summaryrefslogtreecommitdiffstats
path: root/base/server
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2015-01-20 22:11:50 -0500
committerEndi S. Dewata <edewata@redhat.com>2015-01-28 14:13:06 -0500
commit3294ac64d9e71f76309d2cc12a2c256838fe8666 (patch)
tree8756d115624ed0a62ef0b70d3928f626a4feb3ef /base/server
parenta578cf649c0c41676677cf0a6ede03ea8d6fedb7 (diff)
downloadpki-3294ac64d9e71f76309d2cc12a2c256838fe8666.tar.gz
pki-3294ac64d9e71f76309d2cc12a2c256838fe8666.tar.xz
pki-3294ac64d9e71f76309d2cc12a2c256838fe8666.zip
Added server management CLI.
A new pki-server CLI has been added to manage the instances and subsystems using the server management library. This CLI manages the system files directly, so it can only be run locally on the server by the system administrator. The autoDeploy setting in server.xml has been enabled by default. An upgrade script has been added to enable the autoDeploy setting in existing instances. https://fedorahosted.org/pki/ticket/1183
Diffstat (limited to 'base/server')
-rw-r--r--base/server/python/pki/server/cli/__init__.py0
-rw-r--r--base/server/python/pki/server/cli/instance.py252
-rw-r--r--base/server/python/pki/server/cli/subsystem.py309
-rw-r--r--base/server/sbin/pki-server84
-rw-r--r--base/server/share/conf/server.xml2
-rwxr-xr-xbase/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy56
6 files changed, 702 insertions, 1 deletions
diff --git a/base/server/python/pki/server/cli/__init__.py b/base/server/python/pki/server/cli/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/base/server/python/pki/server/cli/__init__.py
diff --git a/base/server/python/pki/server/cli/instance.py b/base/server/python/pki/server/cli/instance.py
new file mode 100644
index 000000000..c1ec9ddd7
--- /dev/null
+++ b/base/server/python/pki/server/cli/instance.py
@@ -0,0 +1,252 @@
+#!/usr/bin/python
+# Authors:
+# Endi S. Dewata <edewata@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (C) 2015 Red Hat, Inc.
+# All rights reserved.
+#
+
+import getopt
+import os
+import sys
+
+import pki.cli
+import pki.server
+
+
+class InstanceCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(InstanceCLI, self).__init__('instance', 'Instance management commands')
+
+ self.add_module(InstanceFindCLI())
+ self.add_module(InstanceShowCLI())
+ self.add_module(InstanceStartCLI())
+ self.add_module(InstanceStopCLI())
+
+ @staticmethod
+ def print_instance(instance):
+ print ' Instance ID: %s' % instance.name
+ print ' Active: %s' % instance.is_active()
+
+
+class InstanceFindCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(InstanceFindCLI, self).__init__('find', 'Find instances')
+
+ def print_help(self):
+ print 'Usage: pki-server instance-find [OPTIONS]'
+ print
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, _ = getopt.getopt(argv, 'i:v', [
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.print_help()
+ sys.exit(1)
+
+ for o, _ in opts:
+ if o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.print_help()
+ sys.exit(1)
+
+ results = []
+ if os.path.exists(pki.server.INSTANCE_BASE_DIR):
+ for f in os.listdir(pki.server.INSTANCE_BASE_DIR):
+
+ if not os.path.isdir:
+ continue
+
+ results.append(f)
+
+ self.print_message('%s entries matched' % len(results))
+
+ first = True
+ for instance_name in results:
+ if first:
+ first = False
+ else:
+ print
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ InstanceCLI.print_instance(instance)
+
+
+class InstanceShowCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(InstanceShowCLI, self).__init__('show', 'Show instance')
+
+ def print_help(self):
+ print 'Usage: pki-server instance-show [OPTIONS] <instance ID>'
+ print
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.print_help()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing instance ID'
+ self.print_help()
+ sys.exit(1)
+
+ instance_name = args[0]
+
+ for o, _ in opts:
+ if o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.print_help()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ InstanceCLI.print_instance(instance)
+
+
+class InstanceStartCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(InstanceStartCLI, self).__init__('start', 'Start instance')
+
+ def print_help(self):
+ print 'Usage: pki-server instance-start [OPTIONS] <instance ID>'
+ print
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.print_help()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing instance ID'
+ self.print_help()
+ sys.exit(1)
+
+ instance_name = args[0]
+
+ for o, _ in opts:
+ if o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.print_help()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+ instance.start()
+
+ self.print_message('%s instance started' % instance_name)
+
+
+class InstanceStopCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(InstanceStopCLI, self).__init__('stop', 'Stop instance')
+
+ def print_help(self):
+ print 'Usage: pki-server instance-stop [OPTIONS] <instance ID>'
+ print
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.print_help()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing instance ID'
+ self.print_help()
+ sys.exit(1)
+
+ instance_name = args[0]
+
+ for o, _ in opts:
+ if o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.print_help()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+ instance.stop()
+
+ self.print_message('%s instance stopped' % instance_name)
diff --git a/base/server/python/pki/server/cli/subsystem.py b/base/server/python/pki/server/cli/subsystem.py
new file mode 100644
index 000000000..3aad00a05
--- /dev/null
+++ b/base/server/python/pki/server/cli/subsystem.py
@@ -0,0 +1,309 @@
+#!/usr/bin/python
+# Authors:
+# Endi S. Dewata <edewata@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (C) 2015 Red Hat, Inc.
+# All rights reserved.
+#
+
+import getopt
+import os
+import sys
+
+import pki.cli
+import pki.server
+
+
+class SubsystemCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(SubsystemCLI, self).__init__('subsystem', 'Subsystem management commands')
+
+ self.add_module(SubsystemDisableCLI())
+ self.add_module(SubsystemEnableCLI())
+ self.add_module(SubsystemFindCLI())
+ self.add_module(SubsystemShowCLI())
+
+ @staticmethod
+ def print_subsystem(subsystem):
+ print ' Subsystem ID: %s' % subsystem.name
+ print ' Instance ID: %s' % subsystem.instance.name
+ print ' Enabled: %s' % subsystem.is_enabled()
+
+
+class SubsystemFindCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(SubsystemFindCLI, self).__init__('find', 'Find subsystems')
+
+ def usage(self):
+ print 'Usage: pki-server subsystem-find [OPTIONS]'
+ print
+ print ' -i, --instance <instance ID> Instance ID.'
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, args):
+
+ try:
+ opts, _ = getopt.getopt(args, 'i:v', [
+ 'instance=',
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.usage()
+ sys.exit(1)
+
+ instance_name = None
+
+ for o, a in opts:
+ if o in ('-i', '--instance'):
+ instance_name = a
+
+ elif o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.usage()
+ sys.exit(1)
+
+ if not instance_name:
+ print 'ERROR: missing instance ID'
+ self.usage()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ results = []
+
+ for name in os.listdir(instance.base_dir):
+
+ subsystem = pki.server.PKISubsystem(instance, name)
+ if not subsystem.is_valid():
+ continue
+
+ results.append(subsystem)
+
+ self.print_message('%s entries matched' % len(results))
+
+ first = True
+ for subsystem in results:
+ if first:
+ first = False
+ else:
+ print
+
+ SubsystemCLI.print_subsystem(subsystem)
+
+
+class SubsystemShowCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(SubsystemShowCLI, self).__init__('show', 'Show subsystem')
+
+ def usage(self):
+ print 'Usage: pki-server subsystem-show [OPTIONS] <subsystem ID>'
+ print
+ print ' -i, --instance <instance ID> Instance ID.'
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'instance=',
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.usage()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing subsystem ID'
+ self.usage()
+ sys.exit(1)
+
+ subsystem_name = args[0]
+ instance_name = None
+
+ for o, a in opts:
+ if o in ('-i', '--instance'):
+ instance_name = a
+
+ elif o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.usage()
+ sys.exit(1)
+
+ if not instance_name:
+ print 'ERROR: missing instance ID'
+ self.usage()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ subsystem = pki.server.PKISubsystem(instance, subsystem_name)
+
+ SubsystemCLI.print_subsystem(subsystem)
+
+
+class SubsystemEnableCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(SubsystemEnableCLI, self).__init__('enable', 'Enable subsystem')
+
+ def usage(self):
+ print 'Usage: pki-server subsystem-enable [OPTIONS] <subsystem ID>'
+ print
+ print ' -i, --instance <instance ID> Instance ID.'
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'instance=',
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.usage()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing subsystem ID'
+ self.usage()
+ sys.exit(1)
+
+ subsystem_name = args[0]
+ instance_name = None
+
+ for o, a in opts:
+ if o in ('-i', '--instance'):
+ instance_name = a
+
+ elif o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.usage()
+ sys.exit(1)
+
+ if not instance_name:
+ print 'ERROR: missing instance ID'
+ self.usage()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ subsystem = pki.server.PKISubsystem(instance, subsystem_name)
+ subsystem.enable()
+
+ self.print_message('Enabled "%s" subsystem' % subsystem_name)
+
+ SubsystemCLI.print_subsystem(subsystem)
+
+
+class SubsystemDisableCLI(pki.cli.CLI):
+
+ def __init__(self):
+ super(SubsystemDisableCLI, self).__init__('disable', 'Disable subsystem')
+
+ def usage(self):
+ print 'Usage: pki-server subsystem-disable [OPTIONS] <subsystem ID>'
+ print
+ print ' -i, --instance <instance ID> Instance ID.'
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv, 'i:v', [
+ 'instance=',
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.usage()
+ sys.exit(1)
+
+ if len(args) != 1:
+ print 'ERROR: missing subsystem ID'
+ self.usage()
+ sys.exit(1)
+
+ subsystem_name = args[0]
+ instance_name = None
+
+ for o, a in opts:
+ if o in ('-i', '--instance'):
+ instance_name = a
+
+ elif o in ('-v', '--verbose'):
+ self.set_verbose(True)
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.usage()
+ sys.exit(1)
+
+ if not instance_name:
+ print 'ERROR: missing instance ID'
+ self.usage()
+ sys.exit(1)
+
+ instance = pki.server.PKIInstance(instance_name)
+ instance.load()
+
+ subsystem = pki.server.PKISubsystem(instance, subsystem_name)
+ subsystem.disable()
+
+ self.print_message('Disabled "%s" subsystem' % subsystem_name)
+
+ SubsystemCLI.print_subsystem(subsystem)
diff --git a/base/server/sbin/pki-server b/base/server/sbin/pki-server
new file mode 100644
index 000000000..c730ebd20
--- /dev/null
+++ b/base/server/sbin/pki-server
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+# Authors:
+# Endi S. Dewata <edewata@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (C) 2015 Red Hat, Inc.
+# All rights reserved.
+#
+
+import getopt
+import sys
+
+import pki.cli
+import pki.server.cli.instance
+import pki.server.cli.subsystem
+
+class PKIServerCLI(pki.cli.CLI):
+
+ def __init__(self):
+
+ super(PKIServerCLI, self).__init__('pki-server', 'PKI server command-line interface')
+
+ self.add_module(pki.server.cli.instance.InstanceCLI())
+ self.add_module(pki.server.cli.subsystem.SubsystemCLI())
+
+ def get_full_module_name(self, module_name):
+ return module_name
+
+ def print_help(self):
+
+ print 'Usage: pki-server [OPTIONS]'
+ print
+ print ' -v, --verbose Run in verbose mode.'
+ print ' --help Show help message.'
+ print
+
+ super(PKIServerCLI, self).print_help()
+
+ def execute(self, argv):
+
+ try:
+ opts, args = getopt.getopt(argv[1:], 'v', [
+ 'verbose', 'help'])
+
+ except getopt.GetoptError as e:
+ print 'ERROR: ' + str(e)
+ self.print_help()
+ sys.exit(1)
+
+ for o, _ in opts:
+ if o in ('-v', '--verbose'):
+ self.verbose = True
+
+ elif o == '--help':
+ self.print_help()
+ sys.exit()
+
+ else:
+ print 'ERROR: unknown option ' + o
+ self.print_help()
+ sys.exit(1)
+
+ if self.verbose:
+ print 'Command: %s' % ' '.join(args)
+
+ super(PKIServerCLI, self).execute(args)
+
+
+if __name__ == '__main__':
+ cli = PKIServerCLI()
+ cli.init()
+ cli.execute(sys.argv)
diff --git a/base/server/share/conf/server.xml b/base/server/share/conf/server.xml
index 306ebf25b..b9e8860b2 100644
--- a/base/server/share/conf/server.xml
+++ b/base/server/share/conf/server.xml
@@ -253,7 +253,7 @@ Tomcat Port = [TOMCAT_SERVER_PORT] (for shutdown)
-->
<Host name="localhost"
appBase="[PKI_INSTANCE_PATH]/webapps"
- unpackWARs="true" autoDeploy="false"
+ unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<!--
diff --git a/base/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy b/base/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy
new file mode 100755
index 000000000..7cafa6dcc
--- /dev/null
+++ b/base/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# Authors:
+# Endi S. Dewata <edewata@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (C) 2014 Red Hat, Inc.
+# All rights reserved.
+#
+
+import grp
+import os
+import pwd
+import shutil
+import signal
+import sys
+from lxml import etree
+
+import pki
+import pki.server.upgrade
+
+
+class EnableWebApplicationAutoDeploy(pki.server.upgrade.PKIServerUpgradeScriptlet):
+
+ def __init__(self):
+
+ self.message = 'Enabled Web application auto deploy'
+
+ self.parser = etree.XMLParser(remove_blank_text=True)
+
+ def upgrade_instance(self, instance):
+
+ server_xml = os.path.join(instance.conf_dir, 'server.xml')
+ self.backup(server_xml)
+
+ document = etree.parse(server_xml, self.parser)
+
+ server = document.getroot()
+ hosts = server.findall('.//Host')
+
+ for host in hosts:
+ host.set('autoDeploy', 'true')
+
+ with open(server_xml, 'w') as f:
+ f.write(etree.tostring(document, pretty_print=True))