diff --git a/env/models.py b/env/models.py new file mode 100644 index 0000000..c9a732a --- /dev/null +++ b/env/models.py @@ -0,0 +1,88 @@ +from django.db import models +from datetime import datetime + +class Spot(models.Model): + name = models.CharField(max_length=30, verbose_name='地点名称') + sn = models.CharField(max_length=20, verbose_name='设备序列号') + ip = models.CharField(max_length=15, verbose_name='设备IP') + def __str__(self): + return self.name + class Meta: + verbose_name_plural='地点设置' + +class Envdata(models.Model): + spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') + errcode = models.IntegerField(default=0, verbose_name='错误代码') + electricity = models.SmallIntegerField(default=1, verbose_name='供电') + fire = models.IntegerField(default=0, verbose_name='火情') + water = models.SmallIntegerField(default=0, verbose_name='漏水') + temperature = models.FloatField(default=0.0, verbose_name='温度') + humidity = models.FloatField(default=0.0, verbose_name='湿度') + rectime = models.DateTimeField(verbose_name='记录时间') + def __str__(self): + return self.spot.name + class Meta: + verbose_name_plural='采集数据' + +class Alarm(models.Model): + spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') + errcode = models.IntegerField(default=0, verbose_name='报警代码') + almname = models.CharField(max_length=20, null=True, verbose_name='报警名称') + almvalue = models.IntegerField(default=0, verbose_name='报警数值') + almtime = models.DateTimeField(verbose_name='报警时间') + def __str__(self): + return self.almname + class Meta: + verbose_name_plural='报警数据' + +class Sms(models.Model): + name = models.CharField(max_length=10, verbose_name='姓名') + phone = models.CharField(max_length=11, verbose_name='手机', null=True) + email = models.CharField(max_length=25, verbose_name='邮箱', null=True) + def __str__(self): + return self.name + class Meta: + verbose_name_plural='通讯设置' + +class Alarmset(models.Model): + spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') + connection = models.BooleanField(default=False, verbose_name='设备离线') + electricity = models.BooleanField(default=False, verbose_name='断电') + fire = models.BooleanField(default=False, verbose_name='火情') + water = models.BooleanField(default=False, verbose_name='漏水') + temperature = models.BooleanField(default=False, verbose_name='温度') + humidity = models.BooleanField(default=False, verbose_name='湿度') + def __str__(self): + return self.spot.name + class Meta: + verbose_name_plural='报警设置' + +class Sendlog(models.Model): + sendtype = models.CharField(max_length=8, default='mail', verbose_name='发送类型') + sendresult = models.BooleanField(default=True, verbose_name='发送结果') + sendto = models.CharField(max_length=200, default='', verbose_name='发送对象') + sendtime = models.DateTimeField(default=datetime.now(), verbose_name='发送时间') + def __str__(self): + return self.sendtype + class Meta: + verbose_name_plural = '发送日志' + +class Device(models.Model): + spot = models.CharField(max_length=20, verbose_name='设备序列号') + # servaddr = models.CharField(max_length=30, default='http://172.18.17.136:8000', verbose_name='服务器地址') + timespan = models.IntegerField(default=1, verbose_name='采集时间间隔') + afire = models.IntegerField(default=15000, verbose_name='火情报警阈值') + atemp = models.FloatField(default=32.0, verbose_name='温度报警阈值') + ahum = models.FloatField(default=75.0, verbose_name='湿度报警阈值') + def __str__(self): + return self.spot + class Meta: + verbose_name_plural = '设备管理' + +class Envchart(models.Model): + class Meta: + verbose_name_plural = '统计图表' + +class Sysmanager(models.Model): + class Meta: + verbose_name_plural = '系统管理' \ No newline at end of file diff --git a/env/netutil.py b/env/netutil.py new file mode 100644 index 0000000..d5845cc --- /dev/null +++ b/env/netutil.py @@ -0,0 +1,57 @@ +import subprocess, platform +import os, sys +import django +from datetime import datetime,timedelta + + +parDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir) +BASE_DIR = os.path.dirname(os.path.join(parDIR, os.pardir)) +sys.path.append(BASE_DIR) +print(BASE_DIR) +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'envdect.settings') +django.setup() + +from env.models import * +from env.envpost import save_alarm, send_alm_message +# from env.sms import sendSMS +from env.mail import sendmail + +alert_people = ['nfa@yeah.net',] + +def pingTEST(host): + res = False + try: + output = subprocess.check_output("ping -{} 6 {}".format('n' if platform.system().lower()=="windows" else 'c', host), shell=True) + if output.index(b'TTL=') > 0: + res = True + except: + return False + return res + +def online_dect(): + alms = Alarmset.objects.all() + for alm in alms: + host = alm.spot.ip + print('testing ip :', host) + r = pingTEST(host) + print('Testing result:', r) + if not r: + save_alarm(alm.spot, 7, '设备离线', 0) + if alm.connection: + send_alm_message(alm.spot, 7, '设备离线', 0) + +def device_dect(): + spots = Spot.objects.all() + for spot in spots: + device = Envdata.objects.filter(spot=spot).order_by('-rectime').first() + if device: + mailtext = '%s机房设备离线,请及时处理,上次提交数据时间:%s。' % (device.spot.name, datetime.strftime(device.rectime,'%Y-%m-%d %H:%M:%S')) + if datetime.now() - device.rectime >= timedelta(minutes=20): + sendmail(alert_people, '机房环境监测报警', mailtext) + +if __name__ == '__main__': + # host = input('Please input the IP address:') + # r = pingTEST(host) + # print(r) + # online_dect() + device_dect() diff --git a/env/sms.py b/env/sms.py new file mode 100644 index 0000000..209a2c9 --- /dev/null +++ b/env/sms.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from urllib import request,parse +import time,datetime + +def sendSMS(txtBody,phone): + url = 'http://sms.api.ums86.com:8899/sms/Api/Send.do' + data = { + 'SpCode': 'xxxxxx', + 'LoginName': 'cz_xxxxx', + 'Password': 'xxxxxxxx', + 'MessageContent': txtBody, + 'UserNumber': phone, + 'SerialNumber': getSerial(), + 'f': '1' + } + res = False + try: + data = parse.urlencode(data).encode('gb2312') + print(data) + req = request.Request(url, data=data) + page = request.urlopen(req).read() + page = page.decode('gb2312') + if 'result=0' in page: + res = True + except: + page = '' + print(page) + return res + +def getSerial(): + t = time.localtime() + h = '888018' + s = h + time.strftime('%Y%m%d%H%M%S', t) + return s + +if __name__ == '__main__': + pn = 18951210000 + txt = u'机房设备离线报警,请及时处理。报警代码:7,报警参数:0。' + r = sendSMS(txt.encode('gb2312'), pn) + print(r) diff --git a/env/tests.py b/env/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/env/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/env/urls.py b/env/urls.py new file mode 100644 index 0000000..c7cb40f --- /dev/null +++ b/env/urls.py @@ -0,0 +1,12 @@ +from django.urls import path, include +from .views import * + +urlpatterns = [ + path('time/', ntp_time, name='ntptime'), + path('api/', epost, name='envpost'), + path('envchart/', chart_index, name='chartindex'), + path('cmdmanager/', sys_cmd, name='sysmanager'), + path('cmd/', cmd_query, name='cmd'), + path('cmdqueue/', cmd_queue, name='cmdqueue'), + path('deviceinfo/', query_deviceinfo, name='deviceinfo'), +]