diff --git a/daemon.py b/daemon.py new file mode 100644 index 0000000..4d54d1d --- /dev/null +++ b/daemon.py @@ -0,0 +1,110 @@ +import paho.mqtt.client as mqtt +import ldap +import traceback +from peewee import * +from db_models import * +import config + +class AuthStatus: + SUCCESS = 0 + LDAP_ERR = -1 + NO_LDAP_ENTRY = -2 + NO_SUCH_USER = -3 + ACCESS_DEINED = -4 + EXCEPTION = -1000 + +client=mqtt.Client() + +def verify_with_ldap(studnum): + passed = False + status = AuthStatus.LDAP_ERR + conn = ldap.initialize(config.LDAP_URI) + conn.protocol_version = 3 + conn.set_option(ldap.OPT_REFERRALS, 0) + try: + bind_result = conn.simple_bind_s(config.LDAP_USER, config.LDAP_PASS) + search_results = conn.search_s( + 'DC=ad,DC=thu-skyworks,DC=org', + ldap.SCOPE_SUBTREE, + "cn=*", + ) + print("LDAP: Succesfully authenticated") + passed = True + status = AuthStatus.SUCCESS + except ldap.INVALID_CREDENTIALS: + print("LDAP: Invalid credentials") + except ldap.SERVER_DOWN: + print("LDAP: Server down") + except ldap.LDAPError as e: + if type(e.message) == dict and e.message.has_key('desc'): + print("LDAP: Other LDAP error: " + e.message['desc']) + else: + print("LDAP: Other LDAP error: " + e) + finally: + conn.unbind_s() + return passed, status + +def log_handle(msg): + print("[client]" + str(msg.payload)) + +def verify_card(msg): + card_number = '{:010d}'.format(int(msg.payload)) + status = AuthStatus.EXCEPTION + try: + one = AccountInfo.select().where(AccountInfo.cardnum == card_number).get() + + print("Access Request by", one.studnum, one.realname) + + success, status = verify_with_ldap(one.studnum) + if success: + client.publish("/command", "open") + print("Valid card, opening the door") + else: + print("Invalid card:", card_number) + AccessRecords.create( + realname = one.realname, + studnum = one.studnum, + cardnum = one.cardnum, + status = status, + ).save() + + except AccountInfo.DoesNotExist: + print("No Records Found for {}".format(msg.payload)) + AccessRecords.create( + cardnum = card_number, + status = AuthStatus.NO_SUCH_USER, + ).save() + except Exception as e: + + AccessRecords.create( + cardnum = card_number, + status = AuthStatus.EXCEPTION, + ).save() + + raise e + + +topics = {"/log": log_handle, "/rs485": log_handle, "/cardverify": verify_card} + +def on_connect(client, userdata, flags, rc): + print("Connected to MQTT broker with result code " + str(rc)) + client.subscribe("/cardverify") + client.subscribe("/rs485") + client.subscribe("/log") + +def on_message(client, userdata, msg): + # print("Received message " + str(msg.payload) + " from topic " + msg.topic) + try: + topics.get(msg.topic)(msg) + except Exception as e: + traceback.print_exc() + +DB_Init() + +client.on_connect = on_connect +client.on_message = on_message + +client.username_pw_set(config.MQTT_USER, config.MQTT_PASSWORD) +client.connect(config.MQTT_BROKER, 1883) + +client.loop_forever() diff --git a/db_models.py b/db_models.py new file mode 100644 index 0000000..7bfea5f --- /dev/null +++ b/db_models.py @@ -0,0 +1,36 @@ +from peewee import * +import datetime +import config + +mysql_db = MySQLDatabase(config.DBNAME, user=config.DBUSER, passwd=config.DBPASS, charset="utf8mb4") + +class BaseModel(Model): + class Meta: + database = mysql_db + +class AccountInfo(BaseModel): + realname = CharField() + studnum = CharField(unique=True) + cardnum = CharField(index=True,unique=True) + cardtype= IntegerField() + userid = CharField() + + +class AccessRecords(BaseModel): + realname = CharField(default='') + studnum = CharField(default='') + cardnum = CharField(default='') + status = IntegerField() + created = DateTimeField(index=True, default=datetime.datetime.now) + +def DB_Init(): + mysql_db.connect() #连接数据库 + mysql_db.create_tables([AccountInfo, AccessRecords], safe=True) + # AccountInfo.create( + # realname = 'good one', + # studnum = '2017011234', + # cardnum = '0000080801', + # cardtype = 2, + # userid = 'test', + # ).save() + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..302bb63 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +PyMySQL ~= 0.9.2 +python-ldap ~= 3.1.0 +peewee ~= 2.10.0 +paho-mqtt ~= 1.3.1 \ No newline at end of file