summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--func.spec4
-rw-r--r--func/overlord/cmd_modules/check.py122
-rw-r--r--func/overlord/cmd_modules/listminions.py3
-rw-r--r--func/overlord/cmd_modules/ping.py2
-rw-r--r--func/overlord/func_command.py10
5 files changed, 134 insertions, 7 deletions
diff --git a/func.spec b/func.spec
index 8fb1b43..3ee4e6d 100644
--- a/func.spec
+++ b/func.spec
@@ -3,7 +3,7 @@
%define is_suse %(test -e /etc/SuSE-release && echo 1 || echo 0)
-Summary: Remote config, monitoring, and management api
+Summary: Remote management framework
Name: func
Source1: version
Version: %(echo `awk '{ print $1 }' %{SOURCE1}`)
@@ -29,7 +29,7 @@ Url: https://hosted.fedoraproject.org/projects/func/
%description
-func is a remote api for mangement, configation, and monitoring of systems.
+func is a remote api for mangement, configuration, and monitoring of systems.
%prep
%setup -q
diff --git a/func/overlord/cmd_modules/check.py b/func/overlord/cmd_modules/check.py
new file mode 100644
index 0000000..58c2b97
--- /dev/null
+++ b/func/overlord/cmd_modules/check.py
@@ -0,0 +1,122 @@
+"""
+check checks to see how happy func is.
+it provides sanity checks for basic user setup.
+
+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 optparse
+import os
+import urllib2
+
+from func.overlord import command
+from func.overlord import client
+from func import utils
+from func.minion import sub_process
+from func.config import read_config
+from func.commonconfig import FuncdConfig
+
+# FIXME: don't hardcode this here
+DEFAULT_PORT = 51234
+
+class CheckAction(client.command.Command):
+ name = "check"
+ usage = "check func for possible setup problems"
+
+ def addOptions(self):
+ self.parser.add_option("-c", "--certmaster", action="store_true", help="check the certmaster configuration on this box")
+ self.parser.add_option("-m", "--minion", action="store_true", help="check the minion configuration on this box")
+
+
+ def handleOptions(self, options):
+ # FIXME: all through the code we have this constant in each
+ # file, need to make this common.
+ self.port = DEFAULT_PORT
+ self.check_certmaster = options.certmaster
+ self.check_minion = options.minion
+
+ def do(self, args):
+
+ if not self.check_certmaster and not self.check_minion:
+ print "* specify --certmaster, --minion, or both"
+ return
+ else:
+ print "SCAN RESULTS:"
+
+ hostname = utils.get_hostname()
+ print "* FQDN is detected as %s, verify that is correct" % hostname
+ self.check_iptables()
+
+ if self.check_minion:
+
+ # check that funcd is running
+ self.check_service("funcd")
+
+ # check that the configured certmaster is reachable
+ self.check_talk_to_certmaster()
+
+ if self.check_certmaster:
+
+ # check UID
+ # FIXME: todo
+
+ # check that certmasterd is running
+ self.check_service("certmasterd")
+
+ # see if we have any waiting CSRs
+ # FIXME: TODO
+
+ # see if we have signed any certs
+ # FIXME: TODO
+
+ # construct a client handle and see if any hosts are reachable
+
+
+ # see if any of our certs have expired
+
+ # warn about iptables if running
+ print "End of Report."
+
+ def check_service(self, which):
+ if os.path.exists("/etc/rc.d/init.d/%s" % which):
+ rc = sub_process.call("/sbin/service %s status >/dev/null 2>/dev/null" % which, shell=True)
+ if rc != 0:
+ print "* service %s is not running" % which
+
+ def check_iptables(self):
+ if os.path.exists("/etc/rc.d/init.d/iptables"):
+ rc = sub_process.call("/sbin/service iptables status >/dev/null 2>/dev/null", shell=True)
+
+ if rc == 0:
+ # FIXME: don't hardcode port
+ print "* iptables may be running, ensure 51234 is unblocked"
+
+ def check_talk_to_certmaster(self):
+ config_file = '/etc/func/minion.conf'
+ config = read_config(config_file, FuncdConfig)
+ cert_dir = config.cert_dir
+ # FIXME: don't hardcode port
+ master_uri = "http://%s:51235/" % config.certmaster
+ print "* minion is set to talk to host '%s' for certs in /etc/func/minion.conf" % config.certmaster
+ # this will be a 501, unsupported GET, but we should be
+ # able to tell if we can make contact
+ connect_ok = True
+ try:
+ fd = urllib2.urlopen(master_uri)
+ data = fd.read()
+ fd.close()
+ except urllib2.HTTPError:
+ pass
+ except:
+ connect_ok = False
+ if not connect_ok:
+ print "cannot connect to certmaster at %s" % (master_uri)
diff --git a/func/overlord/cmd_modules/listminions.py b/func/overlord/cmd_modules/listminions.py
index 1e4570e..9421b8d 100644
--- a/func/overlord/cmd_modules/listminions.py
+++ b/func/overlord/cmd_modules/listminions.py
@@ -1,5 +1,6 @@
"""
-copyfile command line
+list minions provides a command line way to see what certs are
+registered.
Copyright 2007, Red Hat, Inc
see AUTHORS
diff --git a/func/overlord/cmd_modules/ping.py b/func/overlord/cmd_modules/ping.py
index f756fd9..e056f0b 100644
--- a/func/overlord/cmd_modules/ping.py
+++ b/func/overlord/cmd_modules/ping.py
@@ -1,5 +1,5 @@
"""
-copyfile command line
+ping minions to see whether they are up.
Copyright 2007, Red Hat, Inc
Michael DeHaan <mdehaan@redhat.com>
diff --git a/func/overlord/func_command.py b/func/overlord/func_command.py
index 8bc6b7c..bd718bb 100644
--- a/func/overlord/func_command.py
+++ b/func/overlord/func_command.py
@@ -23,15 +23,19 @@ from cmd_modules import show
from cmd_modules import copyfile
from cmd_modules import listminions
from cmd_modules import ping
+from cmd_modules import check
from func.overlord import client
class FuncCommandLine(command.Command):
+
name = "func"
- usage = "func is the commandline interface to a func minion"
+ usage = "func is the command line interface for controlling func minions"
- subCommandClasses = [call.Call, show.Show,
- copyfile.CopyFile, listminions.ListMinions, ping.Ping]
+ subCommandClasses = [
+ call.Call, show.Show, copyfile.CopyFile,
+ listminions.ListMinions, ping.Ping, check.CheckAction
+ ]
def __init__(self):