diff options
-rwxr-xr-x | bin/scotch | 69 | ||||
-rw-r--r-- | kubernetes/mongodb/add-user.yaml | 54 |
2 files changed, 123 insertions, 0 deletions
diff --git a/bin/scotch b/bin/scotch new file mode 100755 index 0000000..1da5962 --- /dev/null +++ b/bin/scotch @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +import subprocess + + +class Color: + bold = "\033[1m" + faint = "\033[2m" + italic = "\033[3m" + underline = "\033[4m" + blink = "\033[5m" + negative = "\033[7m" + crossed = "\033[9m" + reset = "\033[0m" + one = "\x1b[38;5;216m" + two = "\x1b[38;5;192m" + three = "\x1b[38;5;22m" + four = "\x1b[38;5;25m" + five = "\x1b[38;5;98m" + six = "\x1b[38;5;68m" + seven = "\x1b[38;5;59m" + eight = "\x1b[38;5;36m" + nine = "\x1b[38;5;202m" + ten = "\x1b[38;5;100m" + eleven = "\x1b[38;5;105m" + twelve = "\x1b[38;5;106m" + thirteen = "\x1b[38;5;96m" + fourteen = "\x1b[38;5;31m" + fifteen = "\x1b[38;5;23m" + sixteen = "\x1b[38;5;105m" + + +def call_from_shell_list(command_list): + if sys.version_info < (3, 7): + return subprocess.run(command_list, stdout=subprocess.PIPE) + else: + return subprocess.run(command_list, capture_output=True) + + +def main(): + if len(sys.argv) < 2: + print("you want to run something right?\nright?") + sys.exit(1) + + args = sys.argv[1:] + args.insert(0, "strace") + result = call_from_shell_list(args) + lines = result.stderr.decode("utf-8").split("\n") + end_line = lines[-2] + lines = lines[:-2] + for line in lines: + syscall = line[0 : line.find("(")] + sysargs = line[line.find("(") + 1 : line.find(")")].split() + exitvalue = line[line.find(")") + 1 :] + print(Color.one + syscall, end=" ") + print(Color.two, end=" ") + for arg in sysargs: + if arg.find("|") > 0: + print(Color.five, arg, end=" ") + else: + print(arg, end=" ") + print(Color.three + exitvalue + Color.reset) + print(Color.reset + Color.bold + Color.nine + end_line + Color.reset) + + +if __name__ == "__main__": + main() diff --git a/kubernetes/mongodb/add-user.yaml b/kubernetes/mongodb/add-user.yaml new file mode 100644 index 0000000..df68d31 --- /dev/null +++ b/kubernetes/mongodb/add-user.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: mongodb-standalone +data: + ensure-users.js: | + const targetDbStr = 'training'; + const rootUser = cat('/etc/k8-training/admin/MONGO_ROOT_USERNAME'); + const rootPass = cat('/etc/k8-training/admin/MONGO_ROOT_PASSWORD'); + const usersStr = cat('/etc/k8-training/MONGO_USERS_LIST'); + // auth against admin + const adminDb = db.getSiblingDB('admin'); + adminDb.auth(rootUser, rootPass); + print('Successfully authenticated admin user'); + // we'll create the users here + const targetDb = db.getSiblingDB(targetDbStr); + // user-defined roles should be stored in the admin db + const customRoles = adminDb + .getRoles({rolesInfo: 1, showBuiltinRoles: false}) + .map(role => role.role) + .filter(Boolean); + // parse the list of users, and create each user as needed + usersStr + .trim() + .split(';') + .map(s => s.split(':')) + .forEach(user => { + const username = user[0]; + const rolesStr = user[1]; + const password = user[2]; + if (!rolesStr || !password) { + return; + } + const roles = rolesStr.split(','); + const userDoc = { + user: username, + pwd: password, + }; + userDoc.roles = roles.map(role => { + if (!~customRoles.indexOf(role)) { + // is this a user defined role? + return role; // no, it is built-in, just use the role name + } + return {role: role, db: 'admin'}; // yes, user-defined, specify the long format + }); + try { + targetDb.createUser(userDoc); + } catch (err) { + if (!~err.message.toLowerCase().indexOf('duplicate')) { + // if not a duplicate user + throw err; // rethrow + } + } + }); |