import os
import random
import re
-import socket
import tempfile
import time
import threading
"""
Supported flavors of Linux OS
"""
- FEDORA_8 = "f8"
- FEDORA_12 = "f12"
- FEDORA_14 = "f14"
- FEDORA = "fedora"
- UBUNTU = "ubuntu"
- DEBIAN = "debian"
+ DEBIAN = 1
+ UBUNTU = 1 << 1
+ FEDORA = 1 << 2
+ FEDORA_8 = 1 << 3 | FEDORA
+ FEDORA_12 = 1 << 4 | FEDORA
+ FEDORA_14 = 1 << 5 | FEDORA
@clsinit_copy
class LinuxNode(ResourceManager):
_rtype = "linux::Node"
_help = "Controls Linux host machines ( either localhost or a host " \
"that can be accessed using a SSH key)"
- _backend_type = "linux"
+ _platform = "linux"
@classmethod
def _register_attributes(cls):
out = self.get_os()
- if out.find("Fedora release 8") == 0:
- self._os = OSType.FEDORA_8
- elif out.find("Fedora release 12") == 0:
- self._os = OSType.FEDORA_12
- elif out.find("Fedora release 14") == 0:
- self._os = OSType.FEDORA_14
- elif out.find("Fedora release") == 0:
- self._os = OSType.FEDORA
- elif out.find("Debian") == 0:
+ if out.find("Debian") == 0:
self._os = OSType.DEBIAN
elif out.find("Ubuntu") ==0:
self._os = OSType.UBUNTU
+ elif out.find("Fedora release") == 0:
+ self._os = OSType.FEDORA
+ if out.find("Fedora release 8") == 0:
+ self._os = OSType.FEDORA_8
+ elif out.find("Fedora release 12") == 0:
+ self._os = OSType.FEDORA_12
+ elif out.find("Fedora release 14") == 0:
+ self._os = OSType.FEDORA_14
else:
msg = "Unsupported OS"
self.error(msg, out)
@property
def use_deb(self):
- return self.os in [OSType.DEBIAN, OSType.UBUNTU]
+ return (self.os & (OSType.DEBIAN|OSType.UBUNTU))
@property
def use_rpm(self):
- return self.os in [OSType.FEDORA_12, OSType.FEDORA_14, OSType.FEDORA_8,
- OSType.FEDORA]
+ return (self.os & OSType.FEDORA)
@property
def localhost(self):
# Get Public IP address if possible
if not self.get("ip"):
- ip = None
-
- if self.localhost:
- ip = socket.gethostbyname(socket.gethostname())
- else:
- try:
- ip = socket.gethostbyname(self.get("hostname"))
- except:
- msg = "DNS can not resolve hostname %s" % self.get("hostname")
- self.debug(msg)
+ try:
+ ip = sshfuncs.gethostbyname(self.get("hostname"))
+ except:
+ msg = "DNS can not resolve hostname %s" % self.get("hostname")
+ self.debug(msg)
self.set("ip", ip)
if self.get("username") != 'root':
cmd = ("sudo -S killall tcpdump || /bin/true ; " +
+ "sudo -S kill -9 $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; " +
"sudo -S killall -u %s || /bin/true ; " % self.get("username"))
else:
if self.state >= ResourceState.READY:
kill_pids = ' '.join(dict(kill_pids).keys())
cmd = ("killall tcpdump || /bin/true ; " +
- "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; " +
+ "kill $(ps aux | grep '[.]nepi' | 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 ; ")
+ "kill $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; ")
else:
cmd = ("killall tcpdump || /bin/true ; " +
- "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; ")
+ "kill $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; ")
(out, err), proc = self.execute(cmd, retry = 1, with_lock = True)
return self.execute(cmd, with_lock = True)
def run_and_wait(self, command, home,
- shfile = "cmd.sh",
- env = None,
- overwrite = True,
- pidfile = "pidfile",
- ecodefile = "exitcode",
- stdin = None,
- stdout = "stdout",
- stderr = "stderr",
- sudo = False,
- tty = False,
- raise_on_error = True):
+ shfile="cmd.sh",
+ env=None,
+ overwrite=True,
+ wait_run=True,
+ pidfile="pidfile",
+ ecodefile="exitcode",
+ stdin=None,
+ stdout="stdout",
+ stderr="stderr",
+ sudo=False,
+ tty=False,
+ raise_on_error=True):
"""
Uploads the 'command' to a bash script in the host.
Then runs the script detached in background in the host, and
pidfile = pidfile,
raise_on_error = raise_on_error)
- # wait until command finishes to execute
- self.wait_run(pid, ppid)
-
- (eout, err), proc = self.check_errors(home,
- ecodefile = ecodefile,
- stderr = stderr)
+ if wait_run:
+ # wait until command finishes to execute
+ self.wait_run(pid, ppid)
+
+ (eout, err), proc = self.check_errors(home,
+ ecodefile = ecodefile,
+ stderr = stderr)
- # Out is what was written in the stderr file
- if err:
- msg = " Failed to run command '%s' " % command
- self.error(msg, eout, err)
+ # Out is what was written in the stderr file
+ if err:
+ msg = " Failed to run command '%s' " % command
+ self.error(msg, eout, err)
- if raise_on_error:
- raise RuntimeError, msg
+ if raise_on_error:
+ raise RuntimeError, msg
(out, oerr), proc = self.check_output(home, stdout)
return (out, err), proc
-
+
def exitcode(self, home, ecodefile = "exitcode"):
"""
Get the exit code of an application.
return ExitCode.ERROR
def upload_command(self, command,
- shfile = "cmd.sh",
- ecodefile = "exitcode",
- overwrite = True,
- env = None):
+ shfile="cmd.sh",
+ ecodefile="exitcode",
+ overwrite=True,
+ env=None):
""" Saves the command as a bash script file in the remote host, and
forces to save the exit code of the command execution to the ecodefile
"""
# Add environ to command
command = environ + command
- return self.upload(command, shfile, text = True, overwrite = overwrite)
+ return self.upload(command, shfile, text=True, overwrite=overwrite)
- def format_environment(self, env, inline = False):
+ def format_environment(self, env, inline=False):
""" Formats the environment variables for a command to be executed
either as an inline command
(i.e. export PYTHONPATH=src/..; export LALAL= ..;python script.py) or