globals.py 2.71 KB
Newer Older
Matt Traudt's avatar
Matt Traudt committed
1
import os
2
import logging
3
import socket
Matt Traudt's avatar
Matt Traudt committed
4

5
log = logging.getLogger(__name__)
Matt Traudt's avatar
Matt Traudt committed
6

7
RESULT_VERSION = 4
8
9
10
WIRE_VERSION = 1
SPEC_VERSION = '1.1.0'

11
12
13
14
15
16
17
18
19
20
# This is a dictionary of torrc options we always want to set when launching
# Tor and that do not depend on any runtime configuration
TORRC_STARTING_POINT = {
    # We will find out via the ControlPort and not setting something static
    # means a lower chance of conflict
    'SocksPort': 'auto',
    # Easier than password authentication
    'CookieAuthentication': '1',
    # To avoid path bias warnings
    'UseEntryGuards': '0',
21
22
23
    # Because we need things from full server descriptors (namely for now: the
    # bandwidth line)
    'UseMicrodescriptors': '0',
24
25
}

juga's avatar
juga committed
26
27
28
29
30
PKG_DIR = os.path.abspath(os.path.dirname(__file__))
DEFAULT_CONFIG_PATH = os.path.join(PKG_DIR, 'config.default.ini')
DEFAULT_LOG_CONFIG_PATH = os.path.join(PKG_DIR, 'config.log.default.ini')
USER_CONFIG_PATH = os.path.join(os.path.expanduser('~'), '.sbws.ini')

31
32
SUPERVISED_RUN_DPATH = "/run/sbws/tor"

juga's avatar
juga committed
33
SOCKET_TIMEOUT = 60  # seconds
juga's avatar
juga committed
34
35
36
37
38
39
40
41

SBWS_SCALE_CONSTANT = 7500
TORFLOW_SCALING = 1
SBWS_SCALING = 2
TORFLOW_BW_MARGIN = 0.05
TORFLOW_OBS_LAST = 0
TORFLOW_OBS_MEAN = 1
TORFLOW_OBS_DECAYING = 3
42
TORFLOW_ROUND_DIG = 3
juga's avatar
juga committed
43
44
DAY_SECS = 86400
NUM_MIN_RESULTS = 2
45
MIN_REPORT = 60
juga's avatar
juga committed
46
47
48
# Maximum difference between the total consensus bandwidth and the total in
# in the bandwidth lines in percentage
MAX_BW_DIFF_PERC = 50
juga's avatar
juga committed
49

juga's avatar
juga committed
50
BW_LINE_SIZE = 510
juga's avatar
juga committed
51

Matt Traudt's avatar
Matt Traudt committed
52

53
def fail_hard(*a, **kw):
Matt Traudt's avatar
Matt Traudt committed
54
    ''' Log something ... and then exit as fast as possible '''
Matt Traudt's avatar
Matt Traudt committed
55
    log.critical(*a, **kw)
56
    exit(1)
Matt Traudt's avatar
Matt Traudt committed
57
58


59
60
61
62
63
64
65
66
67
68
69
70
71
def touch_file(fname, times=None):
    '''
    If **fname** exists, update its last access and modified times to now. If
    **fname** does not exist, create it. If **times** are specified, pass them
    to os.utime for use.

    :param str fname: Name of file to update or create
    :param tuple times: 2-tuple of floats for access time and modified time
        respectively
    '''
    log.debug('Touching %s', fname)
    with open(fname, 'a') as fd:
        os.utime(fd.fileno(), times=times)
72
73
74
75


def resolve(hostname, ipv4_only=False, ipv6_only=False):
    assert not (ipv4_only and ipv6_only)
76
77
    results = []
    try:
Matt Traudt's avatar
Matt Traudt committed
78
        results = socket.getaddrinfo(hostname, 0)
79
80
81
82
83
    except socket.gaierror:
        log.warn(
            'Unable to resolve %s hostname. Returning empty list of addresses',
            hostname)
        return []
84
    ret = set()
85
    for result in results:
86
87
88
89
90
91
92
93
        fam, _, _, _, addr = result
        if fam == socket.AddressFamily.AF_INET6 and not ipv4_only:
            ret.add(addr[0])
        elif fam == socket.AddressFamily.AF_INET and not ipv6_only:
            ret.add(addr[0])
        else:
            assert None, 'Unknown address family {}'.format(fam)
    return list(ret)