app-sec.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import sys
  2. import os
  3. import logging
  4. import configparser
  5. import datetime
  6. from pymongo import MongoClient
  7. import json
  8. ##### GLOBAL VARIABLES #####
  9. logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
  10. # Increase the recursion limit by much to allow bs to parse large files ()
  11. sys.setrecursionlimit(6000)
  12. # Load config file as library
  13. config = configparser.ConfigParser()
  14. secondsperday = 86400
  15. now = datetime.datetime.now()
  16. verbosity = 1
  17. ###### FUNCTIONS ######
  18. def load_state():
  19. """
  20. Load state, different from DBs in that we always need it.
  21. Retrieves the cached state for current configuration.
  22. :return: state , error number
  23. """
  24. cache = config['DIR']['cache_dir'] + 'state'
  25. err = 0
  26. state = dict()
  27. try:
  28. with open(cache) as json_data:
  29. state = json.load(json_data)
  30. except FileNotFoundError:
  31. # Load default state - start from the beginning
  32. print('File not found in: '+config['DIR']['cache_dir'] + 'state')
  33. print('Loading default state.')
  34. state['cache_dir'] = cache
  35. state['next_adv'] = 0
  36. state['next_fsa'] = 0
  37. state['Packages'] = ''
  38. state['Sources'] = ''
  39. state['Sha1Sums'] = ''
  40. err += 1
  41. return state, err
  42. def load_DBs():
  43. cache = config['DIR']['cache_dir']
  44. tables = ['dsatable', 'src2dsa', 'dsa2cve', 'cvetable', 'src2deps', 'src2month', 'src2sloccount', 'src2pop']
  45. result = []
  46. for i in range(0, len(tables)):
  47. try:
  48. with open(cache + tables[i]) as t:
  49. result.append(json.load(t))
  50. except (IOError, ValueError):
  51. print('read cache '+tables[i]+' failed!! Maybe first run of the system?')
  52. result.append("zero")
  53. return tuple(result)
  54. def aptsec_help():
  55. """
  56. :return:
  57. """
  58. print('See manual for correct usage!')
  59. '''
  60. TODO:
  61. - add parameterized extensions
  62. - for input config file
  63. - for action
  64. - vendor ( OPTIONAL )
  65. '''
  66. def __main__(configfile='config', vendorname='debian', action='help'):
  67. # initialize structures for further computation
  68. if not config.read(configfile):
  69. raise IOError('Cannot open configuration file')
  70. client = MongoClient()
  71. dsatable = dict()
  72. cve_db = client.cvedb
  73. (state, err) = load_state()
  74. state['vendor'] = vendorname
  75. if action == 'update':
  76. (dsatable, src2dsa, dsa2cve, cvetable, src2month, src2sloccount, src2pop, src2deps) = load_DBs()
  77. elif action == 'status':
  78. (dsatable, src2dsa, dsa2cve, cvetable, src2month, src2sloccount, src2pop, src2deps) = load_DBs()
  79. #aptsec_status(sys.argv[2])
  80. elif action == 'show':
  81. (dsatable, src2dsa, dsa2cve, cvetable, src2month, src2sloccount, src2pop, src2deps) = load_DBs()
  82. #src2sum = plot_all(src2month)
  83. #save_DBs(dsatable, src2dsa, dsa2cve, cvetable, src2month, src2sloccount, src2pop, src2deps, src2sum)
  84. else:
  85. aptsec_help()
  86. __main__(action='update')