summaryrefslogtreecommitdiff
path: root/lib.py
blob: 42aede6db8369fb952c5beaed70beab064821e8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import os
import subprocess
import sys

import cliapp
from yarnutils import *


srcdir = os.environ['SRCDIR']
datadir = os.environ['DATADIR']

vars = Variables(datadir)




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)