oops, one fragment had been oversimplified when porting to python3
[myplc.git] / bin / db-config
index f22e7f2..eb936c9 100755 (executable)
-#!/usr/bin/env /usr/bin/plcsh
+#!/usr/bin/plcsh
 #
 # Bootstraps the PLC database with a default administrator account and
 # a default site, defines default slice attribute types, and
 # creates/updates default system slices.
+# scan ordered scripts in /etc/planetlab/db-config.d
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
+# Thierry Parmentelat <thierry.parmentelat@inria.fr>
 #
-# $Id$
-# $URL$
+# to run with options, do e.g.
+# db-config -- -l
 
-import os,sys
-from optparse import OptionParser
+import os
+import sys
+from argparse import ArgumentParser
 
 from plc_config import PLCConfiguration
 
+
 def GetSnippets(directory):
     filenames = []
     if os.path.exists(directory):
         try:
             filenames = os.listdir(directory)
-        except OSError, e:
-            raise Exception, "Error when opening %s (%s)" % \
-                  (os.path.join(dir, file), e)
-            
-    ignored = (".bak","~",".rpmsave",".rpmnew",".orig")
+        except OSError as e:
+            raise Exception("Error when opening %s (%s)" %
+                            (os.path.join(dir, file), e))
+
+    # ignore files that contain either ~ or .
+    ignore_tokens = ("~", ".")
     numberedfiles = {}
     for filename in filenames:
-        shouldIgnore = False
-        for ignore in ignored:
-            if filename.endswith(ignore):
-                shouldIgnore = True
+        ignore = False
+        for token in ignore_tokens:
+            if filename.find(token) >= 0:
+                ignore = True
                 break
 
-        if not shouldIgnore:
+        if not ignore:
             parts = filename.split('-')
-            if len(parts)>=2:
+            if len(parts) >= 2:
                 name = '-'.join(parts)
                 try:
                     number = int(parts[0])
-                    entry = numberedfiles.get(number,[])
+                    entry = numberedfiles.get(number, [])
                     entry.append(name)
-                    numberedfiles[number]=entry
+                    numberedfiles[number] = entry
                 except ValueError:
-                    shouldIgnore = True
+                    ignore = True
             else:
-                shouldIgnore = True
+                ignore = True
 
-        if shouldIgnore:
-            print "db-config: ignoring %s snippet" % filename
+        if ignore:
+            print("db-config: ignored %s snippet" % filename)
 
     filenames = []
-    keys = numberedfiles.keys()
+    keys = list(numberedfiles.keys())
     keys.sort()
     for k in keys:
         for filename in numberedfiles[k]:
             filenames.append(filename)
     return filenames
 
+
 def main():
     cfg = PLCConfiguration()
     cfg.load()
     variables = cfg.variables()
 
-    usage="%prog [-- options] [steps]"
-    release_url = "$URL$"
-    parser = OptionParser(usage=usage, version="%prog " + release_url )
-    parser.add_option("-l","--list",dest="list_steps",action="store_true",default=False,
-                      help="Lists available steps")
-    parser.add_option("-v","--verbose",dest="verbose",action="store_true",default=False,
-                      help="Run verbosely")
+    usage = "%prog [-- options] [steps]"
+
+    parser = ArgumentParser(usage=usage)
+    parser.add_argument(
+        "-l", "--list",
+        dest="list_steps", action="store_true", default=False,
+        help="Lists available steps")
+    parser.add_argument(
+        "-v", "--verbose",
+        dest="verbose", action="store_true", default=False,
+        help="Run verbosely")
+    parser.add_argument('steps', nargs='*')
+
+    args = parser.parse_args()
+
+    globals_exec = globals().copy()
+    locals_exec = {}
 
-    (options,steps) = parser.parse_args()
-    
     # Load variables into dictionaries
-    for category_id, (category, variablelist) in variables.iteritems():
-        globals()[category_id] = dict(zip(variablelist.keys(),
-                                          [variable['value'] for variable in variablelist.values()]))
+    for category_id, (category, variablelist) in variables.items():
+        globals_exec[category_id] = dict(
+            zip(variablelist.keys(),
+            [variable['value'] for variable in variablelist.values()]))
 
-    directory="/etc/planetlab/db-config.d"
+    directory = "/etc/planetlab/db-config.d"
     snippets = GetSnippets(directory)
 
+    steps = args.steps
+
     for snippet in snippets:
-        
-        selected=False
+
+        selected = False
         # no steps provided on the command-line : run them all
         if not steps:
-            selected=True
+            selected = True
         else:
             for step in steps:
-                if snippet.find (step)>=0 : selected=True
-        if not selected: 
+                if snippet.find(step) >= 0:
+                    selected = True
+        if not selected:
             continue
-        
-        if options.list_steps:
-            if not options.verbose: 
-                print snippet
-            else: 
-                print "Found step %s/%s"%(directory,snippet)
-                os.system("rpm -qf %s/%s"%(directory,snippet))
+
+        if args.list_steps:
+            if not args.verbose:
+                print(snippet)
+            else:
+                print("Found step %s/%s" % (directory, snippet))
+                os.system("rpm -qf %s/%s" % (directory, snippet))
             continue
 
         fullpath = os.path.join(directory, snippet)
-        if options.verbose:
-            print "Running step %s"%fullpath
-        execfile(fullpath)
+        if args.verbose:
+            print("Running step %s" % fullpath)
+        with open(fullpath) as feed:
+            exec(feed.read(), globals_exec, locals_exec)
+
 
 if __name__ == '__main__':
     main()
-
-# Local variables:
-# tab-width: 4
-# mode: python
-# End: