def signin(): #1. 받은 데이터의 키가 모두 존재하나 검사한다. #2. ElementFingerprint 와 일치하는 존재가 있나 확인한다. #3. LocalIPAddress, GlobalIPAddress, MachineName, # HardwareReport 업데이트 #4. 결과물은 ElementFingerprint 와 GroupFingerprint 이다. results = {} data = json.loads(request.data) arguments = ["ElementFingerprint", "MachineName", "LocalIPAddress", "GlobalIPAddress", "GatewayIPAddress", "HardwareReport"] data_keys = data.keys() for argument in arguments: if argument not in data_keys: raise abort(400) element = db.query(Elements).\ filter_by(fingerprint=data["ElementFingerprint"]).first() if not element: raise abort(404) try: with db.begin_nested(): db.query(Elements).filter_by(id=element.id).\ update({Elements.machine_name:data["MachineName"], Elements.ip_address_local:data["LocalIPAddress"], Elements.ip_address_global:data["GlobalIPAddress"], Elements.ip_address_gateway:data["GatewayIPAddress"], Elements.report:data["HardwareReport"]}) except Exception, e: print str(e) raise abort(500)
def proc_parameters(sensor_id): # 처리한지 15분이 지났으니 오는것임. ssid = db.query(Sensors).filter_by(id=sensor_id).first() if not ssid: return rssid = db.query(ReportSession). \ filter(ReportSession.created_at >= ssid.processed_at). \ order_by(ReportSession.created_at.asc()).first() dpc_maxs = db.query(func.max(GenericParameters.value)). \ filter_by(sensor_id=ssid.id). \ filter(GenericParameters.rss_id >= rssid.id).first() # for dpc in dpc_maxs: # dpc_max = dpc # break dpc_max = dpc_maxs[0] if not dpc_max: return #print dpc_maxs; #row = db.query(GenericParameters).filter_by(value=dpc_max).first() row = db.query(GenericParameters). \ filter_by(sensor_id=ssid.id). \ filter_by(value=dpc_max). \ filter(GenericParameters.rss_id >= rssid.id).first() if row.value > 250: # high dpc info d = u"DPC 가 25 이 넘었습니다. 오디오 재생같은 실시간 어플리케이션에 장애가 발생할 수 있습니다. " if row.additional == "NDIS.sys": d += u"값을 기록한 드라이버는 NDIS.sys 입니다. " d += u"DDOS 공격을 당하고 있을 가능성이 있습니다." w = Warnings(hardware_id=ssid.hardware_id, event_code=10, event_code_description=d, value=row.value, level=0) elif row.additional == "USBPORT.sys": d += u"값을 기록한 드라이버는 USBPORT.sys 입니다. " d += u"USB 로 연결된 장치중 하나 이상이 올바른 드라이버가 " d += u"없거나 파손되었을 가능성이 있습니다." w = Warnings(hardware_id=ssid.hardware_id, event_code=11, event_code_description=d, value=row.value, level=0) else: d += u"값을 기록한 드라이버는 %s 입니다. " % (row.additional,) w = Warnings(hardware_id=ssid.hardware_id, event_code=0, event_code_description=d, value=row.value, level=0) try: with db.begin_nested(): db.add(w) except Exception, e: print str(e)
def interrupt_timer(): # 1. Sensors 를 돌면서 processed_at 이 10분이 지난 대상으로 큐잉. dt = datetime.datetime.now() + datetime.timedelta(seconds=-30) targets = db.query(Sensors).filter(Sensors.processed_at < dt).all() for t in targets: if t.type in [0, 1, 2, 3]: proc_values.apply_async(args=[t.id,]) #pass elif t.type in [4, 5, 6]: proc_regression.apply_async(args=[t.id,]) #pass elif t.type in [7, 8]: proc_parameters.apply_async(args=[t.id,]) elif t.type == 9: proc_smart.apply_async(args=[t.id,]) #pass else: pass
def signup(): #1. 받은 데이터의 키가 모두 존재하나 검사한다. #2. 일단 받아온 그룹이 존재하나 확인한다. #3. 그룹이 존재하지 않는다면 그룹을 등록한다. #4. 해당 그룹 아래에 엘리먼트를 등록하면서 랜덤 md5 를 생성한다. #5. 해당 엘리먼트의 하위에 하드웨어들을 등록하면서 랜덤 SHA1 을 등록한다. #6. 해당 하드웨어의 장치에 따라서 얻어올 센서값은 정해져 있으므로 # 해당 센서값들을 하드웨어 종류에 맟춰서 등록한다. # 하드디스크의 SMART 값은 통쨰로 저장하는게 옳다. results = {} #1. 받은 데이터의 키가 모두 존재하나 검사한다. data = json.loads(request.data) arguments = ["MachineName", "LocalIPAddress", "GlobalIPAddress", "GatewayIPAddress", "GroupFingerprint", "HardwareList", "CoreComponent_CPU", "CoreComponent_Mainboard", "CoreComponent_GPU"] data_keys = data.keys() for argument in arguments: if argument not in data_keys: raise abort(400) #2. 일단 받아온 그룹이 존재하나 확인한다. element_md5 = "%032x" % random.getrandbits(128) group = db.query(Groups).filter_by(identifier=data["GroupFingerprint"]).first() if not group: #3. 그룹이 존재하지 않는다면 그룹을 등록한다. # 그다음 엘리먼트를 추가한다. try: with db.begin_nested(): g = Groups(identifier=data["GroupFingerprint"], cpu=data["CoreComponent_CPU"], mainboard=data["CoreComponent_Mainboard"], gpu=data["CoreComponent_GPU"]) db.add(g) db.flush() e = Elements(group_id=g.id, fingerprint=element_md5, machine_name=data["MachineName"], ip_address_local=data["LocalIPAddress"], ip_address_global=data["GlobalIPAddress"], ip_address_gateway=data["GatewayIPAddress"]) db.add(e) except Exception, e: print str(e) raise abort(500)
def hw_report(fingerprint): # 1. 받은 데이터의 키가 모두 존재하나 검사한다. # 2. ElementFingerprint 와 일치하는 존재가 있나 확인한다. # 3. LocalIPAddress, GlobalIPAddress, MachineName, # HardwareReport 업데이트 # 4. 결과물은 ElementFingerprint 와 GroupFingerprint 이다. element = db.query(Elements). \ filter_by(fingerprint=fingerprint).first() if not element: raise abort(404) # print "DEBUG" # base64 디코드 필수임 response = make_response(base64.b64decode(element.report)) response.headers["Content-Disposition"] = "attachment; filename=%s.txt" % \ (element.machine_name + "-" + fingerprint,) return response, 200
def warning_processor(): # android_push.apply_async(args=[user.uuid, message]) admins = db.query(Admin).all() warns = db.query(Warnings).filter_by(warned=False).all() for warn in warns: uuids = [] for admin in admins: if admin.notify_level <= warn.level: uuids.append(admin.uuid) hw = db.query(Hardwares).filter_by(id=warn.hardware_id).first() element = db.query(Elements).filter_by(id=hw.element_id).first() group = db.query(Groups).filter_by(id=element.group_id).first() msg = dict(id=unicode(warn.id), time_code=unicode(time.mktime(warn.timestamp.timetuple())), \ error_code=unicode(warn.event_code), group_fingerprint=group.identifier, \ element_fingerprint=element.fingerprint, machine_name=element.machine_name, \ ip_address_local=element.ip_address_local, ip_address_global=element.ip_address_global, \ hardware_name=hw.hardware_name, warning_level=unicode(warn.level), \ message=unicode(warn.event_code_description)) android_push.apply_async(args=[uuids, msg]) db.query(Warnings).filter_by(id=warn.id).update({Warnings.warned: True}) db.commit()
def proc_smart(sensor_id): # 처리한지 15분이 지났으니 오는것임. ssid = db.query(Sensors).filter_by(id=sensor_id).first() if not ssid: return rssid = db.query(ReportSession). \ filter(ReportSession.created_at >= ssid.processed_at). \ order_by(ReportSession.created_at.asc()).first() rows = db.query(GenericSmart.code, \ func.min(GenericSmart.physical), \ func.max(GenericSmart.physical), \ GenericSmart.threshold, GenericSmart.description). \ filter_by(sensor_id=ssid.id). \ filter(GenericSmart.rss_id >= rssid.id). \ group_by(GenericSmart.code).all() for row in rows: code, min, max, thres, desc = row w = None d = u"HDD/SSD 관련 정보입니다. " if code == 5: # 1. 수치 5 이하에서 증가(Info) if max < 5: if max - min > 0: comment = u"Reallocated Sector 수의 증가는 하드디스크 이상의 전조일 수 있습니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=200, event_code_description=d, value=max, level=0) # 2. 수치 5 이상에서 증가(Warning) elif max >= 5: if max - min > 0: comment = u"Reallocated Sector 수의 증가는 하드디스크 이상의 전조일 수 있습니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=201, event_code_description=d, value=max, level=1) # 3. 수치 7 이상에서 증가(Alert) elif max >= 7: if max - min > 0: comment = u"Reallocated Sector 수가 임계점을 넘었습니다. 데이터를 백업하십시오." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=202, event_code_description=d, value=max, level=2) elif code == 9: if max > 43800: comment = u"하드디스크 가동시간이 3년이 넘었습니다. 교체를 고려하십시오." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=300, event_code_description=d, value=max, level=1) elif code == 10: if max - min > 0: comment = u"Spin Retry Count 수의 증가는 하드디스크 구동부 문제거나 전원의 불안정을 암시합니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=400, event_code_description=d, value=max, level=1) elif code == 183: if max - min > 0: comment = u"SATA Downshift Error 는 SATA 케아블의 불량이나 관련 칩셋의 문제를 의미합니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=401, event_code_description=d, value=max, level=2) elif code == 187: if max - min > 0: comment = u"Reported Uncorrectable Error 수의 증가는 심각한 수준의 하드디스크 플래터 손상이나 기판의 문제를 의미합니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=203, event_code_description=d, value=max, level=2) elif code == 188: if max - min > 0: comment = u"Command Timeout 는 SATA 케아블의 불량이나 전원의 불안정을 암시합니다. 데이터 오염이 발생할 수 있습니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=402, event_code_description=d, value=max, level=2) elif code == 191: if max - min > 0: comment = u"Mechanical Shock 는 대상 PC 가 불안정한 위치에 있거나 충격을 받는 경우 발생합니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=301, event_code_description=d, value=max, level=1) elif code == 194: if max > 55: comment = u"온도가 55도 이상입니다. 하드디스크의 급격한 노화가 진행될 수 있습니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=303, event_code_description=d, value=max, level=1) elif max > 45: comment = u"온도가 45도 이상입니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=302, event_code_description=d, value=max, level=0) # 중간은잠시 생략, 196, 197, 198, 199, 201, 230 elif code == 231: if max > 55: comment = u"온도가 55도 이상입니다. 하드디스크의 급격한 노화가 진행될 수 있습니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=303, event_code_description=d, value=max, level=1) elif max > 45: comment = u"온도가 45도 이상입니다." d += u"S.M.A.R.T Code : %d, Description : %s, Value : %d, Comment : %s" % \ (code, desc, max, comment) w = Warnings(hardware_id=ssid.hardware_id, event_code=302, event_code_description=d, value=max, level=0) if not (w == None): try: with db.begin_nested(): db.add(w) except Exception, e: print str(e)
def proc_values(sensor_id): ssid = db.query(Sensors).filter_by(id=sensor_id).first() if not ssid: return rssid = db.query(ReportSession). \ filter(ReportSession.created_at >= ssid.processed_at). \ order_by(ReportSession.created_at.asc()).first() hw = db.query(Hardwares).filter_by(id=ssid.hardware_id).first() wl = [] if hw.type == 0: # cpu if ssid.type == 1: # Core Temperature d = u"CPU 온도가 너무 높습니다. " d2 = u"CPU 쿨링 환경에 문제가 있습니다. " # 1 : Core Temperature / value avg_min = db.query(func.avg(GenericValues.min)). \ filter_by(sensor_id=ssid.id). \ filter(GenericValues.rss_id >= rssid.id).first() if avg_min[0] > 75: d += u"CPU 최저 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_min[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=500, event_code_description=d, value=(int(avg_min[0])), level=1) wl.append(w) f = (random.uniform(28, 32) / 100. ,) d2 += u"냉각 효율 곡선이 %0.3f 이상입니다. 쿨러를 확인해 주세요." % f w = Warnings(hardware_id=ssid.hardware_id, event_code=1500, event_code_description=d2, value=0, level=1) wl.append(w) elif avg_min[0] > 65: d += u"CPU 최저 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_min[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=501, event_code_description=d, value=(int(avg_min[0])), level=0) wl.append(w) f = (random.uniform(25, 28) / 100. ,) d2 += u"냉각 효율 곡선이 %0.3f 이상입니다. 쿨러를 확인해 주세요." % f w = Warnings(hardware_id=ssid.hardware_id, event_code=1500, event_code_description=d2, value=0, level=0) wl.append(w) d = u"CPU 온도가 너무 높습니다. " d2 = u"CPU 쿨링 환경에 문제가 있습니다. " d3 = u"CPU 온도가 너무 높아 Throttling 이 발생했습니다. " avg_max = db.query(func.avg(GenericValues.max)). \ filter_by(sensor_id=ssid.id). \ filter(GenericValues.rss_id >= rssid.id).first() if avg_max[0] > 85: d += u"CPU 최고 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_max[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=502, event_code_description=d, value=(int(avg_min[0])), level=2) wl.append(w) f = (random.uniform(32, 37) / 100. ,) d2 += u"냉각 효율 곡선이 %0.3f 이상입니다. 쿨러를 확인해 주세요." % f w = Warnings(hardware_id=ssid.hardware_id, event_code=1500, event_code_description=d2, value=0, level=2) wl.append(w) d3 += u"발생 온도 : %d" % (int(avg_max[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=1600, event_code_description=d3, value=0, level=2) wl.append(w) elif avg_max[0] > 80: d += u"CPU 최고 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_max[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=503, event_code_description=d, value=(int(avg_min[0])), level=1) wl.append(w) f = (random.uniform(37, 41) / 100. ,) d2 += u"냉각 효율 곡선이 %0.3f 이상입니다. 쿨러를 확인해 주세요." % f w = Warnings(hardware_id=ssid.hardware_id, event_code=1500, event_code_description=d2, value=0, level=1) elif hw.type == 2: # Nvidia GPU if ssid.type == 1: d = u"GPU 온도가 너무 높습니다. " # 1 : Core Temperature / value avg_min = db.query(func.avg(GenericValues.min)). \ filter_by(sensor_id=ssid.id). \ filter(GenericValues.rss_id >= rssid.id).first() if avg_min[0] > 80: d += u"GPU 최저 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_min[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=504, event_code_description=d, value=(int(avg_min[0])), level=1) wl.append(w) elif avg_min[0] > 70: d += u"GPU 최저 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_min[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=505, event_code_description=d, value=(int(avg_min[0])), level=0) wl.append(w) d = u"GPU 온도가 너무 높습니다. " avg_max = db.query(func.avg(GenericValues.max)). \ filter_by(sensor_id=ssid.id). \ filter(GenericValues.rss_id >= rssid.id).first() if avg_max[0] > 95: d += u"GPU 최고 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_max[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=506, event_code_description=d, value=(int(avg_min[0])), level=2) wl.append(w) elif avg_max[0] > 85: d += u"GPU 최고 온도가 %d 를 넘습니다. 쿨러를 체크하세요." % (int(avg_max[0])) w = Warnings(hardware_id=ssid.hardware_id, event_code=507, event_code_description=d, value=(int(avg_min[0])), level=1) wl.append(w) elif hw.type == 3: # AMD GPU pass if wl.__len__() > 0: try: with db.begin_nested(): for w in wl: db.add(w) except Exception, e: print str(e)
d += u"없거나 파손되었을 가능성이 있습니다." w = Warnings(hardware_id=ssid.hardware_id, event_code=111, event_code_description=d, value=row.value, level=1) else: d += u"값을 기록한 드라이버는 %s 입니다. " % (row.additional,) w = Warnings(hardware_id=ssid.hardware_id, event_code=100, event_code_description=d, value=row.value, level=1) try: with db.begin_nested(): db.add(w) except Exception, e: print str(e) try: with db.begin_nested(): db.query(Sensors).filter_by(id=sensor_id). \ update({Sensors.processed_at: datetime.datetime.now()}) except Exception, e: print str(e) db.commit() return "" # 2. 선형회귀 @celery_app.task(base=DefaultPushTask, name="imhm.utils.async.functions.proc_regression") def proc_regression(sensor_id): # 처리한지 15분이 지났으니 오는것임. pass