| from charmhelpers.core.hookenv import ( |
| action_get, |
| action_fail, |
| action_set, |
| config, |
| log, |
| status_set, |
| ) |
| |
| from charms.reactive import ( |
| remove_state as remove_flag, |
| set_state as set_flag, |
| when, |
| when_not, |
| ) |
| import charms.sshproxy |
| from subprocess import CalledProcessError |
| |
| |
| @when_not('netutils.ready') |
| def ready(): |
| status_set('active', 'Ready!') |
| set_flag('netutils.ready') |
| |
| |
| @when('actions.dig') |
| def dig(): |
| err = '' |
| try: |
| nsserver = action_get('nsserver') |
| host = action_get('host') |
| nstype = action_get('type') |
| cmd = "dig" |
| |
| if nsserver: |
| cmd += " @{}".format(nsserver) |
| if host: |
| cmd += " {}".format(host) |
| else: |
| action_fail('Hostname required.') |
| if nstype: |
| cmd += " -t {}".format(nstype) |
| |
| result, err = charms.sshproxy._run(cmd) |
| except: |
| action_fail('dig command failed:' + err) |
| else: |
| action_set({'outout': result}) |
| finally: |
| remove_flag('actions.dig') |
| |
| |
| @when('actions.nmap') |
| def nmap(): |
| err = '' |
| try: |
| result, err = charms.sshproxy._run( |
| 'nmap {}'.format(action_get('destination')) |
| ) |
| except: |
| action_fail('nmap command failed:' + err) |
| else: |
| action_set({'outout': result}) |
| finally: |
| remove_flag('actions.nmap') |
| |
| |
| @when('actions.ping') |
| def ping(): |
| err = '' |
| try: |
| result, err = charms.sshproxy._run('ping -qc {} {}'.format( |
| action_get('count'), action_get('destination')) |
| ) |
| |
| except: |
| action_fail('ping command failed:' + err) |
| else: |
| # Here you can send results back from ping, if you had time to parse it |
| action_set({'output': result}) |
| finally: |
| remove_flag('actions.ping') |
| |
| |
| @when('actions.traceroute') |
| def traceroute(): |
| try: |
| result, err = charms.sshproxy._run( |
| 'traceroute -m {} {}'.format( |
| action_get('hops'), |
| action_get('destination') |
| ) |
| ) |
| except: |
| action_fail('traceroute command failed') |
| else: |
| # Here you can send results back from ping, if you had time to parse it |
| action_set({'output': result}) |
| finally: |
| remove_flag('actions.traceroute') |
| |
| |
| @when('actions.iperf3') |
| def iperf3(): |
| err = '' |
| try: |
| # TODO: read all the flags via action_get and build the |
| # proper command line to run iperf3 |
| host = action_get('host') |
| |
| cmd = 'iperf3 -c {} --json'.format(host) |
| result, err = charms.sshproxy._run(cmd) |
| except CalledProcessError as e: |
| action_fail('iperf3 command failed:' + e.output) |
| else: |
| action_set({'outout': result}) |
| finally: |
| remove_flag('actions.iperf3') |
| |
| |
| @when('config.changed') |
| def config_changed(): |
| """ Handle configuration changes """ |
| cfg = config() |
| if cfg.changed('iperf3'): |
| if cfg['iperf3']: |
| # start iperf in server + daemon mode |
| cmd = "iperf3 -s -D" |
| else: |
| cmd = "killall iperf3" |
| try: |
| charms.sshproxy._run(cmd) |
| log("iperf3 stopped.") |
| except CalledProcessError: |
| log("iperf3 not running.") |
| else: |
| log("iperf3 started.") |