Newer
Older
from charmhelpers.core.hookenv import (
action_get,
action_fail,
action_set,
config,
log,
status_set,
remove_state as remove_flag,
set_state as set_flag,
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')
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
@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.")