PyBitmessage/src/helper_generic.py

110 lines
3.2 KiB
Python
Raw Normal View History

"""
Helper Generic perform generic operations for threading.
Also perform some conversion operations.
"""
2018-04-06 13:03:30 +00:00
import socket
import sys
2018-04-06 12:20:55 +00:00
import threading
import traceback
import multiprocessing
from binascii import hexlify, unhexlify
import shared
2018-04-09 04:38:48 +00:00
import state
import queues
import shutdown
from debug import logger
2018-04-06 12:20:55 +00:00
def powQueueSize():
curWorkerQueue = queues.workerQueue.qsize()
2018-04-06 12:20:55 +00:00
for thread in threading.enumerate():
try:
if thread.name == "singleWorker":
curWorkerQueue += thread.busy
except Exception as err:
logger.info('Thread error %s', err)
return curWorkerQueue
2018-04-06 12:20:55 +00:00
def convertIntToString(n):
a = __builtins__.hex(n)
if a[-1:] == 'L':
a = a[:-1]
if (len(a) % 2) == 0:
2016-03-23 22:26:57 +00:00
return unhexlify(a[2:])
else:
2016-03-23 22:26:57 +00:00
return unhexlify('0' + a[2:])
2018-04-06 12:20:55 +00:00
def convertStringToInt(s):
2016-03-23 22:26:57 +00:00
return int(hexlify(s), 16)
2018-04-06 12:20:55 +00:00
def allThreadTraceback(frame):
2018-04-06 12:20:55 +00:00
id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
code = []
for threadId, stack in sys._current_frames().items():
code.append(
'\n# Thread: %s(%d)' % (id2name.get(threadId, ''), threadId))
for filename, lineno, name, line in traceback.extract_stack(stack):
code.append(
'File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(' %s' % (line.strip()))
print('\n'.join(code))
2018-04-06 12:20:55 +00:00
def signal_handler(signal, frame):
process = multiprocessing.current_process()
logger.error(
'Got signal %i in %s/%s',
signal, process.name, threading.current_thread().name
)
if process.name == "RegExParser":
# on Windows this isn't triggered, but it's fine,
# it has its own process termination thing
raise SystemExit
if "PoolWorker" in process.name:
raise SystemExit
if threading.current_thread().name not in ("PyBitmessage", "MainThread"):
return
logger.error("Got signal %i", signal)
if shared.thisapp.daemon or not state.enableGUI: # FIXME redundant?
shutdown.doCleanShutdown()
else:
allThreadTraceback(frame)
print('Unfortunately you cannot use Ctrl+C when running the UI'
' because the UI captures the signal.')
2018-04-06 12:20:55 +00:00
def isHostInPrivateIPRange(host):
2018-04-06 12:20:55 +00:00
if ":" in host: # IPv6
hostAddr = socket.inet_pton(socket.AF_INET6, host)
if hostAddr == ('\x00' * 15) + '\x01':
return False
if hostAddr[0] == '\xFE' and (ord(hostAddr[1]) & 0xc0) == 0x80:
return False
if (ord(hostAddr[0]) & 0xfe) == 0xfc:
return False
elif ".onion" not in host:
if host[:3] == '10.':
return True
if host[:4] == '172.':
if host[6] == '.':
if int(host[4:6]) >= 16 and int(host[4:6]) <= 31:
return True
if host[:8] == '192.168.':
return True
# Multicast
if host[:3] >= 224 and host[:3] <= 239 and host[4] == '.':
return True
return False
2018-04-06 12:20:55 +00:00
def addDataPadding(data, desiredMsgLength=12, paddingChar='\x00'):
2014-05-02 16:47:50 +00:00
return data + paddingChar * (desiredMsgLength - len(data))