Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
juga
sbws
Commits
992ea07e
Commit
992ea07e
authored
Aug 29, 2018
by
juga
Browse files
Reorder methods in BWV3Line
1. magic methods 2. classmethods 3. staticmethods 4. properties 5. methods
parent
40a76cc7
Changes
1
Hide whitespace changes
Inline
Side-by-side
sbws/lib/v3bwfile.py
View file @
992ea07e
...
@@ -249,38 +249,30 @@ class V3BWLine(object):
...
@@ -249,38 +249,30 @@ class V3BWLine(object):
[
setattr
(
self
,
k
,
v
)
for
k
,
v
in
kwargs
.
items
()
[
setattr
(
self
,
k
,
v
)
for
k
,
v
in
kwargs
.
items
()
if
k
in
BW_EXTRA_ARG_KEYVALUES
]
if
k
in
BW_EXTRA_ARG_KEYVALUES
]
@
property
def
bw_keyvalue_tuple_ls
(
self
):
"""Return list of KeyValue Bandwidth Line tuples."""
# sort the list to generate determinist headers
keyvalue_tuple_ls
=
sorted
([(
k
,
v
)
for
k
,
v
in
self
.
__dict__
.
items
()
if
k
in
BW_KEYVALUES
])
return
keyvalue_tuple_ls
@
property
def
bw_keyvalue_v110str_ls
(
self
):
"""Return list of KeyValue Bandwidth Line strings following
spec v1.1.0.
"""
bw_keyvalue_str
=
[
KEYVALUE_SEP_V110
.
join
([
k
,
str
(
v
)])
for
k
,
v
in
self
.
bw_keyvalue_tuple_ls
]
return
bw_keyvalue_str
@
property
def
bw_strv110
(
self
):
"""Return Bandwidth Line string following spec v1.1.0."""
bw_line_str
=
BW_KEYVALUE_SEP_V110
.
join
(
self
.
bw_keyvalue_v110str_ls
)
+
LINE_SEP
if
len
(
bw_line_str
)
>
BW_LINE_SIZE
:
# if this is the case, probably there are too many KeyValues,
# or the limit needs to be changed in Tor
log
.
warn
(
"The bandwidth line %s is longer than %s"
,
len
(
bw_line_str
),
BW_LINE_SIZE
)
return
bw_line_str
def
__str__
(
self
):
def
__str__
(
self
):
return
self
.
bw_strv110
return
self
.
bw_strv110
@
classmethod
def
from_results
(
cls
,
results
):
success_results
=
[
r
for
r
in
results
if
isinstance
(
r
,
ResultSuccess
)]
# log.debug('len(success_results) %s', len(success_results))
node_id
=
'$'
+
results
[
0
].
fingerprint
bw
=
cls
.
bw_from_results
(
success_results
)
kwargs
=
dict
()
kwargs
[
'nick'
]
=
results
[
0
].
nickname
if
getattr
(
results
[
0
],
'master_key_ed25519'
):
kwargs
[
'master_key_ed25519'
]
=
results
[
0
].
master_key_ed25519
kwargs
[
'rtt'
]
=
cls
.
rtt_from_results
(
success_results
)
kwargs
[
'time'
]
=
cls
.
last_time_from_results
(
results
)
kwargs
.
update
(
cls
.
result_types_from_results
(
results
))
bwl
=
cls
(
node_id
,
bw
,
**
kwargs
)
return
bwl
@
classmethod
def
from_data
(
cls
,
data
,
fingerprint
):
assert
fingerprint
in
data
return
cls
.
from_results
(
data
[
fingerprint
])
@
classmethod
@
classmethod
def
from_bw_line_v110
(
cls
,
line
):
def
from_bw_line_v110
(
cls
,
line
):
assert
isinstance
(
line
,
str
)
assert
isinstance
(
line
,
str
)
...
@@ -293,6 +285,24 @@ class V3BWLine(object):
...
@@ -293,6 +285,24 @@ class V3BWLine(object):
bw_line
=
cls
(
**
kwargs
)
bw_line
=
cls
(
**
kwargs
)
return
bw_line
return
bw_line
@
staticmethod
def
last_time_from_results
(
results
):
return
unixts_to_isodt_str
(
round
(
max
([
r
.
time
for
r
in
results
])))
@
staticmethod
def
rtt_from_results
(
results
):
# convert from miliseconds to seconds
rtts
=
[(
round
(
rtt
*
1000
))
for
r
in
results
for
rtt
in
r
.
rtts
]
rtt
=
round
(
median
(
rtts
))
return
rtt
@
staticmethod
def
result_types_from_results
(
results
):
rt_dict
=
dict
([(
result_type_to_key
(
rt
.
value
),
num_results_of_type
(
results
,
rt
.
value
))
for
rt
in
_ResultType
])
return
rt_dict
@
staticmethod
@
staticmethod
def
bw_from_results
(
results
):
def
bw_from_results
(
results
):
median_bw
=
median
([
dl
[
'amount'
]
/
dl
[
'duration'
]
median_bw
=
median
([
dl
[
'amount'
]
/
dl
[
'duration'
]
...
@@ -319,44 +329,34 @@ class V3BWLine(object):
...
@@ -319,44 +329,34 @@ class V3BWLine(object):
bw_kb
=
max
(
round
(
bw
/
1024
),
1
)
bw_kb
=
max
(
round
(
bw
/
1024
),
1
)
return
bw_kb
return
bw_kb
@
staticmethod
@
property
def
last_time_from_results
(
results
):
def
bw_keyvalue_tuple_ls
(
self
):
return
unixts_to_isodt_str
(
round
(
max
([
r
.
time
for
r
in
results
])))
"""Return list of KeyValue Bandwidth Line tuples."""
# sort the list to generate determinist headers
@
staticmethod
keyvalue_tuple_ls
=
sorted
([(
k
,
v
)
for
k
,
v
in
self
.
__dict__
.
items
()
def
rtt_from_results
(
results
):
if
k
in
BW_KEYVALUES
])
# convert from miliseconds to seconds
return
keyvalue_tuple_ls
rtts
=
[(
round
(
rtt
*
1000
))
for
r
in
results
for
rtt
in
r
.
rtts
]
rtt
=
round
(
median
(
rtts
))
return
rtt
@
staticmethod
def
result_types_from_results
(
results
):
rt_dict
=
dict
([(
result_type_to_key
(
rt
.
value
),
num_results_of_type
(
results
,
rt
.
value
))
for
rt
in
_ResultType
])
return
rt_dict
@
classmethod
@
property
def
from_results
(
cls
,
results
):
def
bw_keyvalue_v110str_ls
(
self
):
success_results
=
[
r
for
r
in
results
if
isinstance
(
r
,
ResultSuccess
)]
"""Return list of KeyValue Bandwidth Line strings following
# log.debug('len(success_results) %s', len(success_results))
spec v1.1.0.
node_id
=
'$'
+
results
[
0
].
fingerprint
"""
bw
=
cls
.
bw_from_results
(
success_results
)
bw_keyvalue_str
=
[
KEYVALUE_SEP_V110
.
join
([
k
,
str
(
v
)])
kwargs
=
dict
()
for
k
,
v
in
self
.
bw_keyvalue_tuple_ls
]
kwargs
[
'nick'
]
=
results
[
0
].
nickname
return
bw_keyvalue_str
if
getattr
(
results
[
0
],
'master_key_ed25519'
):
kwargs
[
'master_key_ed25519'
]
=
results
[
0
].
master_key_ed25519
kwargs
[
'rtt'
]
=
cls
.
rtt_from_results
(
success_results
)
kwargs
[
'time'
]
=
cls
.
last_time_from_results
(
results
)
kwargs
.
update
(
cls
.
result_types_from_results
(
results
))
bwl
=
cls
(
node_id
,
bw
,
**
kwargs
)
return
bwl
@
classmethod
@
property
def
from_data
(
cls
,
data
,
fingerprint
):
def
bw_strv110
(
self
):
assert
fingerprint
in
data
"""Return Bandwidth Line string following spec v1.1.0."""
return
cls
.
from_results
(
data
[
fingerprint
])
bw_line_str
=
BW_KEYVALUE_SEP_V110
.
join
(
self
.
bw_keyvalue_v110str_ls
)
+
LINE_SEP
if
len
(
bw_line_str
)
>
BW_LINE_SIZE
:
# if this is the case, probably there are too many KeyValues,
# or the limit needs to be changed in Tor
log
.
warn
(
"The bandwidth line %s is longer than %s"
,
len
(
bw_line_str
),
BW_LINE_SIZE
)
return
bw_line_str
class
V3BWFile
(
object
):
class
V3BWFile
(
object
):
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment