歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 分析目錄下所有Eudemon防火牆配置的Python腳本

分析目錄下所有Eudemon防火牆配置的Python腳本

日期:2017/3/1 10:18:18   编辑:Linux編程

分析目錄下所有Eudemon防火牆配置的Python腳本:

  1. # coding=gb2312
  2. '''''
  3. Created on 2011-8-26
  4. @author: piky
  5. '''
  6. from os.path import walk, join, normpath
  7. import sys
  8. import os.path
  9. from os import getcwd
  10. import re
  11. import MySQLdb
  12. import time
  13. #判斷str是否符合正則表達式regex,符合則返回符合的部分
  14. def match_sepcial_str(regex, str):
  15. p = re.compile(regex)
  16. t = p.match(str)
  17. if t != None:
  18. return t.group()
  19. return None
  20. #查找str中符合正則表達式regex,符合則返回符合的部分
  21. def search_sepcial_str(regex, str):
  22. p = re.compile(regex)
  23. t = p.search(str)
  24. if t != None:
  25. return t.group()
  26. return None
  27. def time_change_format(time_str):
  28. tm1 = search_sepcial_str("[0-9]+:[0-9]+:[0-9]+", time_str)
  29. tm2 = search_sepcial_str("[0-9]+/[0-9]+/[0-9]+", time_str)
  30. tm2 = tm2.replace("/", "-")
  31. tm = tm2 + " " + tm1
  32. return tm
  33. class Database():
  34. def __init__(self):
  35. self.conn = MySQLdb.connect('localhost', 'root', '123456', 'smart_analyzer')
  36. self.cur = self.conn.cursor()
  37. return
  38. def commit(self):
  39. self.conn.commit()
  40. return
  41. database = Database()
  42. class AnylyzerToolTemplate(object):
  43. def __init__(self):
  44. return
  45. def anylyze(self, line):
  46. key = ""
  47. value = ""
  48. return key,value
  49. #獲取時間
  50. class AnylyzerToolGetTime(object):
  51. def __init__(self):
  52. return
  53. def anylyze(self, line):
  54. r = "[0-9]+:[0-9]+:[0-9]+ [0-9]+/[0-9]+/[0-9]+"
  55. value = match_sepcial_str(r, line)
  56. if value != None:
  57. #print "time:",value
  58. return "time",value
  59. return None,None
  60. class AnylyzerToolStat(object):
  61. def __init__(self):
  62. self.database = None
  63. self.project_id = 0
  64. self.key = []
  65. self.file = ""
  66. self.project_name = ""
  67. self.project_dir_name = ""
  68. self.time = ""
  69. self.start = ""
  70. return
  71. def anylyze(self, line):
  72. #print line
  73. if len(self.key) == 0:
  74. self.get_key_list()
  75. #print self.key
  76. if line.find('System statistic information') != -1:
  77. self.start = self.time
  78. if self.start != "" and self.start != self.time:
  79. #for key in self.key:
  80. # print key
  81. self.add_data(self.time)
  82. self.start = ""
  83. for key in self.key:
  84. if line.find(key[1]) != -1:
  85. value = search_sepcial_str("[0-9]+",line)
  86. if value != None:
  87. key[2] = value
  88. return
  89. return
  90. def get_key_list(self):
  91. sql = 'select name, name_desc from system_stat_type'
  92. self.database.cur.execute(sql)
  93. results = self.database.cur.fetchall()
  94. for key in results:
  95. item = [key[0], key[1], '0']
  96. self.key.append(item)
  97. return
  98. def add_data1(self, key, data, time_str):
  99. sql = 'select * from system_stat_data where type="%s" and data=%s and time="%s" and project_id =%d' % (key, data, time_str, self.project_id)
  100. self.database.cur.execute(sql)
  101. results = self.database.cur.fetchall()
  102. if results != None and len(results) != 0:
  103. return
  104. else:
  105. sql = 'insert into system_stat_data (type,data,time,project_id) values ("%s", %s, "%s", %d)'%(key, data, time_str, self.project_id)
  106. print sql
  107. self.database.cur.execute(sql)
  108. self.database.commit()
  109. return
  110. def add_data(self, time_str):
  111. sql = 'select * from system_stat where time="%s" and project_id =%d' % (time_str, self.project_id)
  112. self.database.cur.execute(sql)
  113. results = self.database.cur.fetchall()
  114. if results != None and len(results) != 0:
  115. return
  116. else:
  117. items = ""
  118. for key in self.key:
  119. items = items + key[0] + ","
  120. #items = items[0:len(items)-1]
  121. values = ""
  122. for key in self.key:
  123. values = values + key[2] + ','
  124. #values = values[0:len(values)-1]
  125. sql = 'insert into system_stat (%s time, project_id) values (%s "%s", %d)'%(items, values, time_str, self.project_id)
  126. print sql
  127. self.database.cur.execute(sql)
  128. self.database.commit()
  129. return
  130. class AnylyzerToolVersion(object):
  131. def __init__(self):
  132. self.database = None
  133. self.project_id = 0
  134. self.time = ""
  135. return
  136. def anylyze(self, line):
  137. if line.find('Software Version') == -1:
  138. return
  139. tmp1 = line.split(':')
  140. tmp2 = tmp1[1].split('(')
  141. version = tmp2[0].strip()
  142. self.add_data(self.time, version)
  143. return
  144. def add_data(self, time_str, version):
  145. sql = 'select * from version where version="%s" and project_id =%d' % (version, self.project_id)
  146. self.database.cur.execute(sql)
  147. results = self.database.cur.fetchall()
  148. if results != None and len(results) != 0:
  149. return
  150. sql = 'insert into version (version, time, project_id) values ("%s", "%s", %d)'%(version, time_str, self.project_id)
  151. print sql
  152. self.database.cur.execute(sql)
  153. self.database.commit()
  154. return
  155. class AnylyzerToolInterface(object):
  156. def __init__(self):
  157. self.database = None
  158. self.project_id = 0
  159. self.time = ""
  160. self.start = ""
  161. self.name = ""
  162. self.data = [
  163. ['outpps', 'output rate', '[0-9]*[ ]*packets/sec', '0'],
  164. ['outBps', 'output rate', '[0-9]*[ ]*bytes/sec', '0'],
  165. ['inpps', 'input rate', '[0-9]*[ ]*packets/sec', '0'],
  166. ['inBps', 'input rate', '[0-9]*[ ]*bytes/sec', '0']
  167. ]
  168. '''''
  169. {'outpps':'0',
  170. 'outBps':'0',
  171. 'inpps':'0',
  172. 'inBps':'0',
  173. }'''
  174. self.status = ""
  175. return
  176. def set_data(self, key, data):
  177. print key,data
  178. for tmp in self.data:
  179. if tmp[0] == key:
  180. tmp[3] = data
  181. return
  182. def anylyze(self, line):
  183. #Ethernet1/0/0 current state
  184. #GigabitEthernet0/0/0 current state
  185. #Ethernet1/0 current state
  186. if self.start != "":
  187. for tmp in self.data:
  188. if line.find(tmp[1]) != -1:
  189. tmp1 = search_sepcial_str(tmp[2], line)
  190. tmp2 = match_sepcial_str('[0-9]*', tmp1)
  191. if tmp2 != None:
  192. tmp[3] = tmp2
  193. if line.find('Input:') != -1:
  194. print self.data
  195. self.add_data(self.time, self.name)
  196. self.start = ""
  197. '''''
  198. if self.start != "":
  199. if line.find('input') != -1:
  200. print line
  201. inpps = search_sepcial_str('[0-9]*[ ]*packets/sec', line)
  202. if inpps != None:
  203. inpps_str = match_sepcial_str('[0-9]*', inpps)
  204. if inpps_str != None:
  205. self.set_data('inpps', inpps_str)
  206. inBps = search_sepcial_str('[0-9]*[ ]*bytes/sec', line)
  207. if inBps != None:
  208. inBps_str = match_sepcial_str('[0-9]*', inBps)
  209. if inBps_str != None:
  210. self.set_data('inBps', inBps_str)
  211. if line.find('output rate') != -1:
  212. outpps = search_sepcial_str('[0-9]*[ ]*packets/sec', line)
  213. if outpps != None:
  214. outpps_str = match_sepcial_str('[0-9]*', outpps)
  215. if outpps_str != None:
  216. self.set_data('outpps', outpps_str)
  217. outBps = search_sepcial_str('[0-9]*[ ]*bytes/sec', line)
  218. if outBps != None:
  219. outBps_str = match_sepcial_str('[0-9]*', outBps)
  220. if outBps_str != None:
  221. self.set_data('outBps', outBps_str)
  222. if line.find('Output') != -1:
  223. print self.data
  224. self.add_data(self.time, self.name)
  225. self.start = ""
  226. '''
  227. name = match_sepcial_str("(Ethernet|GigabitEthernet)[0-9]/[0-9]/[0-9][ ]*current state", line)
  228. if name != None:
  229. name = name.split(' ')[0]
  230. self.name = name
  231. self.start = self.name
  232. tmp = line.split(':')
  233. self.status = tmp[1].strip()
  234. print self.name, self.status
  235. return
  236. def add_data(self, time_str, name):
  237. sql = 'select id from interface where name="%s" and time="%s" and project_id=%d'%(name, time_str, self.project_id)
  238. self.database.cur.execute(sql)
  239. results = self.database.cur.fetchall()
  240. if results != None and len(results) != 0:
  241. return
  242. items = ""
  243. for key in self.data:
  244. items = items + key[0] + ","
  245. #items = items[0:len(items)-1]
  246. values = ""
  247. for key in self.data:
  248. values = values + key[3] + ','
  249. #values = values[0:len(values)-1]
  250. sql = 'insert into interface (%s name, status, time, project_id) values (%s "%s", "%s", "%s", %d)'%(items, values, self.name, self.status, time_str, self.project_id)
  251. print sql
  252. self.database.cur.execute(sql)
  253. self.database.commit()
  254. class AnylyzerToolProject(object):
  255. def __init__(self):
  256. self.database = None
  257. return
  258. def add_data(self, project_name, project_dir, anylyze_file_name):
  259. sql = 'select id from project where path="%s" and file_name="%s"'%(project_dir, anylyze_file_name)
  260. self.database.cur.execute(sql)
  261. results = self.database.cur.fetchall()
  262. if results != None and len(results) != 0:
  263. id = results[0][0]
  264. return id
  265. else:
  266. sql = 'insert into project (name, path, file_name) values ("%s", "%s", "%s")'%(project_name, project_dir, anylyze_file_name)
  267. sql.encode("utf-8")
  268. print sql
  269. self.database.cur.execute(sql)
  270. self.database.commit()
  271. sql = 'select id from project where path="%s" and file_name="%s"'%(project_dir, anylyze_file_name)
  272. self.database.cur.execute(sql)
  273. results = self.database.cur.fetchall()
  274. if results != None:
  275. id = results[0][0]
  276. return id
  277. return None
  278. class Anylyzer(object):
  279. def __init__(self, project_name, project_dir_name, anylyze_file_name):
  280. self.anylyze_file_name = anylyze_file_name
  281. self.analyze_file_type = []
  282. self.project_name = project_name
  283. self.project_dir = project_dir_name
  284. self.analyze_class = []
  285. self.init_analyze_class()
  286. self.database = Database()
  287. self.project_id = 0
  288. return
  289. def register_analyze_tool(self, class_name):
  290. tool = class_name()
  291. tool.file = self.anylyze_file_name
  292. tool.project_name = self.project_name
  293. tool.project_dir_name = self.project_dir
  294. self.analyze_class.append(tool)
  295. return
  296. def anylyzer_file(self):
  297. file = self.anylyze_file_name
  298. #print file
  299. #過濾空文件
  300. if 0 == os.path.getsize(file):
  301. return
  302. #將本文件記錄的數據庫中
  303. anylyzer_tool_project = AnylyzerToolProject()
  304. anylyzer_tool_project.database = self.database
  305. self.project_id = anylyzer_tool_project.add_data(self.project_name, self.project_dir, self.anylyze_file_name)
  306. print "begin anylyze file=%s, id=%d"%(file, self.project_id)
  307. #開始讀取文件
  308. try:
  309. tm = ""
  310. fp = open(file)
  311. while True:
  312. line = fp.readline()
  313. if line == None or len(line) == 0:
  314. break
  315. anylyzer_tool_get_time = AnylyzerToolGetTime()
  316. key,value = anylyzer_tool_get_time.anylyze(line)
  317. if key != None:
  318. tm = time_change_format(value)
  319. for anylyzer_tool in self.analyze_class:
  320. anylyzer_tool.time = tm
  321. anylyzer_tool.database = self.database
  322. anylyzer_tool.project_id = self.project_id
  323. anylyzer_tool.anylyze(line)
  324. fp.close()
  325. except BaseException, e:
  326. print "can't open",file
  327. print str(e)
  328. return
  329. print "end anylyze file:",file
  330. return
  331. def init_analyze_class(self):
  332. self.register_analyze_tool(AnylyzerToolStat)
  333. self.register_analyze_tool(AnylyzerToolVersion)
  334. self.register_analyze_tool(AnylyzerToolInterface)
  335. return
  336. class Collector(object):
  337. '''''
  338. classdocs
  339. '''
  340. def __init__(self):
  341. self.project_root_dir_depth = 0
  342. self.collector_project = []
  343. self.analyze_file_type = []
  344. return
  345. def set_project_root_dir_depth(self, depth):
  346. self.project_root_dir_depth = depth
  347. return
  348. def get_dir_depth(self, dir1, dir2):
  349. dir1_len = len(dir1)
  350. dir2_len = len(dir2)
  351. depth = 0
  352. if dir1_len > dir2_len:
  353. return -1
  354. if dir2[0:dir1_len] != dir1:
  355. return -1
  356. for c in dir2[dir1_len:dir2_len]:
  357. if "\\" == c:
  358. depth = depth + 1
  359. return depth
  360. def register_analyze_file_type(self, type):
  361. self.analyze_file_type.append(type)
  362. return
  363. def get_dir_name(self, dir):
  364. names = os.path.split(dir)
  365. return names[1]
  366. def read_file(self, file, project_name, project_dir_name):
  367. #過濾文件擴展名,如果沒有設置過濾器,則不作判斷
  368. file = file.replace("\\", "/")
  369. project_name = project_name.replace("\\", "/")
  370. project_dir_name = project_dir_name.replace("\\", "/")
  371. print file, project_name, project_dir_name
  372. can_read = True
  373. tmp1 = os.path.splitext(file)
  374. if len(self.analyze_file_type) > 0:
  375. can_read = False
  376. for tmp2 in self.analyze_file_type:
  377. if tmp1[1] == tmp2:
  378. can_read = True
  379. break
  380. if False == can_read:
  381. return
  382. a = Anylyzer(project_name, project_dir_name, file)
  383. a.anylyzer_file()
  384. return
  385. #遍歷指定目錄中的所有子目錄和文件
  386. def walk_dir(self, path=None):
  387. if path == None:
  388. path =getcwd() #current path
  389. alldir = os.walk(path)
  390. project_name = ""
  391. project_dir_name = ""
  392. for sub_path in alldir:
  393. #print self.get_dir_depth(path, sub_path[0]), sub_path[0]
  394. #print sub_path
  395. if (self.project_root_dir_depth == self.get_dir_depth(path, sub_path[0]) - 1):
  396. project_name = self.get_dir_name(sub_path[0])
  397. project_dir_name = sub_path[0]
  398. #print "project_dir_name:",project_dir_name
  399. #print "project_name:",project_name
  400. for file in sub_path[2]:
  401. self.read_file(sub_path[0]+"\\"+file, project_name, project_dir_name)
  402. return
  403. c = Collector()
  404. c.set_project_root_dir_depth(0)
  405. c.register_analyze_file_type(".txt")
  406. c.walk_dir()
Copyright © Linux教程網 All Rights Reserved