def open(self): print("Listen.open", os.getpid()) global sending_notifs t = time.strftime("%Y-%m-%d %H:%M:%S") dbname = config.get("database") if not dbname: dbname = self.get_cookie("dbname", None) if not dbname: raise Exception("Can't open websocket, missing dbname") set_active_db(dbname) db = get_connection() user_id = self.get_cookie("user_id", None) if user_id: user_id = int(user_id) res = db.get( "INSERT INTO ws_listener (user_id,last_check_time) VALUES (%s,%s) RETURNING id", user_id, t) self.listener_id = res.id self.dbname = dbname listen_handlers[self.listener_id] = self if not sending_notifs: io_loop = tornado.ioloop.IOLoop.instance() io_loop.add_timeout( time.time() + POLL_WAIT, send_notifs ) # XXX: should start this directly when process is started? sending_notifs = True db.commit()
def login(self, context={}): set_active_user(None) data = context["data"] db_name = data.get("db_name") if not db_name: raise Exception("Missing db name") database.set_active_db(db_name) login = data["login"] password = data["password"] user_id = get_model("base.user").check_password(login, password) if not user_id: audit_log("Invalid login (%s)" % login) db = database.get_connection() db.commit() raise Exception("Invalid login") try: print("login ok", login) set_active_user(1) user = get_model("base.user").browse(user_id) if user.profile_id.prevent_login or not user.active: raise Exception("User not allowed to login") t = time.strftime("%Y-%m-%d %H:%M:%S") user.write({"lastlog": t}) profile = user.profile_id action = profile.home_action or "account_board" token = new_token(db_name, user_id) db = database.get_connection() res = db.get("SELECT * FROM pg_class WHERE relname='settings'") settings = get_model("settings").browse(1) version = settings.version mod_version = get_module_version() if version != mod_version: raise Exception("Database version (%s) is different than modules version (%s), please upgrade database before login." % ( version, mod_version)) company_id = user.company_id.id or profile.login_company_id.id if not company_id: res = get_model("company").search([["parent_id", "=", None]]) if not res: raise Exception("No company found") company_id = res[0] comp = get_model("company").browse(company_id) return { "cookies": { "dbname": database.get_active_db(), "user_id": user_id, "token": token, "user_name": user.name, "package": settings.package, "company_id": company_id, "company_name": comp.name, }, "next": { "type": "url", "url": "/ui#name=%s" % action, }, "login_action": action, } finally: set_active_user(user_id) audit_log("Login")
def send_notifs(): print("send_notifs", os.getpid(), list(listen_handlers.keys())) t = time.strftime("%Y-%m-%d %H:%M:%S") db_handlers = {} for listener_id, h in listen_handlers.items(): # XXX db_handlers.setdefault(h.dbname, []).append(listener_id) for dbname, listener_ids in db_handlers.items(): set_active_db(dbname) db = get_connection() ids_sql = "(" + ",".join(str(x) for x in listener_ids) + ")" res = db.query( "SELECT listener_id,name FROM ws_event WHERE listener_id IN " + ids_sql) if res: for r in res: print("NOTIFY %s %s %s" % (dbname, r.listener_id, r.name)) handler = listen_handlers[r.listener_id] handler.write_message("NOTIFY %s" % r.name) db.execute("DELETE FROM ws_event WHERE listener_id IN " + ids_sql) db.execute("UPDATE ws_listener SET last_check_time=%s WHERE id IN " + ids_sql, t) # XXX: do this less often db.execute( "DELETE FROM ws_listener WHERE last_check_time<TIMESTAMP %s-INTERVAL '10 seconds'", t) # XXX: do this less often, FIXME db.commit() io_loop = tornado.ioloop.IOLoop.instance() io_loop.add_timeout(time.time() + POLL_WAIT, send_notifs)
def send_notifs(): #print("send_notifs",os.getpid(),list(listen_handlers.keys())) t=time.strftime("%Y-%m-%d %H:%M:%S") db_handlers={} for listener_id,h in listen_handlers.items(): # XXX db_handlers.setdefault(h.dbname,[]).append(listener_id) for dbname,listener_ids in db_handlers.items(): set_active_db(dbname) db=get_connection() try: ids_sql="("+",".join(str(x) for x in listener_ids)+")" res=db.query("SELECT listener_id,name FROM ws_event WHERE listener_id IN "+ids_sql) if res: handler_events={} for r in res: handler_events.setdefault(r.listener_id,[]).append(r.name) for listener_id,events in handler_events.items(): print("NOTIFY %s %s %s"%(dbname,listener_id,events)) handler=listen_handlers[listener_id] handler.write(json.dumps(events)) handler.finish() del listen_handlers[listener_id] db.execute("DELETE FROM ws_event WHERE listener_id IN "+ids_sql) db.execute("UPDATE ws_listener SET last_check_time=%s WHERE id IN "+ids_sql,t) # XXX: do this less often db.execute("DELETE FROM ws_listener WHERE last_check_time<TIMESTAMP %s-INTERVAL '10 seconds'",t) # XXX: do this less often, FIXME db.commit() except: print("#########################################################") print("ERROR: send_notifs failed") db.rollback() import traceback traceback.print_exc() io_loop=tornado.ioloop.IOLoop.instance() io_loop.add_timeout(time.time()+POLL_WAIT,send_notifs)
def run_job(dbname, job): print("run_job dbname=%s pid=%s job='%s'" % (dbname, os.getpid(), job["name"])) database.connections.clear() set_active_user(1) database.set_active_db(dbname) db = database.get_connection() db.begin() clear_cache() m = get_model(job["model"]) f = getattr(m, job["method"]) if job["args"]: args = json.loads(job["args"]) else: args = [] db.execute("UPDATE cron_job SET state='running' WHERE id=%s", job["id"]) db.commit() print("starting job '%s'" % job["name"]) try: with utils.timeout(seconds=job["timeout"]): f(*args) db.commit() print("job '%s' success" % job["name"]) except Exception as e: print("WARNING: job '%s' failed: %s" % (job["name"], e)) db.rollback() t = time.strftime("%Y-%m-%d %H:%M:%S") msg = traceback.format_exc() db.execute( "UPDATE cron_job SET last_error_time=%s,error_message=%s WHERE id=%s", t, msg, job["id"]) db.commit() t1 = time.strftime("%Y-%m-%s %H:%M:%S") if job["interval_num"]: if job["interval_type"] == "second": dt = timedelta(seconds=job["interval_num"]) elif job["interval_type"] == "minute": dt = timedelta(minutes=job["interval_num"]) elif job["interval_type"] == "hour": dt = timedelta(hours=job["interval_num"]) elif job["interval_type"] == "day": dt = timedelta(days=job["interval_num"]) else: raise Exception("Missing interval unit") next_date = datetime.strptime(job["date"], "%Y-%m-%d %H:%M:%S") now = datetime.now() while next_date <= now: # TODO: make this faster next_date += dt if next_date < _check_times[dbname]: _check_times[dbname] = next_date db.execute("UPDATE cron_job SET date=%s,state='waiting' WHERE id=%s", next_date.strftime("%Y-%m-%d %H:%M:%S"), job["id"]) else: db.execute("UPDATE cron_job SET state='done' WHERE id=%s", job["id"]) db.commit()
def run_job(dbname, job): print("run_job dbname=%s pid=%s job='%s'"%(dbname, os.getpid(), job["name"])) database.connections.clear() set_active_user(1) database.set_active_db(dbname) db = database.get_connection() db.begin() clear_cache() m = get_model(job["model"]) f = getattr(m, job["method"]) if job["args"]: args = json.loads(job["args"]) else: args = [] db.execute("UPDATE cron_job SET state='running' WHERE id=%s", job["id"]) db.commit() print("starting job '%s'"%job["name"]) try: with utils.timeout(seconds=job["timeout"]): f(*args) db.commit() print("job '%s' success" % job["name"]) except Exception as e: print("WARNING: job '%s' failed: %s"%(job["name"],e)) db.rollback() t=time.strftime("%Y-%m-%d %H:%M:%S") msg=traceback.format_exc() db.execute("UPDATE cron_job SET last_error_time=%s,error_message=%s WHERE id=%s", t, msg, job["id"]) db.commit() t1 = time.strftime("%Y-%m-%s %H:%M:%S") if job["interval_num"]: if job["interval_type"] == "second": dt = timedelta(seconds=job["interval_num"]) elif job["interval_type"] == "minute": dt = timedelta(minutes=job["interval_num"]) elif job["interval_type"] == "hour": dt = timedelta(hours=job["interval_num"]) elif job["interval_type"] == "day": dt = timedelta(days=job["interval_num"]) else: raise Exception("Missing interval unit") next_date = datetime.strptime(job["date"], "%Y-%m-%d %H:%M:%S") now = datetime.now() while next_date <= now: # TODO: make this faster next_date += dt if next_date < _check_times[dbname]: _check_times[dbname] = next_date db.execute("UPDATE cron_job SET date=%s,state='waiting' WHERE id=%s", next_date.strftime("%Y-%m-%d %H:%M:%S"), job["id"]) else: db.execute("UPDATE cron_job SET state='done' WHERE id=%s", job["id"]) db.commit()
def upgrade_db(self, context={}): data = context["data"] if data["super_password"] != config.get("super_password"): raise Exception("Invalid super admin password") dbname = data["dbname"] database.set_active_db(dbname) from_version = get_db_version() update_db(force=True) apply_migrations(from_version=from_version) return { "next": { "name": "manage_db" }, "flash": "Database upgrade successfully", }
def send_notifs(): print("send_notifs",os.getpid(),list(listen_handlers.keys())) t=time.strftime("%Y-%m-%d %H:%M:%S") db_handlers={} for listener_id,h in listen_handlers.items(): # XXX db_handlers.setdefault(h.dbname,[]).append(listener_id) for dbname,listener_ids in db_handlers.items(): set_active_db(dbname) db=get_connection() ids_sql="("+",".join(str(x) for x in listener_ids)+")" res=db.query("SELECT listener_id,name FROM ws_event WHERE listener_id IN "+ids_sql) if res: for r in res: print("NOTIFY %s %s %s"%(dbname,r.listener_id,r.name)) handler=listen_handlers[r.listener_id] handler.write_message("NOTIFY %s"%r.name) db.execute("DELETE FROM ws_event WHERE listener_id IN "+ids_sql) db.execute("UPDATE ws_listener SET last_check_time=%s WHERE id IN "+ids_sql,t) # XXX: do this less often db.execute("DELETE FROM ws_listener WHERE last_check_time<TIMESTAMP %s-INTERVAL '10 seconds'",t) # XXX: do this less often, FIXME db.commit() io_loop=tornado.ioloop.IOLoop.instance() io_loop.add_timeout(time.time()+POLL_WAIT,send_notifs)
def post(self): params, r_method = xmlrpc.client.loads(self.request.body) db = database.get_connection() if db: db.begin() try: if r_method == "execute": model = params[0] method = params[1] args = params[2] if len(params) >= 4: opts = params[3] else: opts = {} if len(params) >= 7: dbname = params[4] user_id = params[5] token = params[6] if utils.check_token(dbname, user_id, token): database.set_active_db(dbname) access.set_active_user(user_id) m = get_model(model) f = getattr(m, method) res = f(*args, **opts) else: raise Exception("Invalid XML-RPC method") resp = xmlrpc.client.dumps((res,), methodresponse=True, allow_none=True) self.write(resp) db = database.get_connection() if db: db.commit() except Exception as e: db = database.get_connection() if db: db.rollback() import traceback traceback.print_exc() f = xmlrpc.client.Fault(0, str(e)) self.write(xmlrpc.client.dumps(f, methodresponse=True, allow_none=True))
def open(self): print("Listen.open",os.getpid()) global sending_notifs t=time.strftime("%Y-%m-%d %H:%M:%S") dbname=config.get("database") if not dbname: dbname=self.get_cookie("dbname",None) if not dbname: raise Exception("Can't open websocket, missing dbname") set_active_db(dbname) db=get_connection() user_id=self.get_cookie("user_id",None) if user_id: user_id=int(user_id) res=db.get("INSERT INTO ws_listener (user_id,last_check_time) VALUES (%s,%s) RETURNING id",user_id,t) self.listener_id=res.id self.dbname=dbname listen_handlers[self.listener_id]=self if not sending_notifs: io_loop=tornado.ioloop.IOLoop.instance() io_loop.add_timeout(time.time()+POLL_WAIT,send_notifs) # XXX: should start this directly when process is started? sending_notifs=True db.commit()
from netforce import config from netforce import database from netforce import access import netforce_general import netforce_contact import netforce_product import netforce_account import netforce_stock import netforce_stock_cost import netforce_sale import netforce_purchase import netforce_mfg config.load_config() access.set_active_user(1) database.set_active_db("thailandbest_test") os.environ["ESCDELAY"] = "25" f = open(os.devnull, 'w') sys.stdout = f sys.stderr = f def main(stdscr): curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK) curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_RED) curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLUE) set_stdscr(stdscr) opts = { "win": stdscr, }
def login(self, context={}): set_active_user(None) data = context["data"] db_name = data.get("db_name") if not db_name: raise Exception("Missing db name") database.set_active_db(db_name) login = data["login"] password = data["password"] user_id = get_model("base.user").check_password(login, password) if not user_id: audit_log("Invalid login (%s)" % login) db = database.get_connection() db.commit() raise Exception("Invalid login") try: print("login ok", login) set_active_user(1) user = get_model("base.user").browse(user_id) if user.profile_id.prevent_login or not user.active: raise Exception("User not allowed to login") t = time.strftime("%Y-%m-%d %H:%M:%S") user.write({"lastlog": t}) profile = user.profile_id action = profile.home_action or "account_board" token = new_token(db_name, user_id) db = database.get_connection() res = db.get("SELECT * FROM pg_class WHERE relname='settings'") settings = get_model("settings").browse(1) version = settings.version mod_version = get_module_version_name() if version != mod_version: raise Exception( "Database version (%s) is different than modules version (%s), please upgrade database before login." % (version, mod_version)) company_id = user.company_id.id or profile.login_company_id.id if not company_id: res = get_model("company").search([["parent_id", "=", None]]) if not res: raise Exception("No company found") company_id = res[0] comp = get_model("company").browse(company_id) return { "cookies": { "dbname": database.get_active_db(), "user_id": user_id, "token": token, "user_name": user.name, "package": settings.package, "company_id": company_id, "company_name": comp.name, }, "next": { "type": "url", "url": "/ui#name=%s" % action, }, "login_action": action, } finally: set_active_user(user_id) audit_log("Login")
from netforce import config from netforce import database from netforce import access import netforce_general import netforce_contact import netforce_product import netforce_account import netforce_stock import netforce_stock_cost import netforce_sale import netforce_purchase import netforce_mfg config.load_config() access.set_active_user(1) database.set_active_db("thailandbest_test") os.environ["ESCDELAY"]="25" f = open(os.devnull, 'w') sys.stdout = f sys.stderr = f def main(stdscr): curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK) curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_RED) curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_BLUE) set_stdscr(stdscr) opts={ "win": stdscr, } v=make_view("menu",opts)