Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| import subprocess | |
| import paramiko | |
| from charmhelpers.core.hookenv import ( | |
| config, | |
| status_set, | |
| action_get, | |
| action_set, | |
| action_fail, | |
| ) | |
| from charms.reactive import ( | |
| when, | |
| when_not, | |
| set_state as set_flag, | |
| remove_state as remove_flag, | |
| ) | |
| @when('config.changed') | |
| def test_connection(): | |
| status_set('maintenance', 'configuring ssh connection') | |
| remove_flag('vyos-proxy.ready') | |
| try: | |
| who, _ = run('whoami') | |
| except MgmtNotConfigured as e: | |
| remove_flag('vyos-proxy.configured') | |
| status_set('blocked', str(e)) | |
| except subprocess.CalledProcessError as e: | |
| remove_flag('vyos-proxy.configured') | |
| status_set('blocked', e.output) | |
| else: | |
| set_flag('vyos-proxy.configured') | |
| @when('vyos-proxy.configured') | |
| @when_not('vyos-proxy.ready') | |
| def vyos_proxy_ready(): | |
| status_set('active', 'ready') | |
| set_flag('vyos-proxy.ready') | |
| @when('actions.ping') | |
| @when_not('vyos-proxy.configured') | |
| def pingme(): | |
| action_fail('proxy is not ready') | |
| @when('actions.ping') | |
| @when('vyos-proxy.configured') | |
| def pingme_forreal(): | |
| try: | |
| result, err = run('ping -qc {} {}'.format(action_get('count'), action_get('destination'))) | |
| except: | |
| action_fail('ping command failed') | |
| finally: | |
| remove_flag('actions.ping') | |
| # Here you can send results back from ping, if you had time to parse it | |
| action_set({'output': result}) | |
| class MgmtNotConfigured(Exception): | |
| pass | |
| def run(cmd): | |
| ''' Suddenly this project needs to SSH to something. So we replicate what | |
| _run was doing with subprocess using the Paramiko library. This is | |
| temporary until this charm /is/ the VPE Router ''' | |
| cfg = config() | |
| hostname = cfg.get('hostname') | |
| password = cfg.get('pass') | |
| username = cfg.get('user') | |
| if not (username and password and hostname): | |
| raise MgmtNotConfigured('incomplete remote credentials') | |
| client = paramiko.SSHClient() | |
| client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
| try: | |
| client.connect(cfg.get('hostname'), port=22, | |
| username=cfg.get('user'), password=cfg.get('pass')) | |
| except paramiko.ssh_exception.AuthenticationException: | |
| raise MgmtNotConfigured('invalid credentials') | |
| stdin, stdout, stderr = client.exec_command(cmd) | |
| retcode = stdout.channel.recv_exit_status() | |
| client.close() # @TODO re-use connections | |
| if retcode > 0: | |
| output = stderr.read().strip() | |
| raise subprocess.CalledProcessError(returncode=retcode, cmd=cmd, | |
| output=output) | |
| return (''.join(stdout), ''.join(stderr)) |