Skip to content

Commit b080e2b

Browse files
committed
generators in global controller
1 parent 0481c93 commit b080e2b

5 files changed

+366
-0
lines changed

generator/agent_config.yaml

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## WiSHFUL Agent config file
2+
3+
agent_info:
4+
name: 'agent_1'
5+
info: 'wishful_simple_agent_info'
6+
iface: 'eth0'
7+
8+
modules:
9+
discovery:
10+
module : wishful_module_static_discovery
11+
class_name : StaticDiscoveryModule
12+
kwargs: {"downlink":"tcp://127.0.0.1:8990", "uplink":"tcp://127.0.0.1:8989"}
13+
14+
rule_manager:
15+
module : wishful_module_rules
16+
class_name : RuleManagerModule
17+
18+
simple:
19+
module : wishful_module_simple
20+
class_name : SimpleModule2
21+
interfaces : ['wlan0', 'wlan1']
22+
23+
iperf:
24+
module : wishful_module_iperf
25+
class_name : IperfModule

generator/controller_config.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## WiSHFUL Controller's config file
2+
3+
controller:
4+
name: "Controller"
5+
info: "WiSHFUL Controller"
6+
dl: "tcp://127.0.0.1:8990"
7+
ul: "tcp://127.0.0.1:8989"
8+
9+
modules: {}

generator/readme.txt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#run example controller
2+
#run with -v for debugging
3+
./wishful_simple_controller --config ./controller_config.yaml
4+
5+
#run example agent - scapy requires sudo !!!
6+
#run with -v for debugging
7+
sudo su
8+
source ../../dev/bin/activate
9+
./wishful_simple_agent --config ./agent_config.yaml

generator/wishful_simple_agent

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
"""
5+
wishful_agent_simple.py: First implementation of WiSHFUL agent
6+
sudo su REQUIRED !! see readme.txt
7+
8+
Usage:
9+
wishful_agent_simple.py [options] [-q | -v]
10+
11+
Options:
12+
--logfile name Name of the logfile
13+
--config configFile Config file path
14+
15+
Example:
16+
./wishful_agent_simple -v --config ./config.yaml
17+
18+
Other options:
19+
-h, --help show this help message and exit
20+
-q, --quiet print less text
21+
-v, --verbose print more text
22+
--version show version and exit
23+
"""
24+
25+
import logging
26+
import signal
27+
import yaml
28+
import sys, os
29+
import wishful_agent
30+
31+
__author__ = "Piotr Gawlowicz, Mikolaj Chwalisz"
32+
__copyright__ = "Copyright (c) 2015, Technische Universität Berlin"
33+
__version__ = "0.1.0"
34+
__email__ = "{gawlowicz, chwalisz}@tkn.tu-berlin.de"
35+
36+
simpleModuleLogger = logging.getLogger('SimpleModule2')
37+
simpleModuleLogger.setLevel(logging.CRITICAL)
38+
39+
log = logging.getLogger('wishful_agent.main')
40+
agent = wishful_agent.Agent()
41+
42+
def main(args):
43+
log.debug(args)
44+
45+
config_file_path = args['--config']
46+
47+
config = None
48+
with open(config_file_path, 'r') as f:
49+
config = yaml.load(f)
50+
51+
agent.load_config(config)
52+
agent.run()
53+
54+
55+
if __name__ == "__main__":
56+
try:
57+
from docopt import docopt
58+
except:
59+
print("""
60+
Please install docopt using:
61+
pip install docopt==0.6.1
62+
For more refer to:
63+
https://github.com/docopt/docopt
64+
""")
65+
raise
66+
67+
args = docopt(__doc__, version=__version__)
68+
69+
log_level = logging.INFO # default
70+
if args['--verbose']:
71+
log_level = logging.DEBUG
72+
elif args['--quiet']:
73+
log_level = logging.ERROR
74+
75+
logfile = None
76+
if args['--logfile']:
77+
logfile = args['--logfile']
78+
79+
logging.basicConfig(filename=logfile, level=log_level,
80+
format='%(asctime)s - %(name)s.%(funcName)s() - %(levelname)s - %(message)s')
81+
82+
try:
83+
main(args)
84+
except KeyboardInterrupt:
85+
log.debug("Agent exits")
86+
finally:
87+
log.debug("Exit")
88+
agent.stop()

generator/wishful_simple_controller

+235
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
"""
5+
wishful_controller_simple.py: First implementation of WiSHFUL controller
6+
7+
Usage:
8+
wishful_controller_simple.py [options] [-q | -v]
9+
10+
Options:
11+
--logfile name Name of the logfile
12+
--config configFile Config file path
13+
14+
Example:
15+
./wishful_simple_local_controller -v --config ./config.yaml
16+
17+
Other options:
18+
-h, --help show this help message and exit
19+
-q, --quiet print less text
20+
-v, --verbose print more text
21+
--version show version and exit
22+
"""
23+
24+
import sys
25+
import datetime
26+
import logging
27+
import wishful_controller
28+
import gevent
29+
import yaml
30+
from scapy.all import *
31+
import wishful_upis as upis
32+
from wishful_framework import TimeEvent, PktEvent, MovAvgFilter, PeakDetector, Match, Action, Permanance, PktMatch, FieldSelector
33+
34+
35+
__author__ = "Piotr Gawlowicz, Anatolij Zubow"
36+
__copyright__ = "Copyright (c) 2015, Technische Universitat Berlin"
37+
__version__ = "0.1.0"
38+
__email__ = "{gawlowicz, zubow}@tkn.tu-berlin.de"
39+
40+
41+
log = logging.getLogger('wishful_agent.main')
42+
controller = wishful_controller.Controller()
43+
nodes = []
44+
45+
46+
@controller.new_node_callback()
47+
def newNode(node):
48+
nodes.append(node)
49+
print "New node appeared:"
50+
print node
51+
52+
53+
@controller.node_exit_callback()
54+
def nodeExit(node, reason):
55+
if node in nodes:
56+
nodes.remove(node);
57+
print "NodeExit : NodeName : {} Reason : {}".format(node.name, reason)
58+
59+
60+
@controller.set_default_callback()
61+
def default_callback(group, node, cmd, data):
62+
print "DEFAULT CALLBACK : Group: {}, NodeName: {}, Cmd: {}, Returns: {}".format(group, node.name, cmd, data)
63+
64+
65+
def upi_based_rule_matched(group, node, ruleId, data):
66+
print "{} UPI based Rule in node: {} with id: {} was matched; Data: {}".format(datetime.datetime.now(), node.name, ruleId, data)
67+
68+
def pkt_based_rule_matched(group, node, ruleId, data):
69+
print "{} Pkt Rule in node: {} with id: {} was matched; Data: {}".format(datetime.datetime.now(), node.name, ruleId, data)
70+
71+
def pkt_based_rule(group, node, ruleId, pkt):
72+
print "{} Pkt Rule in node: {} with id: {} was matched;".format(datetime.datetime.now(), node.name, ruleId)
73+
try:
74+
print pkt.show()
75+
except:
76+
print pkt
77+
print ""
78+
79+
80+
def main(args):
81+
log.debug(args)
82+
83+
config_file_path = args['--config']
84+
config = None
85+
with open(config_file_path, 'r') as f:
86+
config = yaml.load(f)
87+
88+
controller.load_config(config)
89+
controller.start()
90+
91+
#wait for at leas one node
92+
while len(nodes) < 1:
93+
gevent.sleep(1)
94+
95+
#control loop
96+
while True:
97+
print "Connected nodes", [str(node.name) for node in nodes]
98+
if nodes:
99+
#######################################################################################
100+
print "{} Get new generator".format(datetime.datetime.now())
101+
myGenerator = controller.nodes(nodes[0]).generator.start(
102+
event=TimeEvent(func=upis.radio.get_noise, kwargs={}, interval=0.2, iface="wlan0"))
103+
104+
print "{} New generator with ID: {}".format(datetime.datetime.now(), myGenerator.id)
105+
106+
sampleNum = 5
107+
i = 0
108+
for sample in myGenerator:
109+
print i, sample
110+
i = i + 1
111+
if i == sampleNum:
112+
break
113+
114+
retVal = myGenerator.stop()
115+
print "{} Generator with ID: {} was {}".format(datetime.datetime.now(), myGenerator.id, retVal)
116+
gevent.sleep(2)
117+
118+
#######################################################################################
119+
print "{} Get new generator".format(datetime.datetime.now())
120+
myGenerator = controller.nodes(nodes[0]).generator.start(
121+
event=TimeEvent(func=upis.radio.get_rssi, kwargs={}, iface="wlan0"),
122+
filters=[MovAvgFilter(10)])
123+
124+
print "{} New generator with ID: {}".format(datetime.datetime.now(), myGenerator.id)
125+
126+
sampleNum = 5
127+
i = 0
128+
for sample in myGenerator:
129+
print i, sample
130+
i = i + 1
131+
if i == sampleNum:
132+
break
133+
134+
retVal = myGenerator.stop()
135+
print "{} Generator with ID: {} was {}".format(datetime.datetime.now(), myGenerator.id, retVal)
136+
gevent.sleep(2)
137+
138+
#######################################################################################
139+
print "{} Get new generator".format(datetime.datetime.now())
140+
myGenerator = controller.nodes(nodes[0]).generator.start(
141+
event=PktEvent(iface="eth0"),
142+
pktMatch=PktMatch("icmp"),
143+
selector=FieldSelector("IP.ttl"))
144+
145+
print "{} New generator with ID: {}".format(datetime.datetime.now(), myGenerator.id)
146+
147+
sampleNum = 5
148+
i = 0
149+
for sample in myGenerator:
150+
print i, sample
151+
i = i + 1
152+
if i == sampleNum:
153+
break
154+
155+
retVal = myGenerator.stop()
156+
print "{} Generator with ID: {} was {}".format(datetime.datetime.now(), myGenerator.id, retVal)
157+
gevent.sleep(2)
158+
159+
#######################################################################################
160+
print "{} Get new generator".format(datetime.datetime.now())
161+
myGenerator = controller.nodes(nodes[0]).generator.start(
162+
event=PktEvent(iface="eth0"),
163+
selector=FieldSelector("IP.dst"))
164+
165+
print "{} New generator with ID: {}".format(datetime.datetime.now(), myGenerator.id)
166+
167+
sampleNum = 5
168+
i = 0
169+
for sample in myGenerator:
170+
print i, sample
171+
i = i + 1
172+
if i == sampleNum:
173+
break
174+
175+
retVal = myGenerator.stop()
176+
print "{} Generator with ID: {} was {}".format(datetime.datetime.now(), myGenerator.id, retVal)
177+
gevent.sleep(2)
178+
179+
#######################################################################################
180+
print "{} Get new generator".format(datetime.datetime.now())
181+
myGenerator = controller.nodes(nodes[0]).generator.start(
182+
event=PktEvent(iface="eth0"))
183+
184+
print "{} New generator with ID: {}".format(datetime.datetime.now(), myGenerator.id)
185+
186+
sampleNum = 5
187+
i = 0
188+
for sample in myGenerator:
189+
print i, sample
190+
i = i + 1
191+
if i == sampleNum:
192+
break
193+
194+
retVal = myGenerator.stop()
195+
print "{} Generator with ID: {} was {}".format(datetime.datetime.now(), myGenerator.id, retVal)
196+
gevent.sleep(2)
197+
198+
#######################################################################################
199+
200+
201+
202+
if __name__ == "__main__":
203+
try:
204+
from docopt import docopt
205+
except:
206+
print("""
207+
Please install docopt using:
208+
pip install docopt==0.6.1
209+
For more refer to:
210+
https://github.com/docopt/docopt
211+
""")
212+
raise
213+
214+
args = docopt(__doc__, version=__version__)
215+
216+
log_level = logging.INFO # default
217+
if args['--verbose']:
218+
log_level = logging.DEBUG
219+
elif args['--quiet']:
220+
log_level = logging.ERROR
221+
222+
logfile = None
223+
if args['--logfile']:
224+
logfile = args['--logfile']
225+
226+
logging.basicConfig(filename=logfile, level=log_level,
227+
format='%(asctime)s - %(name)s.%(funcName)s() - %(levelname)s - %(message)s')
228+
229+
try:
230+
main(args)
231+
except KeyboardInterrupt:
232+
log.debug("Controller exits")
233+
finally:
234+
log.debug("Exit")
235+
controller.stop()

0 commit comments

Comments
 (0)