diff options
author | Scott Moser <smoser@nelson> | 2010-01-06 12:39:47 -0500 |
---|---|---|
committer | Scott Moser <smoser@nelson> | 2010-01-06 12:39:47 -0500 |
commit | ca3cafbb65655bf0de40e8a44b608932694a5594 (patch) | |
tree | fe0360e5af37d5b6a22055ed87c63db86230525e /cloud-init-run-module.py | |
parent | 86b6aad19f3796402dbc2f6e90a47081e8b309a0 (diff) | |
download | vyos-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
Diffstat (limited to 'cloud-init-run-module.py')
-rwxr-xr-x | cloud-init-run-module.py | 50 |
1 files changed, 50 insertions, 0 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() |