import os import subprocess import sys import cliapp from yarnutils import * srcdir = os.environ['SRCDIR'] datadir = os.environ['DATADIR'] vars = Variables(datadir) def append(key, value): items = vars[key] or [] items.append(value) vars[key] = items def ssh_key_file_for_user(user): return os.path.abspath('{}.key'.format(user)) def get_admin_ssh_key(): return os.environ['ADMIN_SSH_KEY'] def get_user_ssh_key(user): if user is None: return get_admin_ssh_key() else: return ssh_key_file_for_user(user) def ssh_keygen(user): filename = ssh_key_file_for_user(user) cliapp.runcmd(['ssh-keygen', '-f', filename, '-N', '', '-C', user]) with open(filename + '.pub') as f: return f.read() def env_ssh_command(user): argv = [ 'ssh', '-o', 'PasswordAuthentication=no', '-o', 'IdentitiesOnly=yes', '-i', get_user_ssh_key(user), ] return ' '.join(argv) def git_as(user, args, **kwargs): server = os.environ['GITANO_SERVER'] env = dict(os.environ) env['GIT_SSH_COMMAND'] = env_ssh_command(user) return cliapp.runcmd_unchecked( ['git'] + args, stderr=subprocess.STDOUT, env=env, **kwargs) def git_as_checked(user, args, **kwargs): exit, out, err = git_as(user, args, **kwargs) sys.stdout.write('STDOUT from git:\n{}'.format(out)) sys.stderr.write('STDERR from git:\n{}'.format(err)) assertEqual(exit, 0) def gitano(user, args, stdin=None): server = os.environ['GITANO_SERVER'] kwargs = { 'stderr': subprocess.STDOUT, 'ssh_options': [ '-oPasswordAuthentication=no', '-oIdentitiesOnly=yes', '-i', get_user_ssh_key(user), ], } if stdin is not None: kwargs['feed_stdin'] = stdin return cliapp.ssh_runcmd( 'git@{}'.format(server), args.split(), **kwargs) def gitano_confirm_with_token(prefix, which): try: output = gitano(None, '{} {}'.format(prefix, which)) except cliapp.AppException: pass else: last_line = output.splitlines()[-1] token = last_line.split()[-1] gitano(None, '{} {} {}'.format(prefix, which, token)) def repo_ssh_url(repo): return 'ssh://git@{}/{}'.format(os.environ['GITANO_SERVER'], repo) def local_checkout_dirname(user, repo): return '{}_{}'.format(user, repo)