Example #1
0
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)
Example #2
0
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)
Example #3
0
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
Example #4
0
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)
Example #5
0
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
Example #6
0
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()
Example #7
0
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)
Example #8
0
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)
Example #9
0
            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