예제 #1
0
 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()
예제 #2
0
파일: login.py 프로젝트: cyberhck/netforce
 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")
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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()
예제 #6
0
파일: job.py 프로젝트: cyberhck/netforce
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()
예제 #7
0
 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",
     }
예제 #8
0
 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",
     }
예제 #9
0
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)
예제 #10
0
 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))
예제 #11
0
 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()
예제 #12
0
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,
    }
예제 #13
0
 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")
예제 #14
0
파일: run.py 프로젝트: Sorawit123/netforce
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)