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', '')
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)
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
def has_app_keys(user): appkey = util.get_app_key(user) return os.path.exists(appkey)
#!/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:'