X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tools.py;h=80685de58e447c10a57ceb3498d5fa9748f9c5f3;hb=342c63a2acd2acfb5876b872cea47f152ca5f12e;hp=267ec3149066ab06d47b9ba14d2a89a0c2f4af16;hpb=9cb1916b17841fb5552e809193ee4b32860b14cc;p=nodemanager.git diff --git a/tools.py b/tools.py index 267ec31..80685de 100644 --- a/tools.py +++ b/tools.py @@ -3,18 +3,19 @@ """A few things that didn't seem to fit anywhere else.""" -import cPickle -import errno import os import pwd import tempfile -import threading import fcntl -import commands +import errno +import threading +import subprocess + 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" @@ -37,6 +38,8 @@ def get_if_from_hwaddr(hwaddr): if dev_hwaddr == hwaddr: return dev return None +#################### +# daemonizing def as_daemon_thread(run): """Call function with no arguments in its own thread.""" thr = threading.Thread(target=run) @@ -85,6 +88,8 @@ def fork_as(su, function, *args): os._exit(0) else: os.waitpid(child_pid, 0) +#################### +# manage files def pid_file(): """We use a pid file to ensure that only one copy of NM is running at a given time. If successful, this function will write a pid file containing the pid of the current process. The return value is the pid of the other running process, or None otherwise.""" other_pid = None @@ -115,6 +120,28 @@ def write_temp_file(do_write, mode=None, uidgid=None): finally: f.close() return temporary_filename +# replace a target file with a new contents - checks for changes +# return True if a change occurred, in which case +# chown/chmod settings should be taken care of +def replace_file_with_string (target, new_contents): + try: + current=file(target).read() + except: + current="" + # xxx if verbose, report diffs... + if current==new_contents: + return False + # overwrite target file + f=file(target,'w') + f.write(new_contents) + f.close() + return True + +# not needed yet - should that unlink the new file ? +#def replace_file_with_file (target, new): +# return replace_file_with_string (target, file(new).read()) + +#################### # utilities functions to get (cached) information from the node # get node_id from /etc/planetlab/node_id and cache it @@ -132,10 +159,13 @@ _root_context_arch=None def root_context_arch(): global _root_context_arch if not _root_context_arch: - _root_context_arch=commands.getoutput("uname -i") + sp=subprocess.Popen(["uname","-i"],stdout=subprocess.PIPE) + (_root_context_arch,_)=sp.communicate() + _root_context_arch=_root_context_arch.strip() return _root_context_arch +#################### class NMLock: def __init__(self, file): logger.log("tools: Lock %s initialized." % file, 2)