Added PlanetLabConf functionality.
authorDavid E. Eisenstat <deisenst@cs.princeton.edu>
Mon, 30 Oct 2006 20:09:06 +0000 (20:09 +0000)
committerDavid E. Eisenstat <deisenst@cs.princeton.edu>
Mon, 30 Oct 2006 20:09:06 +0000 (20:09 +0000)
cf.py [new file with mode: 0644]
nm.py

diff --git a/cf.py b/cf.py
new file mode 100644 (file)
index 0000000..868db2c
--- /dev/null
+++ b/cf.py
@@ -0,0 +1,59 @@
+"""configuration files"""
+
+import grp
+import os
+import pwd
+import sha
+import string
+import urllib
+
+import logger
+import tools
+
+
+BOOT_SERVER = "plc-a.demo.vmware"
+
+
+def checksum(path):
+    try:
+        f = open(path)
+        try: return sha.new(f.read()).digest()
+        finally: f.close()
+    except IOError: return None
+
+def system(cmd):
+    if cmd:
+        logger.log('cf: running command %s' % cmd)
+        return os.system(cmd)
+    else: return 0
+
+def conf_file(cf_rec):
+    if not cf_rec['enabled']: return
+    dest = cf_rec['dest']
+    logger.log('cf: considering file %s' % dest)
+    err_cmd = cf_rec['error_cmd']
+    mode = string.atoi(cf_rec['file_permissions'], base=8)
+    uid = pwd.getpwnam(cf_rec['file_owner'])[2]
+    gid = grp.getgrnam(cf_rec['file_group'])[2]
+    src, msg = urllib.urlretrieve('https://%s%s' % (BOOT_SERVER, cf_rec['source']))
+    if not cf_rec['always_update'] and checksum(src) == checksum(dest):
+        logger.log('cf: skipping file %s, always_update is false and checksums are identical' % dest)
+        return
+    if system(cf_rec['preinstall_cmd']):
+        system(err_cmd)
+        if not cf_rec['ignore_cmd_errors']: return
+    logger.log('cf: installing file %s' % dest)
+    os.chmod(src, mode)
+    os.chown(src, uid, gid)
+    os.rename(src, dest)
+    if system(cf_rec['postinstall_cmd']): system(err_cmd)
+
+def GetSlivers_callback(data):
+    def run():
+        for d in data:
+            for f in d['conf_files']:
+                try: conf_file(f)
+                except: logger.log_exc()
+    tools.as_daemon_thread(run)
+
+def start(options): pass
diff --git a/nm.py b/nm.py
index 3f52609..cb76340 100644 (file)
--- a/nm.py
+++ b/nm.py
@@ -4,6 +4,7 @@ import optparse
 import time
 import xmlrpclib
 
+import cf
 import logger
 import sm
 import tools
@@ -37,6 +38,7 @@ def run():
             return
 
         start_and_register_callback(sm)
+        start_and_register_callback(cf)
         while True:
             try: GetSlivers()
             except: logger.log_exc()