globals.py 3.41 KB
Newer Older
Matt Traudt's avatar
Matt Traudt committed
1
import os
2
import logging
3
4
5
6
7
8
9
import platform

from requests import __version__ as requests_version
from stem import __version__ as stem_version

from sbws import __version__

Matt Traudt's avatar
Matt Traudt committed
10

11
log = logging.getLogger(__name__)
Matt Traudt's avatar
Matt Traudt committed
12

13
RESULT_VERSION = 4
14
WIRE_VERSION = 1
juga's avatar
juga committed
15
SPEC_VERSION = '1.2.0'
16

17
18
19
20
21
22
23
24
25
26
# 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',
27
28
29
    # Because we need things from full server descriptors (namely for now: the
    # bandwidth line)
    'UseMicrodescriptors': '0',
juga's avatar
juga committed
30
31
32
33
    # useful logging options for clients that don't care about anonymity
    'SafeLogging': '0',
    'LogTimeGranularity': '1',
    'ProtocolWarnings': '1',
34
35
}

juga's avatar
juga committed
36
37
38
39
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')
40
SUPERVISED_USER_CONFIG_PATH = "/etc/sbws/sbws.ini"
41
42
SUPERVISED_RUN_DPATH = "/run/sbws/tor"

juga's avatar
juga committed
43
SOCKET_TIMEOUT = 60  # seconds
44
TIMEOUT_MEASUREMENTS = 60 * 3  # 3 minutes
juga's avatar
juga committed
45
46
47
48
49
50
51
52

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
53
TORFLOW_ROUND_DIG = 3
54
PROP276_ROUND_DIG = 2
juga's avatar
juga committed
55
56
DAY_SECS = 86400
NUM_MIN_RESULTS = 2
57
MIN_REPORT = 60
juga's avatar
juga committed
58
59
60
# 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
61

juga's avatar
juga committed
62
BW_LINE_SIZE = 510
juga's avatar
juga committed
63

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Metadata to send in every requests, so that data servers can know which
# scanners are using them.
# In Requests these keys are case insensitive.
HTTP_HEADERS = {
    # This would be ignored if changing to HTTP/2
    'Connection': 'keep-alive',
    # Needs to get Tor version from the controller
    'User-Agent': 'sbws/{} ({}) Python/{} Requests/{} Stem/{} Tor/'.format(
                    __version__, platform.platform(),
                    platform.python_version(),
                    requests_version, stem_version),
    # Organization defined names (:rfc:`7239`)
    # Needs to get the nickname from the user config file.
    'Tor-Bandwidth-Scanner-Nickname': '{}',
    'Tor-Bandwidth-Scanner-UUID': '{}',
    # In case of including IP address.
    # 'Forwarded': 'for={}'  # IPv6 part, if there's
    }
# In the case of having ipv6 it's concatenated to forwarder.
IPV6_FORWARDED = ', for="[{}]"'

85
86
87
88
HTTP_GET_HEADERS = {
    'Range': '{}',
    'Accept-Encoding': 'identity',
}
89
DESTINATION_VERIFY_CERTIFICATE = True
90

Matt Traudt's avatar
Matt Traudt committed
91

92
def fail_hard(*a, **kw):
Matt Traudt's avatar
Matt Traudt committed
93
    ''' Log something ... and then exit as fast as possible '''
Matt Traudt's avatar
Matt Traudt committed
94
    log.critical(*a, **kw)
95
    exit(1)
Matt Traudt's avatar
Matt Traudt committed
96
97


98
99
100
101
102
103
104
105
106
107
108
109
110
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)