Implemented config files.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Thu, 28 Jun 2012 21:30:07 +0000 (23:30 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Thu, 28 Jun 2012 21:30:07 +0000 (23:30 +0200)
findwwwritable.py

index efd77ad..e240110 100755 (executable)
@@ -2,9 +2,11 @@
 # python 2.7+ is used
 
 import os
+import sys
 import stat
 from os.path import join
 import argparse
+import ConfigParser
 
 
 def collect_writable_dirs(basedir, uids, gids):
@@ -87,7 +89,7 @@ def apply_whitelist(writable_dirs, whitelist):
 if __name__ == '__main__':
     # constants
     PROGNAME = 'findwwwritable'
-    VERSION = '0.0.2'
+    VERSION = '0.0.3'
 
     # variables
     uids = [33]                # user ids of the user whos write permissions should be found
@@ -100,15 +102,42 @@ if __name__ == '__main__':
     # parse command line arguments
     parser = argparse.ArgumentParser(description='find directories that are writeable by www-data (or an other user)')
     parser.add_argument('-v', '--version', action='version', version='{} {}'.format(PROGNAME, VERSION))
-    parser.add_argument('-c', '--config', help='configuration file (default: {})'.format(config_filename), default=config_filename)
-    parser.add_argument('-w', '--whitelist', help='filename of whitelist (default: {})'.format(whitelist_filename), default=whitelist_filename)
+    parser.add_argument('-c', '--config', help='additional configuration file')
+    parser.add_argument('-w', '--whitelist', help='filename of whitelist (default: {})'.format(whitelist_filename))
     parser.add_argument('-f', '--full', help='do not omit subdirs', action='store_true')
     parser.add_argument('-u', '--uid', dest='uids', help='system uid of the user. may be specified more than once. (default: {})'.format(uids), action='append', type=int)
     parser.add_argument('-g', '--gid', dest='gids', help='system gid of the user. may be specified more than once. (default: {})'.format(gids), action='append', type=int)
-    parser.add_argument('basedir', nargs='*', default=basedir, help='directories are searched below basedir (default: {})'.format(basedir))
+    parser.add_argument('basedir', nargs='*', help='directories are searched below basedir (default: {})'.format(basedir))
     args = parser.parse_args()
-    if args.uids is None: args.uids = uids
-    if args.gids is None: args.gids = gids
+
+    # parse config file
+    config = ConfigParser.ConfigParser({'whitelist': whitelist_filename, 'full': '0'})
+    config_files = [config_filename, os.path.expanduser('~/.'+PROGNAME)]
+    if not args.config is None: config_files.append(args.config)
+    config.read(config_files)
+    if args.whitelist is None: args.whitelist = config.get(PROGNAME, 'whitelist')
+    if not args.full: args.full = config.getboolean(PROGNAME, 'full')
+    if args.uids is None:
+        if config.has_option(PROGNAME, 'uids'):
+            uids = config.get(PROGNAME, 'uids')
+            uids = uids.split(' ')
+            args.uids = map(int, uids)
+        else:
+            args.uids = uids
+    if args.gids is None:
+        if config.has_option(PROGNAME, 'gids'):
+            gids = config.get(PROGNAME, 'gids')
+            gids = gids.split(' ')
+            args.gids = map(int, gids)
+        else:
+            args.gids = gids
+    if len(args.basedir) == 0:
+        if config.has_option(PROGNAME, 'basedir'):
+            basedir = config.get(PROGNAME, 'basedir')
+            basedir = basedir.split(' ')
+            args.basedir = map(int, basedir)
+        else:
+            args.basedir = [basedir]
 
     # read whitelist
     whitelist = read_whitelist(args.whitelist)
@@ -117,6 +146,7 @@ if __name__ == '__main__':
     writable_dirs = []
     for basedir in args.basedir:
         writable_dirs.extend(collect_writable_dirs(basedir, args.uids, args.gids))
+    writable_dirs = sorted(set(writable_dirs))
     if not args.full: writable_dirs = summarize_dirs(writable_dirs)
     writable_dirs = apply_whitelist(writable_dirs, whitelist)