Trimming more stuff out.
authorMichael DeHaan <mdehaan@redhat.com>
Thu, 7 Feb 2008 19:15:25 +0000 (14:15 -0500)
committerMichael DeHaan <mdehaan@redhat.com>
Thu, 7 Feb 2008 19:15:25 +0000 (14:15 -0500)
59 files changed:
certmaster/CommonErrors.py
certmaster/certs.py
certmaster/codes.py
certmaster/commonconfig.py
certmaster/config.py
certmaster/forkbomb.py [deleted file]
certmaster/jobthing.py [deleted file]
certmaster/logger.py
certmaster/minion/module_loader.py [deleted file]
certmaster/minion/modules/Makefile [deleted file]
certmaster/minion/modules/__init__.py [deleted file]
certmaster/minion/modules/certmaster.py [deleted file]
certmaster/minion/modules/command.py [deleted file]
certmaster/minion/modules/copyfile.py [deleted file]
certmaster/minion/modules/filetracker.py [deleted file]
certmaster/minion/modules/func_module.py [deleted file]
certmaster/minion/modules/func_module.py.orig [deleted file]
certmaster/minion/modules/hardware.py [deleted file]
certmaster/minion/modules/jobs.py [deleted file]
certmaster/minion/modules/mount.py [deleted file]
certmaster/minion/modules/nagios-check.py [deleted file]
certmaster/minion/modules/netapp/README [deleted file]
certmaster/minion/modules/netapp/TODO [deleted file]
certmaster/minion/modules/netapp/__init__.py [deleted file]
certmaster/minion/modules/netapp/common.py [deleted file]
certmaster/minion/modules/netapp/snap.py [deleted file]
certmaster/minion/modules/netapp/vol/__init__.py [deleted file]
certmaster/minion/modules/netapp/vol/clone.py [deleted file]
certmaster/minion/modules/networktest.py [deleted file]
certmaster/minion/modules/process.py [deleted file]
certmaster/minion/modules/process.py.orig [deleted file]
certmaster/minion/modules/reboot.py [deleted file]
certmaster/minion/modules/rpms.py [deleted file]
certmaster/minion/modules/service.py [deleted file]
certmaster/minion/modules/smart.py [deleted file]
certmaster/minion/modules/snmp.py [deleted file]
certmaster/minion/modules/sysctl.py [deleted file]
certmaster/minion/modules/test.py [deleted file]
certmaster/minion/modules/virt.py [deleted file]
certmaster/minion/modules/yumcmd.py [deleted file]
certmaster/overlord/__init__.pyc [deleted file]
certmaster/overlord/client.pyc [deleted file]
certmaster/overlord/cmd_modules/__init__.py [deleted file]
certmaster/overlord/cmd_modules/__init__.pyc [deleted file]
certmaster/overlord/cmd_modules/call.py [deleted file]
certmaster/overlord/cmd_modules/call.pyc [deleted file]
certmaster/overlord/cmd_modules/copyfile.py [deleted file]
certmaster/overlord/cmd_modules/listminions.py [deleted file]
certmaster/overlord/cmd_modules/ping.py [deleted file]
certmaster/overlord/cmd_modules/show.py [deleted file]
certmaster/overlord/command.pyc [deleted file]
certmaster/overlord/forkbomb.pyc [deleted file]
certmaster/overlord/func_command.pyc [deleted file]
certmaster/overlord/groups.pyc [deleted file]
certmaster/overlord/jobthing.pyc [deleted file]
certmaster/overlord/modules/netapp.py [deleted file]
certmaster/overlord/sslclient.pyc [deleted file]
certmaster/overlord/test_func.py [deleted file]
certmaster/utils.py

index c76cb3d..437606a 100644 (file)
@@ -60,7 +60,8 @@ def canIgnoreSocketError(e):
 
     return False
 
 
     return False
 
-class Func_Client_Exception(Exception):
+# FIXME: is anything using this?  remove underscores
+class CertMaster_Client_Exception(Exception):
     def __init__(self, value=None):
         Exception.__init__(self)
         self.value = value
     def __init__(self, value=None):
         Exception.__init__(self)
         self.value = value
index 4d6bf15..3d8d991 100644 (file)
@@ -21,8 +21,8 @@ import utils
 
 def_country = 'UN'
 def_state = 'FC'
 
 def_country = 'UN'
 def_state = 'FC'
-def_local = 'Func-ytown'
-def_org = 'func'
+def_local = 'Certmaster-town'
+def_org = 'certmaster'
 def_ou = 'slave-key'
 
 
 def_ou = 'slave-key'
 
 
@@ -83,7 +83,7 @@ def retrieve_cert_from_file(certfile):
     return cert
 
 
     return cert
 
 
-def create_ca(CN="Func Certificate Authority", ca_key_file=None, ca_cert_file=None):
+def create_ca(CN="Certmaster Certificate Authority", ca_key_file=None, ca_cert_file=None):
     cakey = make_keypair(dest=ca_key_file)
     careq = make_csr(cakey, cn=CN)
     cacert = crypto.X509()
     cakey = make_keypair(dest=ca_key_file)
     careq = make_csr(cakey, cn=CN)
     cacert = crypto.X509()
index c6bcb61..a73c700 100755 (executable)
@@ -1,7 +1,7 @@
 """
 """
-func
+Certmaster
 
 
-Copyright 2007, Red Hat, Inc
+Copyright 2007-2008, Red Hat, Inc
 See AUTHORS
 
 This software may be freely redistributed under the terms of the GNU
 See AUTHORS
 
 This software may be freely redistributed under the terms of the GNU
@@ -15,11 +15,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 import exceptions
 
 
 import exceptions
 
 
-class FuncException(exceptions.Exception):
+class CertMasterException(exceptions.Exception):
     pass
 
 
     pass
 
 
-class InvalidMethodException(FuncException):
+class InvalidMethodException(CertMasterException):
     pass
 
 # FIXME: more sub-exceptions maybe
     pass
 
 # FIXME: more sub-exceptions maybe
+
index 9fd3356..baf6a88 100644 (file)
@@ -2,14 +2,14 @@ from config import BaseConfig, BoolOption, IntOption, Option
 
 class CMConfig(BaseConfig):
     listen_addr = Option('')
 
 class CMConfig(BaseConfig):
     listen_addr = Option('')
-    cadir = Option('/etc/pki/func/ca')
-    certroot =  Option('/var/lib/func/certmaster/certs')
-    csrroot = Option('/var/lib/func/certmaster/csrs')
+    cadir = Option('/etc/pki/certmaster/ca')
+    certroot =  Option('/var/lib/certmaster/certmaster/certs')
+    csrroot = Option('/var/lib/certmaster/certmaster/csrs')
     autosign = BoolOption(False)
 
 
 class FuncdConfig(BaseConfig):
     log_level = Option('INFO')
     certmaster = Option('certmaster')
     autosign = BoolOption(False)
 
 
 class FuncdConfig(BaseConfig):
     log_level = Option('INFO')
     certmaster = Option('certmaster')
-    cert_dir = Option('/etc/pki/func')
-    acl_dir = Option('/etc/func/minion-acl.d')
+    cert_dir = Option('/etc/pki/certmaster')
+    acl_dir = Option('/etc/certmaster/minion-acl.d')
index 8202457..e859f4a 100644 (file)
@@ -24,7 +24,7 @@ from ConfigParser import NoSectionError, NoOptionError, ConfigParser
 from ConfigParser import ParsingError
 import exceptions
 
 from ConfigParser import ParsingError
 import exceptions
 
-CONFIG_FILE = "/etc/func/certmaster.conf"
+CONFIG_FILE = "/etc/certmaster/certmaster.conf"
 
 class ConfigError(exceptions.Exception):
     def __init__(self, value=None):
 
 class ConfigError(exceptions.Exception):
     def __init__(self, value=None):
diff --git a/certmaster/forkbomb.py b/certmaster/forkbomb.py
deleted file mode 100644 (file)
index 3dfa6f2..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# forkbomb is a module that partitions arbitrary workloads
-# among N seperate forks, for a configurable N, and
-# collates results upon return, as if it never forked.
-#
-# 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 os
-import random # for testing only
-import time   # for testing only
-import shelve
-import bsddb
-import sys
-import tempfile
-import fcntl
-import utils
-import xmlrpclib
-
-DEFAULT_FORKS = 4
-DEFAULT_CACHE_DIR = "/var/lib/func"
-
-def __get_storage(dir):
-    """
-    Return a tempfile we can use for storing data.
-    """
-    dir = os.path.expanduser(dir)
-    if not os.path.exists(dir):
-        os.makedirs(dir)
-    return tempfile.mktemp(suffix='', prefix='asynctmp', dir=dir)
-
-def __access_buckets(filename,clear,new_key=None,new_value=None):
-    """
-    Access data in forkbomb cache, potentially clearing or
-    modifying it as required.
-    """
-
-    internal_db = bsddb.btopen(filename, 'c', 0644 )
-    handle = open(filename,"r")
-    fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
-    storage = shelve.BsdDbShelf(internal_db)
-
-    if clear:
-        storage.clear()
-        storage.close()
-        fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
-        return {}
-
-    if not storage.has_key("data"):
-        storage["data"] = {}
-    else: 
-        pass
-
-    if new_key is not None:
-        # bsdb is a bit weird about this
-        newish = storage["data"].copy()
-        newish[new_key] = new_value
-        storage["data"] = newish
-
-    rc = storage["data"].copy()
-    storage.close()
-    fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
-
-    return rc
-
-def __bucketize(pool, slots):
-    """
-    Given a pre-existing list of X number of tasks, partition
-    them into a hash of Y number of slots.
-    """
-    buckets = {}
-    count = 0
-    for key in pool:
-        count = count + 1
-        slot = count % slots
-        if not buckets.has_key(slot):
-            buckets[slot] = [] 
-        buckets[slot].append(key)
-    return buckets
-
-def __with_my_bucket(bucket_number,buckets,what_to_do,filename):
-    """
-    Process all tasks assigned to a given fork, and save
-    them in the shelf.
-    """
-    things_in_my_bucket = buckets[bucket_number]
-    results = {}
-    for thing in things_in_my_bucket:
-        (nkey,nvalue) = what_to_do(bucket_number,buckets,thing)
-        __access_buckets(filename,False,nkey,nvalue)
-
-def __forkbomb(mybucket,buckets,what_to_do,filename):
-    """
-    Recursive function to spawn of a lot of worker forks.
-    """
-    nbuckets = len(buckets)
-    pid = os.fork()
-    if pid != 0:
-        if mybucket < (nbuckets-1):
-            __forkbomb(mybucket+1,buckets,what_to_do,filename)
-        try:
-            os.waitpid(pid,0)
-        except OSError, ose:
-            if ose.errno == 10:
-                pass
-            else:
-                raise ose
-    else:
-        __with_my_bucket(mybucket,buckets,what_to_do,filename)    
-        sys.exit(0)
-
-def __demo(bucket_number, buckets, my_item):
-    """ 
-    This is a demo handler for test purposes.
-    It just multiplies all numbers by 1000, but slowly.
-    """
-    # print ">> I am fork (%s) and I am processing item (%s)" % (bucket_number, my_item)
-    # just to verify forks are not sequential
-    sleep = random.randrange(0,4)
-    time.sleep(sleep)
-    return (my_item, my_item * 1000)
-
-def batch_run(pool,callback,nforks=DEFAULT_FORKS,cachedir=DEFAULT_CACHE_DIR):
-    """
-    Given an array of items (pool), call callback in each one, but divide
-    the workload over nfork forks.  Temporary files used during the
-    operation will be created in cachedir and subsequently deleted.    
-    """
-    if nforks <= 1:
-       # modulus voodoo gets crazy otherwise and bad things happen
-       nforks = 2
-    shelf_file = __get_storage(cachedir)
-    __access_buckets(shelf_file,True,None)
-    buckets = __bucketize(pool, nforks)
-    __forkbomb(1,buckets,callback,shelf_file)
-    rc = __access_buckets(shelf_file,False,None)
-    os.remove(shelf_file)
-    return rc
-
-def __test(nforks=4,sample_size=20):
-    pool = xrange(0,sample_size)
-    print batch_run(pool,__demo,nforks=nforks)
-
-if __name__ == "__main__":
-    __test()
-
-
diff --git a/certmaster/jobthing.py b/certmaster/jobthing.py
deleted file mode 100644 (file)
index 67ad1a6..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-# jobthing is a module that allows for background execution of a task, and
-# getting status of that task.  The ultimate goal is to allow ajaxyness
-# of GUI apps using Func, and also for extremely long running tasks that
-# we don't want to block on as called by scripts using the FunC API.  The
-# CLI should not use this.
-#
-# 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 os
-import random # for testing only
-import time   # for testing only
-import shelve
-import bsddb
-import sys
-import tempfile
-import fcntl
-import forkbomb
-import utils
-import traceback
-
-JOB_ID_RUNNING = 0
-JOB_ID_FINISHED = 1
-JOB_ID_LOST_IN_SPACE = 2
-JOB_ID_ASYNC_PARTIAL = 3
-JOB_ID_ASYNC_FINISHED = 4
-
-# how long to retain old job records in the job id database
-RETAIN_INTERVAL = 60 * 60    
-
-# where to store the internal job id database
-CACHE_DIR = "/var/lib/func"
-
-def __update_status(jobid, status, results, clear=False):
-    return __access_status(jobid=jobid, status=status, results=results, write=True)
-
-def __get_status(jobid):
-    return __access_status(jobid=jobid, write=False)
-
-def purge_old_jobs():
-    return __access_status(purge=True)
-
-def __purge_old_jobs(storage):
-    """
-    Deletes jobs older than RETAIN_INTERVAL seconds.  
-    MINOR FIXME: this probably should be a more intelligent algorithm that only
-    deletes jobs if the database is too big and then only the oldest jobs
-    but this will work just as well.
-    """
-    nowtime = time.time()
-    for x in storage.keys():
-        # minion jobs have "-minion" in the job id so disambiguation so we need to remove that
-        jobkey = x.replace("-","").replace("minion","")
-        create_time = float(jobkey)
-        if nowtime - create_time > RETAIN_INTERVAL:
-            del storage[x]
-
-def __access_status(jobid=0, status=0, results=0, clear=False, write=False, purge=False):
-
-    dir = os.path.expanduser(CACHE_DIR)
-    if not os.path.exists(dir):
-        os.makedirs(dir)
-    filename = os.path.join(dir,"status-%s" % os.getuid()) 
-
-    internal_db = bsddb.btopen(filename, 'c', 0644 )
-    handle = open(filename,"r")
-    fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
-    storage = shelve.BsdDbShelf(internal_db)
-
-
-    if clear:
-        storage.clear()
-        storage.close()
-        fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
-        return {}
-    
-    if purge or write:
-        __purge_old_jobs(storage)
-
-    if write:
-        storage[str(jobid)] = (status, results)
-        rc = jobid
-    elif not purge:
-        if storage.has_key(str(jobid)):
-            # tuple of (status, results)
-
-            rc = storage[str(jobid)]
-        else:
-            rc = (JOB_ID_LOST_IN_SPACE, 0)
-    else:
-        rc = 0
-
-    storage.close()
-    fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
-
-    return rc
-
-def batch_run(server, process_server, nforks):
-    """
-    This is the method used by the overlord side usage of jobthing.
-    Minion side usage will use minion_async_run instead.
-
-    Given an array of items (pool), call callback in each one, but divide
-    the workload over nfork forks.  Temporary files used during the
-    operation will be created in cachedir and subsequently deleted.    
-    """
-   
-    job_id = time.time()
-    pid = os.fork()
-    if pid != 0:
-        __update_status(job_id, JOB_ID_RUNNING, -1)
-        return job_id
-    else:
-        # kick off the job
-        __update_status(job_id, JOB_ID_RUNNING,  -1)
-        results = forkbomb.batch_run(server, process_server, nforks)
-        
-        # we now have a list of job id's for each minion, kill the task
-        __update_status(job_id, JOB_ID_ASYNC_PARTIAL, results)
-        sys.exit(0)
-
-def minion_async_run(retriever, method, args):
-    """
-    This is a simpler invocation for minion side async usage.
-    """
-    # to avoid confusion of job id's (we use the same job database)
-    # minion jobs contain the string "minion".  
-
-
-    job_id = "%s-minion" % time.time()
-    pid = os.fork()
-    if pid != 0:
-        __update_status(job_id, JOB_ID_RUNNING, -1)
-        return job_id
-    else:
-        __update_status(job_id, JOB_ID_RUNNING,  -1)
-        try:
-            function_ref = retriever(method)
-            rc = function_ref(*args)
-        except Exception, e:
-            (t, v, tb) = sys.exc_info()
-            rc = utils.nice_exception(t,v,tb)
-
-        __update_status(job_id, JOB_ID_FINISHED, rc)
-        sys.exit(0)
-
-def job_status(jobid, client_class=None):
-    # NOTE: client_class is here to get around some evil circular reference
-    # type stuff.  This is intended to be called by minions (who can leave it None)
-    # or by the Client module code (which does not need to be worried about it).  API
-    # users should not be calling jobthing.py methods directly.
-   
-    got_status = __get_status(jobid)
-
-    # if the status comes back as JOB_ID_ASYNC_PARTIAL what we have is actually a hash
-    # of hostname/minion-jobid pairs.  Instantiate a client handle for each and poll them
-    # for their actual status, filling in only the ones that are actually done.
-
-    (interim_rc, interim_results) = got_status
-
-    if interim_rc == JOB_ID_ASYNC_PARTIAL:
-
-        partial_results = {}
-
-
-        some_missing = False
-        for host in interim_results.keys():
-
-            minion_job = interim_results[host]
-            client = client_class(host, noglobs=True, async=False)
-            minion_result = client.jobs.job_status(minion_job)
-
-            (minion_interim_rc, minion_interim_result) = minion_result
-
-            if minion_interim_rc not in [ JOB_ID_RUNNING ]:
-                if minion_interim_rc in [ JOB_ID_LOST_IN_SPACE ]:
-                    partial_results[host] = [ utils.REMOTE_ERROR, "lost job" ]
-                else:
-                    partial_results[host] = minion_interim_result
-            else: 
-                some_missing = True
-
-        if some_missing:
-            return (JOB_ID_ASYNC_PARTIAL, partial_results)
-        else:
-            return (JOB_ID_ASYNC_FINISHED, partial_results)
-
-    else:
-        return got_status
-   
-    # of job id's on the minion in results.
-
-if __name__ == "__main__":
-    __test()
-
-
index e679f3d..bd35652 100755 (executable)
@@ -1,4 +1,4 @@
-## func
+## Certmaster
 ##
 ## Copyright 2007, Red Hat, Inc
 ## See AUTHORS
 ##
 ## Copyright 2007, Red Hat, Inc
 ## See AUTHORS
@@ -14,8 +14,8 @@
 
 
 import logging
 
 
 import logging
-from func.config import read_config
-from func.commonconfig import FuncdConfig
+from certmaster.config import read_config
+from certmaster.commonconfig import CertmasterConfig
 
 
 # from the comments in http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531
 
 
 # from the comments in http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531
@@ -31,9 +31,9 @@ class Singleton(object):
 class Logger(Singleton):
     _no_handlers = True
 
 class Logger(Singleton):
     _no_handlers = True
 
-    def __init__(self, logfilepath ="/var/log/func/func.log"):
-        config_file = '/etc/func/minion.conf'
-        self.config = read_config(config_file, FuncdConfig)    
+    def __init__(self, logfilepath ="/var/log/certmaster/certmaster.log"):
+        config_file = '/etc/certmaster/minion.conf'
+        self.config = read_config(config_file, CertMasterConfig)    
         self.loglevel = logging._levelNames[self.config.log_level]
         self._setup_logging()
         if self._no_handlers:
         self.loglevel = logging._levelNames[self.config.log_level]
         self._setup_logging()
         if self._no_handlers:
@@ -42,7 +42,7 @@ class Logger(Singleton):
     def _setup_logging(self):
         self.logger = logging.getLogger("svc")
 
     def _setup_logging(self):
         self.logger = logging.getLogger("svc")
 
-    def _setup_handlers(self, logfilepath="/var/log/func/func.log"):
+    def _setup_handlers(self, logfilepath="/var/log/certmaster/certmaster.log"):
         handler = logging.FileHandler(logfilepath, "a")
         self.logger.setLevel(self.loglevel)
         formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
         handler = logging.FileHandler(logfilepath, "a")
         self.logger.setLevel(self.loglevel)
         formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
@@ -53,7 +53,7 @@ class Logger(Singleton):
 
 class AuditLogger(Singleton):
     _no_handlers = True
 
 class AuditLogger(Singleton):
     _no_handlers = True
-    def __init__(self, logfilepath = "/var/log/func/audit.log"):
+    def __init__(self, logfilepath = "/var/log/certmaster/audit.log"):
         self.loglevel = logging.INFO
         self._setup_logging()
         if self._no_handlers:
         self.loglevel = logging.INFO
         self._setup_logging()
         if self._no_handlers:
@@ -67,7 +67,7 @@ class AuditLogger(Singleton):
     def _setup_logging(self):
         self.logger = logging.getLogger("audit")
 
     def _setup_logging(self):
         self.logger = logging.getLogger("audit")
 
-    def _setup_handlers(self, logfilepath="/var/log/func/audit.log"):
+    def _setup_handlers(self, logfilepath="/var/log/certmaster/audit.log"):
         handler = logging.FileHandler(logfilepath, "a")
         self.logger.setLevel(self.loglevel)
         formatter = logging.Formatter("%(asctime)s - %(message)s")
         handler = logging.FileHandler(logfilepath, "a")
         self.logger.setLevel(self.loglevel)
         formatter = logging.Formatter("%(asctime)s - %(message)s")
diff --git a/certmaster/minion/module_loader.py b/certmaster/minion/module_loader.py
deleted file mode 100755 (executable)
index 3068ea8..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-## func
-##
-## 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.
-##
-##
-
-
-import distutils.sysconfig
-import os
-import sys
-from gettext import gettext
-_ = gettext
-
-from func import logger
-logger = logger.Logger().logger
-
-from inspect import isclass
-from func.minion.modules import func_module
-
-def module_walker(topdir):
-    module_files = []
-    for root, dirs, files in os.walk(topdir):
-        # we should get here for each subdir
-        for filename in files:
-            # ASSUMPTION: all module files will end with .py, .pyc, .pyo
-            if filename[-3:] == ".py" or filename[-4:] == ".pyc" or filename[-4:] == ".pyo":
-                # the normpath is important, since we eventually replace /'s with .'s
-                # in the module name, and foo..bar doesnt work -akl
-                module_files.append(os.path.normpath("%s/%s" % (root, filename)))
-
-
-    return module_files
-
-def load_modules(blacklist=None):
-
-    module_file_path="%s/func/minion/modules/" % distutils.sysconfig.get_python_lib()
-    mod_path="%s/func/minion/"  % distutils.sysconfig.get_python_lib()
-
-    sys.path.insert(0, mod_path)
-    mods = {}
-    bad_mods = {}
-
-    filenames = module_walker(module_file_path)
-
-    # FIXME: this is probably more complicated than it needs to be -akl
-    for fn in filenames:
-        # aka, everything after the module_file_path
-        module_name_part = fn[len(module_file_path):]
-        dirname, basename = os.path.split(module_name_part)
-
-        if basename[:8] == "__init__":
-            modname = dirname
-            dirname = ""
-        elif basename[-3:] == ".py":
-            modname = basename[:-3]
-        elif basename[-4:] in [".pyc", ".pyo"]:
-            modname = basename[:-4]
-
-        pathname = modname
-        if dirname != "":
-            pathname = "%s/%s" % (dirname, modname)
-
-        mod_imp_name = pathname.replace("/", ".")
-
-        if mods.has_key(mod_imp_name):
-            # If we've already imported mod_imp_name, don't import it again
-            continue
-
-        # ignore modules that we've already determined aren't valid modules
-        if bad_mods.has_key(mod_imp_name):
-            continue
-
-        try:
-            # Auto-detect and load all FuncModules
-            blip =  __import__("modules.%s" % ( mod_imp_name), globals(), locals(), [mod_imp_name])
-            for obj in dir(blip):
-                attr = getattr(blip, obj)
-                if isclass(attr) and issubclass(attr, func_module.FuncModule):
-                    logger.debug("Loading %s module" % attr)
-                    mods[mod_imp_name] = attr()
-
-        except ImportError, e:
-            # A module that raises an ImportError is (for now) simply not loaded.
-            errmsg = _("Could not load %s module: %s")
-            logger.warning(errmsg % (mod_imp_name, e))
-            bad_mods[mod_imp_name] = True
-            continue
-        except:
-            errmsg = _("Could not load %s module")
-            logger.warning(errmsg % (mod_imp_name))
-            bad_mods[mod_imp_name] = True
-            continue
-
-    return mods
-
-
-if __name__ == "__main__":
-
-    module_file_path = "/usr/lib/python2.5/site-packages/func/minion/modules/"
-    bar = module_walker(module_file_path)
-    print bar
-    for f in bar:
-        print f
-        print os.path.basename(f)
-        print os.path.split(f)
-        g = f[len(module_file_path):]
-        print g
-        print os.path.split(g)
-
-    print load_modules()
diff --git a/certmaster/minion/modules/Makefile b/certmaster/minion/modules/Makefile
deleted file mode 100755 (executable)
index f2bc6c4..0000000
+++ /dev/null
@@ -1,18 +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/certmaster/minion/modules/__init__.py b/certmaster/minion/modules/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/certmaster/minion/modules/certmaster.py b/certmaster/minion/modules/certmaster.py
deleted file mode 100644 (file)
index 9ca484f..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-## -*- coding: utf-8 -*-
-##
-## Process lister (control TBA)
-##
-## Copyright 2008, 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
-import func_module
-from func import certmaster as certmaster
-
-# =================================
-
-class CertMasterModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Administers certs on an overlord."
-
-    def get_hosts_to_sign(self, list_of_hosts):
-        """
-        ...
-        """
-        list_of_hosts = self.__listify(list_of_hosts)
-        cm = certmaster.CertMaster()
-        return cm.get_csrs_waiting()
-
-    def sign_hosts(self, list_of_hosts):
-        """
-        ...
-        """
-        list_of_hosts = self.__listify(list_of_hosts)
-        cm = certmaster.CertMaster()
-        for x in list_of_hosts:
-           cm.sign_this_csr(x)
-        return True
-
-    def cleanup_hosts(self, list_of_hosts):
-        """
-        ...
-        """
-        list_of_hosts = self.__listify(list_of_hosts)
-        cm = certmaster.CertMaster()
-        for x in list_of_hosts:
-           cm.remove_this_cert(x)
-        return True
-
-    def __listify(self, list_of_hosts):
-        if type(list_of_hosts) is type([]):
-            return list_of_hosts
-        else:
-            return [ list_of_hosts ]    
-
diff --git a/certmaster/minion/modules/command.py b/certmaster/minion/modules/command.py
deleted file mode 100644 (file)
index cc463cf..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2007, Red Hat, Inc
-# James Bowes <jbowes@redhat.com>
-# Steve 'Ashcrow' Milner <smilner@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.
-"""
-
-import func_module
-import sub_process
-
-class Command(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Works with shell commands."
-
-    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])
-
-    def exists(self, command):
-        """
-        Checks to see if a command exists on the target system(s).
-        """
-        import os
-
-        if os.access(command, os.X_OK):
-            return True
-        return False
diff --git a/certmaster/minion/modules/copyfile.py b/certmaster/minion/modules/copyfile.py
deleted file mode 100644 (file)
index 150af88..0000000
+++ /dev/null
@@ -1,109 +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
-
-import func_module
-
-
-class CopyFile(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.2"
-    description = "Allows for smart copying of a file."
-
-    def _checksum_blob(self, blob):
-        thissum = sha.new()
-        thissum.update(blob)
-        return thissum.hexdigest()
-                       
-    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)
-        if not os.path.exists(dirpath):
-            os.makedirs(dirpath)
-
-        remote_sum = self._checksum_blob(filebuf.data)
-        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.data)
-                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
diff --git a/certmaster/minion/modules/filetracker.py b/certmaster/minion/modules/filetracker.py
deleted file mode 100644 (file)
index f5f9dbb..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-## func
-##
-## filetracker
-##  maintains a manifest of files of which to keep track
-##  provides file meta-data (and optionally full data) to func-inventory
-##
-## (C) Vito Laurenza <vitolaurenza@gmail.com>
-## + 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.
-##
-
-# func modules
-import func_module
-
-# other modules
-from stat import *
-import glob
-import os
-import md5
-
-# defaults
-CONFIG_FILE='/etc/func/modules/filetracker.conf'
-
-class FileTracker(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Maintains a manifest of files to keep track of."
-
-    def __load(self):
-        """
-        Parse file and return data structure.
-        """
-
-        filehash = {}
-        if os.path.exists(CONFIG_FILE):
-            config = open(CONFIG_FILE, "r")
-            data   = config.read()
-            lines  = data.split("\n")
-            for line in lines:
-                tokens = line.split(None)
-                if len(tokens) < 2:
-                    continue
-                scan_mode = tokens[0]
-                path = " ".join(tokens[1:])
-                if str(scan_mode).lower() == "0":
-                    scan_mode = 0
-                else:
-                    scan_mode = 1
-                filehash[path] = scan_mode
-        return filehash
-
-    #==========================================================
-
-    def __save(self, filehash):
-        """
-        Write data structure to file.
-        """ 
-
-        config = open(CONFIG_FILE, "w+")
-        for (path, scan_mode) in filehash.iteritems():
-            config.write("%s     %s\n" % (scan_mode, path))
-        config.close()
-
-    #==========================================================
-               
-    def track(self, file_name, full_scan=0):
-        """
-        Adds files to keep track of.
-        full_scan implies tracking the full contents of the file, defaults to off
-        """
-
-        filehash = self.__load()
-        filehash[file_name] = full_scan
-        self.__save(filehash)
-        return 1
-
-    #==========================================================
-
-    def untrack(self, file_name):
-        """
-        Stop keeping track of a file.
-        This routine is tolerant of most errors since we're forgetting about the file anyway.
-        """
-
-        filehash = self.__load()
-        if file_name in filehash.keys():
-            del filehash[file_name]
-        self.__save(filehash)
-        return 1
-
-    #==========================================================
-
-    def inventory(self, flatten=1, checksum_enabled=1):
-        """
-        Returns information on all tracked files
-        By default, 'flatten' is passed in as True, which makes printouts very clean in diffs
-        for use by func-inventory.  If you are writting another software application, using flatten=False will
-        prevent the need to parse the returns.
-        """
-        # XMLRPC feeds us strings from the CLI when it shouldn't
-        flatten = int(flatten)
-        checksum_enabled = int(checksum_enabled)
-
-        filehash = self.__load()
-
-        # we'll either return a very flat string (for clean diffs)
-        # or a data structure
-        if flatten:
-            results = ""
-        else:
-            results = []
-
-        for (file_name, scan_type) in filehash.iteritems():
-
-            if not os.path.exists(file_name):
-                if flatten:
-                    results = results + "%s: does not exist\n" % file_name
-                else:
-                    results.append("%s: does not exist\n" % file_name)
-                continue
-
-            this_result = []
-
-            # ----- always process metadata
-            filestat = os.stat(file_name)
-            mode = filestat[ST_MODE]
-            mtime = filestat[ST_MTIME]
-            uid = filestat[ST_UID]
-            gid = filestat[ST_GID]
-            if not os.path.isdir(file_name) and checksum_enabled:
-                sum_handle = open(file_name)
-                hash = self.__sumfile(sum_handle)
-                sum_handle.close()
-            else:
-                hash = "N/A"
-
-            # ------ what we return depends on flatten
-            if flatten:
-                this_result = "%s:  mode=%s  mtime=%s  uid=%s  gid=%s  md5sum=%s\n" % (file_name,mode,mtime,uid,gid,hash) 
-            else:
-                this_result = [file_name,mode,mtime,uid,gid,hash]
-
-            # ------ add on file data only if requested
-            if scan_type != 0 and os.path.isfile(file_name):
-                tracked_file = open(file_name)
-                data = tracked_file.read()
-                if flatten:
-                    this_result = this_result + "*** DATA ***\n" + data + "\n*** END DATA ***\n\n"
-                else:
-                    this_result.append(data)
-                tracked_file.close()
-           
-            if os.path.isdir(file_name):
-                if not file_name.endswith("/"):
-                    file_name = file_name + "/"
-                files = glob.glob(file_name + "*") 
-                if flatten:
-                    this_result = this_result + "*** FILES ***\n" + "\n".join(files) + "\n*** END FILES ***\n\n"
-                else:
-                    this_result.append({"files" : files})
-
-            if flatten:
-                results = results + "\n" + this_result
-            else:
-                results.append(this_result)
-
-
-        return results
-
-    #==========================================================
-
-    def __sumfile(self, fobj):
-        """
-        Returns an md5 hash for an object with read() method.
-        credit: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/266486
-        """
-
-        m = md5.new()
-        while True:
-            d = fobj.read(8096)
-            if not d:
-                break
-            m.update(d)
-        return m.hexdigest()
diff --git a/certmaster/minion/modules/func_module.py b/certmaster/minion/modules/func_module.py
deleted file mode 100644 (file)
index 7d476dc..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-##
-## 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.
-##
-
-import inspect
-
-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]
-
-        # register our module's handlers
-        for name, handler in self.__list_handlers().items():
-            handlers["%s.%s" % (module_name, name)] = handler
-
-    def __list_handlers(self):
-        """ Return a dict of { handler_name, method, ... }.
-        All methods that do not being with an underscore will be exposed.
-        We also make sure to not expose our register_rpc method.
-        """
-        handlers = {}
-        for attr in dir(self):
-            if inspect.ismethod(getattr(self, attr)) and attr[0] != '_' and \
-                    attr != 'register_rpc':
-                handlers[attr] = getattr(self, attr)
-        return handlers
-
-    def __list_methods(self):
-        return self.__list_handlers().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
diff --git a/certmaster/minion/modules/func_module.py.orig b/certmaster/minion/modules/func_module.py.orig
deleted file mode 100644 (file)
index c911b91..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-##
-## 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.
-##
-
-import inspect
-
-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]
-
-        # register all methods that don't start with an underscore
-        for attr in dir(self):
-            if inspect.ismethod(getattr(self, attr)) and attr[0] != '_':
-                handlers["%s.%s" % (module_name, attr)] = getattr(self, attr)
-
-    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
diff --git a/certmaster/minion/modules/hardware.py b/certmaster/minion/modules/hardware.py
deleted file mode 100644 (file)
index 46b1821..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-##
-## 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
-import func_module
-
-# =================================
-
-class HardwareModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Hardware profiler."
-
-    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 inventory(self):
-        data = hw_info(with_devices=True)
-        # remove bogomips because it keeps changing for laptops
-        # and makes inventory tracking noisy
-        if data.has_key("bogomips"):
-            del data["bogomips"]
-        return data
-
-    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
diff --git a/certmaster/minion/modules/jobs.py b/certmaster/minion/modules/jobs.py
deleted file mode 100644 (file)
index 69fb75f..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-## (Largely internal) module for access to asynchoronously dispatched
-## module job ID's.  The Func Client() module wraps most of this usage
-## so it's not entirely relevant to folks using the CLI or Func API
-## directly.
-##
-## Copyright 2008, 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 func import jobthing
-import func_module
-
-# =================================
-
-class JobsModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Internal module for tracking background minion tasks."
-
-    def job_status(self, job_id):
-        """
-        Returns job status in the form of (status, datastruct).
-        Datastruct is undefined for unfinished jobs.  See jobthing.py and
-        Wiki details on async invocation for more information.
-        """
-        return jobthing.job_status(job_id)
-
diff --git a/certmaster/minion/modules/mount.py b/certmaster/minion/modules/mount.py
deleted file mode 100644 (file)
index 0db914f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-##
-## Mount manager
-##
-## Copyright 2007, Red Hat, Inc
-## John Eckersberg <jeckersb@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 sub_process, os
-import func_module
-
-
-class MountModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Mounting, unmounting and getting information on mounted filesystems."
-
-    def list(self):
-        cmd = sub_process.Popen(["/bin/cat", "/proc/mounts"], executable="/bin/cat", stdout=sub_process.PIPE, shell=False)
-        data = cmd.communicate()[0]
-        
-        mounts = []
-        lines = [l for l in data.split("\n") if l] #why must you append blank crap?
-
-        for line in lines:
-            curmount = {}
-            tokens = line.split()
-            curmount['device'] = tokens[0]
-            curmount['dir'] = tokens[1]
-            curmount['type'] = tokens[2]
-            curmount['options'] = tokens[3]
-            mounts.append(curmount)
-
-        return mounts
-
-    def mount(self, device, dir, type="auto", options=None, createdir=False):
-        cmdline = ["/bin/mount", "-t", type]
-        if options: 
-            cmdline.append("-o")
-            cmdline.append(options)
-        cmdline.append(device)
-        cmdline.append(dir)
-        if createdir:
-            try:
-                os.makedirs(dir)
-            except:
-                return False
-        cmd = sub_process.Popen(cmdline, executable="/bin/mount", stdout=sub_process.PIPE, shell=False)
-        if cmd.wait() == 0:
-            return True
-        else:
-            return False
-        
-    def umount(self, dir, killall=False, force=False, lazy=False):
-        # succeed if its not mounted
-        if not os.path.ismount(dir):
-            return True
-
-        if killall:
-            cmd = sub_process.Popen(["/sbin/fuser", "-mk", dir], executable="/sbin/fuser", stdout=sub_process.PIPE, shell=False)
-            cmd.wait()
-
-        cmdline = ["/bin/umount"]
-        if force:
-            cmdline.append("-f")
-        if lazy:
-            cmdline.append("-l")
-        cmdline.append(dir)
-
-        cmd = sub_process.Popen(cmdline, executable="/bin/umount", stdout=sub_process.PIPE, shell=False)
-        if cmd.wait() == 0:
-            return True
-        else:
-            return False
-
-    def inventory(self, flatten=True):
-        return self.list()
diff --git a/certmaster/minion/modules/nagios-check.py b/certmaster/minion/modules/nagios-check.py
deleted file mode 100644 (file)
index f1c0714..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2007, Red Hat, Inc
-# James Bowes <jbowes@redhat.com>
-# Seth Vidal modified command.py to be nagios-check.py
-#
-# 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.
-"""
-
-import func_module
-import sub_process
-
-class Nagios(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Runs nagios checks."
-
-    def run(self, check_command):
-        """
-        Runs a nagios check returning the return code, stdout, and stderr as a tuple.
-        """
-        nagios_path='/usr/lib/nagios/plugins'
-        command = '%s/%s' % (nagios_path, check_command)
-        
-        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])
diff --git a/certmaster/minion/modules/netapp/README b/certmaster/minion/modules/netapp/README
deleted file mode 100644 (file)
index 5ecb205..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-This module is meant to be installed on a minion which is configured
-as an admin host for one or more NetApp filers.  Since we can't get
-our funcy awesomeness on the actual filer the admin host will have to do.
-
-Requirements:
-
-- passphraseless ssh key access from root on the netapp admin minion
-  to root on the target filer
diff --git a/certmaster/minion/modules/netapp/TODO b/certmaster/minion/modules/netapp/TODO
deleted file mode 100644 (file)
index 25d914c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Wrap every possible NetApp command :)
-
-I'm only going to do the ones that are important to me.  If you have
-some that are important to you, feel free to submit patches to
-func-list@redhat.com and harness the power of open source!
diff --git a/certmaster/minion/modules/netapp/__init__.py b/certmaster/minion/modules/netapp/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/certmaster/minion/modules/netapp/common.py b/certmaster/minion/modules/netapp/common.py
deleted file mode 100644 (file)
index 979c95c..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-##
-## NetApp Filer 'common' Module
-##
-## Copyright 2008, Red Hat, Inc
-## John Eckersberg <jeckersb@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 re
-import sub_process 
-
-SSH = '/usr/bin/ssh'
-SSH_USER = 'root'
-SSH_OPTS = '-o forwardagent=no'
-class GenericSSHError(Exception): pass
-class NetappCommandError(Exception): pass
-
-def ssh(host, cmdargs, input=None, user=SSH_USER):
-    cmdline = [SSH, SSH_OPTS, "%s@%s" % (user, host)]
-    cmdline.extend(cmdargs)
-
-    cmd = sub_process.Popen(cmdline,
-                           executable=SSH,
-                           stdin=sub_process.PIPE,
-                           stdout=sub_process.PIPE, 
-                           stderr=sub_process.PIPE,
-                           shell=False)
-
-    (out, err) = cmd.communicate(input)
-
-    if cmd.wait() != 0:
-        raise GenericSSHError, err
-    else:
-        return out + err
-
-def check_output(regex, output):
-    #strip newlines
-    output = output.replace('\n', ' ')
-    if re.search(regex, output):
-        return True
-    else:
-        raise NetappCommandError, output
-
diff --git a/certmaster/minion/modules/netapp/snap.py b/certmaster/minion/modules/netapp/snap.py
deleted file mode 100644 (file)
index 8f3f209..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-##
-## NetApp Filer 'snap' Module
-##
-## Copyright 2008, Red Hat, Inc
-## John Eckersberg <jeckersb@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 re
-from func.minion.modules import func_module
-from func.minion.modules.netapp.common import *
-
-class Snap(func_module.FuncModule):
-
-    # Update these if need be.
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Interface to the 'snap' command"
-
-    def create(self, filer, vol, snap):
-        """
-        TODO: Document me ...
-        """
-        regex = """creating snapshot..."""
-        cmd_opts = ['snap', 'create', vol, snap]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-
-    def delete(self, filer, vol, snap):
-        """
-        TODO: Document me ...
-        """
-        regex = """deleting snapshot..."""
-        cmd_opts = ['snap', 'delete', vol, snap]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-    
-    def list(self, filer, vol):
-        """
-        TODO: Document me ...
-        """
-        return True
-
diff --git a/certmaster/minion/modules/netapp/vol/__init__.py b/certmaster/minion/modules/netapp/vol/__init__.py
deleted file mode 100644 (file)
index 14ce0ac..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-##
-## NetApp Filer 'Vol' Module
-##
-## Copyright 2008, Red Hat, Inc
-## John Eckersberg <jeckersb@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 re
-from func.minion.modules import func_module
-from func.minion.modules.netapp.common import *
-
-class Vol(func_module.FuncModule):
-
-    # Update these if need be.
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Interface to the 'vol' command"
-
-    def create(self, filer, vol, aggr, size):
-        """
-        TODO: Document me ...
-        """
-        regex = """Creation of volume .* has completed."""
-        cmd_opts = ['vol', 'create', vol, aggr, size]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-    
-    def destroy(self, filer, vol):
-        """
-        TODO: Document me ...
-        """
-        regex = """Volume .* destroyed."""
-        cmd_opts = ['vol', 'destroy', vol, '-f']
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-
-    def offline(self, filer, vol):
-        """
-        TODO: Document me ...
-        """
-        regex = """Volume .* is now offline."""
-        cmd_opts = ['vol', 'offline', vol]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-
-    def online(self, filer, vol):
-        """
-        TODO: Document me ...
-        """
-        regex = """Volume .* is now online."""
-        cmd_opts = ['vol', 'online', vol]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-
-    def status(self, filer, vol=None):
-        """
-        TODO: Document me ...
-        """
-        cmd_opts = ['vol', 'status']
-        output = ssh(filer, cmd_opts)
-
-        output = output.replace(',', ' ')
-        lines = output.split('\n')[1:]
-
-        vols = []
-        current_vol = {}
-        for line in lines:
-            tokens = line.split()
-            if len(tokens) >= 2 and tokens[1] in ('online', 'offline', 'restricted'):
-                if current_vol: vols.append(current_vol)
-                current_vol = {'name': tokens[0], 
-                               'state': tokens[1],
-                               'status': [foo for foo in tokens[2:] if '=' not in foo],
-                               'options': [foo for foo in tokens[2:] if '=' in foo]}
-            else:
-                current_vol['status'].extend([foo for foo in tokens if '=' not in foo])
-                current_vol['options'].extend([foo for foo in tokens if '=' in foo])
-        vols.append(current_vol)
-
-        if vol:
-            try:
-                return [foo for foo in vols if foo['name'] == vol][0]
-            except:
-                raise NetappCommandError, "No such volume: %s" % vol
-        else:
-            return vols
-
-    def size(self, filer, vol, delta=None):
-        """
-        TODO: Document me ...
-        """
-        stat_regex = """vol size: Flexible volume .* has size .*."""
-        resize_regex = """vol size: Flexible volume .* size set to .*."""
-        cmd_opts = ['vol', 'size', vol]
-        
-        if delta:
-            cmd_opts.append(delta)
-            output = ssh(filer, cmd_opts)
-            return check_output(resize_regex, output)
-        else:
-            output = ssh(filer, cmd_opts)
-            check_output(stat_regex, output)
-            return output.split()[-1][:-1]
-
-    def options(self, filer, args):
-        """
-        TODO: Document me ...
-        """
-        pass
-
-    def rename(self, filer, args):
-        """
-        TODO: Document me ...
-        """
-        pass
-
-    def restrict(self, filer, args):
-        """
-        TODO: Document me ...
-        """
-        pass
diff --git a/certmaster/minion/modules/netapp/vol/clone.py b/certmaster/minion/modules/netapp/vol/clone.py
deleted file mode 100644 (file)
index 715d8a8..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-##
-## NetApp Filer 'vol.clone' Module
-##
-## Copyright 2008, Red Hat, Inc
-## John Eckersberg <jeckersb@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 re
-from func.minion.modules import func_module
-from func.minion.modules.netapp.common import *
-
-class Clone(func_module.FuncModule):
-
-    # Update these if need be.
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Interface to the 'vol' command"
-
-    def create(self, filer, vol, parent, snap):
-        """
-        TODO: Document me ...
-        """
-        regex = """Creation of clone volume .* has completed."""
-        cmd_opts = ['vol', 'clone', 'create', vol, '-b', parent, snap]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-    
-    def split(self, filer, vol):
-        """
-        TODO: Document me ...
-        """
-        # only worry about 'start' now, I don't terribly care to automate the rest
-        regex = """Clone volume .* will be split from its parent."""
-        cmd_opts = ['vol', 'clone', 'split', 'start', vol]
-        output = ssh(filer, cmd_opts)
-        return check_output(regex, output)
-
-
-
diff --git a/certmaster/minion/modules/networktest.py b/certmaster/minion/modules/networktest.py
deleted file mode 100644 (file)
index 0e6fbb2..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2008, Red Hat, Inc
-# Steve 'Ashcrow' Milner <smilner@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 func_module
-from codes import FuncException
-
-import sub_process
-
-class NetworkTest(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Defines various network testing tools."
-
-    def ping(self, *args):
-        if '-c' not in args:
-            raise(FuncException("You must define a count with -c!"))
-        return self.__run_command('/bin/ping', self.__args_to_list(args))
-
-    def netstat(self, *args):
-        return self.__run_command('/bin/netstat',
-                                  self.__args_to_list(args))
-
-    def traceroute(self, *args):
-         return self.__run_command('/bin/traceroute',
-                                   self.__args_to_list(args))
-
-    def dig(self, *args):
-         return self.__run_command('/usr/bin/dig',
-                                   self.__args_to_list(args))
-
-    def isportopen(self, host, port):
-        # FIXME: the return api here needs some work... -akl
-        import socket
-        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        timeout = 3.0
-        sock.settimeout(timeout)
-        try:
-            sock.connect((host, int(port)))
-        except socket.error, e:
-            sock.close()
-            return [1, ("connection to %s:%s failed" % (host, port), "%s" % e)]
-        except socket.timeout:
-            sock.close()
-            return [2, ("connection to %s:%s timed out after %s seconds" % (host, port, timeout))]
-
-        sock.close()
-        return [0, "connection to %s:%s succeeded" % (host, port)]
-
-    def __args_to_list(self, args):
-        return [arg for arg in args]
-
-    def __run_command(self, command, opts=[]):
-        full_cmd = [command] + opts
-        cmd = sub_process.Popen(full_cmd, stdout=sub_process.PIPE)
-        return [line for line in cmd.communicate()[0].split('\n')]
diff --git a/certmaster/minion/modules/process.py b/certmaster/minion/modules/process.py
deleted file mode 100644 (file)
index 848e847..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-## -*- coding: utf-8 -*-
-##
-## 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
-import func_module
-
-# =================================
-
-class ProcessModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Process related reporting and control."
-
-    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
-
-        cmd = sub_process.Popen(["/bin/ps", flags], executable="/bin/ps", 
-                                stdout=sub_process.PIPE, 
-                                stderr=sub_process.PIPE,
-                                shell=False)
-
-        data, error = cmd.communicate()
-
-        # We can get warnings for odd formatting. warnings != errors.
-        if error and error[:7] != "Warning":
-            raise codes.FuncException(error.split('\n')[0])
-
-        results = []
-        for x in data.split("\n"):
-            tokens = x.split()
-            results.append(tokens)
-
-        return results
-
-    def mem(self):
-        """
-        Returns a list of per-program memory usage.
-
-             Private  +  Shared   =  RAM used     Program
-
-           [["39.4 MiB", "10.3 MiB", "49.8 MiB",  "Xorg"],
-            ["42.2 MiB", "12.4 MiB", "54.6 MiB",  "nautilus"],
-            ["52.3 MiB", "10.8 MiB", "63.0 MiB",  "liferea-bin"]
-            ["171.6 MiB", "11.9 MiB", "183.5 MiB", "firefox-bin"]]
-
-        Taken from the ps_mem.py script written by Pádraig Brady.
-        http://www.pixelbeat.org/scripts/ps_mem.py
-        """
-        import os
-        our_pid=os.getpid()
-        results = []
-        have_smaps=0
-        have_pss=0
-
-        def kernel_ver():
-            """ (major,minor,release) """
-            kv=open("/proc/sys/kernel/osrelease").readline().split(".")[:3]
-            for char in "-_":
-                kv[2]=kv[2].split(char)[0]
-            return (int(kv[0]), int(kv[1]), int(kv[2]))
-
-        kv=kernel_ver()
-
-        def getMemStats(pid):
-            """ return Rss,Pss,Shared (note Private = Rss-Shared) """
-            Shared_lines=[]
-            Pss_lines=[]
-            pagesize=os.sysconf("SC_PAGE_SIZE")/1024 #KiB
-            Rss=int(open("/proc/"+str(pid)+"/statm").readline().split()[1])*pagesize
-            if os.path.exists("/proc/"+str(pid)+"/smaps"): #stat
-                global have_smaps
-                have_smaps=1
-                for line in open("/proc/"+str(pid)+"/smaps").readlines(): #open
-                    #Note in smaps Shared+Private = Rss above
-                    #The Rss in smaps includes video card mem etc.
-                    if line.startswith("Shared"):
-                        Shared_lines.append(line)
-                    elif line.startswith("Pss"):
-                        global have_pss
-                        have_pss=1
-                        Pss_lines.append(line)
-                Shared=sum([int(line.split()[1]) for line in Shared_lines])
-                Pss=sum([int(line.split()[1]) for line in Pss_lines])
-            elif (2,6,1) <= kv <= (2,6,9):
-                Pss=0
-                Shared=0 #lots of overestimation, but what can we do?
-            else:
-                Pss=0
-                Shared=int(open("/proc/"+str(pid)+"/statm").readline().split()[2])*pagesize
-            return (Rss, Pss, Shared)
-
-        cmds={}
-        shareds={}
-        count={}
-        for pid in os.listdir("/proc/"):
-            try:
-                pid = int(pid) #note Thread IDs not listed in /proc/
-                if pid ==our_pid: continue
-            except:
-                continue
-            cmd = file("/proc/%d/status" % pid).readline()[6:-1]
-            try:
-                exe = os.path.basename(os.path.realpath("/proc/%d/exe" % pid))
-                if exe.startswith(cmd):
-                    cmd=exe #show non truncated version
-                    #Note because we show the non truncated name
-                    #one can have separated programs as follows:
-                    #584.0 KiB + 1.0 MiB = 1.6 MiB mozilla-thunder (exe -> bash)
-                    #56.0 MiB + 22.2 MiB = 78.2 MiB mozilla-thunderbird-bin
-            except:
-                #permission denied or
-                #kernel threads don't have exe links or
-                #process gone
-                continue
-            try:
-                rss, pss, shared = getMemStats(pid)
-                private = rss-shared
-                #Note shared is always a subset of rss (trs is not always)
-            except:
-                continue #process gone
-            if shareds.get(cmd):
-                if pss: #add shared portion of PSS together
-                    shareds[cmd]+=pss-private
-                elif shareds[cmd] < shared: #just take largest shared val
-                    shareds[cmd]=shared
-            else:
-                if pss:
-                    shareds[cmd]=pss-private
-                else:
-                    shareds[cmd]=shared
-            cmds[cmd]=cmds.setdefault(cmd,0)+private
-            if count.has_key(cmd):
-               count[cmd] += 1
-            else:
-               count[cmd] = 1
-
-        #Add max shared mem for each program
-        total=0
-        for cmd in cmds.keys():
-            cmds[cmd]=cmds[cmd]+shareds[cmd]
-            total+=cmds[cmd] #valid if PSS available
-
-        sort_list = cmds.items()
-        sort_list.sort(lambda x,y:cmp(x[1],y[1]))
-        sort_list=filter(lambda x:x[1],sort_list) #get rid of zero sized processes
-
-        #The following matches "du -h" output
-        def human(num, power="Ki"):
-            powers=["Ki","Mi","Gi","Ti"]
-            while num >= 1000: #4 digits
-                num /= 1024.0
-                power=powers[powers.index(power)+1]
-            return "%.1f %s" % (num,power)
-
-        def cmd_with_count(cmd, count):
-            if count>1:
-               return "%s (%u)" % (cmd, count)
-            else:
-               return cmd
-
-        for cmd in sort_list:
-            results.append([
-                "%sB" % human(cmd[1]-shareds[cmd[0]]),
-                "%sB" % human(shareds[cmd[0]]),
-                "%sB" % human(cmd[1]),
-                "%s" % cmd_with_count(cmd[0], count[cmd[0]])
-            ])
-        if have_pss:
-            results.append(["", "", "", "%sB" % human(total)])
-
-        return results
-
-    memory = mem
-
-    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
diff --git a/certmaster/minion/modules/process.py.orig b/certmaster/minion/modules/process.py.orig
deleted file mode 100644 (file)
index bdd5193..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-## -*- coding: utf-8 -*-
-##
-## 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,
-            "mem"     : self.mem
-        }
-        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
-
-        cmd = sub_process.Popen(["/bin/ps", flags], executable="/bin/ps", 
-                                stdout=sub_process.PIPE, 
-                                stderr=sub_process.PIPE,
-                                shell=False)
-
-        data, error = cmd.communicate()
-
-        # We can get warnings for odd formatting. warnings != errors.
-        if error and error[:7] != "Warning":
-            raise codes.FuncException(error.split('\n')[0])
-
-        results = []
-        for x in data.split("\n"):
-            tokens = x.split()
-            results.append(tokens)
-
-        return results
-
-    def mem(self):
-        """
-        Returns a list of per-program memory usage.
-
-             Private  +  Shared   =  RAM used     Program
-
-           [["39.4 MiB", "10.3 MiB", "49.8 MiB",  "Xorg"],
-            ["42.2 MiB", "12.4 MiB", "54.6 MiB",  "nautilus"],
-            ["52.3 MiB", "10.8 MiB", "63.0 MiB",  "liferea-bin"]
-            ["171.6 MiB", "11.9 MiB", "183.5 MiB", "firefox-bin"]]
-
-        Taken from the ps_mem.py script written by Pádraig Brady.
-        http://www.pixelbeat.org/scripts/ps_mem.py
-        """
-        import os
-        our_pid=os.getpid()
-        results = []
-        have_smaps=0
-        have_pss=0
-
-        def kernel_ver():
-            """ (major,minor,release) """
-            kv=open("/proc/sys/kernel/osrelease").readline().split(".")[:3]
-            for char in "-_":
-                kv[2]=kv[2].split(char)[0]
-            return (int(kv[0]), int(kv[1]), int(kv[2]))
-
-        kv=kernel_ver()
-
-        def getMemStats(pid):
-            """ return Rss,Pss,Shared (note Private = Rss-Shared) """
-            Shared_lines=[]
-            Pss_lines=[]
-            pagesize=os.sysconf("SC_PAGE_SIZE")/1024 #KiB
-            Rss=int(open("/proc/"+str(pid)+"/statm").readline().split()[1])*pagesize
-            if os.path.exists("/proc/"+str(pid)+"/smaps"): #stat
-                global have_smaps
-                have_smaps=1
-                for line in open("/proc/"+str(pid)+"/smaps").readlines(): #open
-                    #Note in smaps Shared+Private = Rss above
-                    #The Rss in smaps includes video card mem etc.
-                    if line.startswith("Shared"):
-                        Shared_lines.append(line)
-                    elif line.startswith("Pss"):
-                        global have_pss
-                        have_pss=1
-                        Pss_lines.append(line)
-                Shared=sum([int(line.split()[1]) for line in Shared_lines])
-                Pss=sum([int(line.split()[1]) for line in Pss_lines])
-            elif (2,6,1) <= kv <= (2,6,9):
-                Pss=0
-                Shared=0 #lots of overestimation, but what can we do?
-            else:
-                Pss=0
-                Shared=int(open("/proc/"+str(pid)+"/statm").readline().split()[2])*pagesize
-            return (Rss, Pss, Shared)
-
-        cmds={}
-        shareds={}
-        count={}
-        for pid in os.listdir("/proc/"):
-            try:
-                pid = int(pid) #note Thread IDs not listed in /proc/
-                if pid ==our_pid: continue
-            except:
-                continue
-            cmd = file("/proc/%d/status" % pid).readline()[6:-1]
-            try:
-                exe = os.path.basename(os.path.realpath("/proc/%d/exe" % pid))
-                if exe.startswith(cmd):
-                    cmd=exe #show non truncated version
-                    #Note because we show the non truncated name
-                    #one can have separated programs as follows:
-                    #584.0 KiB + 1.0 MiB = 1.6 MiB mozilla-thunder (exe -> bash)
-                    #56.0 MiB + 22.2 MiB = 78.2 MiB mozilla-thunderbird-bin
-            except:
-                #permission denied or
-                #kernel threads don't have exe links or
-                #process gone
-                continue
-            try:
-                rss, pss, shared = getMemStats(pid)
-                private = rss-shared
-                #Note shared is always a subset of rss (trs is not always)
-            except:
-                continue #process gone
-            if shareds.get(cmd):
-                if pss: #add shared portion of PSS together
-                    shareds[cmd]+=pss-private
-                elif shareds[cmd] < shared: #just take largest shared val
-                    shareds[cmd]=shared
-            else:
-                if pss:
-                    shareds[cmd]=pss-private
-                else:
-                    shareds[cmd]=shared
-            cmds[cmd]=cmds.setdefault(cmd,0)+private
-            if count.has_key(cmd):
-               count[cmd] += 1
-            else:
-               count[cmd] = 1
-
-        #Add max shared mem for each program
-        total=0
-        for cmd in cmds.keys():
-            cmds[cmd]=cmds[cmd]+shareds[cmd]
-            total+=cmds[cmd] #valid if PSS available
-
-        sort_list = cmds.items()
-        sort_list.sort(lambda x,y:cmp(x[1],y[1]))
-        sort_list=filter(lambda x:x[1],sort_list) #get rid of zero sized processes
-
-        #The following matches "du -h" output
-        def human(num, power="Ki"):
-            powers=["Ki","Mi","Gi","Ti"]
-            while num >= 1000: #4 digits
-                num /= 1024.0
-                power=powers[powers.index(power)+1]
-            return "%.1f %s" % (num,power)
-
-        def cmd_with_count(cmd, count):
-            if count>1:
-               return "%s (%u)" % (cmd, count)
-            else:
-               return cmd
-
-        for cmd in sort_list:
-            results.append([
-                "%sB" % human(cmd[1]-shareds[cmd[0]]),
-                "%sB" % human(shareds[cmd[0]]),
-                "%sB" % human(cmd[1]),
-                "%s" % cmd_with_count(cmd[0], count[cmd[0]])
-            ])
-        if have_pss:
-            results.append(["", "", "", "%sB" % human(total)])
-
-        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/certmaster/minion/modules/reboot.py b/certmaster/minion/modules/reboot.py
deleted file mode 100644 (file)
index c4fb275..0000000
+++ /dev/null
@@ -1,21 +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.
-
-import func_module
-import sub_process
-
-class Reboot(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Reboots a machine."
-
-    def reboot(self, when='now', message=''):
-        return sub_process.call(["/sbin/shutdown", '-r', when, message])
diff --git a/certmaster/minion/modules/rpms.py b/certmaster/minion/modules/rpms.py
deleted file mode 100644 (file)
index ae26cb4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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 func_module
-import rpm
-
-class RpmModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "RPM related commands."
-
-    def inventory(self, flatten=True):
-        """
-        Returns information on all installed packages.
-        By default, 'flatten' is passed in as True, which makes printouts very
-        clean in diffs for use by func-inventory.  If you are writting another
-        software application, using flatten=False will prevent the need to 
-        parse the returns.
-        """
-        # I have not been able to get flatten=False to work if there 
-        # is more than 491 entries in the dict -- ashcrow
-        ts = rpm.TransactionSet()
-        mi = ts.dbMatch()
-        results = []
-        for hdr in mi:
-            name = hdr['name']
-            epoch = (hdr['epoch'] or 0)
-            version = hdr['version']
-            release = hdr['release']
-            arch = hdr['arch']
-            if flatten:
-                results.append("%s %s %s %s %s" % (name, epoch, version, 
-                                                   release, arch))
-            else:
-                results.append([name, epoch, version, release, arch])
-        return results
diff --git a/certmaster/minion/modules/service.py b/certmaster/minion/modules/service.py
deleted file mode 100644 (file)
index 062aea5..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-## 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
-import func_module
-
-import sub_process
-import os
-
-class Service(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Allows for service control via func."
-
-    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")
-
-    def inventory(self):
-        return {
-            "running" : self.get_running(),
-            "enabled" : self.get_enabled()
-        }
-
-    def get_enabled(self):
-        """
-        Get the list of services that are enabled at the various runlevels.  Xinetd services
-        only provide whether or not they are running, not specific runlevel info.
-        """
-
-        chkconfig = sub_process.Popen(["/sbin/chkconfig", "--list"], stdout=sub_process.PIPE)
-        data = chkconfig.communicate()[0]
-        results = []
-        for line in data.split("\n"):
-            if line.find("0:") != -1:
-               # regular services
-               tokens = line.split()
-               results.append((tokens[0],tokens[1:]))
-            elif line.find(":") != -1 and not line.endswith(":"):
-               # xinetd.d based services
-               tokens = line.split()
-               tokens[0] = tokens[0].replace(":","")
-               results.append((tokens[0],tokens[1]))
-        return results
-
-    def get_running(self):
-        """
-        Get a list of which services are running, stopped, or disabled.
-        """
-        chkconfig = sub_process.Popen(["/sbin/service", "--status-all"], stdout=sub_process.PIPE)
-        data = chkconfig.communicate()[0]
-        results = []
-        for line in data.split("\n"):
-            if line.find(" is ") != -1:
-                tokens = line.split()
-                results.append((tokens[0], tokens[-1].replace("...","")))
-        return results
diff --git a/certmaster/minion/modules/smart.py b/certmaster/minion/modules/smart.py
deleted file mode 100644 (file)
index f410f09..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-##
-## 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
-import func_module
-
-# =================================
-
-class SmartModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Grabs status from SMART to see if your hard drives are ok."
-
-    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)
diff --git a/certmaster/minion/modules/snmp.py b/certmaster/minion/modules/snmp.py
deleted file mode 100644 (file)
index c992db1..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2007, Red Hat, Inc
-# James Bowes <jbowes@redhat.com>
-# Seth Vidal modified command.py to be snmp.py
-#
-# 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.
-"""
-
-import func_module
-import sub_process
-base_snmp_command = '/usr/bin/snmpget -v2c -Ov -OQ'
-
-class Snmp(func_module.FuncModule):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "SNMP related calls through func."
-
-    def get(self, oid, rocommunity, hostname='localhost'):
-        """
-        Runs an snmpget on a specific oid returns the output of the call.
-        """
-        command = '%s -c %s %s %s' % (base_snmp_command, rocommunity, hostname, oid)
-        
-        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])
-        
-    #def walk(self, oid, rocommunity):
-
-    #def table(self, oid, rocommunity):
diff --git a/certmaster/minion/modules/sysctl.py b/certmaster/minion/modules/sysctl.py
deleted file mode 100644 (file)
index 1f11d55..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2008, Red Hat, Inc
-# Luke Macken <lmacken@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 func_module
-import sub_process
-
-class SysctlModule(func_module.FuncModule):
-
-    version = "0.0.1"
-    description = "Configure kernel parameters at runtime"
-
-    def __run(self, cmd):
-        cmd = sub_process.Popen(cmd.split(), stdout=sub_process.PIPE,
-                                stderr=sub_process.PIPE, shell=False)
-        return [line for line in cmd.communicate()[0].strip().split('\n')]
-
-    def list(self):
-        return self.__run("/sbin/sysctl -a")
-
-    def get(self, name):
-        return self.__run("/sbin/sysctl -n %s" % name)
-
-    def set(self, name, value):
-        return self.__run("/sbin/sysctl -w %s=%s" % (name, value))
diff --git a/certmaster/minion/modules/test.py b/certmaster/minion/modules/test.py
deleted file mode 100644 (file)
index 6f7c5fa..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-import func_module
-import time
-import exceptions
-
-class Test(func_module.FuncModule):
-    version = "11.11.11"
-    api_version = "0.0.1"
-    description = "Just a very simple example module"
-
-    def add(self, numb1, numb2):
-        return numb1 + numb2
-
-    def ping(self):
-        return 1
-
-    def sleep(self,t):
-        """
-        Sleeps for t seconds, and returns time of day.
-        Simply a test function for trying out async and threaded voodoo.
-        """
-        t = int(t)
-        time.sleep(t)
-        return time.time()
-
-    def explode(self):
-        """
-        Testing remote exception handling is useful
-        """
-        raise exceptions.Exception("khhhhhhaaaaaan!!!!!!")
diff --git a/certmaster/minion/modules/virt.py b/certmaster/minion/modules/virt.py
deleted file mode 100644 (file)
index 04d36bd..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-"""
-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):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Virtualization items through func."
-
-    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" % vmid)
-
-    def shutdown(self, vmid):
-        return self.find_vm(vmid).shutdown()
-
-    def pause(self, vmid):
-        return self.suspend(self.conn,vmid)
-
-    def unpause(self, vmid):
-        return self.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 __get_conn(self):
-        self.conn = FuncLibvirtConnection()
-        return self.conn
-
-    def state(self):
-        vms = self.list_vms()
-        state = []
-        for vm in vms:
-            state_blurb = self.conn.get_status(vm)
-            state.append("%s %s" % (vm,state_blurb))
-        return state
-
-
-    def info(self):
-        vms = self.list_vms()
-        info = dict()
-        for vm in vms:
-            data = self.conn.find_vm(vm).info()
-            # libvirt returns maxMem, memory, and cpuTime as long()'s, which
-            # xmlrpclib tries to convert to regular int's during serialization.
-            # This throws exceptions, so convert them to strings here and
-            # assume the other end of the xmlrpc connection can figure things
-            # out or doesn't care.
-            info[vm] = {
-                "state"     : VIRT_STATE_NAME_MAP.get(data[0],"unknown"),
-                "maxMem"    : str(data[1]),
-                "memory"    : str(data[2]),
-                "nrVirtCpu" : data[3],
-                "cpuTime"   : str(data[4])
-            }
-        return info
-
-
-    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)
diff --git a/certmaster/minion/modules/yumcmd.py b/certmaster/minion/modules/yumcmd.py
deleted file mode 100644 (file)
index f952372..0000000
+++ /dev/null
@@ -1,50 +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.
-
-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):
-
-    version = "0.0.1"
-    api_version = "0.0.1"
-    description = "Package updates through yum."
-
-    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
-
-    def check_update(self, repo=None):
-        """Returns a list of packages due to be updated"""
-        ayum = yum.YumBase()
-        ayum.doConfigSetup()
-        ayum.doTsSetup()
-        if repo is not None:
-            ayum.repos.enableRepo(repo)
-        return map(str, ayum.doPackageLists('updates').updates)
diff --git a/certmaster/overlord/__init__.pyc b/certmaster/overlord/__init__.pyc
deleted file mode 100644 (file)
index f74bc59..0000000
Binary files a/certmaster/overlord/__init__.pyc and /dev/null differ
diff --git a/certmaster/overlord/client.pyc b/certmaster/overlord/client.pyc
deleted file mode 100644 (file)
index 5c7874e..0000000
Binary files a/certmaster/overlord/client.pyc and /dev/null differ
diff --git a/certmaster/overlord/cmd_modules/__init__.py b/certmaster/overlord/cmd_modules/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/certmaster/overlord/cmd_modules/__init__.pyc b/certmaster/overlord/cmd_modules/__init__.pyc
deleted file mode 100644 (file)
index 287b354..0000000
Binary files a/certmaster/overlord/cmd_modules/__init__.pyc and /dev/null differ
diff --git a/certmaster/overlord/cmd_modules/call.py b/certmaster/overlord/cmd_modules/call.py
deleted file mode 100644 (file)
index 7add5bf..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-"""
-call func method invoker
-
-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.
-"""
-
-
-import optparse
-import pprint
-import xmlrpclib
-
-from func.overlord import command
-from func.overlord import client
-
-DEFAULT_PORT = 51234
-DEFAULT_FORKS = 1
-
-class Call(client.command.Command):
-    name = "call"
-    usage = "call module method name arg1 arg2..."
-    def addOptions(self):
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-        self.parser.add_option("-x", "--xmlrpc", dest="xmlrpc",
-                               help="output return data in XMLRPC format",
-                               action="store_true")
-        self.parser.add_option("", "--raw", dest="rawprint",
-                               help="output return data using Python print",
-                               action="store_true")
-        self.parser.add_option("-j", "--json", dest="json",
-                               help="output return data using JSON",
-                               action="store_true")
-        self.parser.add_option("-p", "--port", dest="port",
-                               default=DEFAULT_PORT)
-        self.parser.add_option("-f", "--forks", dest="forks",
-                               help="how many parallel processes?  (default 1)",
-                               default=DEFAULT_FORKS)
-
-    def handleOptions(self, options):
-        self.options = options
-
-        self.verbose = options.verbose
-        self.port = options.port
-
-        # I'm not really a fan of the "module methodname" approach
-        # but we'll keep it for now -akl
-
-    def parse(self, argv):
-        self.argv = argv
-
-        return command.Command.parse(self, argv)
-        
-
-    def format_return(self, data):
-        """
-        The call module supports multiple output return types, the default is pprint.
-        """
-        
-        if self.options.xmlrpc:
-            return xmlrpclib.dumps((data,""))
-
-        if self.options.json:
-            try:
-                import simplejson
-                return simplejson.dumps(data)
-            except ImportError:
-                print "WARNING: json support not found, install python-simplejson"
-                return data
-
-        if self.options.rawprint:
-            return data
-            
-        return pprint.pformat(data)
-
-    def do(self, args):
-
-        # I'm not really a fan of the "module methodname" approach
-        # but we'll keep it for now -akl
-
-        # I kind of feel like we shouldn't be parsing args here, but I'm
-        # not sure what the write place is -al;
-        self.module           = args[0]
-        if len(args) > 1:
-            self.method       = args[1]
-        else:
-            self.method       = None
-        if len(args) > 2:
-            self.method_args  = args[2:]
-        else:
-            self.method_args  = []
-
-        # this could get weird, sub sub classes might be calling this
-        # this with multiple.parentCommand.parentCommands...
-        # maybe command.py needs a way to set attrs on subCommands?
-        # or some sort of shared datastruct?
-        self.server_spec = self.parentCommand.server_spec
-
-        client_obj = client.Client(self.server_spec,port=self.port,interactive=True,
-            verbose=self.verbose, config=self.config, nforks=self.options.forks)
-        results = client_obj.run(self.module, self.method, self.method_args)
-
-        # TO DO: add multiplexer support
-        # probably as a higher level module.
-
-        # dump the return code stuff atm till we figure out the right place for it
-        return self.format_return(results)
diff --git a/certmaster/overlord/cmd_modules/call.pyc b/certmaster/overlord/cmd_modules/call.pyc
deleted file mode 100644 (file)
index f6c588d..0000000
Binary files a/certmaster/overlord/cmd_modules/call.pyc and /dev/null differ
diff --git a/certmaster/overlord/cmd_modules/copyfile.py b/certmaster/overlord/cmd_modules/copyfile.py
deleted file mode 100644 (file)
index 295aeab..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-"""
-copyfile command line
-
-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.
-"""
-
-
-import optparse
-import os
-import pprint
-import stat
-import xmlrpclib
-
-from func.overlord import command
-from func.overlord import client
-
-DEFAULT_PORT = 51234
-
-class CopyFile(client.command.Command):
-    name = "copyfile"
-    usage = "copy a file to a client"
-
-
-    def addOptions(self):
-        self.parser.add_option("-f", "--file", dest="filename",
-                               action="store")
-        self.parser.add_option("", "--remotepath", dest="remotepath",
-                                action="store")
-        self.parser.add_option("", "--force", dest="force",
-                               action="store_true")
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-        self.parser.add_option("-p", "--port", dest="port")
-
-    def handleOptions(self, options):
-        self.port = DEFAULT_PORT
-        if self.options.port:
-            self.port = self.options.port
-
-
-    def do(self, args):
-        self.server_spec = self.parentCommand.server_spec
-
-        client_obj = client.Client(self.server_spec,
-                                   port=self.port,
-                                   interactive=False,
-                                   verbose=self.options.verbose,
-                                   config=self.config)
-
-        
-        try:
-            fb = open(self.options.filename, "r").read()
-        except IOError, e:
-            print "Unable to open file: %s: %s" % (self.options.filename, e)
-            return
-
-        st = os.stat(self.options.filename)
-        mode = stat.S_IMODE(st.st_mode)
-        uid = st.st_uid
-        gid = st.st_gid
-
-    
-        data = xmlrpclib.Binary(fb)
-        results = client_obj.run("copyfile", "copyfile", [self.options.remotepath, data,
-                                                          mode, uid, gid])
diff --git a/certmaster/overlord/cmd_modules/listminions.py b/certmaster/overlord/cmd_modules/listminions.py
deleted file mode 100644 (file)
index 50c7e24..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-"""
-copyfile command line
-
-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.
-"""
-
-
-import optparse
-import os
-
-from func.overlord import command
-from func.overlord import client
-DEFAULT_PORT = 51234
-
-class ListMinions(client.command.Command):
-    name = "list_minions"
-    usage = "show known minions"
-
-    def addOptions(self):
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-
-    def handleOptions(self, options):
-        self.port = DEFAULT_PORT
-        if options.verbose:
-            self.verbose = self.options.verbose
-    
-    def do(self, args):
-        self.server_spec = self.parentCommand.server_spec
-
-        client_obj = client.Client(self.server_spec,
-                                   port=self.port,
-                                   interactive=False,
-                                   verbose=self.options.verbose,
-                                   config=self.config)
-
-        servers = client_obj.servers
-        print servers
-        for server in servers:
-            # just cause I hate regex'es -akl
-            host = server.split(':')[-2]
-            host = host.split('/')[-1]
-            print host
diff --git a/certmaster/overlord/cmd_modules/ping.py b/certmaster/overlord/cmd_modules/ping.py
deleted file mode 100644 (file)
index f756fd9..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-"""
-copyfile command line
-
-Copyright 2007, Red Hat, Inc
-Michael DeHaan <mdehaan@redhat.com>
-also 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.
-"""
-
-import optparse
-import os
-import pprint
-import stat
-import xmlrpclib
-
-from func.overlord import command
-from func.overlord import client
-
-# FIXME: this really should not be in each sub module.
-DEFAULT_PORT = 51234
-
-
-class Ping(client.command.Command):
-    name = "ping"
-    usage = "see what func minions are up/accessible"
-
-    def addOptions(self):
-        """
-        Not too many options for you!  (Seriously, it's a simple command ... func "*" ping)
-        """
-        # FIXME: verbose and port should be added globally to all sub modules
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-        self.parser.add_option("-p", "--port", dest="port",
-                               default=DEFAULT_PORT)
-
-    def handleOptions(self, options):
-        """
-        Nothing to do here...
-        """
-        pass
-
-    def do(self, args):
-        self.server_spec = self.parentCommand.server_spec
-
-        # because this is mainly an interactive command, expand the server list and make seperate connections.
-        # to make things look more speedy.
-
-        servers = client.expand_servers(self.server_spec, port=self.options.port, noglobs=None, 
-                                        verbose=self.options.verbose, just_fqdns=True)
-
-        for server in servers:
-
-            client_obj = client.Client(server,port=self.options.port,interactive=False,
-                                       verbose=self.options.verbose,config=self.config, noglobs=True)
-
-            results = client_obj.run("test", "ping", [])
-            if results == 1:
-                print "[ ok ... ] %s" % server
-            else:
-                print "[ FAILED ] %s" % server
-
-        return 1
diff --git a/certmaster/overlord/cmd_modules/show.py b/certmaster/overlord/cmd_modules/show.py
deleted file mode 100644 (file)
index e1df554..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-"""
-show introspection commandline
-
-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.
-"""
-
-
-import optparse
-import pprint
-import xmlrpclib
-
-from func.overlord import command
-from func.overlord import client
-
-DEFAULT_PORT = 51234
-
-
-class ShowHardware(client.command.Command):
-    name = "hardware"
-    usage = "show hardware details"
-
-    # FIXME: we might as well make verbose be in the subclass
-    #      and probably an inc variable while we are at it
-    def addOptions(self):
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-        self.parser.add_option("-p", "--port", dest="port")
-
-
-    def handleOptions(self, options):
-        self.port = DEFAULT_PORT
-        if self.options.port:
-            self.port = self.options.port
-
-    def parse(self, argv):
-        self.argv = argv
-        return command.Command.parse(self,argv)
-
-    def do(self,args):
-
-        self.server_spec = self.parentCommand.parentCommand.server_spec
-        
-        client_obj = client.Client(self.server_spec,
-                                   port=self.port,
-                                   interactive=False,
-                                   verbose=self.options.verbose,
-                                   config=self.config)
-        
-        results = client_obj.run("hardware", "info", [])
-
-        # if the user 
-        top_options = ["port","verbose"]
-        
-        for minion in results:
-            print "%s:" % minion
-            minion_data = results[minion]
-            # if user set no args
-            if not args:
-                pprint.pprint(minion_data)
-                continue
-            
-            for arg in args:
-                if arg in minion_data:
-                    print minion_data[arg]
-
-
-class Show(client.command.Command):
-    name = "show"
-    usage = "various simple report stuff"
-    subCommandClasses = [ShowHardware]
-    def addOptions(self):
-        self.parser.add_option("-v", "--verbose", dest="verbose",
-                               action="store_true")
-        self.parser.add_option("-p", "--port", dest="port",
-                               default=DEFAULT_PORT)
-
-    def handleOptions(self, options):
-        self.options = options
-
-        self.verbose = options.verbose
-        self.port = options.port
-
-
-    def parse(self, argv):
-        self.argv = argv
-
-        return command.Command.parse(self, argv)
-        
-
-    def do(self, args):
-        pass
diff --git a/certmaster/overlord/command.pyc b/certmaster/overlord/command.pyc
deleted file mode 100644 (file)
index 6fa44e8..0000000
Binary files a/certmaster/overlord/command.pyc and /dev/null differ
diff --git a/certmaster/overlord/forkbomb.pyc b/certmaster/overlord/forkbomb.pyc
deleted file mode 100644 (file)
index 308557d..0000000
Binary files a/certmaster/overlord/forkbomb.pyc and /dev/null differ
diff --git a/certmaster/overlord/func_command.pyc b/certmaster/overlord/func_command.pyc
deleted file mode 100644 (file)
index 1834e0e..0000000
Binary files a/certmaster/overlord/func_command.pyc and /dev/null differ
diff --git a/certmaster/overlord/groups.pyc b/certmaster/overlord/groups.pyc
deleted file mode 100644 (file)
index 9ed2a92..0000000
Binary files a/certmaster/overlord/groups.pyc and /dev/null differ
diff --git a/certmaster/overlord/jobthing.pyc b/certmaster/overlord/jobthing.pyc
deleted file mode 100644 (file)
index cba36cb..0000000
Binary files a/certmaster/overlord/jobthing.pyc and /dev/null differ
diff --git a/certmaster/overlord/modules/netapp.py b/certmaster/overlord/modules/netapp.py
deleted file mode 100644 (file)
index 987901e..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-##
-## Overlord library to interface with minion-side netapp operations
-##
-## Most of this is just wrappers to create some cleaner, earier to use
-## interfaces.  Also allows users to get function signatures and use
-## nice things like kwargs client side, for those of us who can't live
-## without ipython introspection.
-##
-## Copyright 2008, Red Hat, Inc
-## John Eckersberg <jeckersb@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 func.overlord.client import Client
-
-class RemoteError(Exception): pass
-
-def _(res):
-    if type(res) == type([]) and res[0] == 'REMOTE_ERROR':
-        raise RemoteError, res[2]
-    else:
-        return res
-
-class Filer(Client):
-    def __init__(self, filer, admin_host):
-        Client.__init__(self, admin_host)
-        self.filer = filer
-        self.admin_host = admin_host
-
-    def create_volume(self, vol, aggr, size):
-        return _(self.netapp.vol.create(self.filer, vol, aggr, size)[self.admin_host])
-
-    def destroy_volume(self, vol):
-        # offline it first
-        try:
-            self.netapp.vol.offline(self.filer, vol)
-        except:
-            pass
-        return _(self.netapp.vol.destroy(self.filer, vol)[self.admin_host])
-
-    def offline_volume(self, vol):
-        return _(self.netapp.vol.offline(self.filer, vol)[self.admin_host])                 
-
-    def online_volume(self, vol):
-        return _(self.netapp.vol.online(self.filer, vol)[self.admin_host])                 
-
-    def get_volume_size(self, vol):
-        return _(self.netapp.vol.size(self.filer, vol)[self.admin_host])
-
-    def resize_volume(self, vol, delta):
-        return _(self.netapp.vol.size(self.filer, vol, delta)[self.admin_host])
-
-    def create_snapshot(self, vol, snap):
-        return _(self.netapp.snap.create(self.filer, vol, snap)[self.admin_host])
-
-    def delete_snapshot(self, vol, snap):
-        return _(self.netapp.snap.delete(self.filer, vol, snap)[self.admin_host])
-
-    def create_clone_volume(self, vol, parent, snap):
-        return _(self.netapp.vol.clone.create(self.filer, vol, parent, snap)[self.admin_host])
-
-    def split_clone_volume(self, vol):
-        return _(self.netapp.vol.clone.split(self.filer, vol)[self.admin_host])
-
-    def list_volumes(self):
-        vols = _(self.netapp.vol.status(self.filer))
-        return_list = []
-        for vol in vols:
-            return_list.append(vol['name'])
-        return return_list
-
-    def volume_details(self, vol=None):
-        if vol:
-            return _(self.netapp.vol.status(self.filer, vol)[self.admin_host])
-        else:
-            return _(self.netapp.vol.status(self.filer)[self.admin_host])
diff --git a/certmaster/overlord/sslclient.pyc b/certmaster/overlord/sslclient.pyc
deleted file mode 100644 (file)
index fdc21f2..0000000
Binary files a/certmaster/overlord/sslclient.pyc and /dev/null differ
diff --git a/certmaster/overlord/test_func.py b/certmaster/overlord/test_func.py
deleted file mode 100755 (executable)
index 2b3f041..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/python
-
-
-# FIXME: should import the client lib, not XMLRPC lib, when we are done
-
-import xmlrpclib
-import sys
-
-TEST_GETATTR = True
-TEST_PROCESS = False
-TEST_VIRT = False
-TEST_SERVICES = False
-TEST_HARDWARE =  False
-TEST_SMART = True
-
-if TEST_GETATTR:
-    import func.overlord.client as func_client
-    print func_client.Client("*").hardware.pci_info()
-    #print func_client.Client("*").test.add(1,2)
-    #print func_client.Client("*").hardware.info()
-    #print func_client.Client("*").run("hardware","info",[])
-    #print func_client.Client(socket.gethostname(),noglobs=True).test.add("1","2")
-    sys.exit(1)
-
-# get a connecton (to be replaced by client lib logic)
-s = xmlrpclib.ServerProxy("http://127.0.0.1:51234")
-
-# here's the basic test...
-print s.test.add(1, 2)
-
-if TEST_SMART:
-    print s.smart.info()
-
-if TEST_PROCESS:
-    print s.process.info()
-    # print s.process.pkill("thunderbird")
-
-# here's the service module testing
-if TEST_SERVICES:
-    print s.service.restart("httpd")
-
-if TEST_HARDWARE:
-    print s.hardware.info()
-
-# this is so I can remember how the virt module works
-if TEST_VIRT:
-
-    # example of using koan to install a virtual machine
-    #s.virt_install("mdehaan.rdu.redhat.com","profileX")
-
-    # wait ...
-    vms = s.virt.list_vms()
-    # example of stopping all stopped virtual machines
-    print "list of virtual instances = %s" % vms
-    for vm in vms:
-        status = s.virt.status(vm)
-        print status
-        if status == "shutdown":
-            s.virt.start(vm)
-
-# add more tests here
index 54c9c39..481faf5 100755 (executable)
@@ -1,5 +1,5 @@
 """
 """
-Copyright 2007, Red Hat, Inc
+Copyright 2007-2008, Red Hat, Inc
 see AUTHORS
 
 This software may be freely redistributed under the terms of the GNU
 see AUTHORS
 
 This software may be freely redistributed under the terms of the GNU