dir.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. '''
  2. Created on 26/06/2012
  3. @author: konstaa
  4. '''
  5. import core.api
  6. import re
  7. import os
  8. import logging
  9. import time
  10. import binascii
  11. class Plugin(core.api.Plugin, core.api.Parent, core.api.IConfigurable, core.api.IRunable):
  12. def __init__(self):
  13. self.reader = DirectoryReader()
  14. self.exclude_rules = []
  15. def declare_configuration(self, parser):
  16. parser.add_option("--general.non-recursively", action="store_true", default=False,
  17. help="If the option is set (True), sub-directories are not processed [default: %default]")
  18. parser.add_option("--general.exclude-files", default=r'^[.]',
  19. help="Defines the pattern to exclude files from processing [default: %default]")
  20. parser.add_option("--general.proctime.on", action="store_true", default=False,
  21. help="If the option is set (True), the tool measures processing time per every file [default: %default]")
  22. def configure(self, options):
  23. self.non_recursively = options.__dict__['general.non_recursively']
  24. self.add_exclude_rule(re.compile(options.__dict__['general.exclude_files']))
  25. self.is_proctime_enabled = options.__dict__['general.proctime.on']
  26. def initialize(self):
  27. if self.is_proctime_enabled == True:
  28. namespace = self.get_plugin_loader().get_database_loader().create_namespace('general')
  29. namespace.add_field('proctime', self.measure_proctime_type)
  30. def run(self, args):
  31. if len(args) == 0:
  32. self.reader.run(self, "./")
  33. for directory in args:
  34. self.reader.run(self, directory)
  35. def add_exclude_rule(self, re_compiled_pattern):
  36. self.exclude_rules.append(re_compiled_pattern)
  37. def is_file_excluded(self, file_name):
  38. for each in self.exclude_rules:
  39. if re.match(each, file_name) != None:
  40. return True
  41. return False
  42. class DirectoryReader():
  43. def run(self, plugin, directory):
  44. def run_recursively(plugin, directory):
  45. for fname in os.listdir(directory):
  46. full_path = os.path.join(directory, fname)
  47. if plugin.is_file_excluded(fname) == False:
  48. if os.path.isdir(full_path):
  49. if plugin.non_recursively == False:
  50. run_recursively(plugin, full_path)
  51. else:
  52. logging.info("Processing: " + full_path)
  53. ts = time.time()
  54. f = open(full_path, 'r');
  55. text = f.read();
  56. f.close()
  57. checksum = binascii.crc32(text) & 0xffffffff # to match python 3
  58. data = plugin.get_plugin_loader().get_database_loader().create_file_data(full_path, checksum, text)
  59. plugin.notify_children(data)
  60. if plugin.is_proctime_enabled == True:
  61. data.set_data('general', 'proctime', time.time() - ts)
  62. plugin.get_plugin_loader().get_database_loader().save_file_data(data)
  63. logging.debug("-" * 60)
  64. else:
  65. logging.info("Excluding: " + full_path)
  66. logging.debug("-" * 60)
  67. run_recursively(plugin, directory)