tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
May 2020
- 18 participants
- 1587 discussions

[tor/master] Merge remote-tracking branch 'tor-github/pr/1885/head'
by nickm@torproject.org 12 May '20
by nickm@torproject.org 12 May '20
12 May '20
commit 86b5bcd80ad27083c9b8e5c5999927f235905ec6
Merge: b7a165228 cc169eb12
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue May 12 12:52:41 2020 -0400
Merge remote-tracking branch 'tor-github/pr/1885/head'
changes/doc34133 | 6 ++++++
doc/tor.1.txt | 6 ++++++
2 files changed, 12 insertions(+)
1
0

[translation/communitytpo-contentspot] https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-contentspot
by translation@torproject.org 12 May '20
by translation@torproject.org 12 May '20
12 May '20
commit adfdf7a14689710b3f368b779246f7c87ccb254f
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue May 12 13:45:27 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-conten…
---
contents+es.po | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/contents+es.po b/contents+es.po
index 5a9bdf4b5f..a583825a6c 100644
--- a/contents+es.po
+++ b/contents+es.po
@@ -2458,27 +2458,27 @@ msgstr "[ ] Llegar a un acuerdo sobre tomar fotos o no"
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
msgid "[ ] Present the agenda"
-msgstr ""
+msgstr "[ ] Presenté la agenda"
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
msgid "[ ] Introduce yourself and ask people to introduce themselves"
-msgstr ""
+msgstr "[ ] Preséntese y pida a la gente que se presente"
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
msgid "[ ] \"All questions are welcome\""
-msgstr ""
+msgstr "[ ] \"Todas las preguntas son bienvenidas\""
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
msgid "## After the Training"
-msgstr ""
+msgstr "## Después de la formación"
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
msgid "[ ] Collect participants feedback"
-msgstr ""
+msgstr "[ ] Recoja las impresiones de los participantes"
#: https//community.torproject.org/training/checklist/
#: (content/training/checklist/contents+en.lrpage.body)
1
0

[onionperf/master] Integrate reprocessing mode into analysis mode.
by karsten@torproject.org 12 May '20
by karsten@torproject.org 12 May '20
12 May '20
commit f0b985e4e1b2a20c1968014e25126f874de684c6
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon May 11 10:16:36 2020 +0200
Integrate reprocessing mode into analysis mode.
Tweaked by acute to carry the -s and -t arguments to reprocessing.
Implements #34142.
---
onionperf/onionperf | 106 +++++++++--------------------------
onionperf/reprocessing.py | 13 +++--
onionperf/tests/test_reprocessing.py | 6 +-
3 files changed, 37 insertions(+), 88 deletions(-)
diff --git a/onionperf/onionperf b/onionperf/onionperf
index 536d6e2..cb1899c 100755
--- a/onionperf/onionperf
+++ b/onionperf/onionperf
@@ -63,18 +63,12 @@ The standard way to run this subcommand is to give the path to a TGen and/or
a TorCtl file (e.g., those produced with the `measure` subcommand) using the
`--tgen` and `--torctl` options, and the statistics file resulting from the
analysis will be dumped to `onionperf.analysis.json.xz`.
-(See https://collector.torproject.org/#type-torperf.)
+Another way to run this subcommand is to give two paths to directories
+containing TGen and TorCtl files to have files matched by filename and analysis
+files dumped to `%Y-%m-%d.onionperf.analysis.json.xz`.
+(See https://collector.torproject.org/#type-onionperf.)
Stats files in the default Torperf format can also be exported.
"""
-DESC_REPROCESS = """
-Reprocesses results in bulk from the TGen traffic generator and Tor.
-
-This subcommand scans for TGen and Tor log files in the given paths,
-matches them by filename and then runs the analysis command on each pair,
-reproducing all analysis results.
-
-This is useful when reprocessing logs in bulk, for example
-"""
HELP_ANALYZE = """
Analyze Tor and TGen output
@@ -86,9 +80,6 @@ and plots various interesting performance metrics to PDF files.
HELP_VISUALIZE = """
Visualize OnionPerf analysis results
"""
-HELP_REPROCESS = """
-Reprocesses all OnionPerf log files in the given paths
-"""
logging.basicConfig(format='%(asctime)s %(created)f [onionperf] [%(levelname)s] %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')
logging.getLogger("stem").setLevel(logging.WARN)
@@ -240,13 +231,13 @@ built-in Torperf (50KiB, 1MiB, 5MiB) traffic model""",
analyze_parser.set_defaults(func=analyze, formatter_class=my_formatter_class)
analyze_parser.add_argument('--tgen',
- help="""a file PATH to a TGen logfile""",
+ help="""a file or directory PATH to a TGen logfile or logfile directory""",
metavar="PATH", type=type_str_path_in,
action="store", dest="tgen_logpath",
default=None)
analyze_parser.add_argument('--torctl',
- help="""a file PATH to a TorCtl logfile (in the format output by the monitor subcommmand)""",
+ help="""a file or directory PATH to a TorCtl logfile or logfile directory (in the format output by the monitor subcommmand)""",
metavar="PATH", type=type_str_path_in,
action="store", dest="torctl_logpath",
default=None)
@@ -355,43 +346,6 @@ files generated by this script will be written""",
action="store", dest="lineformats",
default=util.LINEFORMATS)
- # reprocess
- reprocess_parser = sub_parser.add_parser('reprocess', description=DESC_REPROCESS, help=HELP_REPROCESS,
- formatter_class=my_formatter_class)
- reprocess_parser.set_defaults(func=reprocess, formatter_class=my_formatter_class)
-
- reprocess_parser.add_argument('--tgen-dir',
- help="""a dictory PATH to a TGen logfile directory""",
- metavar="PATH", type=type_str_path_in,
- action="store", dest="tgen_dirpath",
- default=None)
-
- reprocess_parser.add_argument('--torctl-dir',
- help="""a directory PATH to a TorCtl logfile directory""",
- metavar="PATH", type=type_str_path_in,
- action="store", dest="torctl_dirpath",
- default=None)
-
- reprocess_parser.add_argument('-p', '--prefix',
- help="""A directory PATH prefix where the processed data
-files generated by this script will be written""",
- metavar="PATH", type=type_str_dir_path_out,
- action="store", dest="prefix",
- default=os.getcwd())
-
- reprocess_parser.add_argument('-d', '--date-filter',
- help="""a DATE string in the form YYYY-MM-DD, all log messages that did not occur on this date will be filtered out of the analysis""",
- metavar="DATE", type=type_str_date_in,
- action="store", dest="date_filter",
- default=None)
-
- reprocess_parser.add_argument('-n', '--nickname',
- help="""a nickname STRING that identifies the machine where the input logfiles were produced""",
- metavar="STRING", type=str,
- action="store", dest="nickname",
- default=None)
-
-
# get args and call the command handler for the chosen mode
args = main_parser.parse_args()
args.func(args)
@@ -450,23 +404,32 @@ def measure(args):
logging.info("Please fix path errors to continue")
def analyze(args):
- from onionperf.analysis import Analysis
if args.tgen_logpath is None and args.torctl_logpath is None:
logging.warning("No logfile paths were given, nothing will be analyzed")
- return
-
- analysis = Analysis(nickname=args.nickname, ip_address=args.ip_address)
- if args.tgen_logpath is not None:
- analysis.add_tgen_file(args.tgen_logpath)
- if args.torctl_logpath is not None:
- analysis.add_torctl_file(args.torctl_logpath)
+ elif (args.tgen_logpath is None or os.path.isfile(args.tgen_logpath)) and (args.torctl_logpath is None or os.path.isfile(args.torctl_logpath)):
+ from onionperf.analysis import Analysis
+ analysis = Analysis(nickname=args.nickname, ip_address=args.ip_address)
+ if args.tgen_logpath is not None:
+ analysis.add_tgen_file(args.tgen_logpath)
+ if args.torctl_logpath is not None:
+ analysis.add_torctl_file(args.torctl_logpath)
+ analysis.analyze(args.do_simple, date_filter=args.date_filter)
+ analysis.save(output_prefix=args.prefix)
+ if args.save_torperf:
+ analysis.export_torperf_version_1_1(output_prefix=args.prefix, do_compress=False)
+
+ elif args.tgen_logpath is not None and os.path.isdir(args.tgen_logpath) and args.torctl_logpath is not None and os.path.isdir(args.torctl_logpath):
+ from onionperf import reprocessing
+ tgen_logs = reprocessing.collect_logs(args.tgen_logpath, '*tgen.log*')
+ torctl_logs = reprocessing.collect_logs(args.torctl_logpath, '*torctl.log*')
+ log_pairs = reprocessing.match(tgen_logs, torctl_logs, args.date_filter)
+ logging.info("Found {0} matching log pairs to be reprocessed".format(len(log_pairs)))
+ reprocessing.multiprocess_logs(log_pairs, args.prefix, args.nickname, args.save_torperf, args.do_simple)
- analysis.analyze(args.do_simple, date_filter=args.date_filter)
- analysis.save(output_prefix=args.prefix)
- if args.save_torperf:
- analysis.export_torperf_version_1_1(output_prefix=args.prefix, do_compress=False)
+ else:
+ logging.error("Given paths were an unrecognized mix of file and directory paths, nothing will be analyzed")
def visualize(args):
from onionperf.visualization import TGenVisualization, TorVisualization
@@ -489,21 +452,6 @@ def visualize(args):
tgen_viz.plot_all(args.prefix)
tor_viz.plot_all(args.prefix)
-def reprocess(args):
- from onionperf import reprocessing
- if args.tgen_dirpath is None or args.torctl_dirpath is None:
- logging.error("Required directory paths were not given - nothing will be reprocessed")
- return
- elif not os.path.isdir(args.tgen_dirpath) or not os.path.isdir(args.torctl_dirpath):
- logging.error("One or more given paths do not exist or are not directories - nothing will be reprocessed")
- return
- else:
- tgen_logs = reprocessing.collect_logs(args.tgen_dirpath, '*tgen.log')
- torctl_logs = reprocessing.collect_logs(args.torctl_dirpath, '*torctl.log')
- log_pairs = reprocessing.match(tgen_logs, torctl_logs, args.date_filter)
- logging.info("Found {0} matching log pairs to be reprocessed".format(len(log_pairs)))
- reprocessing.multiprocess_logs(log_pairs, args.prefix, args.nickname)
-
def type_nonnegative_integer(value):
i = int(value)
if i < 0: raise argparse.ArgumentTypeError("'%s' is an invalid non-negative int value" % value)
diff --git a/onionperf/reprocessing.py b/onionperf/reprocessing.py
index 7acf539..48f67bb 100644
--- a/onionperf/reprocessing.py
+++ b/onionperf/reprocessing.py
@@ -46,23 +46,24 @@ def match(tgen_logs, tor_logs, date_filter):
return log_pairs
-def analyze_func(prefix, nick, pair):
+def analyze_func(prefix, nick, save_torperf, do_simple, pair):
analysis = Analysis(nickname=nick)
logging.info('Analysing pair for date {0}'.format(pair[2]))
analysis.add_tgen_file(pair[0])
analysis.add_torctl_file(pair[1])
- analysis.analyze(do_simple=False, date_filter=pair[2])
+ analysis.analyze(do_simple=do_simple, date_filter=pair[2])
analysis.save(output_prefix=prefix)
- analysis.export_torperf_version_1_1(
- output_prefix=prefix, do_compress=False)
+ if save_torperf:
+ analysis.export_torperf_version_1_1(
+ output_prefix=prefix, do_compress=False)
return 1
-def multiprocess_logs(log_pairs, prefix, nick=None):
+def multiprocess_logs(log_pairs, prefix, nick=None, save_torperf=False, do_simple=False):
pool = Pool(cpu_count())
analyses = None
try:
- func = partial(analyze_func, prefix, nick)
+ func = partial(analyze_func, prefix, nick, save_torperf, do_simple)
mr = pool.map_async(func, log_pairs)
pool.close()
while not mr.ready():
diff --git a/onionperf/tests/test_reprocessing.py b/onionperf/tests/test_reprocessing.py
index efacc5f..a120587 100644
--- a/onionperf/tests/test_reprocessing.py
+++ b/onionperf/tests/test_reprocessing.py
@@ -61,7 +61,7 @@ def test_log_match_with_wrong_filter_date():
def test_analyze_func_json():
pair = (DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.tgen.log', DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.torctl.log', datetime.datetime(2019, 1, 10, 0, 0))
work_dir = tempfile.mkdtemp()
- reprocessing.analyze_func(work_dir, None, pair)
+ reprocessing.analyze_func(work_dir, None, True, False, pair)
json_file = os.path.join(work_dir, "2019-01-10.onionperf.analysis.json.xz")
assert(os.path.exists(json_file))
for i in ['51200', '5242880', '1048576']:
@@ -72,7 +72,7 @@ def test_analyze_func_json():
def test_multiprocess_logs():
pairs = [(DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.tgen.log', DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.torctl.log', datetime.datetime(2019, 1, 10, 0, 0))]
work_dir = tempfile.mkdtemp()
- reprocessing.multiprocess_logs(pairs, work_dir)
+ reprocessing.multiprocess_logs(pairs, work_dir, save_torperf=True)
json_file = os.path.join(work_dir, "2019-01-10.onionperf.analysis.json.xz")
assert(os.path.exists(json_file))
for i in ['51200', '5242880', '1048576']:
@@ -85,7 +85,7 @@ def test_end_to_end():
torctl_logs = reprocessing.collect_logs(DATA_DIR, '*torctl.log')
log_pairs = reprocessing.match(tgen_logs, torctl_logs, None)
work_dir = tempfile.mkdtemp()
- reprocessing.multiprocess_logs(log_pairs, work_dir)
+ reprocessing.multiprocess_logs(log_pairs, work_dir, save_torperf=True)
json_file = os.path.join(work_dir, "2019-01-10.onionperf.analysis.json.xz")
assert(os.path.exists(json_file))
for i in ['51200', '5242880', '1048576']:
1
0

[translation/communitytpo-contentspot] https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-contentspot
by translation@torproject.org 12 May '20
by translation@torproject.org 12 May '20
12 May '20
commit c60f813a1f0ad242ec4f5b4a66907c99a79d3347
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue May 12 10:15:29 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-conten…
---
contents+zh-CN.po | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/contents+zh-CN.po b/contents+zh-CN.po
index 9bde5e4489..37ccf1ad45 100644
--- a/contents+zh-CN.po
+++ b/contents+zh-CN.po
@@ -8,6 +8,7 @@
# 忻然 李 <2544304894(a)qq.com>, 2020
# ff98sha, 2020
# Runzhe Liang <18051080098(a)163.com>, 2020
+# Scott Rhodes <starring169(a)gmail.com>, 2020
#
msgid ""
msgstr ""
@@ -15,7 +16,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-12-11 12:15+CET\n"
"PO-Revision-Date: 2019-12-11 10:50+0000\n"
-"Last-Translator: Runzhe Liang <18051080098(a)163.com>, 2020\n"
+"Last-Translator: Scott Rhodes <starring169(a)gmail.com>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/otf/teams/1519/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -334,7 +335,7 @@ msgstr ""
#: (content/relay-operations/technical-setup/contents+en.lrpage.body)
msgid ""
"* Do you want to run a Tor exit or non-exit (bridge/guard/middle) relay?"
-msgstr ""
+msgstr "* 你想运行一个Tor出口或非出口(网桥/守卫/中间)节点?"
#: https//community.torproject.org/relay/setup/
#: (content/relay-operations/technical-setup/contents+en.lrpage.body)
@@ -388,7 +389,7 @@ msgstr ""
#: (content/relay-operations/technical-setup/contents+en.lrpage.body)
msgid ""
"* How much bandwidth/monthly traffic do you want to allow for Tor traffic?"
-msgstr ""
+msgstr "* 你想给Tor允许每月多少带宽/流量?"
#: https//community.torproject.org/relay/setup/
#: (content/relay-operations/technical-setup/contents+en.lrpage.body)
@@ -438,7 +439,7 @@ msgstr "# 带宽与连接"
msgid ""
"A non-exit relay should be able to handle at least 7000 concurrent "
"connections."
-msgstr ""
+msgstr "一个非出口节点应能同时处理至少7000个连接。"
#: https//community.torproject.org/relay/relays-requirements/
#: (content/relay-operations/relays-requirements/contents+en.lrpage.body)
@@ -459,7 +460,7 @@ msgstr ""
msgid ""
"Fast exit relays (>=100 Mbit/s) usually have to handle a lot more concurrent"
" connections (>100k)."
-msgstr ""
+msgstr "高速出口节点(≥100 Mb/s)通常要处理大许多的同时连接数(>100k)。"
#: https//community.torproject.org/relay/relays-requirements/
#: (content/relay-operations/relays-requirements/contents+en.lrpage.body)
@@ -486,12 +487,12 @@ msgstr ""
msgid ""
"If you do not know your bandwidth you can use http://beta.speedtest.net to "
"measure it."
-msgstr ""
+msgstr "如果你不知道你的带宽你可以通过http://beta.speedtest.net测试。"
#: https//community.torproject.org/relay/relays-requirements/
#: (content/relay-operations/relays-requirements/contents+en.lrpage.body)
msgid "# Monthly Outbound Traffic"
-msgstr ""
+msgstr "# 每月出站流量"
#: https//community.torproject.org/relay/relays-requirements/
#: (content/relay-operations/relays-requirements/contents+en.lrpage.body)
1
0

[onionperf/master] Enforce deterministic ordering in file walk.
by karsten@torproject.org 12 May '20
by karsten@torproject.org 12 May '20
12 May '20
commit 2ab97fc8082c03ff5f1c8d775f417bfee8936726
Author: Philipp Winter <phw(a)nymity.ch>
Date: Fri May 8 10:20:15 2020 -0700
Enforce deterministic ordering in file walk.
os.walk internally calls os.scandir, whose "entries are yielded in
arbitrary order." This breaks (at least on my machine) two unit tests
which rely on ordering:
1. test_reprocessing.test_log_collection_tgen
2. test_reprocessing.test_log_collection_torctl
This patch fixes the problem by calling sorted on the arbitrarily
ordered file names.
---
onionperf/reprocessing.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/onionperf/reprocessing.py b/onionperf/reprocessing.py
index c5351d4..7acf539 100644
--- a/onionperf/reprocessing.py
+++ b/onionperf/reprocessing.py
@@ -13,7 +13,7 @@ import sys
def collect_logs(dirpath, pattern):
logs = []
for root, dirnames, filenames in os.walk(dirpath):
- for filename in fnmatch.filter(filenames, pattern):
+ for filename in fnmatch.filter(sorted(filenames), pattern):
logs.append(os.path.join(root, filename))
return logs
1
0
commit e5f15ea4328e1e0588e249314d002d7dbb647d07
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue May 5 16:21:43 2020 +0200
Port OnionPerf to Python 3.
Fixes #29367.
---
onionperf/analysis.py | 8 +++---
onionperf/docs/conf.py | 20 +++++++--------
onionperf/measurement.py | 20 ++++++++-------
onionperf/model.py | 10 +++-----
onionperf/onionperf | 4 +--
onionperf/tests/test_reprocessing.py | 4 +--
onionperf/tests/test_utils.py | 8 +++---
onionperf/util.py | 47 +++++++++---------------------------
onionperf/visualization.py | 8 +++---
run_tests.sh | 2 +-
setup.py | 2 +-
11 files changed, 52 insertions(+), 81 deletions(-)
diff --git a/onionperf/analysis.py b/onionperf/analysis.py
index e90d005..82db3c8 100644
--- a/onionperf/analysis.py
+++ b/onionperf/analysis.py
@@ -17,7 +17,7 @@ from stem.response.events import CircuitEvent, CircMinorEvent, StreamEvent, Band
from stem.response import ControlMessage, convert
# onionperf imports
-import util
+from . import util
ERRORS = { 'AUTH' : 'TGEN/AUTH',
'READ' : 'TGEN/READ',
@@ -286,7 +286,7 @@ class Analysis(object):
output.write("@type torperf 1.1\r\n")
output_str = ' '.join("{0}={1}".format(k, d[k]) for k in sorted(d.keys()) if d[k] is not None).strip()
output.write("{0}\r\n".format(output_str))
- except KeyError, e:
+ except KeyError as e:
logging.warning("KeyError while exporting torperf file, missing key '{0}', skipping transfer '{1}'".format(str(e), xfer_db['transfer_id']))
continue
@@ -431,8 +431,7 @@ class Transfer(object):
d['elapsed_seconds']['payload_progress'] = {decile: self.payload_progress[decile] - e.unix_ts_start for decile in self.payload_progress if self.payload_progress[decile] is not None}
return d
-class Parser(object):
- __metaclass__ = ABCMeta
+class Parser(object, metaclass=ABCMeta):
@abstractmethod
def parse(self, source, do_simple):
pass
@@ -837,7 +836,6 @@ class TorCtlParser(Parser):
except:
continue
source.close()
- print len(self.streams), len(self.circuits)
def get_data(self):
return {'circuits': self.circuits, 'circuits_summary': self.circuits_summary,
diff --git a/onionperf/docs/conf.py b/onionperf/docs/conf.py
index f3d2b34..6344c90 100644
--- a/onionperf/docs/conf.py
+++ b/onionperf/docs/conf.py
@@ -19,14 +19,14 @@ sys.path.insert(0, os.path.abspath('..'))
# -- Project information -----------------------------------------------------
-project = u'onionperf'
-copyright = u'2019, Ana Custura'
-author = u'Ana Custura'
+project = 'onionperf'
+copyright = '2019, Ana Custura'
+author = 'Ana Custura'
# The short X.Y version
-version = u''
+version = ''
# The full version, including alpha/beta/rc tags
-release = u''
+release = ''
# -- General configuration ---------------------------------------------------
@@ -66,7 +66,7 @@ language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path .
-exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
@@ -131,8 +131,8 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- (master_doc, 'onionperf.tex', u'onionperf Documentation',
- u'Ana Custura', 'manual'),
+ (master_doc, 'onionperf.tex', 'onionperf Documentation',
+ 'Ana Custura', 'manual'),
]
@@ -141,7 +141,7 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- (master_doc, 'onionperf', u'onionperf Documentation',
+ (master_doc, 'onionperf', 'onionperf Documentation',
[author], 1)
]
@@ -152,7 +152,7 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- (master_doc, 'onionperf', u'onionperf Documentation',
+ (master_doc, 'onionperf', 'onionperf Documentation',
author, 'onionperf', 'One line description of project.',
'Miscellaneous'),
]
diff --git a/onionperf/measurement.py b/onionperf/measurement.py
index 467ff61..91952a5 100644
--- a/onionperf/measurement.py
+++ b/onionperf/measurement.py
@@ -4,7 +4,7 @@
See LICENSE for licensing information
'''
-import os, traceback, subprocess, threading, Queue, logging, time, datetime, re, shlex
+import os, traceback, subprocess, threading, queue, logging, time, datetime, re, shlex
from lxml import etree
# stem imports
@@ -14,7 +14,7 @@ from stem.version import Version, Requirement, get_system_tor_version
from stem import __version__ as stem_version
# onionperf imports
-import analysis, monitor, model, util
+from . import analysis, monitor, model, util
def generate_docroot_index(docroot_path):
root = etree.Element("files")
@@ -22,7 +22,7 @@ def generate_docroot_index(docroot_path):
for filename in filepaths:
e = etree.SubElement(root, "file")
e.set("name", filename)
- with open("{0}/index.xml".format(docroot_path), 'wb') as f: print >> f, etree.tostring(root, pretty_print=True, xml_declaration=True)
+ with open("{0}/index.xml".format(docroot_path), 'wt') as f: print(etree.tostring(root, pretty_print=True, xml_declaration=True), file=f)
def readline_thread_task(instream, q):
# wait for lines from stdout until the EOF
@@ -49,7 +49,8 @@ def watchdog_thread_task(cmd, cwd, writable, done_ev, send_stdin, ready_search_s
# wait for a string to appear in stdout if requested
if ready_search_str is not None:
boot_re = re.compile(ready_search_str)
- for line in iter(subp.stdout.readline, b''):
+ for bytes in iter(subp.stdout.readline, b''):
+ line = bytes.decode('utf-8')
writable.write(line)
if boot_re.search(line):
break # got it!
@@ -59,7 +60,7 @@ def watchdog_thread_task(cmd, cwd, writable, done_ev, send_stdin, ready_search_s
ready_ev.set()
# a helper will block on stdout and return lines back to us in a queue
- stdout_q = Queue.Queue()
+ stdout_q = queue.Queue()
t = threading.Thread(target=readline_thread_task, args=(subp.stdout, stdout_q))
t.start()
@@ -67,9 +68,9 @@ def watchdog_thread_task(cmd, cwd, writable, done_ev, send_stdin, ready_search_s
# sure that the subprocess is still alive and the master doesn't want us to quit
while subp.poll() is None and done_ev.is_set() is False:
try:
- line = stdout_q.get(True, 1)
- writable.write(line)
- except Queue.Empty:
+ bytes = stdout_q.get(True, 1)
+ writable.write(bytes.decode('utf-8'))
+ except queue.Empty:
# the queue is empty and the get() timed out, recheck loop conditions
continue
@@ -100,7 +101,8 @@ def watchdog_thread_task(cmd, cwd, writable, done_ev, send_stdin, ready_search_s
# helper thread is done, make sure we drain the remaining lines from the stdout queue
while not stdout_q.empty():
- writable.write(stdout_q.get_nowait())
+ bytes = stdout_q.get_nowait()
+ writable.write(bytes.decode('utf-8'))
# if we have too many failures, exit the watchdog to propogate the error up
if len(failure_times) > 10:
break
diff --git a/onionperf/model.py b/onionperf/model.py
index 3c057c5..a5e0787 100644
--- a/onionperf/model.py
+++ b/onionperf/model.py
@@ -5,16 +5,14 @@
'''
from abc import ABCMeta, abstractmethod
-from cStringIO import StringIO
+from io import StringIO
from networkx import read_graphml, write_graphml, DiGraph
-class TGenModel(object):
+class TGenModel(object, metaclass=ABCMeta):
'''
an action-dependency graph model for Shadow's traffic generator
'''
- __metaclass__ = ABCMeta
-
def dump_to_string(self):
s = StringIO()
write_graphml(self.graph, s)
@@ -42,9 +40,7 @@ class TGenLoadableModel(TGenModel):
model_instance = cls(graph)
return model_instance
-class GeneratableTGenModel(TGenModel):
-
- __metaclass__ = ABCMeta
+class GeneratableTGenModel(TGenModel, metaclass=ABCMeta):
@abstractmethod
def generate(self):
diff --git a/onionperf/onionperf b/onionperf/onionperf
index 45ead3c..536d6e2 100755
--- a/onionperf/onionperf
+++ b/onionperf/onionperf
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
'''
OnionPerf
@@ -479,7 +479,7 @@ def visualize(args):
tor_viz = TorVisualization()
for (path, label) in args.datasets:
- nextformat = lfcycle.next()
+ nextformat = next(lfcycle)
anal = Analysis.load(filename=path)
if anal is not None:
diff --git a/onionperf/tests/test_reprocessing.py b/onionperf/tests/test_reprocessing.py
index 76d5b4b..efacc5f 100644
--- a/onionperf/tests/test_reprocessing.py
+++ b/onionperf/tests/test_reprocessing.py
@@ -45,7 +45,7 @@ def test_log_match_no_log_date():
def test_log_match_with_filter_date():
tgen_logs = reprocessing.collect_logs(DATA_DIR, '*tgen.log')
torctl_logs = reprocessing.collect_logs(DATA_DIR, '*torctl.log')
- test_date = datetime.date(2019, 01, 10)
+ test_date = datetime.date(2019, 1, 10)
log_pairs = reprocessing.match(tgen_logs, torctl_logs, test_date)
well_known_list = [(DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.tgen.log', DATA_DIR + 'logs/onionperf_2019-01-10_23:59:59.torctl.log', datetime.datetime(2019, 1, 10, 0, 0))]
assert_equals(log_pairs, well_known_list)
@@ -53,7 +53,7 @@ def test_log_match_with_filter_date():
def test_log_match_with_wrong_filter_date():
tgen_logs = reprocessing.collect_logs(DATA_DIR, '*tgen.log')
torctl_logs = reprocessing.collect_logs(DATA_DIR, '*torctl.log')
- test_date = datetime.date(2017, 01, 01)
+ test_date = datetime.date(2017, 1, 1)
log_pairs = reprocessing.match(tgen_logs, torctl_logs, test_date)
well_known_list = []
assert_equals(log_pairs, well_known_list)
diff --git a/onionperf/tests/test_utils.py b/onionperf/tests/test_utils.py
index 71056ff..497c97e 100644
--- a/onionperf/tests/test_utils.py
+++ b/onionperf/tests/test_utils.py
@@ -95,7 +95,7 @@ def test_find_path_with_which():
"""
temp_file = tempfile.NamedTemporaryFile()
- os.chmod(temp_file.name, 0775)
+ os.chmod(temp_file.name, 0o775)
work_path = util.find_path(None, temp_file.name, tempfile.tempdir)
assert_equals(work_path, temp_file.name)
temp_file.close()
@@ -252,7 +252,7 @@ def test_file_writable():
test_writable.write("onionperf")
test_writable.close()
expected_checksum = "5001ed4ab25b52543946fa63da829d4eeab1bd254c89ffdad0877186e074b385"
- with open(temp_file.name) as f:
+ with open(temp_file.name, 'rb') as f:
file_bytes = f.read()
file_checksum = hashlib.sha256(file_bytes).hexdigest()
assert_equals(file_checksum, expected_checksum)
@@ -270,8 +270,8 @@ def test_file_writable_compressed():
test_writable = util.FileWritable(temp_file.name, True)
test_writable.write("onionperf")
test_writable.close()
- expected_checksum = "66a6256bc4b04529c7123fa9573d30de659ffaa0cce1cc9b189817c8bf30e813"
- with open(temp_file.name) as f:
+ expected_checksum = "3556b3bee6bb56d0a42676cbbf5784ebe4151fe65b0797f42260f93212e2df11"
+ with open(temp_file.name, 'rb') as f:
file_bytes = f.read()
file_checksum = hashlib.sha256(file_bytes).hexdigest()
assert_equals(file_checksum, expected_checksum)
diff --git a/onionperf/util.py b/onionperf/util.py
index d481150..7c8e80f 100644
--- a/onionperf/util.py
+++ b/onionperf/util.py
@@ -4,10 +4,9 @@
See LICENSE for licensing information
'''
-import sys, os, socket, logging, random, re, shutil, datetime, urllib, gzip
-from subprocess import Popen, PIPE, STDOUT
+import sys, os, socket, logging, random, re, shutil, datetime, urllib.request, urllib.parse, urllib.error, gzip, lzma
from threading import Lock
-from cStringIO import StringIO
+from io import StringIO
from abc import ABCMeta, abstractmethod
LINEFORMATS = "k-,r-,b-,g-,c-,m-,y-,k--,r--,b--,g--,c--,m--,y--,k:,r:,b:,g:,c:,m:,y:,k-.,r-.,b-.,g-.,c-.,m-.,y-."
@@ -156,7 +155,7 @@ def get_ip_address():
"""
ip_address = None
try:
- data = urllib.urlopen('https://check.torproject.org/').read()
+ data = urllib.request.urlopen('https://check.torproject.org/').read().decode('utf-8')
ip_address = find_ip_address_url(data)
if not ip_address:
logging.error(
@@ -195,18 +194,14 @@ class DataSource(object):
self.filename = filename
self.compress = compress
self.source = None
- self.xzproc = None
def __iter__(self):
if self.source is None:
self.open()
return self.source
- def next(self):
- return self.__next__()
-
- def __next__(self): # python 3
- return self.source.next() if self.source is not None else None
+ def __next__(self):
+ return next(self.source) if self.source is not None else None
def open(self):
if self.source is None:
@@ -214,14 +209,12 @@ class DataSource(object):
self.source = sys.stdin
elif self.compress or self.filename.endswith(".xz"):
self.compress = True
- cmd = "xz --decompress --stdout {0}".format(self.filename)
- xzproc = Popen(cmd.split(), stdout=PIPE)
- self.source = xzproc.stdout
+ self.source = lzma.open(self.filename, mode='rt')
elif self.filename.endswith(".gz"):
self.compress = True
- self.source = gzip.open(self.filename, 'rb')
+ self.source = gzip.open(self.filename, 'rt')
else:
- self.source = open(self.filename, 'r')
+ self.source = open(self.filename, 'rt')
def get_file_handle(self):
if self.source is None:
@@ -230,12 +223,9 @@ class DataSource(object):
def close(self):
if self.source is not None: self.source.close()
- if self.xzproc is not None: self.xzproc.wait()
-
-class Writable(object):
- __metaclass__ = ABCMeta
+class Writable(object, metaclass=ABCMeta):
@abstractmethod
def write(self, msg):
pass
@@ -251,8 +241,6 @@ class FileWritable(Writable):
self.do_compress = do_compress
self.do_truncate = do_truncate
self.file = None
- self.xzproc = None
- self.ddproc = None
self.lock = Lock()
if self.filename == '-':
@@ -275,14 +263,9 @@ class FileWritable(Writable):
def __open_nolock(self):
if self.do_compress:
- self.xzproc = Popen("xz --threads=3 -".split(), stdin=PIPE, stdout=PIPE)
- dd_cmd = "dd of={0}".format(self.filename)
- # # note: its probably not a good idea to append to finalized compressed files
- # if not self.do_truncate: dd_cmd += " oflag=append conv=notrunc"
- self.ddproc = Popen(dd_cmd.split(), stdin=self.xzproc.stdout, stdout=open(os.devnull, 'w'), stderr=STDOUT)
- self.file = self.xzproc.stdin
+ self.file = lzma.open(self.filename, mode='wt')
else:
- self.file = open(self.filename, 'w' if self.do_truncate else 'a', 0)
+ self.file = open(self.filename, 'wt' if self.do_truncate else 'at', 1)
def close(self):
self.lock.acquire()
@@ -293,12 +276,6 @@ class FileWritable(Writable):
if self.file is not None:
self.file.close()
self.file = None
- if self.xzproc is not None:
- self.xzproc.wait()
- self.xzproc = None
- if self.ddproc is not None:
- self.ddproc.wait()
- self.ddproc = None
def rotate_file(self, filename_datetime=datetime.datetime.now()):
self.lock.acquire()
@@ -316,7 +293,7 @@ class FileWritable(Writable):
self.__close_nolock()
with open(self.filename, 'rb') as f_in, gzip.open(new_filename, 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
- with open(self.filename, 'a') as f_in:
+ with open(self.filename, 'ab') as f_in:
f_in.truncate(0)
self.__open_nolock()
diff --git a/onionperf/visualization.py b/onionperf/visualization.py
index c673617..a5dde54 100644
--- a/onionperf/visualization.py
+++ b/onionperf/visualization.py
@@ -46,9 +46,7 @@ pylab.rcParams.update({
})
'''
-class Visualization(object):
-
- __metaclass__ = ABCMeta
+class Visualization(object, metaclass=ABCMeta):
def __init__(self):
self.datasets = []
@@ -349,7 +347,7 @@ class TGenVisualization(Visualization):
if client not in dls[bytes]: dls[bytes][client] = 0
for sec in d["time_to_last_byte"][b]: dls[bytes][client] += len(d["time_to_last_byte"][b][sec])
for bytes in dls:
- x, y = getcdf(dls[bytes].values(), shownpercentile=1.0)
+ x, y = getcdf(list(dls[bytes].values()), shownpercentile=1.0)
pylab.figure(figs[bytes].number)
pylab.plot(x, y, lineformat, label=label)
@@ -555,7 +553,7 @@ def getcdf(data, shownpercentile=0.99, maxpoints=10000.0):
frac = cf(data)
k = len(data) / maxpoints
x, y, lasty = [], [], 0.0
- for i in xrange(int(round(len(data) * shownpercentile))):
+ for i in range(int(round(len(data) * shownpercentile))):
if i % k > 1.0: continue
assert not numpy.isnan(data[i])
x.append(data[i])
diff --git a/run_tests.sh b/run_tests.sh
index d45032c..7a30e61 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -1,3 +1,3 @@
#!/bin/sh
-PYTHONPATH=. python -m nose --with-coverage --cover-package=onionperf
+PYTHONPATH=. python3 -m nose --with-coverage --cover-package=onionperf
diff --git a/setup.py b/setup.py
index 07e46a6..41bba2f 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
from distutils.core import setup
1
0

12 May '20
commit 16556497d431f032e789294fa55191637e5a23aa
Author: Philipp Winter <phw(a)nymity.ch>
Date: Fri May 8 10:37:10 2020 -0700
Turn dict_keys and dict_values into lists.
The tool 2to3 discovered these issues.
---
onionperf/analysis.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/onionperf/analysis.py b/onionperf/analysis.py
index 82db3c8..041d8c3 100644
--- a/onionperf/analysis.py
+++ b/onionperf/analysis.py
@@ -50,7 +50,7 @@ class Analysis(object):
self.torctl_filepaths.append(filepath)
def get_nodes(self):
- return self.json_db['data'].keys()
+ return list(self.json_db['data'].keys())
def get_tor_bandwidth_summary(self, node, direction):
try:
@@ -160,13 +160,13 @@ class Analysis(object):
continue
xfers_by_filesize = {}
- for xfer_db in self.json_db['data'][nickname]['tgen']['transfers'].values():
+ for xfer_db in list(self.json_db['data'][nickname]['tgen']['transfers'].values()):
xfers_by_filesize.setdefault(xfer_db['filesize_bytes'], []).append(xfer_db)
streams_by_srcport, circuits = {}, []
if 'tor' in self.json_db['data'][nickname]:
if 'streams' in self.json_db['data'][nickname]['tor']:
- for streams_db in self.json_db['data'][nickname]['tor']['streams'].values():
+ for streams_db in list(self.json_db['data'][nickname]['tor']['streams'].values()):
if 'source' in streams_db:
srcport = int(streams_db['source'].split(':')[1])
streams_by_srcport[srcport] = streams_db
@@ -264,9 +264,9 @@ class Analysis(object):
srcport = int(xfer_db['endpoint_local'].split(':')[2])
if srcport in streams_by_srcport:
stream_db = streams_by_srcport[srcport]
- if 'failure_reason_local' in stream_db.keys():
+ if 'failure_reason_local' in list(stream_db.keys()):
d['ERRORCODE'] += '_' + stream_db['failure_reason_local']
- if 'failure_reason_remote' in stream_db.keys():
+ if 'failure_reason_remote' in list(stream_db.keys()):
d['ERRORCODE'] += '_' + stream_db['failure_reason_remote']
circid = int(stream_db['circuit_id'] or 0)
if circid in circuits:
@@ -280,7 +280,7 @@ class Analysis(object):
d['CIRC_ID'] = circid
d['USED_AT'] = stream_db['unix_ts_end']
d['USED_BY'] = int(stream_db['stream_id'])
- if 'ERRORCODE' in d.keys():
+ if 'ERRORCODE' in list(d.keys()):
d['ERRORCODE'] = ERRORS[d['ERRORCODE']]
output.write("@type torperf 1.1\r\n")
1
0

[onionperf/master] Make installation instructions work with Python 3.
by karsten@torproject.org 12 May '20
by karsten@torproject.org 12 May '20
12 May '20
commit 0f43d7904c1690561667d7833f42e00b3f367647
Author: Philipp Winter <phw(a)nymity.ch>
Date: Fri May 8 11:02:45 2020 -0700
Make installation instructions work with Python 3.
For the most part, this is as simple as adding a "3" to all occurrences
of "python" with the single exception of revising how one creates a
virtual environment in Python 3.
---
README.md | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index 51a9982..d7ff81b 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ produce a json stats database and files that can feed into Torperf, and
can later be used to visualize changes in Tor client performance over time.
For more information, see https://git.torproject.org/onionperf
+
For a dockerized setup, see https://github.com/hiromipaw/onionperf-docker
## Quick deployment instructions
@@ -19,7 +20,7 @@ For a dockerized setup, see https://github.com/hiromipaw/onionperf-docker
These are the quick deployment instructions for the current Debian stable distribution.
```
-sudo apt install git cmake make build-essential gcc libigraph0-dev libglib2.0-dev python-dev libxml2-dev python-lxml python-networkx python-scipy python-matplotlib python-numpy libevent-dev libssl-dev python-stem tor
+sudo apt install git cmake make build-essential gcc libigraph0-dev libglib2.0-dev python3-dev libxml2-dev python3-lxml python3-networkx python3-scipy python3-matplotlib python3-numpy libevent-dev libssl-dev python3-stem tor
git clone https://github.com/shadow/tgen.git
cd tgen
@@ -31,8 +32,8 @@ sudo ln -s ~/tgen/build/tgen /usr/bin/tgen
git clone https://github.com/torproject/onionperf
cd onionperf
-sudo python setup.py build
-sudo python setup.py install
+sudo python3 setup.py build
+sudo python3 setup.py install
```
## Step-by-step installation instructions
@@ -50,13 +51,13 @@ cd onionperf
+ **Tor** (>= v0.2.7.3-rc): libevent, openssl
+ **TGen** (Shadow >= v1.11.1): cmake, glib2, igraph
- + **OnionPerf**: python
+ + **OnionPerf**: python3
The easiest way to satisfy all system dependencies is to use a package manager. TGen is not currently packaged and needs to be built from source.
Note we only provide support for the current Debian Stable distribution.
```
-sudo apt install cmake make build-essential gcc libigraph0-dev libglib2.0-dev python-dev
+sudo apt install cmake make build-essential gcc libigraph0-dev libglib2.0-dev python3-dev
```
### Install Python modules
@@ -68,7 +69,7 @@ sudo apt install cmake make build-essential gcc libigraph0-dev libglib2.0-dev py
The easiest way to satisfy all system dependencies is to use a package manager.
```
-apt install tor libxml2-dev python-lxml python-networkx python-scipy python-matplotlib python-numpy python-stem
+apt install tor libxml2-dev python3-lxml python3-networkx python3-scipy python3-matplotlib python3-numpy python3-stem
```
@@ -86,15 +87,14 @@ You must first satisfy the system/library requirements of each of the python mod
Note: pip installation is not recommended as software installed by pip is not verified.
```
-sudo apt-get install python-dev libxml2 libxml2-dev libxslt1.1 libxslt1-dev libpng12-0 libpng12-dev libfreetype6 libfreetype6-dev
+sudo apt-get install python3-dev libxml2 libxml2-dev libxslt1.1 libxslt1-dev libpng12-0 libpng12-dev libfreetype6 libfreetype6-dev
```
It is recommended to use virtual environments to keep all of the dependencies self-contained and
to avoid conflicts with your other python projects.
```
-pip install virtualenv
-virtualenv --no-site-packages venv
+python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt # installs all required python modules for all OnionPerf subcommands
deactivate
@@ -169,8 +169,8 @@ pip install -I .
Otherwise:
```
-python setup.py build
-python setup.py install
+python3 setup.py build
+python3 setup.py install
```
### Run OnionPerf
1
0

[onionperf/master] Open Tor control log files with \r\n as newline.
by karsten@torproject.org 12 May '20
by karsten@torproject.org 12 May '20
12 May '20
commit f863ee46e82a7acdf670752664eb4df93de0a247
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Sat May 9 19:51:42 2020 +0200
Open Tor control log files with \r\n as newline.
Turns out that Tor control log files use \r\n for newlines. When we
open these files without providing a newline parameter, line endings
are translated by Python 3 into '\n' before being returned to the us.
If we do specify a newline parameter, line endings are returned to us
untranslated. We need \r\n as newlines for Stem to recognize and parse
control events.
On the other hand TGen log files use \n as newline, which is why we
need to make newlines configurable.
---
onionperf/analysis.py | 2 +-
onionperf/util.py | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/onionperf/analysis.py b/onionperf/analysis.py
index 041d8c3..8e2b7df 100644
--- a/onionperf/analysis.py
+++ b/onionperf/analysis.py
@@ -825,7 +825,7 @@ class TorCtlParser(Parser):
def parse(self, source, do_simple=True):
self.do_simple = do_simple
- source.open()
+ source.open(newline='\r\n')
for line in source:
# ignore line parsing errors
try:
diff --git a/onionperf/util.py b/onionperf/util.py
index 7c8e80f..cb9f065 100644
--- a/onionperf/util.py
+++ b/onionperf/util.py
@@ -203,18 +203,18 @@ class DataSource(object):
def __next__(self):
return next(self.source) if self.source is not None else None
- def open(self):
+ def open(self, newline=None):
if self.source is None:
if self.filename == '-':
self.source = sys.stdin
elif self.compress or self.filename.endswith(".xz"):
self.compress = True
- self.source = lzma.open(self.filename, mode='rt')
+ self.source = lzma.open(self.filename, mode='rt', newline=newline)
elif self.filename.endswith(".gz"):
self.compress = True
- self.source = gzip.open(self.filename, 'rt')
+ self.source = gzip.open(self.filename, 'rt', newline=newline)
else:
- self.source = open(self.filename, 'rt')
+ self.source = open(self.filename, 'rt', newline=newline)
def get_file_handle(self):
if self.source is None:
1
0

[translation/tpo-web] https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
by translation@torproject.org 12 May '20
by translation@torproject.org 12 May '20
12 May '20
commit e67803d0e24663193c15d5680e1119373fcff121
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue May 12 06:23:30 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
---
contents+bs.po | 1371 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1371 insertions(+)
diff --git a/contents+bs.po b/contents+bs.po
new file mode 100644
index 0000000000..824c10cfda
--- /dev/null
+++ b/contents+bs.po
@@ -0,0 +1,1371 @@
+#
+# Translators:
+# Aleksandar Todorović (r3bl) <aleksandar(a)r3bl.me>, 2019
+# erinm, 2019
+# Amar Memisevic <factoryamar(a)gmail.com>, 2020
+# Vojtech Kotek <kotek.vojtech(a)gmail.com>, 2020
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-02-24 13:39+CET\n"
+"PO-Revision-Date: 2019-03-09 10:41+0000\n"
+"Last-Translator: Vojtech Kotek <kotek.vojtech(a)gmail.com>, 2020\n"
+"Language-Team: Bosnian (https://www.transifex.com/otf/teams/1519/bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bs\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.title)
+msgid "Anonymity Online"
+msgstr ""
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.section)
+msgid "home"
+msgstr ""
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.body)
+msgid "###### ABOUT US ######"
+msgstr ""
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.body)
+msgid ""
+"We believe everyone should be able to explore the internet with privacy."
+msgstr ""
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.body)
+msgid "We are the Tor Project, a 501(c)3 US nonprofit."
+msgstr ""
+
+#: https//www.torproject.org/ (content/contents+en.lrpage.body)
+msgid ""
+"We advance human rights and defend your privacy online through free software"
+" and open networks. [Meet our team](about/people)."
+msgstr ""
+
+#: https//www.torproject.org/contact/
+#: (content/contact/contents+en.lrpage.title)
+msgid "Contact"
+msgstr "Kontakt"
+
+#: https//www.torproject.org/contact/
+#: (content/contact/contents+en.lrpage.section)
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.section)
+msgid "The Tor Project"
+msgstr ""
+
+#: https//www.torproject.org/contact/
+#: (content/contact/contents+en.lrpage.body)
+msgid "### Get Support"
+msgstr ""
+
+#: https//www.torproject.org/contact/
+#: (content/contact/contents+en.lrpage.body)
+msgid ""
+"Need help? Visit our [Support Portal](https://support.torproject.org) for "
+"answers to frequently asked questions about connecting to Tor, circumventing"
+" censorship, using onion services, and more."
+msgstr ""
+
+#: https//www.torproject.org/download/
+#: (content/download/contents+en.lrpage.title)
+#: (content/download/contents+en.lrpage.section)
+#: https//www.torproject.org/download/alpha/
+#: (content/download/alpha/contents+en.lrpage.section)
+#: https//www.torproject.org/download/languages/
+#: (content/download/languages/contents+en.lrpage.section)
+#: https//www.torproject.org/download/tor/
+#: (content/download/tor/contents+en.lrpage.section)
+msgid "Download"
+msgstr "Preuzmi"
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.title)
+msgid "Sponsors"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.section)
+#: https//www.torproject.org/about/ (content/about/contents+en.lrpage.section)
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.section)
+#: https//www.torproject.org/about/trademark/
+#: (content/about/trademark/contents+en.lrtrademark.section)
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.section)
+#: https//www.torproject.org/about/people/
+#: (content/about/people/contents+en.lrpeople.section)
+#: https//www.torproject.org/about/sponsors/
+#: (content/about/sponsors/contents+en.lrsponsors.section)
+#: https//www.torproject.org/about/reports/
+#: (content/about/reports/contents+en.lrreports.section)
+#: https//www.torproject.org/about/jobs/
+#: (content/about/jobs/contents+en.lrjobs.section)
+msgid "About"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Documentation"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Press"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Support"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Jobs"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Blog"
+msgstr "Blog"
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Donate"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Donate Now"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Trademark"
+msgstr ""
+
+#: https//www.torproject.org/menu/ (content/menu/contents+en.lrpage.body)
+msgid "Community"
+msgstr ""
+
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.title)
+msgid "Success"
+msgstr ""
+
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.body)
+msgid "You're equipped to browse freely."
+msgstr ""
+
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.body)
+msgid "Tor is the strongest tool for privacy and freedom online."
+msgstr ""
+
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.body)
+msgid ""
+"It is free and open source software maintained by the Tor Project and a "
+"community of volunteers worldwide."
+msgstr ""
+
+#: https//www.torproject.org/thank-you/
+#: (content/thank-you/contents+en.lrpage.body)
+msgid ""
+"We need your help to keep Tor secure and safe for millions across the globe."
+" [Donate Now](https://donate.torproject.org/)"
+msgstr ""
+
+#: https//www.torproject.org/about/ (content/about/contents+en.lrpage.title)
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.title)
+msgid "History"
+msgstr "History"
+
+#: https//www.torproject.org/download/alpha/
+#: (content/download/alpha/contents+en.lrpage.title)
+msgid "Download Tor Browser Alpha"
+msgstr ""
+
+#: https//www.torproject.org/download/alpha/
+#: (content/download/alpha/contents+en.lrpage.body)
+msgid ""
+"Before we release a stable version of our software, we release an alpha "
+"version to test features and find bugs."
+msgstr ""
+
+#: https//www.torproject.org/download/alpha/
+#: (content/download/alpha/contents+en.lrpage.body)
+msgid ""
+"Please only download an alpha if you are okay with some things not working "
+"properly, want to help us find and [report "
+"bugs](https://support.torproject.org/misc/bug-or-feedback/), and are not "
+"putting yourself at risk."
+msgstr ""
+
+#: https//www.torproject.org/download/languages/
+#: (content/download/languages/contents+en.lrpage.title)
+msgid "Download Tor Browser in your language"
+msgstr ""
+
+#: https//www.torproject.org/download/languages/
+#: (content/download/languages/contents+en.lrpage.body)
+msgid ""
+"We want everyone to be able to enjoy Tor Browser in their own language. Tor "
+"Browser is now available in 32 different languages, and we are working to "
+"add more. Want to help us translate? [See "
+"here](https://community.torproject.org/localization/)"
+msgstr ""
+
+#: https//www.torproject.org/download/tor/
+#: (content/download/tor/contents+en.lrpage.title)
+msgid "Download Tor Source Code"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.title)
+msgid "Cy Pres Awards"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "### Cy Pres Awards – Consumer Privacy and Privacy Online"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"_Cy pres_ awards are funds distributed as a part of class action lawsuit "
+"settlements in the United States. When the totality of the funds cannot be "
+"distributed to class members, they can be distributed to nonprofit, "
+"advocacy, and research groups that generally represent the class members. "
+"Consumer privacy _cy pres_ awards can help the Tor Project to educate "
+"individuals and organizations about how to retain their privacy online, "
+"advocate for privacy protections, and build important free, open source "
+"technologies that prioritize privacy."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "#### About the Tor Project"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"The Tor Project is a U.S.-based 501(c)3 nonprofit founded in 2006 with the "
+"mission of advancing human rights and freedoms by:"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"- Creating and deploying free and open anonymity and privacy technologies,"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "- Supporting their unrestricted availability and use, and"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "- Furthering their scientific and popular understanding."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"The Tor Project and its surrounding community develop and distribute some of"
+" the most popular and widely used free, open source privacy technologies: "
+"Tor Browser and the Tor network."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"Beyond developing technology, the organization helps people retain their "
+"privacy online. The Tor Project has educated thousands of activists, "
+"journalists, human rights defenders, librarians, consumers, and average "
+"internet users about how to protect and retain their privacy online."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"The Tor Project is recognized as a leading expert on privacy online, and is "
+"[often turned to by the media for information about how individuals and "
+"consumers can protect their privacy](https://www.torproject.org/press/)."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"In the past, the Tor Project has been the recipient of consumer privacy _cy "
+"pres_ awards through the Rose Foundation's Consumer Privacy grants. The "
+"organization has more than a decade of experience successfully delivering on"
+" projects with funders and partners as varied as the U.S. State Department –"
+" Bureau of Democracy, Human Rights, and Labor; National Science Foundation; "
+"Defense Advanced Research Projects Agency (DARPA); and the Media Democracy "
+"Fund."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "#### Contact the Tor Project about a Cy Pres Award"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"If you would like to speak to somebody at the Tor Project about whether or "
+"not the organization might be appropriate for a _cy pres_ award, please "
+"contact Sarah Stevenson, Fundraising Director, at "
+"[sstevenson@torproject.org](mailto:sstevenson@torproject.org)."
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "#### Further Reading"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid "- [The Tor Project in the Media](https://www.torproject.org/press/)"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"- [The Tor Project Financial "
+"Reports](https://www.torproject.org/about/reports/)"
+msgstr ""
+
+#: https//www.torproject.org/about/cy-pres/
+#: (content/about/cy-pres/contents+en.lrpage.body)
+msgid ""
+"- [The Tor Project Board Members and "
+"Staff](https://www.torproject.org/about/people/)"
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"The Tor Project, Inc, became a 501(c)3 nonprofit in 2006, but the idea of "
+"\"onion routing\" began in the mid 1990s."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"**Just like Tor users, the developers, researchers, and founders who've made"
+" Tor possible are a diverse group of people. But all of the people who have "
+"been involved in Tor are united by a common belief: internet users should "
+"have private access to an uncensored web.**"
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"In the 1990s, the lack of security on the internet and its ability to be "
+"used for tracking and surveillance was becoming clear, and in 1995, David "
+"Goldschlag, Mike Reed, and Paul Syverson at the U.S. Naval Research Lab "
+"(NRL) asked themselves if there was a way to create internet connections "
+"that don't reveal who is talking to whom, even to someone monitoring the "
+"network."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Their answer was to create and deploy the first research designs and "
+"prototypes of onion routing."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"The goal of onion routing was to have a way to use the internet with as much"
+" privacy as possible, and the idea was to route traffic through multiple "
+"servers and encrypt it each step of the way."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid "This is still a simple explanation for how Tor works today."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"In the early 2000s, Roger Dingledine, a recent [Massachusetts Institute of "
+"Technology (MIT)](https://web.mit.edu/) graduate, began working on an NRL "
+"onion routing project with Paul Syverson."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"To distinguish this original work at NRL from other onion routing efforts "
+"that were starting to pop up elsewhere, Roger called the project Tor, which "
+"stood for The Onion Routing. Nick Mathewson, a classmate of Roger's at MIT, "
+"joined the project soon after."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"From its inception in the 1990s, onion routing was conceived to rely on a "
+"decentralized network. The network needed to be operated by entities with "
+"diverse interests and trust assumptions, and the software needed to be free "
+"and open to maximize transparency and separation."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"That's why in October 2002 when the Tor network was initially deployed, its "
+"code was released under a free and open software license."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"By the end of 2003, the network had about a dozen volunteer nodes, mostly in"
+" the U.S., plus one in Germany."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Recognizing the benefit of Tor to digital rights, the [Electronic Frontier "
+"Foundation (EFF)](https://www.eff.org/) began funding Roger's and Nick's "
+"work on Tor in 2004. In 2006, the Tor Project, Inc., a 501(c)3 nonprofit "
+"organization, was founded to maintain Tor's development."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"In 2007, the organization began developing bridges to the Tor network to "
+"address censorship, such as the need to get around government firewalls, in "
+"order for its users to access the open web."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Tor began gaining popularity among activists and tech-savvy users interested"
+" in privacy, but it was still difficult for less-technically savvy people to"
+" use, so starting in 2005, development of tools beyond just the Tor proxy "
+"began."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Development of Tor Browser began in "
+"[2008](https://lists.torproject.org/pipermail/tor-"
+"talk/2008-January/007837.html)."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"With Tor Browser having made Tor more accessible to everyday internet users "
+"and activists, Tor was an instrumental tool during the [Arab "
+"Spring](https://en.wikipedia.org/wiki/Arab_Spring) beginning in late 2010. "
+"It not only protected people's identity online but also allowed them to "
+"access critical resources, social media, and websites which were blocked."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"The need for tools safeguarding against mass surveillance became a "
+"mainstream concern thanks to the [Snowden revelations in "
+"2013](https://www.theguardian.com/world/interactive/2013/nov/01/snowden-nsa-"
+"files-surveillance-revelations-decoded#section/1)."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Not only was Tor instrumental to Snowden's whistleblowing, but content of "
+"the documents also upheld assurances that, at that time, [Tor could not be "
+"cracked](https://www.wired.com/story/the-grand-tor/)."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"People's awareness of tracking, surveillance, and censorship may have "
+"increased, but so has the prevalence of these hindrances to internet "
+"freedom."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"Today, the network has [thousands of relays](https://metrics.torproject.org)"
+" run by volunteers and millions of users worldwide. And it is this diversity"
+" that keeps Tor users safe."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"We, at the Tor Project, fight every day for everyone to have private access "
+"to an uncensored internet, and Tor has become the world's strongest tool for"
+" privacy and freedom online."
+msgstr ""
+
+#: https//www.torproject.org/about/history/
+#: (content/about/history/contents+en.lrpage.body)
+msgid ""
+"But Tor is more than just software. It is a labor of love produced by an "
+"international community of people devoted to human rights. The Tor Project "
+"is [deeply committed](https://blog.torproject.org/tor-social-contract) to "
+"transparency and the safety of its users."
+msgstr ""
+
+#: https//www.torproject.org/about/people/
+#: (content/about/people/contents+en.lrpeople.title)
+msgid "People"
+msgstr ""
+
+#: https//www.torproject.org/about/people/
+#: (content/about/people/contents+en.lrpeople.body)
+msgid ""
+"We are an international team who believes everyone should have private "
+"access to the uncensored web."
+msgstr ""
+
+#: https//www.torproject.org/about/sponsors/
+#: (content/about/sponsors/contents+en.lrsponsors.body)
+msgid ""
+"Having a diverse user base means we have diverse funding sources, too. Our "
+"goal is to continue diversifying our funding. To inquire about sponsorship, "
+"please email giving(at)torproject.org."
+msgstr ""
+
+#: https//www.torproject.org/about/reports/
+#: (content/about/reports/contents+en.lrreports.body)
+msgid ""
+"The Tor Project, Inc. is a US 501(c)(3) nonprofit organization committed to "
+"transparency in its work and reporting."
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tails/
+#: (content/press/new-release-tails/contents+en.lrpost.title)
+msgid "New Release: Tails 3.12"
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tails/
+#: (content/press/new-release-tails/contents+en.lrpost.summary)
+msgid ""
+"This release fixes many security vulnerabilities. You should upgrade as soon"
+" as possible."
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tails/
+#: (content/press/new-release-tails/contents+en.lrpost.summary)
+msgid ""
+"The biggest news for 3.12 is that we completely changed the installation "
+"methods for Tails."
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tor/
+#: (content/press/new-release-tor/contents+en.lrpost.title)
+msgid "New Release: Tor 0.4.0.1-alpha"
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tor/
+#: (content/press/new-release-tor/contents+en.lrpost.summary)
+msgid ""
+"There's a new alpha release available for download. If you build Tor from "
+"source, you can download the source code for 0.4.0.1-alpha from the usual "
+"place on the website."
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tor-browser/
+#: (content/press/new-release-tor-browser/contents+en.lrpost.title)
+msgid "New Release: Tor Browser 8.5a10"
+msgstr ""
+
+#: https//www.torproject.org/press/-new-release-tor-browser/
+#: (content/press/new-release-tor-browser/contents+en.lrpost.summary)
+msgid ""
+"Tor Browser 8.5a10 is now available from the <a "
+"href=\"https://www.torproject.org/projects/torbrowser.html.en#downloads-"
+"alpha\">Tor Browser Project page</a> and also from our <a "
+"href=\"/dist/torbrowser/8.5a10/\">distribution directory</a>."
+msgstr ""
+
+#: https//www.torproject.org/about/trademark/trademark-faq/
+#: (content/about/trademark/trademark-faq/contents+en.lrtopic.title)
+msgid "Tor Trademark Frequently Asked Questions"
+msgstr ""
+
+#: lego/templates/banner.html:3 lego/templates/banner.html:5
+#: templates/banner.html:3 templates/banner.html:5
+msgid "Close banner"
+msgstr ""
+
+#: lego/templates/banner.html:11 templates/banner.html:11
+msgid "Tracking, surveillance, and censorship are widespread online."
+msgstr ""
+
+#: lego/templates/banner.html:20 templates/banner.html:20
+msgid "TAKE BACK THE INTERNET WITH TOR"
+msgstr ""
+
+#: lego/templates/banner.html:33 lego/templates/banner.html:35
+#: templates/banner.html:33 templates/banner.html:35
+msgid "DONATE NOW"
+msgstr ""
+
+#: lego/templates/banner.html:37 templates/banner.html:37
+msgid "Give today, and Mozilla will match your donation."
+msgstr ""
+
+#: lego/templates/footer.html:13 lego/templates/footer.html:22
+#: lego/templates/navbar.html:83 templates/footer.html:13
+#: templates/footer.html:22 templates/hero-home.html:13
+#: templates/navbar.html:83
+msgid "Download Tor Browser"
+msgstr ""
+
+#: lego/templates/footer.html:14 templates/footer.html:14
+msgid ""
+"Download Tor Browser to experience real private browsing without tracking, "
+"surveillance, or censorship."
+msgstr ""
+
+#: lego/templates/footer.html:35 templates/footer-min.html:9
+#: templates/footer.html:35
+msgid "Our mission:"
+msgstr ""
+
+#: lego/templates/footer.html:36 templates/footer-min.html:10
+#: templates/footer.html:36
+msgid ""
+"To advance human rights and freedoms by creating and deploying free and open"
+" source anonymity and privacy technologies, supporting their unrestricted "
+"availability and use, and furthering their scientific and popular "
+"understanding."
+msgstr ""
+
+#: lego/templates/footer.html:73 templates/footer-min.html:46
+#: templates/footer.html:73
+msgid "Subscribe to our Newsletter"
+msgstr ""
+
+#: lego/templates/footer.html:74 templates/footer-min.html:47
+#: templates/footer.html:74
+msgid "Get monthly updates and opportunities from the Tor Project:"
+msgstr ""
+
+#: lego/templates/footer.html:75 templates/footer-min.html:48
+#: templates/footer.html:75
+msgid "Sign up"
+msgstr "Prijavite se"
+
+#: lego/templates/footer.html:94 templates/footer-min.html:67
+#: templates/footer.html:94
+#, python-format
+msgid ""
+"Trademark, copyright notices, and rules for use by third parties can be "
+"found in our %(link_to_faq)s"
+msgstr ""
+
+#: lego/templates/navbar.html:25 templates/navbar.html:25
+msgid "Menu"
+msgstr ""
+
+#: lego/templates/search.html:5 templates/search.html:5
+msgid "Search"
+msgstr "Pretraga"
+
+#: lego/templates/secure-connections.html:1
+msgid ""
+"The following visualization shows what information is visible to "
+"eavesdroppers with and without Tor Browser and HTTPS encryption:"
+msgstr ""
+
+#: lego/templates/secure-connections.html:4
+msgid ""
+"Click the “Tor” button to see what data is visible to observers when you're "
+"using Tor. The button will turn green to indicate that Tor is on."
+msgstr ""
+
+#: lego/templates/secure-connections.html:5
+msgid ""
+"Click the “HTTPS” button to see what data is visible to observers when "
+"you're using HTTPS. The button will turn green to indicate that HTTPS is on."
+msgstr ""
+
+#: lego/templates/secure-connections.html:6
+msgid ""
+"When both buttons are green, you see the data that is visible to observers "
+"when you are using both tools."
+msgstr ""
+
+#: lego/templates/secure-connections.html:7
+msgid ""
+"When both buttons are grey, you see the data that is visible to observers "
+"when you don't use either tool."
+msgstr ""
+
+#: lego/templates/secure-connections.html:11
+msgid "HTTPS"
+msgstr "HTTPS"
+
+#: lego/templates/secure-connections.html:15
+#: lego/templates/secure-connections.html:65
+msgid "Tor"
+msgstr "Tor"
+
+#: lego/templates/secure-connections.html:32
+msgid "POTENTIALLY VISIBLE DATA"
+msgstr ""
+
+#: lego/templates/secure-connections.html:37
+msgid "Site.com"
+msgstr ""
+
+#: lego/templates/secure-connections.html:40
+msgid "The site being visited."
+msgstr ""
+
+#: lego/templates/secure-connections.html:44
+msgid "user / pw"
+msgstr ""
+
+#: lego/templates/secure-connections.html:47
+msgid "Username and password used for authentication."
+msgstr ""
+
+#: lego/templates/secure-connections.html:51
+msgid "data"
+msgstr ""
+
+#: lego/templates/secure-connections.html:54
+msgid "Data being transmitted."
+msgstr ""
+
+#: lego/templates/secure-connections.html:58
+msgid "location"
+msgstr ""
+
+#: lego/templates/secure-connections.html:61
+msgid ""
+"Network location of the computer used to visit the website (the public IP "
+"address)."
+msgstr ""
+
+#: lego/templates/secure-connections.html:68
+msgid "Whether or not Tor is being used."
+msgstr ""
+
+#: templates/contact.html:8
+msgid "Chat with us on"
+msgstr ""
+
+#: templates/contact.html:9
+msgid "Ask questions about using Tor."
+msgstr ""
+
+#: templates/contact.html:10
+msgid "Discuss Tor-related coding and protocols. Ideas are welcome."
+msgstr ""
+
+#: templates/contact.html:11
+msgid "Get in touch with other translators"
+msgstr ""
+
+#: templates/contact.html:12
+msgid "Watch or join publicly logged team meetings."
+msgstr ""
+
+#: templates/contact.html:13
+msgid ""
+"Discuss organization and community related topics: meetups and outreach."
+msgstr ""
+
+#: templates/contact.html:14
+msgid "Discuss running a Tor relay."
+msgstr ""
+
+#: templates/contact.html:15
+msgid "Talk with Tor's global south community."
+msgstr ""
+
+#: templates/contact.html:16
+msgid "Talk with us about improvements on our websites."
+msgstr ""
+
+#: templates/contact.html:17
+msgid "Discuss UX related ideas."
+msgstr ""
+
+#: templates/contact.html:23
+msgid "Find us on Social Media"
+msgstr ""
+
+#: templates/contact.html:37
+msgid "Volunteer with Tor"
+msgstr ""
+
+#: templates/contact.html:41
+msgid "Get Involved"
+msgstr ""
+
+#: templates/contact.html:47
+msgid "Join an email list"
+msgstr ""
+
+#: templates/contact.html:50
+msgid ""
+"Our teams collaborate in open channels, including email lists, you are "
+"welcome to join. If you have a question for a specific team not answered on "
+"our support portal, you can ask the appropriate list. You're welcome to "
+"subscribe and just watch, too :)"
+msgstr ""
+
+#: templates/contact.html:63
+msgid "Report a bug or give feedback."
+msgstr ""
+
+#: templates/contact.html:64
+msgid ""
+"Tor relies on the support of users and volunteers around the world to help "
+"us improve our software and resources, so your feedback is extremely "
+"valuable to us (and to all Tor users)."
+msgstr ""
+
+#: templates/contact.html:70
+msgid "Tell us about a bad relay."
+msgstr ""
+
+#: templates/contact.html:71
+msgid ""
+"If you find a relay that you think is malicious, misconfigured, or otherwise"
+" broken, please check out our wiki page and blog post on how to report it."
+msgstr ""
+
+#: templates/contact.html:79
+msgid "Report a security issue."
+msgstr ""
+
+#: templates/contact.html:80
+msgid ""
+"If you've found a security issue in one of our projects or in our "
+"infrastructure, please email tor-security(a)lists.torproject.org. If you've "
+"found a security bug in Tor or Tor Browser, feel free to submit it for our"
+msgstr ""
+
+#: templates/contact.html:80
+msgid "bug bounty program."
+msgstr ""
+
+#: templates/contact.html:80
+msgid ""
+"If you want to encrypt your mail, you can get the GPG public key for the "
+"list by contacting tor-security-sendkey(a)lists.torproject.org or from pool"
+".sks-keyservers.net. Here is the fingerprint:"
+msgstr ""
+
+#: templates/contact.html:100
+msgid "Email us"
+msgstr ""
+
+#: templates/contact.html:101
+msgid ""
+"For questions and comments about Tor the non-profit organization: trademark "
+"questions, affiliation and coordination, contract inquiries, etc, please "
+"email frontdesk(a)torproject.org. For donor-related questions, contact "
+"giving(a)torproject.org"
+msgstr ""
+
+#: templates/contact.html:107
+msgid "Send us Mail"
+msgstr ""
+
+#: templates/download-android.html:12
+msgid "Get Tor Browser for Android."
+msgstr ""
+
+#: templates/download-android.html:15 templates/hero-download.html:5
+msgid "Protect yourself against tracking, surveillance, and censorship."
+msgstr ""
+
+#: templates/download-android.html:27 templates/download-android.html:30
+#: templates/download-android.html:33 templates/download-android.html:36
+msgid "Download .apk"
+msgstr ""
+
+#: templates/download-android.html:39
+msgid "Go to Google Play"
+msgstr ""
+
+#: templates/download-android.html:41
+msgid "Go to F-Droid"
+msgstr ""
+
+#: templates/download-android.html:48
+msgid "Are you an iOS user? We encourage you to try Onion Browser."
+msgstr ""
+
+#: templates/download-languages.html:11 templates/download-options.html:11
+msgid "Language"
+msgstr "Jezik"
+
+#: templates/download-languages.html:12 templates/download-options.html:12
+msgid "Windows"
+msgstr ""
+
+#: templates/download-languages.html:13
+msgid "macOS"
+msgstr ""
+
+#: templates/download-languages.html:14 templates/download-options.html:14
+msgid "GNU/Linux"
+msgstr ""
+
+#: templates/download-options.html:13
+msgid "MacOS"
+msgstr ""
+
+#: templates/download-options.html:43
+msgid "Tor Browser for Android Alpha"
+msgstr ""
+
+#: templates/download-options.html:49
+msgid "Google Play"
+msgstr ""
+
+#: templates/download-tor.html:8
+msgid "Tor Source"
+msgstr ""
+
+#: templates/download-tor.html:12
+msgid "Version"
+msgstr ""
+
+#: templates/download-tor.html:27 templates/download-tor.html:33
+msgid "Changelog"
+msgstr "Promjene"
+
+#: templates/download-tor.html:28 templates/download-tor.html:34
+msgid "sig"
+msgstr ""
+
+#: templates/download-tor.html:41
+msgid "Windows Expert Bundle"
+msgstr ""
+
+#: templates/download-tor.html:46
+msgid "Windows 10, 8, 7, Vista, XP, 2000, 2003 Server, ME, and Windows 98SE"
+msgstr ""
+
+#: templates/download-tor.html:47
+msgid "Contains just Tor and nothing else."
+msgstr ""
+
+#: templates/download.html:5
+msgid "Get Connected"
+msgstr ""
+
+#: templates/download.html:7
+msgid "Get connected"
+msgstr ""
+
+#: templates/download.html:9
+msgid ""
+"If you are in a country where Tor is blocked, you can configure Tor to "
+"connect to a bridge during the setup process."
+msgstr ""
+
+#: templates/download.html:10
+msgid "Select \"Tor is censored in my country.\""
+msgstr ""
+
+#: templates/download.html:13
+msgid ""
+"If Tor is not censored, one of the most common reasons Tor won't connect is "
+"an incorrect system clock. Please make sure it's set correctly."
+msgstr ""
+
+#: templates/download.html:14
+msgid "Support Portal"
+msgstr ""
+
+#: templates/download.html:14
+msgid "Read other FAQ's at our Support Portal"
+msgstr ""
+
+#: templates/download.html:19 templates/download.html:21
+msgid "Stay safe"
+msgstr ""
+
+#: templates/download.html:23
+msgid "Please do not torrent over Tor."
+msgstr ""
+
+#: templates/download.html:24
+msgid ""
+"Tor Browser will block browser plugins such as Flash, RealPlayer, QuickTime,"
+" and others: they can be manipulated into revealing your IP address."
+msgstr ""
+
+#: templates/download.html:27
+msgid ""
+"We do not recommend installing additional add-ons or plugins into Tor "
+"Browser"
+msgstr ""
+
+#: templates/download.html:28
+msgid ""
+"Plugins or addons may bypass Tor or compromise your privacy. Tor Browser "
+"already comes with HTTPS Everywhere, NoScript, and other patches to protect "
+"your privacy and security."
+msgstr ""
+
+#: templates/download.html:40
+#, python-format
+msgid "Check out the %s for more troubleshooting tips."
+msgstr ""
+
+#: templates/download.html:49
+msgid "How can I verify Tor Browser signature?"
+msgstr ""
+
+#: templates/download.html:54
+msgid "Stand up for privacy and freedom online."
+msgstr ""
+
+#: templates/download.html:55
+msgid ""
+"We're a nonprofit organization and rely on supporters like you to help us "
+"keep Tor robust and secure for millions of people worldwide."
+msgstr ""
+
+#: templates/hero-download-languages.html:2
+#: templates/hero-download-options.html:2
+msgid "DEFEND YOURSELF"
+msgstr ""
+
+#: templates/hero-download-tor.html:2
+msgid "GROW THE NETWORK"
+msgstr ""
+
+#: templates/hero-download.html:2
+msgid "Defend yourself."
+msgstr ""
+
+#: templates/hero-download.html:32
+msgid "Download for"
+msgstr ""
+
+#: templates/hero-download.html:33
+msgid "Signature"
+msgstr ""
+
+#: templates/hero-download.html:43
+msgid "Download for Android"
+msgstr ""
+
+#: templates/hero-download.html:49
+msgid "Download in another language or platform"
+msgstr ""
+
+#: templates/hero-download.html:50
+msgid "Download the latest alpha build"
+msgstr ""
+
+#: templates/hero-download.html:55
+msgid "Read the latest release announcements"
+msgstr ""
+
+#: templates/hero-home.html:2
+msgid "Browse Privately."
+msgstr ""
+
+#: templates/hero-home.html:5
+msgid "Explore Freely."
+msgstr ""
+
+#: templates/hero-home.html:8 templates/meta.html:5 templates/meta.html:12
+msgid ""
+"Defend yourself against tracking and surveillance. Circumvent censorship."
+msgstr ""
+
+#: templates/home.html:7
+msgid "Block Trackers"
+msgstr ""
+
+#: templates/home.html:11
+msgid "BLOCK TRACKERS"
+msgstr ""
+
+#: templates/home.html:12
+msgid ""
+"Tor Browser isolates each website you visit so third-party trackers and ads "
+"can't follow you. Any cookies automatically clear when you're done browsing."
+" So will your browsing history."
+msgstr ""
+
+#: templates/home.html:24
+msgid "Defend Against Surveillance"
+msgstr ""
+
+#: templates/home.html:28
+msgid "DEFEND AGAINST SURVEILLANCE"
+msgstr ""
+
+#: templates/home.html:29
+msgid ""
+"Tor Browser prevents someone watching your connection from knowing what "
+"websites you visit. All anyone monitoring your browsing habits can see is "
+"that you're using Tor."
+msgstr ""
+
+#: templates/home.html:41
+msgid "Resist Fingerprinting"
+msgstr ""
+
+#: templates/home.html:45
+msgid "RESIST FINGERPRINTING"
+msgstr ""
+
+#: templates/home.html:46
+msgid ""
+"Tor Browser aims to make all users look the same, making it difficult for "
+"you to be fingerprinted based on your browser and device information."
+msgstr ""
+
+#: templates/home.html:58
+msgid "Multi-layered Encryption"
+msgstr ""
+
+#: templates/home.html:62
+msgid "MULTI-LAYERED ENCRYPTION"
+msgstr ""
+
+#: templates/home.html:63
+msgid ""
+"Your traffic is relayed and encrypted three times as it passes over the Tor "
+"network. The network is comprised of thousands of volunteer-run servers "
+"known as Tor relays."
+msgstr ""
+
+#: templates/home.html:75
+msgid "Browse Freely"
+msgstr ""
+
+#: templates/home.html:79
+msgid "BROWSE FREELY"
+msgstr ""
+
+#: templates/home.html:80
+msgid ""
+"With Tor Browser, you are free to access sites your home network may have "
+"blocked."
+msgstr ""
+
+#: templates/jobs.html:2
+msgid "Current Openings"
+msgstr ""
+
+#: templates/jobs.html:13
+msgid ""
+"At the moment, we don't have any official open positions. Please check back "
+"soon, though!"
+msgstr ""
+
+#: templates/jobs.html:18 templates/projects.html:5
+msgid "Previous Openings"
+msgstr ""
+
+#: templates/jobs.html:32 templates/projects.html:33
+msgid ""
+"Think you could help us in a position that's not listed? We also rely on a "
+"vast community of volunteer contributors and many have become paid staff."
+msgstr ""
+
+#: templates/jobs.html:32 templates/projects.html:33
+msgid "We invite you to join us on IRC to find how you can get involved."
+msgstr ""
+
+#: templates/meta.html:11
+msgid "The Tor Project | Privacy & Freedom Online"
+msgstr ""
+
+#: templates/meta.html:20
+msgid "Tor Project"
+msgstr ""
+
+#: templates/people.html:2
+msgid "Board of Directors"
+msgstr ""
+
+#: templates/people.html:3 templates/people.html:15
+msgid "Core Tor"
+msgstr ""
+
+#: templates/people.html:28
+msgid "Join Our Team"
+msgstr ""
+
+#: templates/people.html:29
+msgid ""
+"Even if we aren't hiring, you can contribute to Tor. We are open to ideas "
+"and studies to improve Tor software. If you're a developer, we welcome you "
+"to sign up for our dev mailing list to see what we're up to."
+msgstr ""
+
+#: templates/people.html:31
+msgid "Sign up for tor-dev"
+msgstr ""
+
+#: templates/press.html:7
+msgid "Get support"
+msgstr ""
+
+#: templates/press.html:9
+msgid "Visit our Support Portal"
+msgstr ""
+
+#: templates/press.html:12
+msgid "Ask us on #tor"
+msgstr ""
+
+#: templates/press.html:15
+msgid "Write to a mailing list"
+msgstr ""
+
+#: templates/press.html:22
+msgid "Brand Assets"
+msgstr ""
+
+#: templates/press.html:27
+msgid "The Tor Browser"
+msgstr ""
+
+#: templates/press.html:30
+msgid "Onion Services"
+msgstr ""
+
+#: templates/press.html:40
+msgid "Press Releases"
+msgstr ""
+
+#: templates/press.html:54
+msgid "Coverage"
+msgstr ""
+
+#: templates/press.html:61
+msgid "Date"
+msgstr "Datum"
+
+#: templates/press.html:62
+msgid "Publication"
+msgstr ""
+
+#: templates/press.html:63
+msgid "Topic"
+msgstr ""
+
+#: templates/reports.html:2
+msgid "Founding Documents"
+msgstr ""
+
+#: templates/reports.html:16
+msgid "Reports"
+msgstr "Izvještaji"
+
+#: templates/reports.html:22
+msgid "Year"
+msgstr ""
+
+#: templates/reports.html:23
+msgid "Type"
+msgstr "Tip"
+
+#: templates/reports.html:24
+msgid "Title"
+msgstr "Naslov"
+
+#: templates/sidenav.html:4 templates/sidenav.html:35
+msgid "Topics"
+msgstr ""
+
+#: templates/sponsors.html:2
+msgid ""
+"Thank you to all the people and groups who have made Tor possible so far, "
+"and thank you especially to the individual volunteers who have made non-"
+"financial contributions: coding, testing, documenting, translating, "
+"educating, researching, and running the relays that make up the Tor network."
+msgstr ""
+
+#: templates/sponsors.html:5
+msgid "Active Sponsors"
+msgstr ""
+
+#: templates/sponsors.html:17
+msgid "Past Sponsors"
+msgstr ""
+
+#: templates/sponsors.html:35
+msgid ""
+"This sponsors page is based upon un-audited and un-reviewed financial and "
+"in-kind donations, contract, and other data."
+msgstr ""
+
+#: templates/sponsors.html:36
+msgid ""
+"Further details about our audited and reviewed funding can be found with our"
+" Financial Reports."
+msgstr ""
+
+#: templates/thank-you.html:6
+msgid "Want to join our community? Getting involved with Tor is easy."
+msgstr ""
+
+#: templates/thank-you.html:13
+msgid ""
+"Sign up for Tor News and get updates and opportunities from across the "
+"organization and community."
+msgstr ""
+
+#: templates/thank-you.html:17
+msgid "Run a relay to make the network faster and more decentralized."
+msgstr ""
+
+#: templates/thank-you.html:21
+msgid "Use your skills to volunteer."
+msgstr ""
+
+#: templates/macros/downloads.html:68
+msgid "Tor Browser manual"
+msgstr ""
+
+#: templates/macros/jobs.html:11
+msgid "Read more."
+msgstr ""
+
+#: templates/macros/question.html:12
+msgid "Contributors to this page:"
+msgstr ""
+
+#: templates/macros/question.html:14
+msgid "Edit this page"
+msgstr ""
+
+#: templates/macros/question.html:15
+msgid "Suggest Feedback"
+msgstr ""
+
+#: templates/macros/question.html:16
+msgid "Permalink"
+msgstr ""
+
+#: templates/macros/reports.html:5 templates/macros/reports.html:19
+msgid "View PDF"
+msgstr ""
1
0