Arguments can be passed to scripts. Fixes #69
authorFrederic Massart <fred@moodle.com>
Mon, 10 Mar 2014 04:33:21 +0000 (12:33 +0800)
committerFrederic Massart <fred@moodle.com>
Mon, 10 Mar 2014 04:33:21 +0000 (12:33 +0800)
lib/commands/run.py
lib/moodle.py
lib/scripts.py

index 13b1114..4cba201 100644 (file)
@@ -63,6 +63,14 @@ class RunCommand(Command):
             }
         ),
         (
+            ['-g', '--arguments'],
+            {
+                'help': 'a list of arguments to pass to the script. Use --arguments="--list of --arguments" if you need to use dashes. Otherwise add -- after the argument list.',
+                'metavar': 'arguments',
+                'nargs': '+'
+            }
+        ),
+        (
             ['script'],
             {
                 'nargs': '?',
@@ -107,7 +115,7 @@ class RunCommand(Command):
         for M in Mlist:
             logging.info('Running \'%s\' on \'%s\'' % (args.script, M.get('identifier')))
             try:
-                M.runScript(args.script, stderr=None, stdout=None)
+                M.runScript(args.script, stderr=None, stdout=None, arguments=args.arguments)
             except Exception as e:
                 logging.warning('Error while running the script on %s' % M.get('identifier'))
                 logging.debug(e)
index db005d1..6913a9b 100644 (file)
@@ -607,9 +607,9 @@ class Moodle(object):
 
         self.reload()
 
-    def runScript(self, scriptname, **kwargs):
+    def runScript(self, scriptname, arguments=None, **kwargs):
         """Runs a script on the instance"""
-        return Scripts.run(scriptname, self.get('path'), cmdkwargs=kwargs)
+        return Scripts.run(scriptname, self.get('path'), arguments=arguments, cmdkwargs=kwargs)
 
     def update(self, remote=None):
         """Update the instance from the remote"""
index a9b3b65..ee73667 100644 (file)
@@ -121,16 +121,23 @@ class Scripts(object):
         return cli
 
     @classmethod
-    def run(cls, script, path, cmdkwargs={}):
+    def run(cls, script, path, arguments=None, cmdkwargs={}):
         """Executes a script at in a certain directory"""
 
+        # Converts arguments to a string.
+        arguments = '' if arguments == None else arguments
+        if type(arguments) == list:
+            arguments = ' '.join(arguments)
+        arguments = ' ' + arguments
+
         cli = cls.find(script)
         if cli.endswith('.php'):
             dest = os.path.join(path, 'mdkscriptrun.php')
             logging.debug('Copying %s to %s' % (cli, dest))
             shutil.copyfile(cli, dest)
 
-            cmd = '%s %s' % (C.get('php'), dest)
+            cmd = '%s %s %s' % (C.get('php'), dest, arguments)
+
             result = process(cmd, cwd=path, **cmdkwargs)
             os.remove(dest)
         elif cli.endswith('.sh'):
@@ -139,7 +146,7 @@ class Scripts(object):
             shutil.copyfile(cli, dest)
             os.chmod(dest, stat.S_IRUSR | stat.S_IXUSR)
 
-            cmd = '%s' % (dest)
+            cmd = '%s %s' % (dest, arguments)
             result = process(cmd, cwd=path, **cmdkwargs)
             os.remove(dest)
         else: