From 80afcea54e4fc7d383e1463c0f33d3b7763b2252 Mon Sep 17 00:00:00 2001
From: Evan Wies <evan@neomantra.net>
Date: Thu, 4 Jul 2013 12:23:16 -0400
Subject: [PATCH] supervisorctl: add command-line options as module parameters

Adds more parameters which may be passed to supervisorctl:  config,
serverurl, username, password

Also refactored the various `module.run_command(build_a_string)` calls
into a single `run_supervisorctl` function.
---
 web_infrastructure/supervisorctl | 61 +++++++++++++++++++++++++++-----
 1 file changed, 52 insertions(+), 9 deletions(-)

diff --git a/web_infrastructure/supervisorctl b/web_infrastructure/supervisorctl
index 0185af5648e..d9f30be4c5a 100644
--- a/web_infrastructure/supervisorctl
+++ b/web_infrastructure/supervisorctl
@@ -32,6 +32,26 @@ options:
       - The name of the I(supervisord) program/process to manage
     required: true
     default: null
+  config:
+    description:
+      - configuration file path, passed as -c to supervisorctl
+    required: false
+    default: null
+  serverurl:
+    description:
+      - URL on which supervisord server is listening, passed as -s to supervisorctl
+    required: false
+    default: null
+  username:
+    description:
+      - username to use for authentication with server, passed as -u to supervisorctl
+    required: false
+    default: null
+  password:
+    description:
+      - password to use for authentication with server, passed as -p to supervisorctl
+    required: false
+    default: null
   state:
     description:
       - The state of service
@@ -45,11 +65,19 @@ author: Matt Wright
 EXAMPLES = '''
 # Manage the state of program to be in 'started' state.
 - supervisorctl: name=my_app state=started
+
+# Restart another_app using an alternate config file
+- supervisorctl: name=another_app state=restart config=/var/opt/my_project/supervisord.conf
+
 '''
 
 def main():
     arg_spec = dict(
         name=dict(required=True),
+        config=dict(required=False),
+        serverurl=dict(required=False),
+        username=dict(required=False),
+        password=dict(required=False),
         state=dict(required=True, choices=['present', 'started', 'restarted', 'stopped'])
     )
 
@@ -57,18 +85,33 @@ def main():
 
     name = module.params['name']
     state = module.params['state']
+    config = module.params.get('config')
+    serverurl = module.params.get('serverurl')
+    username = module.params.get('username')
+    password = module.params.get('password')
 
-    SUPERVISORCTL = module.get_bin_path('supervisorctl', True)
+    supervisorctl_args = [ module.get_bin_path('supervisorctl', True) ]
+    if config:    supervisorctl_args.extend(['-c', config])
+    if serverurl: supervisorctl_args.extend(['-s', serverurl])
+    if username:  supervisorctl_args.extend(['-u', username])
+    if password:  supervisorctl_args.extend(['-p', password])
 
-    rc, out, err = module.run_command('%s status' % SUPERVISORCTL)
+    def run_supervisorctl(cmd, name=None, **kwargs):
+        args = list(supervisorctl_args)  # copy the master args
+        args.append(cmd)
+        if name:
+            args.append(name)
+        return module.run_command(args, **kwargs)
+
+    rc, out, err = run_supervisorctl('status')
     present = name in out
 
     if state == 'present':
         if not present:
             if module.check_mode:
                 module.exit_json(changed=True)
-            module.run_command('%s reread' % SUPERVISORCTL, check_rc=True)
-            rc, out, err = module.run_command('%s add %s' % (SUPERVISORCTL, name))
+            run_supervisorctl('reread', check_rc=True)
+            rc, out, err = run_supervisorctl('add', name)
 
             if '%s: added process group' % name in out:
                 module.exit_json(changed=True, name=name, state=state)
@@ -77,7 +120,7 @@ def main():
 
         module.exit_json(changed=False, name=name, state=state)
 
-    rc, out, err = module.run_command('%s status %s' % (SUPERVISORCTL, name))
+    rc, out, err = run_supervisorctl('status', name)
     running = 'RUNNING' in out
 
     if running and state == 'started':
@@ -86,7 +129,7 @@ def main():
     if running and state == 'stopped':
         if module.check_mode:
             module.exit_json(changed=True)
-        rc, out, err = module.run_command('%s stop %s' % (SUPERVISORCTL, name))
+        rc, out, err = run_supervisorctl('stop', name)
 
         if '%s: stopped' % name in out:
             module.exit_json(changed=True, name=name, state=state)
@@ -96,8 +139,8 @@ def main():
     elif state == 'restarted':
         if module.check_mode:
             module.exit_json(changed=True)
-        rc, out, err = module.run_command('%s update %s' % (SUPERVISORCTL, name))
-        rc, out, err = module.run_command('%s restart %s' % (SUPERVISORCTL, name))
+        rc, out, err = run_supervisorctl('update', name)
+        rc, out, err = run_supervisorctl('restart', name)
 
         if '%s: started' % name in out:
             module.exit_json(changed=True, name=name, state=state)
@@ -107,7 +150,7 @@ def main():
     elif not running and state == 'started':
         if module.check_mode:
             module.exit_json(changed=True)
-        rc, out, err = module.run_command('%s start %s' % (SUPERVISORCTL, name))
+        rc, out, err = run_supervisorctl('start',name)
 
         if '%s: started' % name in out:
             module.exit_json(changed=True, name=name, state=state)