Add copyright/license blurb.
[toast/findwwwritable.git] / findwwwritable.py
index efd77ad96826356948c94f47cbe95566a5439f89..1a0b82b1159af63f880d699ac0d8d023130a4712 100755 (executable)
@@ -1,10 +1,29 @@
 #!/usr/bin/python
 # python 2.7+ is used
 
+# Copyright (C) 2011-2012 Philipp Spitzer, gregor herrmann, Stefan Stahl
+#
+# This file is part of findwwwritable.
+#
+# findwwwritable is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 2 of the License, or (at your option)
+# any later version.
+#
+# findwwwritable is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# findwwwritable.  If not, see <http://www.gnu.org/licenses/>.
+
 import os
+import sys
 import stat
 from os.path import join
 import argparse
+import ConfigParser
 
 
 def collect_writable_dirs(basedir, uids, gids):
@@ -87,7 +106,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 +119,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 +163,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)