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 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)
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) else: try: with db.begin_nested(): # 이미 그룹이 존재한다. e = Elements(group_id=group.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) #5. 해당 엘리먼트의 하위에 하드웨어들을 등록하면서 랜덤 SHA1 을 등록한다. hws = data["HardwareList"] hws_sha1_dict = {} for hw_name in hws.keys():
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)