diff options
Diffstat (limited to 'modules')
| -rwxr-xr-x | modules/Makefile | 19 | ||||
| -rw-r--r-- | modules/__init__.py | 0 | ||||
| -rw-r--r-- | modules/command.py | 40 | ||||
| -rw-r--r-- | modules/copyfile.py | 115 | ||||
| -rwxr-xr-x | modules/func_module.py | 67 | ||||
| -rwxr-xr-x | modules/hardware.py | 133 | ||||
| -rwxr-xr-x | modules/process.py | 79 | ||||
| -rwxr-xr-x | modules/reboot.py | 29 | ||||
| -rwxr-xr-x | modules/service.py | 59 | ||||
| -rwxr-xr-x | modules/smart.py | 56 | ||||
| -rwxr-xr-x | modules/test.py | 19 | ||||
| -rwxr-xr-x | modules/virt.py | 274 | ||||
| -rw-r--r-- | modules/yum.py | 48 |
13 files changed, 0 insertions, 938 deletions
diff --git a/modules/Makefile b/modules/Makefile deleted file mode 100755 index 86a3db8..0000000 --- a/modules/Makefile +++ /dev/null @@ -1,19 +0,0 @@ - - -PYFILES = $(wildcard *.py) - -PYCHECKER = /usr/bin/pychecker -PYFLAKES = /usr/bin/pyflakes - -clean:: - @rm -fv *.pyc *~ .*~ *.pyo - @find . -name .\#\* -exec rm -fv {} \; - @rm -fv *.rpm - - -pychecker:: - @$(PYCHECKER) $(PYFILES) || exit 0 - -pyflakes:: - @$(PYFLAKES) $(PYFILES) || exit 0 - diff --git a/modules/__init__.py b/modules/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/modules/__init__.py +++ /dev/null diff --git a/modules/command.py b/modules/command.py deleted file mode 100644 index 5dc0292..0000000 --- a/modules/command.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2007, Red Hat, Inc -# James Bowes <jbowes@redhat.com> -# -# This software may be freely redistributed under the terms of the GNU -# general public license. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -""" -Abitrary command execution module for func. -""" - -from modules import func_module - -import sub_process - -class Command(func_module.FuncModule): - - def __init__(self): - self.methods = { - "run" : self.run - } - func_module.FuncModule.__init__(self) - - def run(self, command): - """ - Runs a command, returning the return code, stdout, and stderr as a tuple. - NOT FOR USE WITH INTERACTIVE COMMANDS. - """ - - cmdref = sub_process.Popen(command.split(),stdout=sub_process.PIPE,stderr=sub_process.PIPE, shell=False) - data = cmdref.communicate() - return (cmdref.returncode, data[0], data[1]) - -methods = Command() -register_rpc = methods.register_rpc - - diff --git a/modules/copyfile.py b/modules/copyfile.py deleted file mode 100644 index 58b5ea4..0000000 --- a/modules/copyfile.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2007, Red Hat, Inc -# seth vidal -# -# This software may be freely redistributed under the terms of the GNU -# general public license. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -import sha -import os -import time -import shutil - -from modules import func_module - - - - -class CopyFile(func_module.FuncModule): - - def __init__(self): - self.methods = { - "copyfile" : self.copyfile, - "checksum" : self.checksum - } - func_module.FuncModule.__init__(self) - - def checksum(self, thing): - - CHUNK=2**16 - thissum = sha.new() - if os.path.exists(thing): - fo = open(thing, 'r', CHUNK) - chunk = fo.read - while chunk: - chunk = fo.read(CHUNK) - thissum.update(chunk) - fo.close() - del fo - else: - # assuming it's a string of some kind - thissum.update(thing) - - return thissum.hexdigest() - - - def copyfile(self, filepath, filebuf, mode=0644, uid=0, gid=0, force=None): - # -1 = problem file was not copied - # 1 = file was copied - # 0 = file was not copied b/c file is unchanged - - - # we should probably verify mode,uid,gid are valid as well - - dirpath = os.path.dirname(filepath) - basepath = os.path.basename(filepath) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - remote_sum = self.checksum(filebuf) - local_sum = 0 - if os.path.exists(filepath): - local_sum = self.checksum(filepath) - - if remote_sum != local_sum or force is not None: - # back up the localone - if os.path.exists(filepath): - if not self._backuplocal(filepath): - return -1 - - # do the new write - try: - fo = open(filepath, 'w') - fo.write(filebuf) - fo.close() - del fo - except (IOError, OSError), e: - # XXX logger output here - return -1 - else: - return 0 - - # hmm, need to figure out proper exceptions -akl - try: - # we could intify the mode here if it's a string - os.chmod(filepath, mode) - os.chown(filepath, uid, gid) - except (IOError, OSError), e: - return -1 - - return 1 - - def _backuplocal(self, fn): - """ - make a date-marked backup of the specified file, - return True or False on success or failure - """ - # backups named basename-YYYY-MM-DD@HH:MM~ - ext = time.strftime("%Y-%m-%d@%H:%M~", time.localtime(time.time())) - backupdest = '%s.%s' % (fn, ext) - - try: - shutil.copy2(fn, backupdest) - except shutil.Error, e: - #XXX logger output here - return False - return True - - - -methods = CopyFile() -register_rpc = methods.register_rpc diff --git a/modules/func_module.py b/modules/func_module.py deleted file mode 100755 index 32a235d..0000000 --- a/modules/func_module.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python - -## -## Copyright 2007, Red Hat, Inc -## see AUTHORS -## -## This software may be freely redistributed under the terms of the GNU -## general public license. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -## - - -from func import logger -from func.config import read_config -from func.commonconfig import FuncdConfig - - -class FuncModule(object): - - # the version is meant to - version = "0.0.0" - api_version = "0.0.0" - description = "No Description provided" - - def __init__(self): - - config_file = '/etc/func/minion.conf' - self.config = read_config(config_file, FuncdConfig) - self.__init_log() - self.__base_methods = { - # __'s so we don't clobber useful names - "module_version" : self.__module_version, - "module_api_version" : self.__module_api_version, - "module_description" : self.__module_description, - "list_methods" : self.__list_methods - } - - def __init_log(self): - log = logger.Logger() - self.logger = log.logger - - def register_rpc(self, handlers, module_name): - # add the internal methods, note that this means they - # can get clobbbered by subclass versions - for meth in self.__base_methods: - handlers["%s.%s" % (module_name, meth)] = self.__base_methods[meth] - for meth in self.methods: - handlers["%s.%s" % (module_name,meth)] = self.methods[meth] - - def __list_methods(self): - return self.methods.keys() + self.__base_methods.keys() - - def __module_version(self): - return self.version - - def __module_api_version(self): - return self.api_version - - def __module_description(self): - return self.description - - -methods = FuncModule() -register_rpc = methods.register_rpc diff --git a/modules/hardware.py b/modules/hardware.py deleted file mode 100755 index e2455d1..0000000 --- a/modules/hardware.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/python - -## -## Hardware profiler plugin -## requires the "smolt" client package be installed -## but also relies on lspci for some things -## -## Copyright 2007, Red Hat, Inc -## Michael DeHaan <mdehaan@redhat.com> -## -## This software may be freely redistributed under the terms of the GNU -## general public license. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -## - - -# other modules -import sys - -# our modules -import sub_process -from modules import func_module - -# ================================= - -class HardwareModule(func_module.FuncModule): - def __init__(self): - self.methods = { - "info" : self.info, - "hal_info" : self.hal_info - } - func_module.FuncModule.__init__(self) - - def hal_info(self): - """ - Returns the output of lshal, but split up into seperate devices - for easier parsing. Each device is a entry in the return hash. - """ - - cmd = sub_process.Popen(["/usr/bin/lshal"],shell=False,stdout=sub_process.PIPE) - data = cmd.communicate()[0] - - data = data.split("\n") - - results = {} - current = "" - label = data[0] - for d in data: - if d == '': - results[label] = current - current = "" - label = "" - else: - if label == "": - label = d - current = current + d - - return results - - - def info(self,with_devices=True): - """ - Returns a struct of hardware information. By default, this pulls down - all of the devices. If you don't care about them, set with_devices to - False. - """ - return hw_info(with_devices) - -# ================================= - -def hw_info(with_devices=True): - - # this may fail if smolt is not installed. That's ok. hal_info will - # still work. - - # hack: smolt is not installed in site-packages - sys.path.append("/usr/share/smolt/client") - import smolt - - hardware = smolt.Hardware() - host = hardware.host - - # NOTE: casting is needed because these are DBusStrings, not real strings - data = { - 'os' : str(host.os), - 'defaultRunlevel' : str(host.defaultRunlevel), - 'bogomips' : str(host.bogomips), - 'cpuVendor' : str(host.cpuVendor), - 'cpuModel' : str(host.cpuModel), - 'numCpus' : str(host.numCpus), - 'cpuSpeed' : str(host.cpuSpeed), - 'systemMemory' : str(host.systemMemory), - 'systemSwap' : str(host.systemSwap), - 'kernelVersion' : str(host.kernelVersion), - 'language' : str(host.language), - 'platform' : str(host.platform), - 'systemVendor' : str(host.systemVendor), - 'systemModel' : str(host.systemModel), - 'formfactor' : str(host.formfactor), - 'selinux_enabled' : str(host.selinux_enabled), - 'selinux_enforce' : str(host.selinux_enforce) - } - - # if no hardware info requested, just return the above bits - if not with_devices: - return data - - collection = data["devices"] = [] - - for item in hardware.deviceIter(): - - (VendorID,DeviceID,SubsysVendorID,SubsysDeviceID,Bus,Driver,Type,Description) = item - - collection.append({ - "VendorID" : str(VendorID), - "DeviceID" : str(DeviceID), - "SubsysVendorID" : str(SubsysVendorID), - "Bus" : str(Bus), - "Driver" : str(Driver), - "Type" : str(Type), - "Description" : str(Description) - }) - - return data - -methods = HardwareModule() -register_rpc = methods.register_rpc - - - diff --git a/modules/process.py b/modules/process.py deleted file mode 100755 index 94a0240..0000000 --- a/modules/process.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/python - -## -## Process lister (control TBA) -## -## Copyright 2007, Red Hat, Inc -## Michael DeHaan <mdehaan@redhat.com> -## -## This software may be freely redistributed under the terms of the GNU -## general public license. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -## - -# other modules -import sub_process -import codes - -# our modules -from modules import func_module - -# ================================= - -class ProcessModule(func_module.FuncModule): - def __init__(self): - self.methods = { - "info" : self.info, - "kill" : self.kill, - "pkill" : self.pkill - } - func_module.FuncModule.__init__(self) - - def info(self,flags="-auxh"): - """ - Returns a struct of hardware information. By default, this pulls down - all of the devices. If you don't care about them, set with_devices to - False. - """ - - flags.replace(";","") # prevent stupidity - - - #FIXME: we need to swallow stdout/stderr as well, right now it spews to the console - cmd = sub_process.Popen(["/bin/ps", flags] ,executable="/bin/ps", stdout=sub_process.PIPE,shell=False) - data = cmd.communicate()[0] - - results = [] - - for x in data.split("\n"): - tokens = x.split() - results.append(tokens) - - return results - - - def kill(self,pid,signal="TERM"): - if pid == "0": - raise codes.FuncException("Killing pid group 0 not permitted") - if signal == "": - # this is default /bin/kill behaviour, it claims, but enfore it anyway - signal = "-TERM" - if signal[0] != "-": - signal = "-%s" % signal - rc = sub_process.call(["/bin/kill",signal, pid], executable="/bin/kill", shell=False) - print rc - return rc - - def pkill(self,name,level=""): - # example killall("thunderbird","-9") - rc = sub_process.call(["/usr/bin/pkill", name, level], executable="/usr/bin/pkill", shell=False) - return rc - -methods = ProcessModule() -register_rpc = methods.register_rpc - - - diff --git a/modules/reboot.py b/modules/reboot.py deleted file mode 100755 index 8772b8f..0000000 --- a/modules/reboot.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2007, Red Hat, Inc -# James Bowes <jbowes@redhat.com> -# -# This software may be freely redistributed under the terms of the GNU -# general public license. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -from modules import func_module - -import sub_process - -class Reboot(func_module.FuncModule): - - def __init__(self): - self.methods = { - "reboot" : self.reboot - } - func_module.FuncModule.__init__(self) - - def reboot(self, when='now', message=''): - return sub_process.call(["/sbin/shutdown", '-r', when, message]) - - -methods = Reboot() -register_rpc = methods.register_rpc diff --git a/modules/service.py b/modules/service.py deleted file mode 100755 index 433d70b..0000000 --- a/modules/service.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/python - -## func -## -## Copyright 2007, Red Hat, Inc -## Michael DeHaan <mdehaan@redhat.com> -## -## This software may be freely redistributed under the terms of the GNU -## general public license. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -## -## - -import codes -from modules import func_module - -import sub_process -import os - -class Service(func_module.FuncModule): - - def __init__(self): - self.methods = { - "start" : self.start, - "stop" : self.stop, - "restart" : self.restart, - "reload" : self.reload, - "status" : self.status - } - func_module.FuncModule.__init__(self) - - def __command(self, service_name, command): - - filename = os.path.join("/etc/rc.d/init.d/",service_name) - if os.path.exists(filename): - return sub_process.call(["/sbin/service", service_name, command]) - else: - raise codes.FuncException("Service not installed: %s" % service_name) - - def start(self, service_name): - return self.__command(service_name, "start") - - def stop(self, service_name): - return self.__command(service_name, "stop") - - def restart(self, service_name): - return self.__command(service_name, "restart") - - def reload(self, service_name): - return self.__command(service_name, "reload") - - def status(self, service_name): - return self.__command(service_name, "status") - -methods = Service() -register_rpc = methods.register_rpc diff --git a/modules/smart.py b/modules/smart.py deleted file mode 100755 index 0a7be47..0000000 --- a/modules/smart.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/python - -## -## Grabs status from SMART to see if your hard drives are ok -## Returns in the format of (return code, [line1, line2, line3,...]) -## -## Copyright 2007, Red Hat, Inc -## Michael DeHaan <mdehaan@redhat.com> -## -## This software may be freely redistributed under the terms of the GNU -## general public license. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -## - -# other modules -import sub_process - -# our modules -from modules import func_module - -# ================================= - -class SmartModule(func_module.FuncModule): - def __init__(self): - self.methods = { - "info" : self.info, - } - func_module.FuncModule.__init__(self) - - def info(self,flags="-q onecheck"): - """ - Returns a struct of hardware information. By default, this pulls down - all of the devices. If you don't care about them, set with_devices to - False. - """ - - flags.replace(";","") # prevent stupidity - - cmd = sub_process.Popen("/usr/sbin/smartd %s" % flags,stdout=sub_process.PIPE,shell=True) - data = cmd.communicate()[0] - - results = [] - - for x in data.split("\n"): - results.append(x) - - return (cmd.returncode, results) - -methods = SmartModule() -register_rpc = methods.register_rpc - - - diff --git a/modules/test.py b/modules/test.py deleted file mode 100755 index 55265a3..0000000 --- a/modules/test.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python - -from modules import func_module - -class Test(func_module.FuncModule): - version = "11.11.11" - api_version = "0.0.1" - description = "Just a very simple example module" - def __init__(self): - self.methods = { - "add": self.add - } - func_module.FuncModule.__init__(self) - - def add(self, numb1, numb2): - return numb1 + numb2 - -methods = Test() -register_rpc = methods.register_rpc diff --git a/modules/virt.py b/modules/virt.py deleted file mode 100755 index 18ad718..0000000 --- a/modules/virt.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/python - -""" -Virt management features - -Copyright 2007, Red Hat, Inc -Michael DeHaan <mdehaan@redhat.com> - -This software may be freely redistributed under the terms of the GNU -general public license. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -""" - -# warning: virt management is rather complicated -# to see a simple example of func, look at the -# service control module. API docs on how -# to use this to come. - -# other modules -import os -import sub_process -import libvirt - -# our modules -import codes -import func_module - -VIRT_STATE_NAME_MAP = { - 0 : "running", - 1 : "running", - 2 : "running", - 3 : "paused", - 4 : "shutdown", - 5 : "shutdown", - 6 : "crashed" -} - -class FuncLibvirtConnection(object): - - def __init__(self): - - - cmd = sub_process.Popen("uname -r", shell=True, stdout=sub_process.PIPE) - output = cmd.communicate()[0] - - if output.find("xen") != -1: - conn = libvirt.open(None) - else: - conn = libvirt.open("qemu:///system") - - if not conn: - raise codes.FuncException("hypervisor connection failure") - - self.conn = conn - - def find_vm(self, vmid): - """ - Extra bonus feature: vmid = -1 returns a list of everything - """ - conn = self.conn - - vms = [] - - # this block of code borrowed from virt-manager: - # get working domain's name - ids = conn.listDomainsID(); - for id in ids: - vm = conn.lookupByID(id) - vms.append(vm) - # get defined domain - names = conn.listDefinedDomains() - for name in names: - vm = conn.lookupByName(name) - vms.append(vm) - - if vmid == -1: - return vms - - for vm in vms: - if vm.name() == vmid: - return vm - - raise codes.FuncException("virtual machine %s not found" % needle) - - def shutdown(self, vmid): - return self.find_vm(vmid).shutdown() - - def pause(self, vmid): - return suspend(self.conn,vmid) - - def unpause(self, vmid): - return resume(self.conn,vmid) - - def suspend(self, vmid): - return self.find_vm(vmid).suspend() - - def resume(self, vmid): - return self.find_vm(vmid).resume() - - def create(self, vmid): - return self.find_vm(vmid).create() - - def destroy(self, vmid): - return self.find_vm(vmid).destroy() - - def undefine(self, vmid): - return self.find_vm(vmid).undefine() - - def get_status2(self, vm): - state = vm.info()[0] - # print "DEBUG: state: %s" % state - return VIRT_STATE_NAME_MAP.get(state,"unknown") - - def get_status(self, vmid): - state = self.find_vm(vmid).info()[0] - return VIRT_STATE_NAME_MAP.get(state,"unknown") - - - -class Virt(func_module.FuncModule): - - - def __init__(self): - - """ - Constructor. Register methods and make them available. - """ - - self.methods = { - "install" : self.install, - "shutdown" : self.shutdown, - "destroy" : self.destroy, - "start" : self.create, - "pause" : self.pause, - "unpause" : self.unpause, - "delete" : self.undefine, - "status" : self.get_status, - "list_vms" : self.list_vms, - } - - func_module.FuncModule.__init__(self) - - def get_conn(self): - self.conn = FuncLibvirtConnection() - return self.conn - - def list_vms(self): - self.conn = self.get_conn() - vms = self.conn.find_vm(-1) - results = [] - for x in vms: - try: - results.append(x.name()) - except: - pass - return results - - def install(self, server_name, target_name, system=False): - - """ - Install a new virt system by way of a named cobbler profile. - """ - - # Example: - # install("bootserver.example.org", "fc7webserver", True) - - conn = self.get_conn() - - if conn is None: - raise codes.FuncException("no connection") - - if not os.path.exists("/usr/bin/koan"): - raise codes.FuncException("no /usr/bin/koan") - target = "profile" - if system: - target = "system" - - # TODO: FUTURE: set --virt-path in cobbler or here - koan_args = [ - "/usr/bin/koan", - "--virt", - "--virt-graphics", # enable VNC - "--%s=%s" % (target, target_name), - "--server=%s" % server_name - ] - - rc = sub_process.call(koan_args,shell=False) - if rc == 0: - return 0 - else: - raise codes.FuncException("koan returned %d" % rc) - - - def shutdown(self, vmid): - """ - Make the machine with the given vmid stop running. - Whatever that takes. - """ - self.get_conn() - self.conn.shutdown(vmid) - return 0 - - - def pause(self, vmid): - - """ - Pause the machine with the given vmid. - """ - self.get_conn() - self.conn.suspend(vmid) - return 0 - - - def unpause(self, vmid): - - """ - Unpause the machine with the given vmid. - """ - - self.get_conn() - self.conn.resume(vmid) - return 0 - - - def create(self, vmid): - - """ - Start the machine via the given mac address. - """ - self.get_conn() - self.conn.create(vmid) - return 0 - - - def destroy(self, vmid): - - """ - Pull the virtual power from the virtual domain, giving it virtually no - time to virtually shut down. - """ - self.get_conn() - self.conn.destroy(vmid) - return 0 - - - def undefine(self, vmid): - - """ - Stop a domain, and then wipe it from the face of the earth. - by deleting the disk image and it's configuration file. - """ - - self.get_conn() - self.conn.undefine(vmid) - return 0 - - - def get_status(self, vmid): - - """ - Return a state suitable for server consumption. Aka, codes.py values, not XM output. - """ - - self.get_conn() - return self.conn.get_status(vmid) - - -methods = Virt() -register_rpc = methods.register_rpc - - diff --git a/modules/yum.py b/modules/yum.py deleted file mode 100644 index 6600d47..0000000 --- a/modules/yum.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2007, Red Hat, Inc -# James Bowes <jbowes@redhat.com> -# -# This software may be freely redistributed under the terms of the GNU -# general public license. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -from modules import func_module - -import yum - -# XXX Use internal yum callback or write a useful one. -class DummyCallback(object): - - def event(self, state, data=None): - pass - -class Yum(func_module.FuncModule): - - def __init__(self): - self.methods = { - "update" : self.update - } - func_module.FuncModule.__init__(self) - - def update(self): - # XXX support updating specific rpms - ayum = yum.YumBase() - ayum.doGenericSetup() - ayum.doRepoSetup() - try: - ayum.doLock() - ayum.update() - ayum.buildTransaction() - ayum.processTransaction( - callback=DummyCallback()) - finally: - ayum.closeRpmDB() - ayum.doUnlock() - return True - - -methods = Yum() -register_rpc = methods.register_rpc |
