예제 #1
0
def sync_total_progress(dev, tol, cur, session_key=""):
    d_server = start_dict_server()
    d_server.set_to_dict("DEV_COMM_SYNC_%s" % session_key,
                         "%d,%d" % (tol, cur))
    d_server.set_to_dict("DEV_COMM_PROGRESS_%s" % session_key,
                         "%s,0" % dev.encode("gb18030"))
    d_server.close()
예제 #2
0
def clear_progress_cache(devs, session_key=""):
    d_server = start_dict_server()
    d_server.set_to_dict("DEV_COMM_SYNC_%s" % session_key,
                         "%d,0" % (len(devs) * 2))
    if devs:
        d_server.set_to_dict("DEV_COMM_PROGRESS_%s" % session_key,
                             "%s,0" % devs[0].alias.encode("gb18030"))
    else:
        d_server.set_to_dict("DEV_COMM_PROGRESS_%s" % session_key, ",0")
    d_server.close()
예제 #3
0
def check_acc_device(request, d_server, allow_create=False):
    from mysite.iclock.models import Device
    from base.cached_model import STATUS_PAUSED, STATUS_STOP
    from mysite.iaccess.dev_comm_center  import DEVOPT
    import time
    import datetime
    from mysite.iclock.models.model_device import DEVICE_ACCESS_CONTROL_PANEL
    from redis_self.server import start_dict_server
    from mysite.iclock.cache_cmds import check_and_init_cmds_cache
    #print '---request=',request
    device = None
    global g_monitor_server
    if not g_monitor_server:
       #print '--rtlog--first time=',g_monitor_server
       g_monitor_server = start_dict_server()
    if not d_server:
        d_server = g_monitor_server
    try:
        sn = request.GET["SN"]
        #print '---sn=',sn
    except:
        sn = request.raw_post_data.split("SN=")[1].split("&")[0]
        
    dev_info = d_server.get_from_dict("PUSH_DEV_INFO")#暂没有加设备的同步.....darcy20110803锦湖轮胎
    len = d_server.llen_dict(DEVOPT)
    #print '--len=',len
   # print '-----!!dev_info=',dev_info
    if not dev_info or len > 0:#设备信息初始化   len > 0意味着有新增、编辑或者删除操作的(任意一个)
        #{"PUSH_DEVICE_INFO", {"1234",:{"dev_obj":<>,"push_status":1, "pull_status":0},{"23455":{}}}
        devs = Device.objects.filter(device_type=DEVICE_ACCESS_CONTROL_PANEL)
        dev_dict = {}
        for dev in devs:
            dev_dict[dev.sn] = dev
        d_server.set_to_dict("PUSH_DEV_INFO", dev_dict)
        dev_info = dev_dict
    #print '----dev_info=',dev_info
    #print sn, dev_info.keys()
    if sn in dev_info.keys():#设备存在
        device = dev_info[sn]
        #print '--sn==',sn
        if device.status in (STATUS_STOP, STATUS_PAUSED):
            return None
        #初始化设备的在线状态(此处仅更新push的在线状态)--darcy20110803锦湖轮胎
        #push_state = d_server.get_from_dict("PUSH_STATE_" + sn)
        #if push_state <= 0:#等于0的话为在线--darcy20110803锦湖轮胎
        d_server.set_to_dict("PUSH_STATE_%s"%sn, time.mktime(datetime.datetime.now().timetuple()))
        #print '-key=',"PUSH_STATE_%s"%sn
        #print '--get_push_state=',d_server.get_from_dict("PUSH_STATE_%s"%sn), "PUSH_STATE_%s"%sn
            
    #device.last_activity = datetime.datetime.now()?????
    check_and_init_cmds_cache(device)
    return device
예제 #4
0
def option(request, usr, catalog):
    from base.options import OptionForm
    from django.core.cache import cache
    from django.utils.translation import get_language
    if usr.is_anonymous():
        return HttpResponse(_(u'没有权限'))
    if request.method == 'POST':
        from django.conf import settings
        if "mysite.iaccess" in settings.INSTALLED_APPS:
            from redis_self.server import start_dict_server
            import dict4ini

            is_contain_att = request.POST.get("is_contain_att")
            d_server = start_dict_server()
            att_dict = d_server.get_from_dict("IS_CONTAINS_ATT")
            if att_dict != None:
                att_dict = int(att_dict)
            cfg = dict4ini.DictIni(os.getcwd() + "/appconfig.ini",
                                   values={"iaccess": {
                                       "is_contain_att": 0
                                   }})
            if is_contain_att == "on":
                if att_dict != 1:
                    d_server.set_to_dict("IS_CONTAINS_ATT", '1')
                    cfg.iaccess.is_contain_att = 1
                    cfg.save()
            elif is_contain_att == None:
                if att_dict == 1:
                    d_server.set_to_dict("IS_CONTAINS_ATT", '0')
                    cfg.iaccess.is_contain_att = 0
                    cfg.save()

        f = OptionForm(catalog, usr, request.POST)
        if f.is_valid(
        ):  # All validation rules pass Process the data in form.cleaned_data
            try:
                f.save()
                k = "user_id_%s" % usr.pk
                cache.delete(k)
            except Exception, e:  #保存失败
                import traceback
                traceback.print_exc()
                from data_edit import NON_FIELD_ERRORS
                f.errors[
                    NON_FIELD_ERRORS] = u'<ul class="errorlist"><li>%s</li></ul>' % e
            else:
                lng = get_language()
                cache.delete(u"%s_%s_%s" % (lng, usr.username, "menu_list"))
                if request.is_ajax():
                    return getJSResponse('{ Info:"OK" }')
        else:
            return HttpResponse(u"%s" % f.errors)
예제 #5
0
 def action(self):
     if self.object.device_type == DEVICE_ACCESS_CONTROL_PANEL:
         if not self.object.enabled:
             raise Exception(_(u'设备已被禁用!'))
         ret = self.object.set_acc_push_params(enable=1)
         if ret >= 0:
             self.object.accdevice.iclock_server_on = 1
             self.object.accdevice.save(force_update=True)
             d_server = start_dict_server()
             d_server.set_to_dict(ACCDEVICE_PUSH_ON % self.object.sn, 1)
             d_server.close()
             raise Exception(_(u"操作成功!"))
         else:
             raise Exception(_(u"操作失败!"))
예제 #6
0
def ClearCmdCache(request):
    dev_id = request.GET.get("devid", 0)
    if dev_id:
        dev = Device.objects.get(id=dev_id)
        q_server = queqe_server()
        q_server.delete_file(dev.new_command_list_name())  #手动删除新命令
        q_server.connection.disconnect()

        d_server = start_dict_server()
        d_server.delete_dict(dev.command_temp_list_name())
        d_server.delete_dict(dev.command_count_key())
        d_server.close()
        return HttpResponse(smart_str({'ret': 1}))
    else:
        return HttpResponse(smart_str({'ret': 0}))
예제 #7
0
def is_contain_att(site):  #site变量暂无实际意义。
    import dict4ini
    from django.conf import settings
    from redis_self.server import start_dict_server
    current_path = settings.APP_HOME
    if 'mysite.iaccess' in settings.INSTALLED_APPS:
        d_server = start_dict_server()
        is_contain_att = d_server.get_key('IS_CONTAINS_ATT')
        if is_contain_att == None:
            #print '*******read is_att from file***'
            app = dict4ini.DictIni(current_path + "/appconfig.ini")
            is_contain_att = app["iaccess"].has_key(
                "is_contain_att") and app["iaccess"]["is_contain_att"] or "0"
            d_server.set_to_dict('IS_CONTAINS_ATT', is_contain_att)
        d_server.close()
        return settings.ZKACCESS_ATT and int(is_contain_att)
    return True
예제 #8
0
def downdata_progress(request):  #进度条后台控制
    global g_monitor_server
    if not g_monitor_server:
        g_monitor_server = start_dict_server()

    cdatas = []
    skey = request.session.session_key
    #print "downdata_progress=", skey
    cur_gress = g_monitor_server.get_from_dict("DEV_COMM_PROGRESS_%s" % skey)
    tol_gress = g_monitor_server.get_from_dict("DEV_COMM_SYNC_%s" % skey)
    if cur_gress and tol_gress:
        cur_strs = cur_gress.split(",", 2)
        tol_gress = tol_gress.split(",", 2)
        try:
            icur = int(cur_strs[1])
        except:
            icur = 0
        try:
            itol = (int(tol_gress[1]) * 100) / int(tol_gress[0])
        except:
            itol = 0
        cdata = {
            'dev': cur_strs[0].decode("gb18030"),
            'progress': icur,
            'tolprogress': itol,
        }
        cdatas.append(cdata)
        #g_monitor_server.close()
        cc = {
            'index': 1,
            'data': cdatas,
        }
    else:
        cdata = {
            'dev': "",
            'progress': 0,
            'tolprogress': 0,
        }
        cdatas.append(cdata)
        #g_monitor_server.close()
        cc = {
            'index': 0,
            'data': cdatas,
        }
    rtdata = simplejson.dumps(cc)
    return HttpResponse(smart_str(rtdata))
예제 #9
0
def comm_error_msg(request):
    global g_monitor_server
    if not g_monitor_server:
        #print '--error--first time=',g_monitor_server
        g_monitor_server = start_dict_server()

    cdatas = []
    cc = {}
    global g_dev_comm_error_list
    if g_dev_comm_error_list:
        #print '---dev_list exist'
        dev_list = g_dev_comm_error_list
    else:
        #print '---dev_list not exist'
        dev_list = filterdata_by_user(
            Device.objects.filter(device_type=DEVICE_ACCESS_CONTROL_PANEL),
            request.user)
        g_dev_comm_error_list = dev_list
    #print '----dev_list=',dev_list, dev_list.count()
    #print '-----dev_list=', dev_list
    icount = 0
    for dev in dev_list:
        if not dev.enabled:  #不监控已禁用的设备
            continue

        key = dev.command_temp_list_name()
        ucmd = g_monitor_server.get_from_dict(key)
        if ucmd is None:
            continue
        ret = ucmd['CmdReturn']
        #print ret
        if (-400 < ret < -200) or (ret < -10000) or (ret == -1001):
            icount += 1
            cdata = {
                'devname': ucmd['SN'].alias,
            }
            cdatas.append(cdata)
    cc = {
        'cnt': icount,
        'data': cdatas,
    }
    #g_monitor_server.close()
    rtdata = simplejson.dumps(cc)
    return HttpResponse(smart_str(rtdata))
예제 #10
0
    def action(self, get_records, sd_file):
        if self.object.device_type == DEVICE_ACCESS_CONTROL_PANEL:
            if not self.object.enabled:
                raise Exception(_(u'设备已被禁用!'))

            from mysite.iaccess.devcomm import TDevComm
            from mysite.iaccess.dev_comm_center import process_event_log
            #获取事件记录时先检查数据中心是否开启
            d_server = start_dict_server()
            if not d_server.get_from_dict("CENTER_RUNING"):
                ret = -1003
                raise Exception(_(u"获取事件记录失败,错误码:%s") % ret)
            d_server.close()
            if get_records == "1":
                ret = self.object.upload_acclog(True)
            elif get_records == "2":
                if not self.request.FILES.has_key('sd_file'):
                    raise Exception(_(u"请选择目标文件"))
                file = self.request.FILES['sd_file']
                if not file:
                    raise Exception(_(u"目标文件不存在"))


#                   try:
#                       if not file.name.endswith(".dat"):
#                           raise Exception(_(u"目标文件格式错误"))
#                   except:
#                       raise Exception(_(u"目标文件格式错误"))
                file_buffer = file.read()
                tdev = TDevComm({})
                result = tdev.get_transaction("SD", file_buffer, file.size)
                ret = result["result"]
                sn = result["data"][0].split(',')[0]
                if sn != self.object.sn:
                    raise Exception(_(u"当前文件里的记录不属于该设备!"))
                #result["data"].pop(0)
                process_event_log(self.object, result)
            else:
                ret = self.object.upload_acclog(False)
            if ret >= 0:
                raise Exception(
                    _(u"<font color='blue'>获取事件记录成功,共 %d 条</font>") % ret)
            else:
                raise Exception(_(u"获取事件记录失败,错误码:%s") % ret)
예제 #11
0
def acc_cdata(request, response):
    from redis_self.server import start_dict_server
    from mysite.iclock.devview import cdata_get_options
#    print '====innini=--acc_cdata'
    resp = ''
    try:
        global g_monitor_server
        if not g_monitor_server:
           #print '--rtlog--first time=',g_monitor_server
           g_monitor_server = start_dict_server()


        #检测设备是否存在,存在的话,检测设备的在线和离线状态。
        device = check_acc_device(request, g_monitor_server, True)

        print '----device=',device
        if device is None: 
            return "UNKNOWN DEVICE"
#        print '---request.method=',request.method
        g_monitor_server.set_to_dict(device.get_last_activity(), datetime.datetime.now())
        if request.REQUEST.has_key('action'):
            resp += "OK\n"
        elif request.method == 'GET':
            #if request.REQUEST.has_key('PIN'):
            #    resp+=cdata_get_pin(request, device)
            # else:
            print '----request---get'
            alg_ver = "1.0"
            if request.REQUEST.has_key('pushver'):
              alg_ver = request.REQUEST.get('pushver')    #2010-8-25  device字段alg_ver用来区分新老固件  >=2.0为新固件,默认为旧固件
            device.alg_ver = alg_ver
            device.save()
            resp += cdata_get_options(device)
            
        elif request.method == 'POST':#处理设备上传上来的数据,如实时监控记录等。-darcy0803锦湖轮胎
#            print '---cdata post'
            try:
                resp += acc_cdata_post(request, device, g_monitor_server)
#                print '---!!!!!---resp=',resp
            except Exception, e:
                resp = u"ERROR: %s" % e
                print e
                #errorLog(request)
        else:
예제 #12
0
def acd_getreq(request, resp, device):
    from mysite.iclock.models.model_device import MAX_COMMAND_TIMEOUT_SECOND
    from mysite.iclock.cache_cmds import get_request_cmds, check_pre_request, get_pre_request_cmds, TEMP_CMD_KEY
    from redis_self.server import start_dict_server
    print '=======acd_getreq=='
    global g_monitor_server
    if not g_monitor_server:
       #print '--rtlog--first time=',g_monitor_server
       g_monitor_server = start_dict_server()
    g_monitor_server.set_to_dict(device.get_last_activity(), datetime.datetime.now())
    try:
        sn = request.GET["SN"]
    except:
        sn = request.raw_post_data.split("SN=")[1].split("&")[0]
#    temp_cmd_list = cache.get(TEMP_CMD_KEY%device.pk)
#    print temp_cmd_list,'======temp_cmd_list==key=',TEMP_CMD_KEY%device.pk
#    if temp_cmd_list:
#        temp_cmd_obj = temp_cmd_list.pop()
#        cache.set(TEMP_CMD_KEY%device.pk, temp_cmd_list)
#        return process_next_cmd(request, resp, device, temp_cmd_obj, sn, False)#处理紧急命令,不需要更新cache中的命令index,紧急命令单独存储、优先处理
    pre_cmd_obj = cache.get("PROCESSING_CMD_OBJ_%s"%sn)
#    timeout = CMD_RETURN_TIMEOUT
    if pre_cmd_obj and not pre_cmd_obj.CmdImmediately:
        check_ret = check_pre_request(device)#确认上次下发命令,机器是否成功接收到
        if not check_ret:
            devcmd = get_pre_request_cmds(device) #返回上一次下发的命令
            print devcmd,'----precmdcmdmdm'
            return process_next_cmd(request, resp, device, devcmd, sn, False)
        else:
            devcmd = get_request_cmds(device)
            print devcmd, '========nextdevcmdddd'
            return process_next_cmd(request, resp, device, devcmd, sn, True)
    else:
        devcmd = get_request_cmds(device)
        print '---------devcmd=',devcmd
        ret = process_next_cmd(request, resp, device, devcmd, sn, True)
        return ret
예제 #13
0
def update_cache(visitor_pin=None, state=None, visit_time=None):
    #print '--------update----cache=====', visitor_pin, '----state--', state, '---', visit_time
    d_server = start_dict_server()
    visitor_alarm_info = d_server.get_from_dict("visitor_alarm_info")
    if visitor_alarm_info:
        alarm_pin_list = d_server.get_from_dict("visitor_alarm_info")[0]
        alarm_time_list = d_server.get_from_dict("visitor_alarm_info")[1]
        alarm_time_length = d_server.get_from_dict("visitor_alarm_info")[2]

        visitor_pin = int(visitor_pin)
        try:
            if state == "in":
                if alarm_pin_list.count(
                        visitor_pin) > 0:  #如果访客已在缓存中,更新进入的时间,放到缓存中最后一位
                    #print '---if----already ----here----'
                    index = alarm_pin_list.index(visitor_pin)
                    alarm_time_list.pop(index)
                    alarm_pin_list.remove(visitor_pin)
                time = visit_time + datetime.timedelta(hours=alarm_time_length)
                #                print '--------time---', time
                #                print '-----visit_time---',visit_time
                #                print '-----hours-----', datetime.timedelta(hours=alarm_time_length)
                alarm_pin_list.append(visitor_pin)
                alarm_time_list.append(time)
            elif state == "out":  #离开,删除访客在缓存中的信息
                #print '-----out----'
                index = alarm_pin_list.index(visitor_pin)
                alarm_time_list.pop(index)
                alarm_pin_list.remove(visitor_pin)

            d_server.set_to_dict(
                "visitor_alarm_info",
                [alarm_pin_list, alarm_time_list, alarm_time_length])
        except Exception, e:
            print '====update_cache===eeee===', e
        finally:
예제 #14
0
    def run(self):
        init_Email()
        d_server = start_dict_server()
        q_server = FileQueue()
        email_count = q_server.get_from_file("EMAILS")
        if email_count:
            d_server.set_to_dict("EMAIL_COUNT", 1)
#        try:
        while True:
            #修改邮件参数不需要重启服务。-darcy20120220
            change_args = d_server.get_from_dict("CHANGE_IACCESS_EMAIL_ARGS")
            #            print '-------change_iaccess_argument-----',change_args
            if change_args:
                cfg = dict4ini.DictIni(os.getcwd() + "/appconfig.ini",
                                       values={
                                           "iaccess": {
                                               "down_newlog": 0,
                                               "realtime_forever": 0
                                           }
                                       })
                realtime_forever = int(cfg.iaccess.realtime_forever)
                down_log_time = cfg.iaccess.down_newlog
                init_Email(cfg)
                d_server.set_to_dict("CHANGE_IACCESS_EMAIL_ARGS", 0)

            email_info = d_server.get_from_dict("EMAIL_INFO")
            #            print "EMAIL_INFO:---",email_info
            d_server.set_to_dict("EMAIL_INFO", "")
            process_send_email(email_info, q_server, d_server)
            #            print "one round"
            time.sleep(10)
#        except:
#            pass
#        finally:
        q_server.connection.disconnect()
        d_server.close()
예제 #15
0
def get_redis_rtlog(request):
    rtdata = {}
    try:
        #print '----in here request=',request
        changed_value = request.GET.get(
            "change",
            "")  #默认情况下为“”。决定是否需要重新获取所有有效设备,避免将设备缓存后前段无效。--darcy20110731
        #print '-----changed_value=',changed_value
        global g_area_dev_door_change

        logid = int(request.GET.get('logid', FIRSTVISIT_OR_DELBACKEND))
        step = int(request.GET.get('step', 0))  #步长:即要log的最大条数
        rt_type = request.GET.get('type', '')  #all alarm
        devid = request.REQUEST.get("devid", 0)  #默认为0,表示监控所有设备的所有门的状态
        doors_id = request.GET.get("door_id", '0')
        #再获取实时监控记录
        #print '----before g_monitor_server'
        #print '----00001'
        global g_monitor_server
        #print '----after g_monitor_server'
        if not g_monitor_server:
            #print '--rtlog--first time=',g_monitor_server
            g_monitor_server = start_dict_server()

        #控制后台是否需要开启实时监控
        rtmonitor_stamp = datetime.datetime.now()
        g_monitor_server.set_to_dict("RTMONITOR_STAMP", rtmonitor_stamp)

        rtid_all = 0  #缓存里所有的记录条数
        rtid_alarm = 0  #缓存里所有的报警事件记录
        log_count = 0  #返回的有效记录条数
        valid_devices_dict = {}
        deleted = g_monitor_server.get_from_dict(
            "MONITOR_RT_DEL")  #没有该值时返回None,如果为True,实时监控需要重新取
        g_monitor_server.delete_dict("MONITOR_RT_DEL")
        #print '----deleted=',deleted
        #print '----00003'
        rtlog = []
        if rt_type == "all":
            #rtid_all = g_monitor_server.lock_rlen("MONITOR_RT")#被锁住时以及文件缓存为空时都返回-1,即该值不可能为0 此时前端继续使用原来的logid取数据
            rtid_all = g_monitor_server.llen_dict("MONITOR_RT")

            #print '-REALLOG--deleted=',deleted,'   -rtid_all=',rtid_all, '---logid=',logid
            #from mysite.utils import printf
            #printf("---deleted=%s, rtid_all=%s, logid=%s"%(deleted, rtid_all, logid))
            #获取门状态door_states
            #为提高监控页面的用户体验,降低该页面的数据库查询,使用全局变量,避免查询数据库,这样就要求,用户添加或者修改设备信息后必须手动刷新页面,由于对于设备的操作不会过于频繁,所以可以接受--darcy20110728
            #print '----00004'

            global g_monitor_devices
            changed_break = False
            device_added = g_monitor_server.get_from_dict("DEVICE_ADDED")  #新增
            device_delete = g_monitor_server.get_from_dict(
                "DEVICE_DELETE")  #删除和编辑
            check_enable = g_monitor_server.get_from_dict(
                ACCDEVICE_ENABLE_CHANGED
            )  #禁用或者启用任何一台设备,实时监控都需要重新获取设备。--darcy20111012

            last_doors_id = g_monitor_server.get_from_dict("VALID_DOORS")
            valid_door_changed = (doors_id != last_doors_id
                                  )  #前端门改变了重新获取g_monitor_devices
            #print '=======$$$$$valid_door_changed=%s'%valid_door_changed
            if (not g_monitor_devices) or (
                    changed_value != g_area_dev_door_change
            ) or device_added or device_delete or check_enable or valid_door_changed:
                #printf('=======$$$$$valid_door_changed=%s'%valid_door_changed, True)
                #print '--- not exist or get again'
                g_area_dev_door_change = changed_value
                try:
                    valid_devices_dict = obtain_valid_devices(request)
                except Exception, e:
                    print '-----e=', e
                #print '---valid_devices_dict=',valid_devices_dict
                g_monitor_devices = valid_devices_dict
                changed_break = True
                if device_added:
                    g_monitor_server.set_to_dict("DEVICE_ADDED", 0)
                if device_delete:
                    g_monitor_server.set_to_dict("DEVICE_DELETE", 0)
            else:
                valid_devices_dict = g_monitor_devices
                #sprint '--- exist'

            #print '----00012'
            global g_monitor_doors
            if not g_monitor_doors or device_added or device_delete:  #只用到id,没有用到其他的设备或者门的属性
                #print '--g_monitor_doors not exist=',g_monitor_doors
                for door in AccDoor.objects.all():
                    g_monitor_doors[int(door.id)] = door
            #print '----00013'
            #print '---g_dev_door_id=',g_dev_door_id

            #print '----00005'

            if deleted == True or rtid_all < logid:
                logid = -1
            if logid != -1:
                #print '----00006'
                if logid == FIRSTVISIT_OR_DELBACKEND:  #监控全部时获取报警记录的初始id值
                    rtid_alarm = g_monitor_server.llen_dict("ALARM_RT")
                    #rtid_alarm = g_monitor_server.llen("ALARM_RT")
                #rtlog = g_monitor_server.lrange_from_file("MONITOR_RT", logid, logid + step)
                #print '--all real log-rtlog=',g_monitor_server.get_from_dict("MONITOR_RT")

                #取出来的是列表
                timeout = 0
                #                print '----000061'
                while True:
                    rtlog = g_monitor_server.lrange_from_dict(
                        "MONITOR_RT", logid, logid + step)
                    if not rtlog:
                        doorstate_changed = g_monitor_server.get_from_dict(
                            "GET_DOORSTATE_AGAIN"
                        )  #接受到后台通知,实时监控线程立即返回门状态数据--darcy20110805
                        #print '----doorstate_changed=',doorstate_changed
                        if doorstate_changed:
                            g_monitor_server.set_to_dict(
                                "GET_DOORSTATE_AGAIN", 0)
                            break

                        check_enable = g_monitor_server.get_from_dict(
                            ACCDEVICE_ENABLE_CHANGED)
                        if check_enable:
                            try:
                                valid_devices_dict = obtain_valid_devices(
                                    request)
                            except Exception, e:
                                print '-----e2=', e
                            #print '---valid_devices_dict=',valid_devices_dict
                            g_monitor_devices = valid_devices_dict
                            g_monitor_server.delete_dict(
                                ACCDEVICE_ENABLE_CHANGED)
                            break

                        #print '----changed_break=',changed_break
                        if changed_break:
                            break
                        timeout += 1
                        #                        print '--timeout=',timeout
                        if timeout > 30:  #60
                            #g_monitor_server.set_to_dict("GET_DOORSTATE_AGAIN", 0)
                            break  #超时后HttpResponse
                        time.sleep(0.3)
                        continue
                    else:
                        g_monitor_server.set_to_dict("GET_DOORSTATE_AGAIN", 0)
                        break

                #print '----000062'
            #print '---valid_devices_dict=',valid_devices_dict
            door_states = door_state_monitor(
                valid_devices_dict.values(),
                g_monitor_server)  #门状态不涉及辅助输入点,故不需调整
예제 #16
0
def end_sync_userinfo(session_key=""):
    d_server = start_dict_server()
    d_server.delete_dict("DEV_COMM_SYNC_%s" % session_key)
    d_server.delete_dict("DEV_COMM_PROGRESS_%s" % session_key)
    d_server.close()
예제 #17
0
def trigger_cmd_device(cmd_obj):
    #写入新命令队列
    old_cmd = 0
    write_log('---------in trigger_cmd_device cmd_obj=%s' % cmd_obj)
    try:
        q_server = queqe_server()
        d_server = start_dict_server()
        cln = cmd_obj.SN.new_command_list_name()  #NEWCMD_*
        #向文件缓存和dict中同时写入新命令
        dev = cmd_obj.SN
        #命令总数
        cntkey = dev.command_count_key()
        #print '---cntkey=',cntkey
        cnt = d_server.get_from_dict(cntkey)  #从dict中取
        old_cmd = q_server.llen_file(cln)
        write_log('---cmd_obj=%s,---cnt=%s,-----old_cmd=%s' %
                  (cmd_obj, cnt, old_cmd))
        if cnt is None:
            cnt = str(old_cmd)
            write_log('------devcmd get length from file-cnt=%s' % cnt)
        if cnt.find('\x00'):
            cnt = cnt.strip('\x00')
        #q_server.set(cntkey, "%d"%(int(cnt)+1))

        if dev.device_type == DEVICE_ACCESS_CONTROL_PANEL and cmd_obj.CmdImmediately:
            timeout = 0
            while True:
                temp_cmd_lock = d_server.get_from_dict("TEMP_CMD_LOCK")
                if temp_cmd_lock:  #如果当前其他线程或者进程在进行同样的操作,等待
                    write_log(
                        '--------!cmd_obj=%s temp_cmd_lock=%s timeout=%s' %
                        (cmd_obj, temp_cmd_lock, timeout))
                    timeout += 1
                    if timeout > 300:
                        break  #超时后不放入缓存
                    time.sleep(0.5)
                    continue
                else:
                    d_server.set_to_dict("TEMP_CMD_LOCK", 1)
                    immed_cmd_dict = d_server.get_from_dict("TEMP_CMD")
                    write_log('-devcmd-before immed_cmd_dict=%s, cmd_obj=%s' %
                              (immed_cmd_dict, cmd_obj))
                    if not immed_cmd_dict:
                        immed_cmd_dict = {}
                        immed_cmd_dict.setdefault(dev.id, [cmd_obj])
                    else:
                        devcmds = immed_cmd_dict.get(dev.id) or [
                        ]  #获取到当前设备对应的所有的紧急命令
                        #                        if devcmds:
                        #                            devcmds.append(cmd_obj)
                        #                        else:
                        #                            devcmds = []
                        devcmds.append(cmd_obj)
                        immed_cmd_dict[dev.id] = devcmds
                    write_log(
                        '-devcmd-before set_to_dict cmd_obj=%s,immed_cmd_dict=%s'
                        % (cmd_obj, immed_cmd_dict))
                    d_server.set_to_dict("TEMP_CMD", immed_cmd_dict)
                    d_server.set_to_dict("TEMP_CMD_LOCK", 0)
                    #immed_cmd_dict = d_server.get_from_dict("TEMP_CMD")
                    #write_log('-devcmd-after cmd_obj=%s,immed_cmd_dict=%s'%(cmd_obj, immed_cmd_dict))
                    #time.sleep(1)
                    #immed_cmd_dict = d_server.get_from_dict("TEMP_CMD")
                    #printf('-devcmd-after 5s cmd_obj=%s, immed_cmd_dict=%s'%(cmd_obj, immed_cmd_dict), True)
                    break
                #print d_server.get_from_dict("TEMP_CMD"),'-----------devcmds'
        else:
            write_log('-------------------file catch')
            q_server.lpush_to_file(cln, pickle.dumps(cmd_obj))
        if not cmd_obj.CmdImmediately:
            d_server.set_to_dict(cntkey, "%d" % (int(cnt) + 1))  #命令总数写入dict
        write_log('---cmd_obj=%s--cnt========%s' %
                  (cmd_obj, d_server.get_from_dict(cntkey)))
        q_server.connection.disconnect()
    except:
        print_exc()
    if not (dev.comm_type == COMMU_MODE_PUSH_HTTP):  #门禁设备不须通知
        return
    pass
    #UDP 广播通知设备来读取命令
    if old_cmd:  #若新命令队列不空,说明设备上次的命令还没有执行,不需要再次通知设备
        return
    try:
        ip = cmd_obj.SN.ipaddress
        sNotify = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        if ip: sNotify.sendto("R-CMD", (ip, 4374))
    except:
        print_exc()
예제 #18
0
def get_visitor_monitor(request):
    from view import get_visitor_option, get_visitor_in, get_visitor_by_pin, add_recode_to_report
    d_server = start_dict_server()
    current_time = datetime.datetime.now()  #当前的时间
    time_length = get_visitor_option()  #来访的时长

    visitor_alarm_info = d_server.get_from_dict(
        "visitor_alarm_info")  #获取缓存中访客来访需要监控的访客信息
    #print '---------visitor_alarm_info=', visitor_alarm_info
    alarm_visitor_info = []  #传到前端的访客信息
    if visitor_alarm_info:
        alarm_time_length = d_server.get_from_dict("visitor_alarm_info")[
            2]  #获取来访时长
        #print '-----------alarm_time_length=', alarm_time_length
        #如果来访时长修改了,更新缓存中的信息
        if alarm_time_length != time_length:
            #print '------update lai fang shi chang------'
            visitor_in = get_visitor_in()
            alarm_pin_set = visitor_in["alarm_pin_set"]
            alarm_time_list = visitor_in["alarm_time_list"]
            d_server.set_to_dict("visitor_alarm_info",
                                 [alarm_pin_set, alarm_time_list, time_length])

        #访客超过来访时长,将信息传到前端, 更新缓存
        alarm_pin_set = d_server.get_from_dict("visitor_alarm_info")[0]
        alarm_time_list = d_server.get_from_dict("visitor_alarm_info")[
            1]  #取缓存中的报警时间
        alarm_info = {}  #报警的信息
        begin_length = len(alarm_pin_set)  #缓存alarm_pin_set开始时的长度
        end_length = 0  #缓存alarm_pin_set循环结束后的长度

        for alarm_time in alarm_time_list:
            #            print '--------current_time==', current_time
            #            print '--------alarm_time====', alarm_time
            if current_time < alarm_time:  #当前时间小于报警时间,跳出
                break
            else:
                index = alarm_time_list.index(alarm_time)
                pin = alarm_pin_set[index]  #获取来访超时的访客的编号
                #print '-----pin=', pin
                alarm_visitor = get_visitor_by_pin(pin)  #获取来访超时的访客信息

                #传到前端的访客信息
                alarm_info["name"] = alarm_visitor[0]
                #print '--------name=',alarm_info["name"]
                alarm_info["pin"] = alarm_visitor[1]
                alarm_info["card"] = alarm_visitor[2]
                #print '--------card=', alarm_info["card"]
                alarm_info["visitor_company"] = alarm_visitor[3]
                alarm_info["visit_reason"] = alarm_visitor[4]
                alarm_info["visitor_number"] = alarm_visitor[5]
                alarm_info["exit"] = alarm_visitor[6]
                alarm_info["visit_time"] = str(alarm_visitor[7])

                alarm_visitor_info.append(alarm_info)

                #往报表插入记录
                #print '----begin add to report-------'
                add_recode_to_report(alarm_info)
                #print '---------end add to report----'
                #更新缓存

                alarm_pin_set.remove(pin)
                alarm_time_list.remove(alarm_time)
                end_length = len(alarm_pin_set)
        #有变化,更新缓存
        if begin_length > end_length:
            d_server.set_to_dict("visitor_alarm_info",
                                 [alarm_pin_set, alarm_time_list, time_length])
    #重启系统后
    else:
        try:
            visitor_in = get_visitor_in()
            if visitor_in:
                alarm_pin_set = visitor_in["alarm_pin_set"]
                alarm_time_list = visitor_in["alarm_time_list"]
                d_server.set_to_dict(
                    "visitor_alarm_info",
                    [alarm_pin_set, alarm_time_list, time_length])
        except Exception, e:
            print '---else--e=', e
예제 #19
0
    def action(self, firmware_file):
        if self.object.device_type == DEVICE_ACCESS_CONTROL_PANEL:  #门禁
            if not self.object.enabled:
                raise Exception(_(u'设备已被禁用!'))

            if not self.request.FILES.has_key('firmware_file'):
                raise Exception(_(u"目标文件不存在"))

            file = self.request.FILES['firmware_file']
            if not file:
                raise Exception(_(u"目标文件不存在"))
            if file.name != "emfw.cfg":
                raise Exception(_(u"目标文件名错误"))
            #for chunk in file.chunks():
            #buffer.write(chunk)
            buffer = file.read()
            from mysite.iaccess.devcomm import TDevComm
            devcomm = TDevComm(self.object.getcomminfo())
            d_server = None
            service_running = True  #门禁后台服务

            from mysite.iaccess.dev_comm_center import check_service_commcenter
            d_server = start_dict_server()
            #print '--------before wait_com_pause'
            service_running = check_service_commcenter(d_server)
            if service_running:
                if self.object.comm_type == COMMU_MODE_PULL_RS485:  #485通讯
                    from mysite.iaccess.dev_comm_center import wait_com_pause
                    if wait_com_pause(d_server, self.object.com_port,
                                      60) == False:  #等待后台停止进程
                        #print '------wait_com_pause failed'
                        d_server.close()
                        raise Exception(_(u"升级固件失败,原因:后台串口进程忙"))
                    else:
                        os.system("taskkill /im plrscagent.* /f")
                elif self.object.comm_type == COMMU_MODE_PULL_TCPIP:
                    from mysite.iaccess.dev_comm_center import wait_thread_pause
                    if wait_thread_pause(d_server, self.object.id,
                                         60) == False:  #等待后台停止进程
                        #print '------wait_com_pause failed'
                        d_server.close()
                        raise Exception(_(u"升级固件失败,原因:后台设备线程忙"))

            cret = devcomm.connect()
            #print '----cret = ',cret
            #print '------after connect the device cret=',cret

            if cret['result'] > 0:
                #print '----before upgrade_firmware'
                ret = devcomm.upgrade_firmware(file.name, buffer, file.size)
                #print '---after upgrade firmware'
                #无论成功与否,先让后台进程继续
                if self.object.comm_type == COMMU_MODE_PULL_RS485 and service_running:
                    from mysite.iaccess.dev_comm_center import set_comm_run
                    #print '-set_comm_run-=',set_comm_run
                    set_comm_run(d_server, self.object.com_port)  #后台进程继续
                elif self.object.comm_type == COMMU_MODE_PULL_TCPIP and service_running:
                    from mysite.iaccess.dev_comm_center import set_thread_run
                    #print '---set_thread_run time=',datetime.datetime.now()
                    set_thread_run(d_server, self.object.id)  #后台线程继续
                d_server.close()

                if ret['result'] >= 0:  #
                    devcomm.reboot()
                    devcomm.disconnect()
                    raise Exception(_(u"<font color='blue'>操作成功</font>"))
                else:
                    devcomm.disconnect()
                    raise Exception(_(u"升级固件失败,错误码:%d") % ret['result'])
            else:

                from mysite.iaccess.dev_comm_center import DEVICE_COMMAND_RETURN
                #print '----connect failed'
                try:
                    reason = unicode(
                        dict(DEVICE_COMMAND_RETURN)[str(cret["result"])])
                    raise Exception(_(u"连接设备失败(原因:%s),无法升级固件。") % reason)
                except:
                    raise Exception(
                        _(u"设备连接失败(错误码:%d),无法升级固件。") % cret['result'])
예제 #20
0
 def action(self, **kwargs):
     d_server = start_dict_server()
     self.object.set_dev_enabled(d_server)
     d_server.close()
예제 #21
0
def obtain_valid_devices(request):
    u = request.user
    aa = u.areaadmin_set.all()  #如果新增用户时设定区域,那么aa不为空,否则为空代表全部(包含普通用户和超级管理员)
    a_limit = aa and [int(a.area_id) for a in aa] or [
        int(area.pk) for area in Area.objects.all()
    ]  #非超级管理员且没有配置有效区域(默认全部)的有效区域id列表(即用户手动配置过用户区域的)

    area_id = int(request.GET.get("area_id", 0))  #不为0.前端随已经过过滤,但是考虑用户可以手动修改url
    #print '----area_id=',area_id
    if area_id and area_id in a_limit:
        #devices = Device.objects.filter(area__pk=area_id)#权限范围内的全部
        devices = Device.objects.filter(
            Q(area__pk=area_id) | Q(area__in=Area.objects.get(
                id=area_id).area_set.all()))  #权限范围内的全部,且要处理区域的上下级
    else:
        device_id = int(request.GET.get("device_id", 0))
        #print '----device_id=',device_id
        dev_limit = [
            int(d.pk) for d in Device.objects.filter(area__pk__in=a_limit)
        ]  #权限范围内的设备
        if device_id and device_id in dev_limit:
            devices = Device.objects.filter(pk=device_id)
        else:
            door_limit = [
                int(door.id) for door in AccDoor.objects.filter(
                    device__area__pk__in=a_limit)
            ]  #所有有效的
            doors_id = request.GET.get("door_id",
                                       '0')  #此处可能是单个数字也可以能是多个 0代表默认情况(全部门)
            global g_monitor_server
            if not g_monitor_server:
                g_monitor_server = start_dict_server()
            g_monitor_server.set_to_dict(
                "VALID_DOORS",
                doors_id)  #前端获取到的需要监控的门,若此值改变需重新获取g_monitor_devices
            #print '--first--doors_id=',doors_id ,'type=',type(doors_id)

            is_many_doors = doors_id.__contains__(',')

            if is_many_doors:  #多门
                doors_id = doors_id.split(",")  #默认0,取全部
                #print '----doors_id=',doors_id
                doors_id_left = [
                    int(id) for id in doors_id if int(id) in door_limit
                ]  #当前需要的---不过滤也可以
                devices = Device.objects.filter(
                    accdoor__pk__in=doors_id_left).distinct()
                #print '---devices=',devices
            elif doors_id == '0':  #没有area_id,device_id,door_id的请求--door_id实际不可能为0
                #print '----none----'
                devices = Device.objects.filter(area__pk__in=a_limit)
            else:  #单门
                devices = Device.objects.filter(
                    accdoor__pk=int(doors_id)).distinct()

    valid_devices_dict = {}
    valid_devices = devices.filter(device_type=DEVICE_ACCESS_CONTROL_PANEL)
    for dev in valid_devices:
        valid_devices_dict[int(dev.id)] = dev
    #print '--@@@@@valid_devices_dict values=', valid_devices_dict.values()
    global g_dev_door_id  #记录dev和door id的关系
    for dev in valid_devices_dict.values():
        ids = dev.accdoor_set.values_list("id")
        g_dev_door_id[int(dev.id)] = [int(id[0]) for id in ids
                                      ]  #[(12L,), (11L,), (9L,), (10L,)]
    return valid_devices_dict
예제 #22
0
def get_device_monitor(request):
    try:
        global g_monitor_server
        if not g_monitor_server:
            g_monitor_server = start_dict_server()
        service_enable = check_service_commcenter(g_monitor_server)

        dev_monitor_list = g_monitor_server.get_from_dict("DEV_MONITOR_LIST")
        device_added = g_monitor_server.get_from_dict(
            "DEVICE_ADDED_MONITOR")  #新增
        device_delete = g_monitor_server.get_from_dict(
            "DEVICE_DELETE_MONITOR")  #删除和编辑
        #print '------dev_monitor_list=',dev_monitor_list
        if not dev_monitor_list or device_added or device_delete:  #意味着有新增、编辑或者删除操作的(任意一个)
            #print '---monitor device not exist'
            u = request.user
            aa = u.areaadmin_set.all()
            a_limit = aa and [int(a.area_id) for a in aa] or [
                int(area.pk) for area in Area.objects.all()
            ]  #非超级管理员且没有配置有效区域(默认全部)的有效区域id列表(即用户手动配置过用户区域的)
            dev_monitor_list = Device.objects.filter(
                area__pk__in=a_limit).filter(
                    device_type=DEVICE_ACCESS_CONTROL_PANEL).order_by(
                        'id')  #当前用户授权范围内的门禁控制器
            #g_dev_monitor_list = dev_list
            g_monitor_server.set_to_dict(
                "DEV_MONITOR_LIST",
                [dev for dev in dev_monitor_list])  #QuerySet无法直接pickle
            if device_added:
                g_monitor_server.set_to_dict("DEVICE_ADDED_MONITOR", 0)
            if device_delete:
                g_monitor_server.set_to_dict("DEVICE_DELETE_MONITOR", 0)

        cdatas = []

        for dev in dev_monitor_list:
            ret = 0
            op_type = ""
            op_state = ""

            key = dev.command_temp_list_name()  #ICLOCK_%s_TMP#
            #print '-!!!!!!!!!!!-key=',key
            ucmd = g_monitor_server.get_from_dict(key)  #tmp 获取设备通讯状态
            #print '-----get device monitor =',g_monitor_server.llen_file(key)
            #print '--------get-device-monitor====ucmd====',ucmd
            q_server = queqe_server()
            #cmdcount = q_server.llen_file(dev.new_command_list_name())#新命令NEWCMDS_%scmdcount = g_monitor_server.llen(dev.new_command_list_name())#NEWCMDS_%s
            q_server.connection.disconnect()
            cntkey = dev.command_count_key()  #ICLOCK_%s_CMD
            #print '---------cntkey=',cntkey
            cnt = g_monitor_server.get_from_dict(cntkey)  #从缓存dict中获取命令总条数

            if cnt is None:
                cnt = "0"
            if cnt.find('\x00'):
                cnt = cnt.strip('\x00')
            try:
                cnt = int(cnt)
            except:
                cnt = 0

            reason = ""
            if service_enable:
                if ucmd is None:  #ucmd为None代表没有其他状态
                    if not dev.enabled:  #设备被禁用
                        #g_monitor_server.set_to_dict()
                        op_type = get_cmd_content("CONNECT")  #
                        ret = '-1002'  #警告 <-1000
                        op_state = unicode(DEVICE_COMMAND_RETURN[ret])

                    else:  #没有其他状态时的默认状态
                        op_type = get_cmd_content("CONNECT")  #
                        ret = '1001'  # 正在连接
                        op_state = unicode(DEVICE_COMMAND_RETURN[ret])
                else:
                    #print '----ucmd=',ucmd,'----type=',type(ucmd)
                    #print '---ret=',ret
                    ret = ucmd['CmdReturn']
                    op_type = get_cmd_content(ucmd['CmdContent'])
                    if ret >= 0:
                        op_state = unicode(DEVICE_COMMAND_RETURN["0"])
                    else:
                        try:
                            op_state = unicode(DEVICE_COMMAND_RETURN[str(ret)])
                        except:
                            op_state = _(u"%(f)s:错误代码%(ff)d") % {
                                "f": DEVICE_COMMAND_RETURN["-1001"],
                                "ff": ret
                            }
            else:
                op_type = get_cmd_content("CHECK_SERVICE")
                ret = '-1003'  #警告 <-1000
                op_state = unicode(DEVICE_COMMAND_RETURN[ret])

            cdata = {
                'id': dev.id,
                'devname': dev.alias,
                'sn': dev.sn,
                'op_type': op_type,  #操作类型
                'op_state': op_state,  #当前操作状态
                'retmemo': reason,
                'ret': ret,
                'CmdCount': cnt,
            }

            cdatas.append(cdata)

        cc = {'data': cdatas}
        #g_monitor_server.close()
        #g_monitor_server.connection.disconnect()
        rtdata = simplejson.dumps(cc)
        return HttpResponse(smart_str(rtdata))
    except Exception, e:
        print '---e=', e