import sioc only when needed.
[nodemanager.git] / tools.py
index 776a8d4..941838b 100644 (file)
--- a/tools.py
+++ b/tools.py
@@ -7,12 +7,30 @@ import pwd
 import tempfile
 import threading
 import fcntl
-
+import commands
 import logger
 
-
 PID_FILE = '/var/run/nm.pid'
 
+def get_default_if():
+    interface = get_if_from_hwaddr(get_hwaddr_from_plnode())
+    if not interface: interface = "eth0"
+    return interface
+
+def get_hwaddr_from_plnode():
+    for line in open("/usr/boot/plnode.txt", 'r').readlines():
+        if line.startswith("NET_DEVICE"):
+            return line.split("=")[1].strip().strip('"')
+    return None
+
+def get_if_from_hwaddr(hwaddr):
+   import sioc
+   devs = sioc.gifconf()
+   for dev in devs:
+      dev_hwaddr = sioc.gifhwaddr(dev)
+      if dev_hwaddr == hwaddr: return dev
+   return None
+
 def as_daemon_thread(run):
     """Call function <run> with no arguments in its own thread."""
     thr = threading.Thread(target=run)
@@ -91,6 +109,38 @@ def write_temp_file(do_write, mode=None, uidgid=None):
     finally: f.close()
     return temporary_filename
 
+# utilities functions to get (cached) information from the node
+
+# get node_id from /etc/planetlab/node_id and cache it
+_node_id=None
+def node_id():
+    global _node_id
+    if _node_id is None:
+        try:
+            _node_id=int(file("/etc/planetlab/node_id").read())
+        except:
+            _node_id=""
+    return _node_id
+
+# get slicefamily from /etc/planetlab/slicefamily and cache it
+# http://svn.planet-lab.org/wiki/SliceFamily
+_slicefamily=None
+def slicefamily():
+    global _slicefamily
+    if _slicefamily is None:
+        try:
+            _slicefamily=file("/etc/planetlab/slicefamily").read().strip()
+        except:
+            _slicefamily=""
+    return _slicefamily
+
+_root_context_arch=None
+def root_context_arch():
+    global _root_context_arch
+    if not _root_context_arch:
+        _root_context_arch=commands.getoutput("uname -i")
+    return _root_context_arch
+
 
 class NMLock:
     def __init__(self, file):