File: configure.py

package info (click to toggle)
pyro5 5.15-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,112 kB
  • sloc: python: 14,291; makefile: 163; sh: 66; javascript: 62
file content (136 lines) | stat: -rw-r--r-- 5,574 bytes parent folder | download
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
"""
Configuration settings.

Pyro - Python Remote Objects.  Copyright by Irmen de Jong (irmen@razorvine.net).
"""

import os
import platform
from . import __version__, _pyro_logfile, _pyro_loglevel


# noinspection PyAttributeOutsideInit

class Configuration:
    # Declare available config items.
    # DO NOT EDIT THESE HERE IN THIS MODULE! They are the global defaults.
    # Instead, specify them later in your own code or via environment variables.
    __slots__ = [
        "HOST", "NS_HOST", "NS_PORT", "NS_BCPORT", "NS_BCHOST", "NS_AUTOCLEAN", "NS_LOOKUP_DELAY",
        "NATHOST", "NATPORT", "COMPRESSION", "SERVERTYPE", "COMMTIMEOUT", "POLLTIMEOUT", "MAX_RETRIES",
        "SOCK_REUSE", "SOCK_NODELAY", "DETAILED_TRACEBACK", "THREADPOOL_SIZE", "THREADPOOL_SIZE_MIN",
        "MAX_MESSAGE_SIZE", "BROADCAST_ADDRS", "PREFER_IP_VERSION", "SERIALIZER", "SERPENT_BYTES_REPR",
        "ITER_STREAMING", "ITER_STREAM_LIFETIME", "ITER_STREAM_LINGER", "LOGFILE", "LOGLEVEL", "LOGWIRE",
        "SSL", "SSL_SERVERCERT", "SSL_SERVERKEY", "SSL_SERVERKEYPASSWD", "SSL_REQUIRECLIENTCERT",
        "SSL_CLIENTCERT", "SSL_CLIENTKEY", "SSL_CLIENTKEYPASSWD", "SSL_CACERTS"
    ]

    def __init__(self):
        self.reset()

    def reset(self, use_environment=True):
        """
        Reset to default config items.
        If use_environment is False, won't read environment variables settings (useful if you can't trust your env).
        """
        self.HOST = "localhost"
        self.NS_HOST = "localhost"
        self.NS_PORT = 9090
        self.NS_BCPORT = 9091
        self.NS_BCHOST = None
        self.NS_AUTOCLEAN = 0.0
        self.NS_LOOKUP_DELAY = 0.0
        self.NATHOST = None
        self.NATPORT = 0
        self.COMPRESSION = False
        self.SERVERTYPE = "thread"
        self.COMMTIMEOUT = 0.0
        self.POLLTIMEOUT = 2.0
        self.MAX_RETRIES = 0
        self.SOCK_REUSE = True  # so_reuseaddr on server sockets?
        self.SOCK_NODELAY = False  # tcp_nodelay on socket?
        self.DETAILED_TRACEBACK = False
        self.THREADPOOL_SIZE = 80
        self.THREADPOOL_SIZE_MIN = 4
        self.MAX_MESSAGE_SIZE = 1024 * 1024 * 1024  # 1 gigabyte
        self.BROADCAST_ADDRS = ["<broadcast>", "0.0.0.0"]
        self.PREFER_IP_VERSION = 0  # 4, 6 or 0 (0=let OS choose according to RFC 3484)
        self.SERIALIZER = "serpent"
        self.SERPENT_BYTES_REPR = False
        self.LOGWIRE = False
        self.ITER_STREAMING = True
        self.ITER_STREAM_LIFETIME = 0.0
        self.ITER_STREAM_LINGER = 30.0
        self.LOGFILE = _pyro_logfile
        self.LOGLEVEL = _pyro_loglevel
        self.SSL = False
        self.SSL_SERVERCERT = ""
        self.SSL_SERVERKEY = ""
        self.SSL_SERVERKEYPASSWD = ""
        self.SSL_REQUIRECLIENTCERT = False
        self.SSL_CLIENTCERT = ""
        self.SSL_CLIENTKEY = ""
        self.SSL_CLIENTKEYPASSWD = ""
        self.SSL_CACERTS = ""
        if use_environment:
            # environment variables overwrite config items
            prefix = "PYRO_"
            for item, envvalue in (e for e in os.environ.items() if e[0].startswith(prefix)):
                item = item[len(prefix):]
                if item not in self.__slots__:
                    raise ValueError("invalid Pyro environment config variable: %s%s" % (prefix, item))
                value = getattr(self, item)
                valuetype = type(value)
                if valuetype is set:
                    envvalue = {v.strip() for v in envvalue.split(",")}
                elif valuetype is list:
                    envvalue = [v.strip() for v in envvalue.split(",")]
                elif valuetype is bool:
                    envvalue = envvalue.lower()
                    if envvalue in ("0", "off", "no", "false"):
                        envvalue = False
                    elif envvalue in ("1", "yes", "on", "true"):
                        envvalue = True
                    else:
                        raise ValueError("invalid boolean value: %s%s=%s" % (prefix, item, envvalue))
                else:
                    try:
                        envvalue = valuetype(envvalue)
                    except ValueError:
                        raise ValueError("invalid Pyro environment config value: %s%s=%s" % (prefix, item, envvalue)) from None
                setattr(self, item, envvalue)

    def copy(self):
        """returns a copy of this config"""
        other = object.__new__(Configuration)
        for item in self.__slots__:
            setattr(other, item, getattr(self, item))
        return other

    def as_dict(self):
        """returns this config as a regular dictionary"""
        return {item: getattr(self, item) for item in self.__slots__}

    def dump(self):
        """Easy config diagnostics"""
        from .protocol import PROTOCOL_VERSION
        result = ["Pyro version: %s" % __version__,
                  "Loaded from: %s" % os.path.dirname(__file__),
                  "Python version: %s %s (%s, %s)" % (platform.python_implementation(),
                                                      platform.python_version(), platform.system(), os.name),
                  "Protocol version: %d" % PROTOCOL_VERSION,
                  "Currently active global configuration settings:"]
        for item, value in sorted(self.as_dict().items()):
            result.append("{:s} = {:s}".format(item, str(value)))
        return "\n".join(result)


global_config = Configuration()


def dump():
    print(global_config.dump())


if __name__ == "__main__":
    dump()