[Pki-devel] [PATCH] 545 Added server management CLI.

Endi Sukma Dewata edewata at redhat.com
Thu Jan 22 19:20:16 UTC 2015


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

-- 
Endi S. Dewata
-------------- next part --------------
From f20225af9b168fb62de91d0a76baf76642ad4b5a Mon Sep 17 00:00:00 2001
From: "Endi S. Dewata" <edewata at redhat.com>
Date: Tue, 20 Jan 2015 22:11:50 -0500
Subject: [PATCH] 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
---
 base/common/python/pki/cli.py                      | 145 ++++++++++
 base/server/python/pki/server/cli/__init__.py      |   0
 base/server/python/pki/server/cli/instance.py      | 252 +++++++++++++++++
 base/server/python/pki/server/cli/subsystem.py     | 310 +++++++++++++++++++++
 base/server/sbin/pki-server                        |  84 ++++++
 base/server/share/conf/server.xml                  |   2 +-
 .../10.2.2/02-EnableWebApplicationAutoDeploy       |  56 ++++
 pylint-build-scan.sh                               |   8 +-
 specs/pki-core.spec                                |   1 +
 9 files changed, 856 insertions(+), 2 deletions(-)
 create mode 100644 base/common/python/pki/cli.py
 create mode 100644 base/server/python/pki/server/cli/__init__.py
 create mode 100644 base/server/python/pki/server/cli/instance.py
 create mode 100644 base/server/python/pki/server/cli/subsystem.py
 create mode 100644 base/server/sbin/pki-server
 create mode 100755 base/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy

diff --git a/base/common/python/pki/cli.py b/base/common/python/pki/cli.py
new file mode 100644
index 0000000000000000000000000000000000000000..d44875fcb42bddd0cad4f4e6314c84890965e3d4
--- /dev/null
+++ b/base/common/python/pki/cli.py
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+# Authors:
+#     Endi S. Dewata <edewata at 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 sys
+import collections
+
+
+class CLI(object):
+
+    def __init__(self, name, description):
+
+        self.name = name
+        self.description = description
+        self.parent = None
+
+        self.verbose = False
+        self.modules = collections.OrderedDict()
+
+    def set_verbose(self, verbose):
+        self.verbose = verbose
+        if self.parent:
+            self.parent.set_verbose(verbose)
+
+    def get_full_name(self):
+        if self.parent:
+            return self.parent.get_full_module_name(self.name)
+        return self.name
+
+    def get_full_module_name(self, module_name):
+        return self.get_full_name() + '-' + module_name
+
+    def add_module(self, module):
+        self.modules[module.name] = module
+        module.parent = self
+
+    def get_module(self, name):
+        return self.modules.get(name)
+
+    def print_message(self, message):
+        print '-' * len(message)
+        print message
+        print '-' * len(message)
+
+    def print_help(self):
+
+        print 'Commands:'
+
+        for module in self.modules.itervalues():
+            full_name = module.get_full_name()
+            print ' {:30}{:30}'.format(full_name, module.description)
+
+    def init(self):
+        pass
+
+    def execute(self, args):
+
+        if len(args) == 0:
+            self.print_help()
+            sys.exit()
+
+        # A command consists of parts joined by dashes: <part 1>-<part 2>-...-<part N>.
+        # For example: cert-request-find
+        command = args[0]
+
+        # The command will be split into module name and sub command, for example:
+        #  - module name: cert
+        #  - sub command: request-find
+        module_name = None
+        sub_command = None
+
+        # Search the module by incrementally adding parts into module name.
+        # Repeat until it finds the module or until there is no more parts to add.
+        module = None
+        position = 0
+
+        while True:
+
+            # Find the next dash.
+            i = command.find('-', position)
+            if i >= 0:
+                # Dash found. Split command into module name and sub command.
+                module_name = command[0:i]
+                sub_command = command[i+1:]
+            else:
+                # Dash not found. Use the whole command.
+                module_name = command
+                sub_command = None
+
+            if self.verbose:
+                print 'Module: %s' % module_name
+
+            m = self.get_module(module_name)
+            if m:
+                # Module found. Check sub command.
+                if not sub_command:
+                    # No sub command. Use this module.
+                    module = m
+                    break
+
+                # There is a sub command. It must be processed by module's children.
+                if len(m.modules) > 0:
+                    # Module has children. Use this module.
+                    module = m
+                    break
+
+                # Module doesn't have children. Keep looking.
+
+            # If there's no more dashes, stop.
+            if i<0:
+                break
+
+            position = i + 1
+
+        if not module:
+            raise Exception('Invalid module "%s".' % self.get_full_module_name(module_name))
+
+        # Prepare module arguments.
+        if sub_command:
+            # If module command exists, include it as arguments: <module command> <args>...
+            module_args = [sub_command] + args[1:]
+
+        else:
+            # Otherwise, pass the original arguments: <args>...
+            module_args = args[1:]
+
+        module.init()
+        module.execute(module_args)
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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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 0000000000000000000000000000000000000000..c1ec9ddd728950d2b39384249b25335d25820c6a
--- /dev/null
+++ b/base/server/python/pki/server/cli/instance.py
@@ -0,0 +1,252 @@
+#!/usr/bin/python
+# Authors:
+#     Endi S. Dewata <edewata at 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 0000000000000000000000000000000000000000..7e487ebee9c82ba193166a91f7bf2c4074d0f7a6
--- /dev/null
+++ b/base/server/python/pki/server/cli/subsystem.py
@@ -0,0 +1,310 @@
+#!/usr/bin/python
+# Authors:
+#     Endi S. Dewata <edewata at 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:
+            print 'option: %s %s' % (o, a)
+            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 0000000000000000000000000000000000000000..c730ebd20feef9ef6d853b4a186422af7c3e3a71
--- /dev/null
+++ b/base/server/sbin/pki-server
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+# Authors:
+#     Endi S. Dewata <edewata at 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 306ebf25b9a2ac83f90e0e79e4530211ef7fc7ea..b9e8860b2179e1432ebef7d06ff9f2c70985c1b5 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 0000000000000000000000000000000000000000..7cafa6dcc1ebb0d98b1c0fd2d0a91180b4b9e57f
--- /dev/null
+++ b/base/server/upgrade/10.2.2/02-EnableWebApplicationAutoDeploy
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# Authors:
+#     Endi S. Dewata <edewata at 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))
diff --git a/pylint-build-scan.sh b/pylint-build-scan.sh
index bc5efb711720a830915a65eee8ca11a606f3721a..a4bff6bfc6e59fd1a5c45c8ba8fe20806e5eef08 100755
--- a/pylint-build-scan.sh
+++ b/pylint-build-scan.sh
@@ -19,7 +19,13 @@ PYLINT_REPORT_PATH="`cd $HOME_DIR/../.. ; pwd`/pylint-report"
 
 cd $PYTHON_PACKAGE_DIR
 
-rv=`pylint --rcfile=$PYLINT_RC_FILE_PATH pki/ $HOME_DIR/usr/sbin/pkispawn $HOME_DIR/usr/sbin/pkidestroy $HOME_DIR/usr/sbin/pki-upgrade $HOME_DIR/usr/sbin/pki-server-upgrade >> $PYLINT_REPORT_PATH`
+FILES="pki/"
+FILES="$FILES $HOME_DIR/usr/sbin/pkispawn"
+FILES="$FILES $HOME_DIR/usr/sbin/pkidestroy"
+FILES="$FILES $HOME_DIR/usr/sbin/pki-upgrade"
+FILES="$FILES $HOME_DIR/usr/sbin/pki-server"
+FILES="$FILES $HOME_DIR/usr/sbin/pki-server-upgrade"
+rv=`pylint --rcfile=$PYLINT_RC_FILE_PATH $FILES >> $PYLINT_REPORT_PATH`
 
 status=$?
 
diff --git a/specs/pki-core.spec b/specs/pki-core.spec
index bac0083f8d1c6f4e62c9653144003fda774b39b8..dbd5de62ea12f1a501bf64d7fedb307e840702cd 100644
--- a/specs/pki-core.spec
+++ b/specs/pki-core.spec
@@ -791,6 +791,7 @@ echo >> /var/log/pki/pki-server-upgrade-%{version}.log 2>&1
 %{_sysconfdir}/pki/default.cfg
 %{_sbindir}/pkispawn
 %{_sbindir}/pkidestroy
+%{_sbindir}/pki-server
 %{_sbindir}/pki-server-upgrade
 #%{_bindir}/pki-setup-proxy
 %{python_sitelib}/pki/server/
-- 
1.8.4.2



More information about the Pki-devel mailing list