X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fnode.py;h=f75368dca092d95812007b366229171e74c6087d;hb=33c786e768384b7d9b1244c3c3cb73ed7f70a994;hp=cbc0099eb6bbe2f7736d281c4ac113e2541dfcd4;hpb=752d0aaffb889011159fef73c02d838e538d7144;p=nepi.git diff --git a/src/nepi/resources/linux/node.py b/src/nepi/resources/linux/node.py index cbc0099e..f75368dc 100644 --- a/src/nepi/resources/linux/node.py +++ b/src/nepi/resources/linux/node.py @@ -188,6 +188,12 @@ class LinuxNode(ResourceManager): "releasing the resource", flags = Flags.ExecReadOnly) + gateway_user = Attribute("gatewayUser", "Gateway account username", + flags = Flags.ExecReadOnly) + + gateway = Attribute("gateway", "Hostname of the gateway machine", + flags = Flags.ExecReadOnly) + cls._register_attribute(hostname) cls._register_attribute(username) cls._register_attribute(port) @@ -198,13 +204,15 @@ class LinuxNode(ResourceManager): cls._register_attribute(clean_experiment) cls._register_attribute(clean_processes) cls._register_attribute(tear_down) + cls._register_attribute(gateway_user) + cls._register_attribute(gateway) def __init__(self, ec, guid): super(LinuxNode, self).__init__(ec, guid) self._os = None # home directory at Linux host self._home_dir = "" - + # lock to prevent concurrent applications on the same node, # to execute commands at the same time. There are potential # concurrency issues when using SSH to a same host from @@ -389,22 +397,32 @@ class LinuxNode(ResourceManager): # TODO: Validate! return True - def clean_processes(self, killer = False): + def clean_processes(self): self.info("Cleaning up processes") - - if killer: - # Hardcore kill - cmd = ("sudo -S killall python tcpdump || /bin/true ; " + - "sudo -S killall python tcpdump || /bin/true ; " + - "sudo -S kill $(ps -N -T -o pid --no-heading | grep -v $PPID | sort) || /bin/true ; " + - "sudo -S killall -u root || /bin/true ; " + - "sudo -S killall -u root || /bin/true ; ") - else: - # Be gentler... + + if self.get("username") != 'root': cmd = ("sudo -S killall tcpdump || /bin/true ; " + - "sudo -S killall tcpdump || /bin/true ; " + - "sudo -S killall -u %s || /bin/true ; " % self.get("username") + + "sudo -S kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; " + "sudo -S killall -u %s || /bin/true ; " % self.get("username")) + else: + if self.state >= ResourceState.READY: + import pickle + pids = pickle.load(open("/tmp/save.proc", "rb")) + pids_temp = dict() + ps_aux = "ps aux |awk '{print $2,$11}'" + (out, err), proc = self.execute(ps_aux) + for line in out.strip().split("\n"): + parts = line.strip().split(" ") + pids_temp[parts[0]] = parts[1] + kill_pids = set(pids_temp.items()) - set(pids.items()) + kill_pids = ' '.join(dict(kill_pids).keys()) + + cmd = ("killall tcpdump || /bin/true ; " + + "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; " + + "kill %s || /bin/true ; " % kill_pids) + else: + cmd = ("killall tcpdump || /bin/true ; " + + "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; ") out = err = "" (out, err), proc = self.execute(cmd, retry = 1, with_lock = True) @@ -453,7 +471,7 @@ class LinuxNode(ResourceManager): if self.localhost: (out, err), proc = execfuncs.lexec(command, - user = user, + user = self.get("username"), # still problem with localhost sudo = sudo, stdin = stdin, env = env) @@ -465,6 +483,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, sudo = sudo, stdin = stdin, @@ -487,6 +507,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, sudo = sudo, stdin = stdin, @@ -540,6 +562,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, identity = self.get("identity"), server_key = self.get("serverKey"), @@ -558,6 +582,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, identity = self.get("identity"), server_key = self.get("serverKey") @@ -575,6 +601,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, identity = self.get("identity"), server_key = self.get("serverKey") @@ -597,6 +625,8 @@ class LinuxNode(ResourceManager): host = self.get("hostname"), user = self.get("username"), port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), agent = True, sudo = sudo, identity = self.get("identity"), @@ -615,6 +645,8 @@ class LinuxNode(ResourceManager): (out, err), proc = sshfuncs.rcopy( src, dst, port = self.get("port"), + gwuser = self.get("gatewayUser"), + gw = self.get("gateway"), identity = self.get("identity"), server_key = self.get("serverKey"), recursive = True, @@ -992,10 +1024,10 @@ class LinuxNode(ResourceManager): self._home_dir = out.strip() except: trace = traceback.format_exc() - msg = "Impossible to retrieve HOME directory" % trace + msg = "Impossible to retrieve HOME directory %s" % trace if not self._home_dir: - self.error(msg, out, err) + self.error(msg) raise RuntimeError, msg def filter_existing_files(self, src, dst):