fixed pesky double logging bug

macdev
quadrismegistus 4 years ago
parent 3862cf7068
commit 8b72f11370

@ -65,12 +65,12 @@ class HalfForgetfulStorage(ForgetfulStorage):
return zip(ikeys, ivalues)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
log = logging.getLogger('kademlia')
log.addHandler(handler)
log.setLevel(logging.DEBUG)
# handler = logging.StreamHandler()
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# handler.setFormatter(formatter)
# log = logging.getLogger('kademlia')
# log.addHandler(handler)
# log.setLevel(logging.DEBUG)
loop = asyncio.get_event_loop()

@ -1,8 +1,7 @@
## CONFIG
# change this to your external ip address for your server
#(needs to be external to allow tor routing)
SERVER_ADDR = '128.232.229.63:5555'
DEFAULT_SCREEN='profile'
DEFAULT_SCREEN='feed'
HORIZONTAL = False
WINDOW_SIZE = (1136,640) if HORIZONTAL else (640,1136)
@ -53,19 +52,6 @@ Window.size = WINDOW_SIZE
# with open('log.txt','w') as of:
# of.write('### LOG ###\n')
import logging
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger = logging.getLogger('app')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
def log(*args):
# with open('log.txt','a+') as of:
# of.write(' '.join([str(x) for x in args])+'\n')
line = ' '.join(str(x) for x in args)
logger.debug(line)
class MyLayout(MDBoxLayout):
scr_mngr = ObjectProperty(None)
@ -147,11 +133,35 @@ class MainApp(MDApp):
# def connect(self):
# # connect to kad?
# self.node = p2p.connect()
@property
def logger(self):
if not hasattr(self,'_logger'):
import logging
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self._logger = logger = logging.getLogger(self.title)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
return self._logger
def log(self,*args):
line = ' '.join(str(x) for x in args)
self.logger.debug(line)
def __init__(self, **kwargs):
super().__init__(**kwargs)
# start looping
self.event_loop_worker = None
self.loop=asyncio.get_event_loop()
# load json storage
self.username=''
self.load_store()
# connect to API
self.api = api.Api(app=self)
@ -169,24 +179,11 @@ class MainApp(MDApp):
return ''
def build(self):
# bind bg texture
# self.texture = Image(source='assets/bg.png').texture
# self.texture.wrap = 'clamp_to_edge'
# self.texture.uvsize = (-2, -2)
# self.start_event_loop_thread()
# with open('log.txt','w') as of: of.write('## LOG ##\n')
self.load_store()
# self.boot_kad()
self.api = api.Api(app_storage=self.store)
self.username=''
# bind
global app,root
app = self
#self.username = self.store.get('userd').get('username')
# load root
self.root = root = Builder.load_file('root.kv')
draw_background(self.root)
@ -195,51 +192,16 @@ class MainApp(MDApp):
logo.font_name='assets/Strengthen.ttf'
logo.font_size='58dp'
logo.pos_hint={'center_y':0.43}
# icons
icons=root.ids.toolbar.ids.right_actions.children
for icon in icons:
#log(dir(icon))
#icon.icon='android' #user_font_size='200sp'
icon.font_size='58dp'
icon.user_font_size='58dp'
icon.width='58dp'
icon.size_hint=(None,None)
icon.height='58dp'
# logged in?
if not self.is_logged_in():
self.root.change_screen('login')
#log(self.username)
else:
# self.root.post_id=190
self.root.change_screen(DEFAULT_SCREEN)
return self.root
# ## LOOP
# def start_event_loop_thread(self):
# """Start the asyncio event loop thread. Bound to the top button."""
# if self.event_loop_worker is not None:
# return
# #self.root.ids.btn.text = ("Running the asyncio EventLoop now...\n\n\n\n"
# # "Now enter a few words below.")
# self.event_loop_worker = worker = EventLoopWorker()
# #pulse_listener_label = self.root.ids.pulse_listener
# #def display_on_pulse(instance, text):
# # pulse_listener_label.text = text
# # make the label react to the worker's `on_pulse` event:
# #worker.bind(on_pulse=display_on_pulse)
# worker.start()
# def submit_pulse_text(self, text):
# """Send the TextInput string over to the asyncio event loop worker."""
# worker = self.event_loop_worker
# if worker is not None:
# loop = self.event_loop_worker.loop
# # use the thread safe variant to run it on the asyncio event loop:
# loop.call_soon_threadsafe(worker.set_pulse_text, text)
def load_store(self):
@ -282,7 +244,7 @@ class MainApp(MDApp):
def login(self,un=None,pw=None):
dat = self.api.login(un,pw)
log(dat)
self.log(dat)
if 'success' in dat:
self.save_login(un)
elif 'error' in dat:
@ -299,16 +261,16 @@ class MainApp(MDApp):
return False
def upload(self,filename,file_id=None):
log('uploading filename:',filename)
self.log('uploading filename:',filename)
rdata=self.api.upload(filename,file_id=file_id)
log('upload result:',rdata)
self.log('upload result:',rdata)
if rdata is not None:
rdata['success']='File uploaded'
return rdata
return {'error':'Upload failed'}
def download(self,file_id,output_fn=None):
log('downloading:',file_id)
self.log('downloading:',file_id)
file_dat = self.api.download(file_id)
if not output_fn:
file_id=file_dat['id']
@ -333,7 +295,7 @@ class MainApp(MDApp):
if not anonymous and self.username:
jsond['author']=self.username
log('posting:',jsond)
self.log('posting:',jsond)
res=self.api.post(jsond)
if 'success' in res:
self.root.change_screen('feed')
@ -362,7 +324,7 @@ class MainApp(MDApp):
# create dir?
ofn_image_dir = os.path.split(ofn_image)[0]
if not os.path.exists(ofn_image_dir): os.makedirs(ofn_image_dir)
log('getting image!')
self.log('getting image!')
with self.get_session() as sess:
with sess.get(self.api+'/download/'+img_src,stream=True) as r:
with open(ofn_image,'wb') as of:
@ -371,7 +333,9 @@ class MainApp(MDApp):
def main():
# start_logger()
App = MainApp()
App.run()

@ -18,6 +18,9 @@ class BaseScreen(MDScreen):
def app(self):
return App.get_running_app()
def log(self,*x):
return self.app.log(*x)
class ProtectedScreen(BaseScreen):
def on_pre_enter(self):
if not self.app.is_logged_in():

@ -6,7 +6,6 @@ from kivymd.uix.card import MDCard, MDSeparator
from kivy.uix.scrollview import ScrollView
from screens.base import ProtectedScreen
from kivy.properties import ListProperty
from main import log
import os,time
from datetime import datetime
from kivy.app import App
@ -57,9 +56,13 @@ class PostLayout(MDBoxLayout): pass
class PostScrollView(ScrollView): pass
class PostCard(MDCard):
@property
def app(self): return App.get_running_app()
def log(self,*x): self.app.log(*x)
def __init__(self, data):
super().__init__()
log('PostCard() got data: '+str(data))
self.log('PostCard() got data: '+str(data))
self.author = data.get('author','[Anonymous]')
self.img_id = data.get('file_id','')
self.img_ext = data.get('file_ext','')
@ -70,10 +73,10 @@ class PostCard(MDCard):
self.timestamp = data.get('timestamp',None)
self.bind(minimum_height=self.setter('height'))
log('PostCard.img_id =',self.img_id)
log('PostCard.img_ext =',self.img_ext)
log('PostCard.img_src =',self.img_src)
log('PostCard.cache_img_src =',self.cache_img_src)
self.log('PostCard.img_id =',self.img_id)
self.log('PostCard.img_ext =',self.img_ext)
self.log('PostCard.img_src =',self.img_src)
self.log('PostCard.cache_img_src =',self.cache_img_src)
# pieces
author_section_layout = PostAuthorLayout()
@ -100,7 +103,7 @@ class PostCard(MDCard):
image.height = '300dp'
image_layout.add_widget(image)
image_layout.height='300dp'
# log(image.image_ratio)
# self.log(image.image_ratio)
self.post_content = PostContent(text=self.content)
@ -136,10 +139,10 @@ class PostCard(MDCard):
self.add_widget(scroller)
# self.add_widget(post_layout)
# log('?????',self.cache_img_src, os.path.exists(self.cache_img_src), os.stat(self.cache_img_src).st_size)
# self.log('?????',self.cache_img_src, os.path.exists(self.cache_img_src), os.stat(self.cache_img_src).st_size)
if self.cache_img_src and (not os.path.exists(self.cache_img_src) or not os.stat(self.cache_img_src).st_size):
def do_download():
log('downloading...')
self.log('downloading...')
self.app.download(self.img_id, self.cache_img_src)
self.image.reload()
@ -158,7 +161,7 @@ class PostCard(MDCard):
# otherwise load image...
self.app.get_image(self.img_src)
log('done getting image!')
self.log('done getting image!')
self.image.reload()
self.img_loaded=True
@ -169,7 +172,7 @@ class FeedScreen(ProtectedScreen):
posts = ListProperty()
def on_pre_enter(self):
# log('ids:' +str(self.ids.post_carousel.ids))
# self.log('ids:' +str(self.ids.post_carousel.ids))
for post in self.posts:
self.ids.post_carousel.remove_widget(post)
@ -181,6 +184,7 @@ class FeedScreen(ProtectedScreen):
if i>lim: break
#post = Post(title=f'Marx Zuckerberg', content=ln.strip())
self.log('???')
post_obj = PostCard(post)
self.posts.append(post_obj)
self.ids.post_carousel.add_widget(post_obj)

@ -1,5 +1,4 @@
from screens.base import BaseScreen
from main import log
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.textfield import MDTextField
from kivymd.uix.button import MDRectangleFlatButton

@ -6,7 +6,6 @@ from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDRectangleFlatButton, MDIconButton, MDRaisedButton
from kivy.properties import ListProperty,ObjectProperty
from kivy.app import App
from main import log
from screens.feed.feed import *
import os,time,threading
from threading import Thread
@ -106,7 +105,6 @@ class PostScreen(ProtectedScreen):
def open_dialog(self,msg):
if not hasattr(self,'dialog') or not self.dialog:
self.dialog = ProgressPopup()
log(self.dialog.ids.keys())
self.dialog.ids.progress_label.text=msg
self.dialog.open()

@ -1,5 +1,4 @@
from screens.base import BaseScreen
from main import log
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.chip import MDChip
from kivymd.uix.textfield import MDTextField
@ -269,7 +268,7 @@ class ProfileScreen(BaseScreen):
if i>lim: break
post_obj = PostCard(post)
log(post)
self.log(post)
self.posts.append(post_obj)
self.carousel.add_widget(post_obj)

@ -1,17 +1,7 @@
# import flask,os,time
# from flask import request, jsonify, send_from_directory
# from pathlib import Path
# from models import *
# from flask_api import FlaskAPI, status, exceptions
# from werkzeug.security import generate_password_hash,check_password_hash
# from flask import Flask, flash, request, redirect, url_for
# from werkzeug.utils import secure_filename
import os,time
from pathlib import Path
import asyncio
from .crypto import *
from main import log
from .p2p import *
from pathlib import Path
from functools import partial
@ -19,13 +9,13 @@ from functools import partial
# works better with tor?
import json
jsonify = json.dumps
from main import log
# Start server
DEBUG = True
UPLOAD_DIR = 'uploads/'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
from .p2p import NODES_PRIME
# PORT_SPEAK = 8468
PORT_LISTEN = 8468
@ -40,16 +30,18 @@ def start_selfless_thread():
return asyncio.run(_go())
class Api(object):
def __init__(self,app_storage):
self._node=self.connect()
self.app_storage = app_storage
def __init__(self,app):
self.app=app
self.app_storage = self.app.store
self.log = self.app.log
# log('starting selfless daemon...')
# self.log('starting selfless daemon...')
# self.selfless = Thread(target=start_selfless_thread)
# self.selfless.daemon = True
# self.selfless.start()
# connect?
self._node=self.connect()
pass
@property
@ -59,13 +51,13 @@ class Api(object):
return self._node
def connect(self):
log('connecting...')
self.log('connecting...')
#loop=asyncio.get_event_loop()
async def _getdb():
from .kad import KadServer
log('starting server..')
self.log('starting server..')
node = KadServer() #storage=HalfForgetfulStorage())
await node.listen(PORT_LISTEN)
@ -74,14 +66,14 @@ class Api(object):
async def _connect():
self._node0 = node = await _getdb() #await loop.create_task(_getdb())
# log('!!!',type(self._node))
# self.log('!!!',type(self._node))
#await node
#self.node = node
return node
# return asyncio.run(_connect())
# loop.set_debug(True)
# log('loop???',loop)
# self.log('loop???',loop)
return asyncio.run(_connect())
@ -96,7 +88,7 @@ class Api(object):
except TypeError:
pass
log('wtf??',self.node)
self.log('wtf??',self.node)
node = self.node
# node=self.node
@ -119,15 +111,16 @@ class Api(object):
def get_json(self,key_or_keys):
res = self.get(key_or_keys)
log('GET_JSON',res)
self.log('GET_JSON',res)
if type(res)==list:
# self.log('is a list!',json.loads(res[0]))
return [None if x is None else json.loads(x) for x in res]
else:
#log('RES!!!',res)
return None if res is None else json.loads(res)
def set(self,key_or_keys,value_or_values):
# log('hello?')
# self.log('hello?')
# loop=asyncio.get_event_loop()
async def _set():
@ -141,10 +134,10 @@ class Api(object):
if type(key_or_keys) in {list,tuple,dict}:
keys = key_or_keys
values = value_or_values
log(len(keys),len(values))
self.log(len(keys),len(values))
assert len(keys)==len(values)
res = await asyncio.gather(*[node.set(key,value) for key,value in zip(keys,values)])
# log('RES?',res)
# self.log('RES?',res)
else:
key = key_or_keys
value = value_or_values
@ -160,7 +153,7 @@ class Api(object):
def set_json(self,key,value):
value_json = jsonify(value)
# log('OH NO!',sys.getsizeof(value_json))
# self.log('OH NO!',sys.getsizeof(value_json))
return self.set(key,value_json)
def has(self,key):
@ -188,7 +181,7 @@ class Api(object):
return {'error':'Register failed'}
person = self.get_person(name)
if person is not None:
log('error! person exists')
self.log('error! person exists')
return {'error':'Register failed'}
private_key,public_key = new_keys(password=passkey,save=False)
@ -201,7 +194,7 @@ class Api(object):
self.set_person(name,public_key)
log('success! Account created')
self.log('success! Account created')
return {'success':'Account created', 'username':name}
def load_private_key(self,password):
@ -210,7 +203,7 @@ class Api(object):
try:
return load_private_key(pem_private_key.encode(),password)
except ValueError as e:
log('!!',e)
self.log('!!',e)
return None
@ -228,7 +221,7 @@ class Api(object):
# see if user exists
person = self.get_person(name)
log(person)
self.log(person)
if person is None:
return {'error':'Login failed'}
@ -269,11 +262,11 @@ class Api(object):
parts.append(part)
# PARTS.append(part)
log('part!:',sys.getsizeof(part))
self.log('part!:',sys.getsizeof(part))
#self.set(part_key,part)
if len(parts)>=buffer_size:
log('setting...')
self.log('setting...')
self.set(part_keys,parts)
part_keys=[]
PARTS+=parts
@ -281,14 +274,14 @@ class Api(object):
# set all parts
#self.set(part_keys,PARTS)
log('# parts:',len(PARTS))
self.log('# parts:',len(PARTS))
if parts and part_keys: self.set(part_keys, parts)
# how many parts?
log('# pieces!',len(part_ids))
self.log('# pieces!',len(part_ids))
file_store = {'ext':os.path.splitext(filename)[-1][1:], 'parts':part_ids}
log('FILE STORE??',file_store)
self.log('FILE STORE??',file_store)
self.set_json(uri+file_id,file_store)
# file_store['data'].seek(0)
@ -299,7 +292,7 @@ class Api(object):
file_store = self.get_json('/file/'+file_id)
if file_store is None: return
log('file_store!?',file_store)
self.log('file_store!?',file_store)
keys = ['/part/'+x for x in file_store['parts']]
pieces = self.get(keys)
file_store['parts_data']=pieces
@ -309,7 +302,7 @@ class Api(object):
def post(self,data):
post_id=get_random_id()
res = self.set_json('/post/'+post_id, data)
log('got data:',data)
self.log('got data:',data)
## add to channels
self.append_json('/posts/channel/earth', post_id)
@ -434,7 +427,7 @@ import sys
# while True:
# chunk = f.read(chunksize)
# if chunk:
# log(type(chunk), sys.getsizeof(chunk))
# self.log(type(chunk), sys.getsizeof(chunk))
# yield chunk
# #yield from chunk
# else:
@ -445,7 +438,7 @@ import sys
# barray = bytearray(f.read())
# for part in barray[0:-1:chunksize]:
# log('!?',part)
# self.log('!?',part)
# yield bytes(part)
def bytes_from_file(filename,chunksize=8192):

@ -43,9 +43,10 @@ class HalfForgetfulStorage(ForgetfulStorage):
def get(self, key, default=None):
# self.cull()
print('looking for key: ', key)
print('looking for key: ', key.decode())
if key in self.data:
print('found it!')
val=self[key]
print('...found it! = %s' % val)
return self[key]
return default

@ -6,20 +6,20 @@ import shelve
from collections import OrderedDict
import pickle,os
# NODES_PRIME = [("128.232.229.63",8468), ("68.66.241.111",8468)]
NODES_PRIME = [("128.232.229.63",8467), ("68.66.241.111",8467)]
NODES_PRIME = [("68.66.241.111",8467), ("10.42.0.13",8467)]
# NODES_PRIME = [("68.66.241.111",8467), ("10.42.0.13",8467)]
async def echo(msg):
print('echo',msg)
def boot_selfless_node(port=8468, loop=None):
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
log = logging.getLogger('kademlia')
log.addHandler(handler)
log.setLevel(logging.DEBUG)
# handler = logging.StreamHandler()
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# handler.setFormatter(formatter)
# log = logging.getLogger('kademlia')
# log.addHandler(handler)
# log.setLevel(logging.DEBUG)
if not loop: loop = asyncio.get_event_loop()
loop.set_debug(True)

Loading…
Cancel
Save