2016-07-20 19:00:34 +02:00
|
|
|
import base64
|
2016-07-25 23:09:13 +02:00
|
|
|
import distutils.version
|
2015-08-20 17:27:15 +02:00
|
|
|
import random
|
2016-09-16 06:14:25 +02:00
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import yaml
|
2016-10-13 19:35:55 +02:00
|
|
|
import datetime
|
2015-08-20 17:27:15 +02:00
|
|
|
|
2016-07-25 23:09:13 +02:00
|
|
|
from lbrynet.core.cryptoutils import get_lbry_hash_obj
|
|
|
|
|
2015-08-20 17:27:15 +02:00
|
|
|
blobhash_length = get_lbry_hash_obj().digest_size * 2 # digest_size is in bytes, and blob hashes are hex encoded
|
|
|
|
|
|
|
|
|
|
|
|
def generate_id(num=None):
|
|
|
|
h = get_lbry_hash_obj()
|
|
|
|
if num is not None:
|
|
|
|
h.update(str(num))
|
|
|
|
else:
|
|
|
|
h.update(str(random.getrandbits(512)))
|
|
|
|
return h.digest()
|
|
|
|
|
|
|
|
|
|
|
|
def is_valid_blobhash(blobhash):
|
|
|
|
"""
|
|
|
|
@param blobhash: string, the blobhash to check
|
|
|
|
|
|
|
|
@return: Whether the blobhash is the correct length and contains only valid characters (0-9, a-f)
|
|
|
|
"""
|
|
|
|
if len(blobhash) != blobhash_length:
|
|
|
|
return False
|
|
|
|
for l in blobhash:
|
|
|
|
if l not in "0123456789abcdef":
|
|
|
|
return False
|
2016-07-25 23:09:13 +02:00
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def version_is_greater_than(a, b):
|
|
|
|
"""Returns True if version a is more recent than version b"""
|
|
|
|
try:
|
|
|
|
return distutils.version.StrictVersion(a) > distutils.version.StrictVersion(b)
|
|
|
|
except ValueError:
|
|
|
|
return distutils.version.LooseVersion(a) > distutils.version.LooseVersion(b)
|
2016-07-20 19:00:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
def deobfuscate(obfustacated):
|
|
|
|
return base64.b64decode(obfustacated.decode('rot13'))
|
|
|
|
|
|
|
|
|
|
|
|
def obfuscate(plain):
|
|
|
|
return base64.b64encode(plain).encode('rot13')
|
2016-09-16 06:14:25 +02:00
|
|
|
|
|
|
|
|
|
|
|
settings_decoders = {
|
|
|
|
'.json': json.loads,
|
|
|
|
'.yml': yaml.load
|
|
|
|
}
|
|
|
|
|
|
|
|
settings_encoders = {
|
|
|
|
'.json': json.dumps,
|
|
|
|
'.yml': yaml.safe_dump
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def load_settings(path):
|
|
|
|
ext = os.path.splitext(path)[1]
|
|
|
|
f = open(path, 'r')
|
|
|
|
data = f.read()
|
|
|
|
f.close()
|
|
|
|
decoder = settings_decoders.get(ext, False)
|
|
|
|
assert decoder is not False, "Unknown settings format .%s" % ext
|
|
|
|
return decoder(data)
|
|
|
|
|
|
|
|
|
|
|
|
def save_settings(path, settings):
|
|
|
|
ext = os.path.splitext(path)[1]
|
|
|
|
encoder = settings_encoders.get(ext, False)
|
|
|
|
assert encoder is not False, "Unknown settings format .%s" % ext
|
|
|
|
f = open(path, 'w')
|
|
|
|
f.write(encoder(settings))
|
2016-10-13 19:35:55 +02:00
|
|
|
f.close()
|
|
|
|
|
|
|
|
|
|
|
|
def today():
|
|
|
|
return datetime.datetime.today()
|