test_log.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import os, random, sys, time, json, getopt, threading
  4. sys.path.append('../epu_tester')
  5. import extdevices
  6. import checklogfile
  7. reload(sys)
  8. sys.setdefaultencoding('utf8')
  9. login = "admin"
  10. password = "12345"
  11. def print_test_list():
  12. print "\t\t1 - ON/OFF test\r\n\
  13. \t2 - RAM buffer test\r\n\
  14. \t3 - Log file download test"
  15. def usage():
  16. print "Usage: test_log.py -t <test number> <ip>\r\n\
  17. --help, -h \t\tprint usage info\r\n\
  18. --test, -t \t\ttest number to run"
  19. print_test_list()
  20. def ping(hostname):
  21. response = os.system("ping -q -c1 -W1 " + hostname + ">> /dev/null")
  22. if response == 0:
  23. return True
  24. else:
  25. return False
  26. def do_login():
  27. os.system("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt -d \"login=%s&password=%s\" http://%s/login.cgi > /dev/null" % (login, password, ip))
  28. def do_logout():
  29. os.system("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt http://%s/logout.cgi > /dev/null" %ip)
  30. def do_reset_sett():
  31. os.system("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/reset.cgi\" > /dev/null" %ip)
  32. def log_get_page(page):
  33. return os.popen("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/history.cgi?page=%s&_=%s\" --compressed | jq -r -j '.page'" % (ip, page, random.randint(0, 0xFFFF))).read()
  34. def log_get_string(page, string):
  35. return os.popen("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/history.cgi?page=%s&_=%s\" --compressed | jq -r -j '.page[%s]'" % (ip, page, random.randint(0, 0xFFFF), string)).read().decode('utf-8')
  36. def log_get_ramstrnum():
  37. page = log_get_pagesnum()
  38. return os.popen("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/history.cgi?page=%s&_=%s\" --compressed | jq -r -j '.page | length'" % (ip, page, random.randint(0, 0xFFFF))).read()
  39. def log_get_pagesnum():
  40. return os.popen("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/history.cgi?page=1&_=%s\" --compressed | jq -r -j '.pages'" % (ip, random.randint(0, 0xFFFF))).read()
  41. def log_download(path):
  42. print "Downloading log file..."
  43. if 0 == os.system("curl -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/history.cgi?page=all&_=%s\" --output %s --progress" % (ip, random.randint(0, 0xFFFF), path)):
  44. return True
  45. else:
  46. return False
  47. def log_add_message():
  48. do_logout()
  49. do_login()
  50. time.sleep(1)
  51. def reboot(method):
  52. if method == "snmp":
  53. os.system("snmpset -v1 -t0.1 -r0 -c public %s .1.3.6.1.4.1.41752.5.17.2.9.1.0 i 1 > /dev/null" %ip)
  54. if method == "web":
  55. os.system("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt http://%s/reboot.cgi" %ip)
  56. else:
  57. print "Unknown method"
  58. def stop_spam_task():
  59. res = os.popen("curl -s -b /tmp/cookies.txt -c /tmp/cookies.txt \"http://%s/led.cgi?state=%s&_=%s\" --compressed" % (ip, "off", random.randint(0, 0xFFFF))).read()
  60. if res == "OFF":
  61. print "Spam stoped"
  62. return True
  63. else:
  64. print "Error"
  65. return False
  66. def rambuf_test():
  67. passed = False;
  68. results = [0]*10
  69. if not ping(ip):
  70. print "Host not found"
  71. return False
  72. do_login()
  73. while len(filter(lambda x: x > 0, results)) < 10:
  74. while True:
  75. last_msg = log_get_string(1, 0)
  76. ram_num = int(log_get_ramstrnum())
  77. if ram_num == 10:
  78. ram_num = 0;
  79. if results[ram_num] > 0:
  80. log_add_message()
  81. else:
  82. break
  83. print "\r\nLast message: ", last_msg
  84. print "Messages in RAM: %s" %ram_num
  85. reboot("web")
  86. time.sleep(10)
  87. do_login()
  88. for i in range(1, 10):
  89. page = log_get_page(i)
  90. print "\r\nPage " + str(i) + "\r\n" + page
  91. parsed_page = json.loads(page)
  92. if last_msg in parsed_page:
  93. str_num = parsed_page.index(last_msg) + 1
  94. print "\r\nLast message found as %s-th message (page %s, string %s)" %(str_num + (i - 1) * 10 , i, str_num)
  95. results[ram_num] += 1
  96. break
  97. if "Перезагрузка" in parsed_page:
  98. print "Error: Last message not found"
  99. return False
  100. print "\r\nResults:", results
  101. return True
  102. def on_off_test():
  103. num = 0 #External device addr
  104. device = extdevices.io_device(num)
  105. msg = ''
  106. timestamp = ''
  107. res = False
  108. device.set_outputs(0x02)
  109. time.sleep(8)
  110. if not ping(ip):
  111. print "Host not found"
  112. return False
  113. while True:
  114. try:
  115. device.set_outputs(0x00)
  116. print "OFF"
  117. time.sleep(0.2)
  118. device.set_outputs(0x02)
  119. print "ON"
  120. time.sleep(4)
  121. #Waiting LOG restore
  122. delay = 0
  123. res = 1
  124. while res != 0:
  125. res = os.system("tail ./trace.txt | grep -a \"Write page\" > /dev/null")
  126. if res != 0:
  127. print "Waiting restore: %d" % delay
  128. delay+=5
  129. time.sleep(5)
  130. else:
  131. time.sleep(12)
  132. do_login()
  133. #Get start timestamp
  134. if timestamp == '':
  135. strdate = log_get_string(1, 0).replace('"','').split(";")[3].rstrip()
  136. print "Started at:", strdate
  137. timestamp = time.strptime(strdate, "%d.%m.%y %H:%M:%S")
  138. #Check if Log index was overfloved since test start. If so, finish the test.
  139. lastpage = log_get_pagesnum()
  140. if lastpage > 3000:
  141. lastpages = 3000
  142. strdate = log_get_string(lastpage, 0).replace('"','').split(";")[3].rstrip()
  143. if timestamp < time.strptime(strdate, "%d.%m.%y %H:%M:%S"):
  144. print "Test finished. Checking LOG.."
  145. #Download and check log file
  146. PATH = "/tmp/testlog.csv"
  147. if log_download(PATH):
  148. res = checklogfile.check(PATH)
  149. break
  150. #Validate LOG pages
  151. if msg:
  152. print "Finding message:", msg
  153. for i in range(1, int(log_get_pagesnum())):
  154. parsed_page = json.loads(log_get_page(i))
  155. if len(parsed_page) != 10:
  156. print "Error. Corrupted page:"
  157. stop_spam_task()
  158. for i in parsed_page:
  159. print i
  160. return False
  161. if msg in parsed_page:
  162. print "Found:", i
  163. break
  164. else:
  165. print "Page: %d" % i
  166. msg = log_get_string(2, 0)
  167. time.sleep(random.randint(1, 4))
  168. except KeyboardInterrupt:
  169. sys.exit(0)
  170. except ValueError:
  171. print "JSON parse error."
  172. stop_spam_task()
  173. return False
  174. except:
  175. print "Retry"
  176. stop_spam_task()
  177. return res
  178. def download_test_ram(start_num, add_num):
  179. print "RAM:", start_num, "+", add_num
  180. PATH = "/tmp/testlog_ram"+str(start_num)+"_"+str(add_num)+".csv"
  181. do_login()
  182. while True:
  183. last_msg = log_get_string(1, 0)
  184. ram_num = int(log_get_ramstrnum())
  185. if ram_num == 10:
  186. ram_num = 0;
  187. if ram_num == start_num:
  188. break
  189. else:
  190. log_add_message()
  191. thr = threading.Thread(target=log_download, args=(PATH,), kwargs={})
  192. thr.start()
  193. time.sleep(1)
  194. for i in range(add_num):
  195. log_add_message()
  196. thr.join()
  197. print "Last message:", last_msg
  198. fsize = os.path.getsize(PATH)
  199. print "File size: ", fsize
  200. if fsize != 120*30000 + 3 + 120*start_num:
  201. print "Error. File size missmatch"
  202. return False
  203. res = checklogfile.check(PATH)
  204. if not res:
  205. return False
  206. lines = checklogfile.parse(PATH)
  207. res = False
  208. for i in range(len(lines)):
  209. s = lines[i]
  210. if last_msg in s:
  211. res = True
  212. break
  213. if not res:
  214. print "Error. Last message not found"
  215. return False
  216. else:
  217. print "Last message found"
  218. do_logout()
  219. return True
  220. def download_test():
  221. passed = False;
  222. results = [0]*10
  223. if not ping(ip):
  224. print "Host not found"
  225. return False
  226. do_login()
  227. #Проверка добавления записи в лог во время загрузки файла (строка попала в RAM и вызвала запись страницы)
  228. if not download_test_ram(8, 5):
  229. return False
  230. #Проверка добавления записи в лог во время загрузки файла (строка попала в RAM, без записи страницы)
  231. if not download_test_ram(1, 2):
  232. return False
  233. #Проверка загрузки лога при количестве строк в RAM 0-9
  234. do_login()
  235. while len(filter(lambda x: x > 0, results)) < 10:
  236. while True:
  237. last_msg = log_get_string(1, 0)
  238. ram_num = int(log_get_ramstrnum())
  239. if ram_num == 10:
  240. ram_num = 0;
  241. if results[ram_num] > 0:
  242. log_add_message()
  243. else:
  244. break
  245. print "\r\nLast message: ", last_msg
  246. print "Messages in RAM: %s" %ram_num
  247. PATH = "/tmp/testlog_" + str(ram_num) + ".csv"
  248. thr = threading.Thread(target=log_download, args=(PATH,), kwargs={})
  249. thr.start()
  250. thr.join()
  251. #log_download(PATH)
  252. fsize = os.path.getsize(PATH)
  253. print "File size: ", fsize
  254. res = checklogfile.check(PATH)
  255. if res:
  256. results[ram_num] += 1
  257. else:
  258. return False
  259. lines = checklogfile.parse(PATH)
  260. res = False
  261. for i in range(len(lines)):
  262. s = lines[i]
  263. if last_msg in s:
  264. res = True
  265. break
  266. if not res:
  267. print "Error. Last message not found"
  268. return False
  269. else:
  270. print "Last message found"
  271. print "\r\nResults:", results
  272. return True
  273. test_list = [0, on_off_test, rambuf_test, download_test]
  274. def main():
  275. testnum = 0
  276. global ip
  277. try:
  278. opts, args = getopt.getopt(sys.argv[1:], "ht:", \
  279. ["help", "test="])
  280. except getopt.GetoptError:
  281. usage()
  282. sys.exit(2)
  283. for opt, arg in opts:
  284. if opt in ("-h", "--help"):
  285. usage()
  286. sys.exit()
  287. if opt in ("-t", "--test"):
  288. testnum = int(arg)
  289. if testnum == 0 or len(sys.argv) < 3:
  290. usage()
  291. sys.exit(2)
  292. ip = sys.argv[-1]
  293. #Run test by number
  294. if not test_list[testnum]():
  295. print "\r\nFailed\r\n"
  296. else:
  297. print "\r\nPassed\r\n"
  298. if __name__ == "__main__":
  299. main()