ColdCore/daemons/shell_accounts.py

86 lines
2.8 KiB
Python

import spur
import random
import config
from data.database import db
from data import ssh
import utils.misc
def run():
db.connect()
try:
shell = spur.SshShell(
hostname=config.shell_host,
username=config.secret.shell_username,
private_key_file=config.secret.shell_privkey,
port=config.shell_port,
missing_host_key=spur.ssh.MissingHostKey.accept
)
result = shell.run(["sudo", "useradd", "--help"])
if result.return_code != 0:
raise ValueError("Unable to sudo useradd.")
account_count = ssh.count_accounts()
if account_count >= config.shell_max_accounts:
raise ValueError("Max SSH accounts already created!")
free_account_count = ssh.count_unassigned()
new_accounts = max(config.shell_free_acounts - free_account_count, 0)
print("Checking that all teams have been assigned accounts...")
print("{}/{} shell accounts allocated adding {}...".format(free_account_count, account_count, new_accounts))
teams = ssh.get_teams_without_ssh()
if len(teams) > 0:
print("{} teams without accounts present! Adding these as well.".format(len(teams)))
new_accounts += len(teams)
accounts = []
while new_accounts > 0:
username = random.choice(config.shell_user_prefixes) + \
str(random.randint(0, config.shell_max_accounts))
plaintext_password = utils.misc.generate_random_string(config.shell_password_length, chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789")
hashed_password = shell.run(["bash", "-c", "echo '{}' | openssl passwd -1 -stdin".format(plaintext_password)])
hashed_password = hashed_password.output.decode("utf-8").strip()
shell_cmd = config.shell_user_creation.format(username=username, password=hashed_password)
result = shell.run(shell_cmd.split(), allow_error=True)
if result.return_code == 9:
print("Collision! Retrying.")
continue
elif result.return_code != 0:
raise RuntimeError(result.stderr)
print("\t{}:{}".format(username, plaintext_password))
account = {
"username": username,
"password": plaintext_password,
"hostname": config.shell_host,
"port": config.shell_port
}
accounts.append(account)
new_accounts -= 1
if len(accounts) > 0:
ssh.create_accounts(accounts)
print("Successfully imported accounts.")
for team in teams:
ssh.assign_shell_account(team)
except spur.ssh.ConnectionError:
raise RuntimeError("Could not connect to shell server.")
db.close()