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