Beispiel #1
0
 def fillParam(self):
     p = self.param
     p['editor'] = self.config.get('editor')
     p['logfile'] = self.config.get('logfile')
     p['configfile'] = self.configfile
     p['user'] = getpass.getuser()
     p['appkey'] = util.get_app_key(p['user'])
     p['userhostport'] = ''
     default_port = 22
     p['port'] = default_port
     p['drive'] = ''
     p['drivename'] = 'GOLDDRIVE'
     drives = self.config.get('drives')
     p['drives'] = drives
     p['no_host'] = not bool(drives)
     if not drives:
         return
     currentText = self.cboParam.currentText()
     if not currentText:
         return
     drive = currentText.split()[0].strip()
     d = drives[drive]
     p['drive'] = drive
     p['drivename'] = d.get('drivename', 'GOLDDRIVE').replace(' ', '-')
     p['host'] = d.get('hosts', 'localhost')[0]
     p['port'] = d.get('port', default_port)
     p['user'] = d.get('user', getpass.getuser())
     p['userhost'] = f"{p['user']}@{p['host']}"
     p['userhostport'] = f"{p['userhost']}:{p['port']}"
     p['appkey'] = util.get_app_key(p['user'])
     p['args'] = d.get('args', '')
Beispiel #2
0
    def onConnectHost(self, drive, userhostport):
        self.progressBar.setVisible(True)
        self.param['drive'] = drive
        userhost = userhostport
        host = userhostport
        self.param['userhost'] = userhost
        self.param['host'] = host
        self.param['port'] = 22
        if ':' in userhostport:
            userhost, port = userhostport.split(':')
            self.param['port'] = port
            self.param['host'] = userhost
            host = userhost
        if '@' in userhost:
            user, host = userhost.split('@')
            self.param['user'] = user
            self.param['host'] = host
        else:
            user = self.param['user']
        self.param['userhost'] = f'{user}@{host}'
        self.param['appkey'] = util.get_app_key(user)

        # print(f"user: {self.param['user']}")
        # print(f"host: {self.param['host']}")
        # print(f"port: {self.param['port']}")
        # print(f"userhost: {self.param['userhost']}")
        self.worker.doWork('connect', self.param)
Beispiel #3
0
def main(userhost, password, port=22):
    '''
	Setup ssh keys, return ReturnBox
	'''
    logger.info(f'Setting up ssh keys for {userhost}...')
    rb = util.ReturnBox()

    # app key
    user, host = userhost.split('@')
    seckey = util.get_app_key(user)

    # Check if keys need to be generated
    pubkey = ''
    if has_app_keys(user):
        logger.info('Private key already exists.')
        sk = paramiko.RSAKey.from_private_key_file(seckey)
        pubkey = f'ssh-rsa {sk.get_base64()} {userhost}'
    else:
        rbkey = generate_keys(seckey, userhost)
        if rbkey.error:
            rbkey.returncode = util.ReturnCode.BAD_SSH
            return rbkey
        else:
            pubkey = rbkey.output

    # connect
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    rb.error = ''
    try:
        logger.info('Connecting using password...')
        client.connect(hostname=host,
                       username=user,
                       password=password,
                       port=port,
                       timeout=10,
                       look_for_keys=False)
    except paramiko.ssh_exception.AuthenticationException:
        rb.error = f'User or password wrong'
        rb.returncode = 1
    except Exception as ex:
        rb.error = f'connection error: {ex}'
        rb.returncode = 2

    if rb.error:
        logger.error(rb.error)
        if 'getaddrinfo failed' in rb.error:
            rb.error = f'{host} not found'
        client.close()
        rb.returncode = util.ReturnCode.BAD_SSH
        return rb

    set_key_permissions(user, seckey)

    logger.info(f'Publising public key...')

    # Copy to the target machines.
    # cmd = f"exec bash -c \"cd; umask 077; mkdir -p .ssh && echo '{pubkey}' >> .ssh/authorized_keys || exit 1\" || exit 1"
    cmd = f"exec sh -c \"cd; umask 077; mkdir -p .ssh; echo '{pubkey}' >> .ssh/authorized_keys\""
    logger.info(cmd)
    ok = False

    try:
        stdin, stdout, stderr = client.exec_command(cmd, timeout=10)
        rc = stdout.channel.recv_exit_status()
        if rc == 0:
            logger.info('Key transfer successful')
            rb.returncode = util.ReturnCode.OK
        else:
            logger.error(
                f'Error transfering public key: exit {rc}, error: {stderr}')
    except Exception as ex:
        logger.error(ex)
        rb.returncode = util.ReturnCode.BAD_SSH
        rb.error = f'error transfering public key: {ex}'
        return rb
    finally:
        client.close()

    err = stderr.read()
    if err:
        logger.error(err)
        rb.returncode = util.ReturnCode.BAD_SSH
        rb.error = f'error transfering public key, error: {err}'
        return rb

    rb = testssh(userhost, seckey, port)
    if rb.returncode == util.ReturnCode.OK:
        rb.output = "SSH setup successfull."
        logger.info(rb.output)
    else:
        message = 'SSH setup test failed'
        detail = ''
        if rb.returncode == util.ReturnCode.BAD_LOGIN:
            detail = ': authentication probem'
        else:
            message = ': connection problem'
        rb.error = message
        rb.returncode = util.ReturnCode.BAD_SSH
        logger.error(message + detail)
    return rb
Beispiel #4
0
def has_app_keys(user):
    appkey = util.get_app_key(user)
    return os.path.exists(appkey)
Beispiel #5
0
#!/usr/bin/env python

import sys
import os
DIR = os.path.dirname(os.path.realpath(__file__))
sys.path.append(fr'{DIR}\..\golddrive\app')
import util
util.set_path()

password = os.environ.get('GOLDDRIVE_PASS', '')
host = os.environ.get('GOLDDRIVE_HOST', '')
user = os.environ.get('GOLDDRIVE_USER', '')
port = os.environ.get('GOLDDRIVE_PORT', '')
assert password  # env var 'GOLDDRIVE_PASS' empty, run setenv.bat

golddrive = os.environ['GOLDDRIVE']
js = util.load_config(fr'{golddrive}\config.json')
assert js

userhost = f'{user}@{host}'
sshdir = os.path.expandvars("%USERPROFILE%")
appkey = util.get_app_key(user)
appkey_bak = fr'{appkey}.pytest_backup'
drive = 'Y:'