forked from LW-Ho/CoAP_CLI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CoAPCLI.py
executable file
·267 lines (225 loc) · 8.66 KB
/
CoAPCLI.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
import logging.config
import os
import sys
from cmd import Cmd
from GetMotes import getAllMotes
import RestCoAP
from CoAPObserve import CoAPObserve
from AutoOb import AutoOb
logging.config.fileConfig(os.path.join('logging.conf'))
log = logging.getLogger("root")
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('config.cfg')
# if false, data can't saving to db.
flag_DB = None
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
engine = create_engine('mysql+mysqlconnector://{username}:{password}@{host}/{database}'.format(username=config.get('database', 'username'),
password=config.get('database', 'password'),
host=config.get('database', 'host'),
database=config.get('database', 'database'),
), echo=False)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
def object_callback(mote_data):
try:
#log.info("Got new object_callback")
#log.debug(mote_data)
if flag_DB :
#log.info("Got new object_callback in flag_DB")
session = Session()
session.add(mote_data)
session.commit()
except:
log.error("Got Error! You Need to started MySQL service.")
import sys
log.critical("Unexpected error:{0}".format(sys.exc_info()[0]))
log.critical("Unexpected error:{0}".format(sys.exc_info()[1]))
session.rollback()
def optional_mysqlDB():
global flag_DB
while flag_DB is None:
db = raw_input("Would you want access data to MySQL DB ?(Y/N) ")
if db == "Y" or db == "y" :
print "You press Yes."
flag_DB = True
elif db == "N" or db =="n" :
print "You press No."
flag_DB = False
else :
print "Enter again."
flag_DB = None
class CoAPCLI(Cmd):
def __init__(self):
log.info("Starting CoAP command line to control centralized scheduling...")
Cmd.__init__(self)
self.doc_header = 'Commands: \ngetallmotes \nlist \npost \npostall \nobserve \nobserveall \nobservelist \ndelete \ndeleteall \nauto \nquit'
self.prompt = '>'
self.intro = '\nCoAP Command Line Tool, Welcome to use it!'
self.mote_lists = []
self.mote_observe_lists = []
self.autoObserve = None # save autoOb class
self.border_router_Addr = ""
# self.topology_list = []
def do_getallmotes(self, arg):
if not arg:
self.stdout.write("Please provide Border router's IP address.\n")
return
args = arg.split(' ')
try:
self.border_router_Addr = args[0]
except:
self.stdout.write("Error from getallmotes.\n")
self.border_router_Addr = arg
try:
self.stdout.write("Current Motes List : \n")
self.mote_lists = getAllMotes(self.border_router_Addr) # get motes from border router website.
# self.stdout.write("====== End of List =======\n")
except:
self.stdout.write("Error from getallmotes.\n")
def do_list(self, arg):
try:
self.stdout.write("Current Motes List : \n")
for index in range(0,len(self.mote_lists)):
self.stdout.write("%2d : %s\n" %(index+1, self.mote_lists[index]))
self.stdout.write("====== End of List =======\n")
except:
self.stdout.write("Error from list.\n")
def do_post(self, arg):
if not arg:
self.stdout.write("Please provide node's IP address.\n")
return
args = arg.split(' ')
try:
node = args[0]
resource = args[1]
query = args[2]
RestCoAP.postQueryToNode(node, resource, query)
except:
self.stdout.write("Error from post.\n")
def do_postall(self, arg):
if not arg:
self.stdout.write("Please provide arguments\n")
return
args = arg.split(' ')
try:
resource = args[0]
query = args[1]
RestCoAP.postToAllNode(self.mote_lists, resource, query)
except:
self.stdout.write("Error from postall.\n")
def do_observe(self, arg):
if not arg:
self.stdout.write("Please provide node's IP address.\n")
return
args = arg.split(' ')
try:
node = args[0]
resource = str(args[1])
coapObserve = CoAPObserve(node=node, resource="res/"+resource, object_callback=object_callback)
coapObserve.printName()
coapObserve.setDaemon(True)
coapObserve.start()
self.mote_observe_lists.append(coapObserve)
except:
self.stdout.write("Error from observe.\n")
def do_observeall(self, arg):
if len(self.mote_lists) == 0:
self.stdout.write("Please run getallmotes command.\n")
return
self.do_observelist("arg") # refresh observe_list.
s1 = set(self.mote_lists)
temp = []
for obnode in self.mote_observe_lists: # to change element type, then save to oher list. (CoAP to string)
temp.append(obnode.getName())
s2 = set(temp)
result = list(s1.difference(s2)) # compare list,we can know that is not observing.
try :
for node in result:
coapObserve = CoAPObserve(node=node, resource="res/bcollect", object_callback=object_callback)
coapObserve.printName()
coapObserve.setDaemon(True)
coapObserve.start()
self.mote_observe_lists.append(coapObserve)
self.stdout.write("Observe ALL Done.\n")
except :
self.stdout.write("Do not found moteAddress text.\n")
return
def do_observelist(self, arg):
if len(self.mote_observe_lists) != 0:
for index in self.mote_observe_lists:
if index.getFlag() is False:
if not arg:
index.printName()
else:
continue
else:
self.mote_observe_lists.remove(index)
self.stdout.write("Current Observing Mote of Numbers: %d \n" %(len(self.mote_observe_lists)))
def do_delete(self, arg):
if not arg:
self.stdout.write("Please provide node's IP address.\n")
return
if len(self.mote_observe_lists) != 0:
for index in self.mote_observe_lists:
if index.getName() == arg:
#index.stop()
self.mote_observe_lists.remove(index)
log.info("Delete got {0}!".format(index.getName()))
index = None
def do_deleteall(self, arg):
while len(self.mote_observe_lists) != 0:
for index in self.mote_observe_lists:
index.stopOb()
if index.getFlag() is True:
log.info("Delete got {0}!".format(index.getName()))
self.mote_observe_lists.remove(index)
index.stop()
index = None
#index.stop() # stop coap_client
#index.join() # release thread.
else :
index.stopOb()
def do_auto(self, arg):
args = arg.split(' ')
if args[0] == "start":
if self.autoObserve is None and len(self.mote_lists) != 0 :
if len(args) == 2:
self.autoObserve = AutoOb(mote_lists=self.mote_lists, mote_observe_lists=self.mote_observe_lists, countDown=args[1], autoOb_callback=self.autoOb_callback, object_callback=object_callback)
else:
self.autoObserve = AutoOb(mote_lists=self.mote_lists, mote_observe_lists=self.mote_observe_lists, autoOb_callback=self.autoOb_callback, object_callback=object_callback)
self.autoObserve.setDaemon(True)
self.autoObserve.start()
elif len(self.mote_lists) == 0:
self.stdout.write("Please run getallmotes command.\n")
return
else:
self.stdout.write("Running... You can't run again.\n")
self.stdout.write("You must stop before you can start again.\n")
elif args[0] == "stop" and self.autoObserve is not None:
self.autoObserve.stop()
self.autoObserve = None
#self.autoObserve.join()
else:
self.stdout.write("Need type auto start or auto stop.\n")
return
def autoOb_callback(self, mote_observe_Lists, refreshTopology):
# using callback function to maintain mote_lists and mote_observe_lists.
self.mote_observe_lists = mote_observe_Lists
if refreshTopology is True :
self.mote_lists = getAllMotes(self.border_router_Addr)
self.stdout.write("Updating Topology...\n")
else:
return self.mote_lists
def do_quit(self, arg):
log.info("Stopping CoAPCLI...")
if len(self.mote_observe_lists) != 0:
self.stdout.write("You need delete to all nodes.\n")
else:
sys.exit(1)
if __name__=="__main__":
optional_mysqlDB()
collect_cli = CoAPCLI()
collect_cli.cmdloop()