+ Add pijion support
* Fix shutdown
This commit is contained in:
parent
1d22b43ef9
commit
fd93f6151e
@ -1,105 +0,0 @@
|
||||
from typing import NamedTuple, List, Set
|
||||
|
||||
from collections import namedtuple
|
||||
from hashlib import sha3_256
|
||||
from secrets import randbelow
|
||||
from random import SystemRandom
|
||||
from threading import Thread
|
||||
from time import sleep
|
||||
import uuid
|
||||
|
||||
WeightedEdge = namedtuple("WeightedEdge", ["node", "weight"])
|
||||
|
||||
message_pool: Set["Message"] = set() # This is just to save memory for the simulation
|
||||
|
||||
def get_message(hash_id):
|
||||
for m in message_pool:
|
||||
if hash_id == m.hash_id:
|
||||
return m
|
||||
raise ValueError
|
||||
|
||||
class Node:
|
||||
def __init__(self, hidden_node: bool,
|
||||
edges: List[WeightedEdge], graph_ids=["main"]):
|
||||
self.hidden_node = hidden_node
|
||||
self.edges = edges
|
||||
self.node_id = str(uuid.uuid4())
|
||||
self._messages: List[str] = list() # hashes point to message_pool
|
||||
self._hidden_messages: List[str] = list()
|
||||
|
||||
def sharing_messages(self):
|
||||
share = list(self._messages)
|
||||
for m in self._hidden_messages:
|
||||
share.remove(m)
|
||||
return share
|
||||
|
||||
|
||||
def add_message(self, hash_id):
|
||||
if hash_id not in self._messages:
|
||||
self._messages.append(hash_id)
|
||||
|
||||
def pick_edge(self):
|
||||
selected = self.edges[0]
|
||||
alt = []
|
||||
|
||||
for weighted_edge in self.edges[1:]:
|
||||
if weighted_edge.weight[0] > selected.weight:
|
||||
selected = weighted_edge
|
||||
elif weighted_edge.weight[0] == selected.weight:
|
||||
alt.append(selected)
|
||||
alt.append(selected)
|
||||
SystemRandom().shuffle(alt)
|
||||
return alt[0]
|
||||
|
||||
|
||||
def share_to_edges(self, message_id):
|
||||
edge = self.pick_edge()
|
||||
edge.node.add_message(message_id)
|
||||
edge.weight[0] += 1
|
||||
|
||||
def lookup_messages(self):
|
||||
edge = self.pick_edge()
|
||||
for message in edge.node.sharing_messages():
|
||||
if message.hash_id not in self._messages:
|
||||
self._messages.append(message.hash_id)
|
||||
print(self.node_id, "found", message.hash_id)
|
||||
edge.weight[0] += 1
|
||||
|
||||
def make_new_connections(self):
|
||||
edge = self.pick_edge()
|
||||
for new_edge in edge.node.edges:
|
||||
if new_edge not in self.edges:
|
||||
self.edges.append(WeightedEdge(new_edge.node, [0]))
|
||||
print(self.node_id, "added peer", new_edge.node.node_id)
|
||||
edge.weight[0] += 1
|
||||
|
||||
|
||||
class Message:
|
||||
def __init__(self, data):
|
||||
def _do_hash(data):
|
||||
h = sha3_256()
|
||||
h.update(data)
|
||||
return h.digest()
|
||||
self.hash_id = _do_hash(data)
|
||||
self.data = data
|
||||
|
||||
bootstrap_node = Node(False, [])
|
||||
graph = [WeightedEdge(bootstrap_node, [0])]
|
||||
|
||||
for i in range(10):
|
||||
graph.append(WeightedEdge(Node(False, [WeightedEdge(bootstrap_node, [0])]), [0]))
|
||||
|
||||
m = Message(b"hello world")
|
||||
message_pool.add(m)
|
||||
bootstrap_node.add_message(m.hash_id)
|
||||
|
||||
def node_driver(node):
|
||||
while True:
|
||||
node.make_new_connections()
|
||||
node.lookup_messages()
|
||||
sleep(1)
|
||||
|
||||
for edge in graph:
|
||||
Thread(target=node_driver, args=[edge.node], daemon=True).start()
|
||||
input()
|
||||
|
@ -5,7 +5,17 @@ This file initializes Onionr when ran to be a daemon or with commands
|
||||
|
||||
Run with 'help' for usage.
|
||||
"""
|
||||
# Enable pyjion if we can because why not
|
||||
pyjion_enabled = False
|
||||
try:
|
||||
import pyjion
|
||||
pyjion.enable()
|
||||
pyjion_enabled = True
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
import sqlite3
|
||||
except ModuleNotFoundError:
|
||||
|
@ -51,6 +51,6 @@ def register_private_blueprints(private_api, app):
|
||||
app.register_blueprint(
|
||||
private_api._too_many.get_by_string('DaemonEventsBP').flask_bp)
|
||||
|
||||
Thread(target=_add_events_bp).start()
|
||||
Thread(target=_add_events_bp, daemon=True).start()
|
||||
|
||||
return app
|
||||
|
@ -58,7 +58,9 @@ def block_exec(event, info):
|
||||
'apport/__init__.py',
|
||||
'apport/report.py'
|
||||
]
|
||||
whitelisted_source = []
|
||||
whitelisted_source = [
|
||||
'ZABaAGQBZAJsAW0CWgIBAHoGZAFkA2wDWgRXAG4LBABlBXkZAQABAAEAZARaBlkAbgN3AGQFWgZkAWQGbAdtCFoIAQBkAWQDbAlaCWQBZAdsCm0LWgwBAAkAZQmgDWQIZAWhAnM1ZARaBmUIgwBkCRcAWg5kEmQMZQ9kDWUPZgRkDmQPhAVaEGQTZBBkEYQBWhFkA1MA'
|
||||
]
|
||||
home = identifyhome.identify_home()
|
||||
|
||||
code_b64 = base64.b64encode(info[0].co_code).decode()
|
||||
|
@ -24,7 +24,6 @@ shutdown_bp = Blueprint('shutdown', __name__)
|
||||
|
||||
def shutdown(client_api_inst):
|
||||
try:
|
||||
client_api_inst.publicAPI.httpServer.stop()
|
||||
client_api_inst.httpServer.stop()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
@ -30,7 +30,6 @@ from utils import hastor
|
||||
import runtests
|
||||
from httpapi import daemoneventsapi
|
||||
from .. import version
|
||||
from .getapihost import get_api_host_until_available
|
||||
from utils.bettersleep import better_sleep
|
||||
from .killdaemon import kill_daemon # noqa
|
||||
from .showlogo import show_logo
|
||||
@ -109,31 +108,19 @@ def daemon():
|
||||
|
||||
shared_state.get(daemoneventsapi.DaemonEventsBP)
|
||||
|
||||
Thread(target=shared_state.get(apiservers.ClientAPI).start,
|
||||
daemon=True, name='client HTTP API').start()
|
||||
|
||||
|
||||
# Init run time tester
|
||||
# (ensures Onionr is running right, for testing purposes)
|
||||
# Run time tests are not normally run
|
||||
shared_state.get(runtests.OnionrRunTestManager)
|
||||
|
||||
# initialize clientAPI but dont start it yet
|
||||
shared_state.get(apiservers.ClientAPI)
|
||||
|
||||
shared_state.share_object() # share the parent object to the threads
|
||||
|
||||
show_logo()
|
||||
|
||||
# since we randomize loopback API server hostname to protect against attacks,
|
||||
# we have to wait for it to become set
|
||||
apiHost = ''
|
||||
if not offline_mode:
|
||||
apiHost = get_api_host_until_available()
|
||||
|
||||
|
||||
|
||||
security_level = config.get('general.security_level', 1)
|
||||
use_existing_tor = config.get('tor.use_existing_tor', False)
|
||||
|
||||
|
||||
|
||||
_show_info_messages()
|
||||
logger.info(
|
||||
@ -141,8 +128,11 @@ def daemon():
|
||||
events.event('init', threaded=False)
|
||||
events.event('daemon_start')
|
||||
|
||||
try:
|
||||
shared_state.get(apiservers.ClientAPI).start()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
better_sleep(5)
|
||||
|
||||
cleanup.delete_run_files()
|
||||
if security_level >= 2:
|
||||
|
@ -1,38 +0,0 @@
|
||||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Wait for the api host to be available in the public api host file.
|
||||
returns string of ip for the local public host interface
|
||||
"""
|
||||
from time import sleep
|
||||
|
||||
from filepaths import public_API_host_file
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def get_api_host_until_available() -> str:
|
||||
"""Wait for the api host to be available in the public api host file.
|
||||
|
||||
returns string of ip for the local public host interface
|
||||
"""
|
||||
api_host = ''
|
||||
while api_host == '':
|
||||
try:
|
||||
with open(public_API_host_file, 'r') as file:
|
||||
api_host = file.read()
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
sleep(0.5)
|
||||
return api_host
|
@ -45,13 +45,11 @@ def kill_daemon():
|
||||
try:
|
||||
spawn(
|
||||
localcommand.local_command,
|
||||
'/shutdownclean'
|
||||
'/shutdown'
|
||||
).get(timeout=5)
|
||||
except sqlite3.OperationalError:
|
||||
pass
|
||||
|
||||
net.killTor()
|
||||
|
||||
|
||||
kill_daemon.onionr_help = "Gracefully stops the " # type: ignore
|
||||
kill_daemon.onionr_help += "Onionr API servers" # type: ignore
|
Loading…
Reference in New Issue
Block a user