import os, re
from process import RemoteProcess
from server import SizelessConnectableServer
[docs]class RemoteLinuxProcess(RemoteProcess):
def __init__(self, server, pid, logfile):
super(RemoteLinuxProcess, self).__init__(server, pid, logfile)
[docs] def is_running(self):
"Returns bool."
lines = self.server.run_command("ps -l %d; echo $?" % (self.pid))[0].split('\n')
if lines[-1] == '':
lines = lines[:-1]
return lines[-1] == '0'
[docs] def kill(self):
"""
Kill process if running
"""
self.server.run_command("kill %d" % (self.pid))
[docs] def halt(self):
"""Temporarily stop a process."""
self.server.run_command("kill -STOP %d" % (self.pid))
[docs] def resume(self):
"""Resume a halted process."""
self.server.run_command("kill -CONT %d" % (self.pid))
[docs] def clean(self):
"""
Remove the log file
"""
if self.logfile is not None:
self.server.run_command("rm %s" % (self.logfile))
[docs]class SizelessLinuxServer(SizelessConnectableServer):
def __init__(self, utup, cpus, roots, credentials):
super(SizelessLinuxServer, self).__init__(utup, cpus, roots, credentials)
[docs] def check_connection(self):
if not self.connected:
return False
try:
stdout, stderr = self.run_command("date")
if stdout != '':
return True
except:
pass
self.connected = False
return False
# Basic operations
[docs] def list_disk(self, path):
"""
path: subdirectory
"""
ansi_escape = re.compile(r'\x1b[^m]*m')
stdout, stderr = self.run_command("ls -1 " + self.fullpath(path))
for filename in stdout.split('\n'):
yield ansi_escape.sub('', filename)
[docs] def read_file(self, filepath=None):
"Returns string."
return self.run_command("cat " + self.fullpath(filepath) + "\n")[0]
[docs] def start_process(self, command, path=None):
logfile, stderr = self.run_command("mktemp")
self.run_command("nohup %s > %s 2>&1 &" % (command, logfile), path)
pid = int(self.run_command("echo $!")[0].split('\n')[0])
return RemoteLinuxProcess(self, pid, logfile)
[docs] def cwd(self, path):
self.run_command("cd " + path + "\n")
[docs] def active_processes(self, procname):
return int(self.run_command("ps -Af | grep " + procname + " | wc -l")[0]) - 1