summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Options/Common.py
blob: b44c589909129dae22c8f13e53bc86ed3c0c0236 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
""" Common options used in multiple different contexts. """

# pylint: disable=W0403
import Types
from Actions import PluginsAction, ComponentAction
from Parser import repository as _repository_option
from Options import Option, PathOption, BooleanOption
# pylint: enable=W0403

__all__ = ["Common"]


class classproperty(object):
    """ Decorator that can be used to create read-only class
    properties. """

    def __init__(self, getter):
        self.getter = getter

    def __get__(self, instance, owner):
        return self.getter(owner)


class ReportingTransportAction(ComponentAction):
    """ :class:`Bcfg2.Options.ComponentAction` that loads a single
    reporting transport from :mod:`Bcfg2.Reporting.Transport`. """
    islist = False
    bases = ['Bcfg2.Reporting.Transport']


class ReportingStorageAction(ComponentAction):
    """ :class:`Bcfg2.Options.ComponentAction` that loads a single
    reporting storage driver from :mod:`Bcfg2.Reporting.Storage`. """
    islist = False
    bases = ['Bcfg2.Reporting.Storage']


class Common(object):
    """ Common options used in multiple different contexts. """
    _plugins = None
    _filemonitor = None
    _reporting_storage = None
    _reporting_transport = None

    @classproperty
    def plugins(cls):
        """ Load a list of Bcfg2 server plugins """
        if cls._plugins is None:
            cls._plugins = Option(
                cf=('server', 'plugins'),
                type=Types.comma_list, help="Server plugin list",
                action=PluginsAction,
                default=['Bundler', 'Cfg', 'Metadata', 'Pkgmgr', 'Rules',
                         'SSHbase'])
        return cls._plugins

    @classproperty
    def filemonitor(cls):
        """ Load a single Bcfg2 file monitor (from
        :attr:`Bcfg2.Server.FileMonitor.available`) """
        if cls._filemonitor is None:
            import Bcfg2.Server.FileMonitor

            class FileMonitorAction(ComponentAction):
                islist = False
                mapping = Bcfg2.Server.FileMonitor.available

            cls._filemonitor = Option(
                cf=('server', 'filemonitor'), action=FileMonitorAction,
                default='default', help='Server file monitoring driver')
        return cls._filemonitor

    @classproperty
    def reporting_storage(cls):
        """ Load a Reporting storage backend """
        if cls._reporting_storage is None:
            cls._reporting_storage = Option(
                cf=('reporting', 'storage'), dest="reporting_storage",
                help='Reporting storage engine',
                action=ReportingStorageAction, default='DjangoORM')
        return cls._reporting_storage

    @classproperty
    def reporting_transport(cls):
        """ Load a Reporting transport backend """
        if cls._reporting_transport is None:
            cls._reporting_transport = Option(
                cf=('reporting', 'transport'), dest="reporting_transport",
                help='Reporting transport',
                action=ReportingTransportAction, default='DirectStore')
        return cls._reporting_transport

    #: Set the path to the Bcfg2 repository
    repository = _repository_option

    #: Daemonize process, storing PID
    daemon = PathOption(
        '-D', '--daemon', help="Daemonize process, storing PID")

    #: Run interactively, prompting the user for each change
    interactive = BooleanOption(
        "-I", "--interactive",
        help='Run interactively, prompting the user for each change')

    #: Log to syslog
    syslog = BooleanOption(
        cf=('logging', 'syslog'), help="Log to syslog")

    #: Server location
    location = Option(
        '-S', '--server', cf=('components', 'bcfg2'),
        default='https://localhost:6789', metavar='<https://server:port>',
        help="Server location")

    #: Communication password
    password = Option(
        '-x', '--password', cf=('communication', 'password'),
        metavar='<password>', help="Communication Password")

    #: Path to SSL key
    ssl_key = PathOption(
        '--ssl-key', cf=('communication', 'key'), dest="key",
        help='Path to SSL key', default="/etc/pki/tls/private/bcfg2.key")

    #: Path to SSL certificate
    ssl_cert = PathOption(
        cf=('communication', 'certificate'), dest="cert",
        help='Path to SSL certificate', default="/etc/pki/tls/certs/bcfg2.crt")

    #: Path to SSL CA certificate
    ssl_ca = PathOption(
        cf=('communication', 'ca'), help='Path to SSL CA Cert')

    #: Default Path paranoid setting
    default_paranoid = Option(
        cf=('mdata', 'paranoid'), dest="default_paranoid", default='true',
        choices=['true', 'false'], help='Default Path paranoid setting')