summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@nelson>2010-01-06 12:39:47 -0500
committerScott Moser <smoser@nelson>2010-01-06 12:39:47 -0500
commitca3cafbb65655bf0de40e8a44b608932694a5594 (patch)
treefe0360e5af37d5b6a22055ed87c63db86230525e
parent86b6aad19f3796402dbc2f6e90a47081e8b309a0 (diff)
downloadvyos-cloud-init-ca3cafbb65655bf0de40e8a44b608932694a5594.tar.gz
vyos-cloud-init-ca3cafbb65655bf0de40e8a44b608932694a5594.zip
add cloud-init-run-module and ec2init/execute.py
cloud-init-run-module handles some boilerplate code for running items on a 'frequency'. It has the following usefulness - a config module can be put into ec2init dir and implement a 'run' method that takes a list of arguments and the path to a config file - it handles invoking module.run() only at a given frequency This is similar to karmic's ec2init's "run_once_ever" or run_once_per_ami execute.py is an example module that executes the arguments given to it An example usage in an upstart job would be with a 'exec' line like: exec cloud-init-run-module once_per_ami clean-core execute rm /var/run/core The above would then run the command 'rm /var/run/core' only once
-rwxr-xr-xcloud-init-run-module.py50
-rw-r--r--ec2init/execute.py14
-rwxr-xr-xsetup.py4
3 files changed, 67 insertions, 1 deletions
diff --git a/cloud-init-run-module.py b/cloud-init-run-module.py
new file mode 100755
index 00000000..5a35de5d
--- /dev/null
+++ b/cloud-init-run-module.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+import sys
+import ec2init
+
+def Usage(out = sys.stdout):
+ out.write("Usage: cloud-init-run-module freq sem-name mod-name [args]")
+
+def main():
+ # expect to be called with
+ # <freq> <semaphore-name> <module-name> args
+ if len(sys.argv) < 4:
+ Usage(sys.stderr)
+ sys.exit(1)
+
+ (freq,semname,modname)=sys.argv[1:4]
+ run_args=sys.argv[4:]
+
+ if ec2init.sem_has_run(semname,freq):
+ sys.stderr.write("%s already ran %s\n" % (semname,freq))
+ sys.exit(0)
+
+ try:
+ mod = __import__('ec2init.' + modname)
+ inst = getattr(mod,modname)
+ except:
+ sys.stderr.write("Failed to load module ec2init.%s\n" % modname)
+ sys.exit(1)
+
+ import os
+
+ cfg_path = None
+ cfg_env_name = "CLOUD_CFG"
+ if os.environ.has_key(cfg_env_name):
+ cfg_path = os.environ[cfg_env_name]
+
+ try:
+ if not ec2init.sem_acquire(semname,freq):
+ sys.stderr.write("Failed to acquire lock on %s\n" % semname)
+ sys.exit(1)
+
+ inst.run(run_args,cfg_path)
+ except:
+ ec2init.sem_clear(semname,freq)
+ raise
+
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
diff --git a/ec2init/execute.py b/ec2init/execute.py
new file mode 100644
index 00000000..d7386663
--- /dev/null
+++ b/ec2init/execute.py
@@ -0,0 +1,14 @@
+def run(list,cfg):
+ import subprocess
+ subprocess.Popen(list).communicate()
+ retcode = subprocess.call(list)
+
+ if retcode == 0:
+ return
+
+ if retcode < 0:
+ str="Cmd terminated by signal %s\n" % -retcode
+ else:
+ str="Cmd returned %s\n" % retcode
+ str+=' '.join(list)
+ raise Exception(str)
diff --git a/setup.py b/setup.py
index aaa7cbeb..0f86cb54 100755
--- a/setup.py
+++ b/setup.py
@@ -36,7 +36,9 @@ setup(name='EC2-init',
'ec2-set-hostname.py',
'ec2-wait-for-meta-data-service.py',
'ec2-init.py',
- 'ec2-is-compat-env'],
+ 'ec2-is-compat-env',
+ 'cloud-init-run-module.py'
+ ],
data_files=[('/etc/ec2-init', ['ec2-config.cfg']),
('/etc/ec2-init/templates', glob('templates/*')),
('/etc/init', ['ec2init.conf']),