import logging logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.ERROR) import json import os import requests import sqlite3 import time CARD_DB_PATH = '/home/pi/production.sqlite3' CARD_PUSH_DELAY = 10 CARD_UPDATE_URL = 'https://tools-auth.protospace.ca/update-cards/' settings = json.load(open('settings.json')) request_headers = {'Authorization': 'Token ' + settings['token']} last_modified_time = None card_data = {} while True: try: modified_time = os.path.getmtime(CARD_DB_PATH) logging.info('modified_time: {}, last_modified_time: {}'.format(modified_time, last_modified_time)) if modified_time != last_modified_time: logging.info('Card database modified time is different, reading database...') conn = sqlite3.connect('file:' + CARD_DB_PATH + '?mode=ro', uri=True) c = conn.cursor() for row in c.execute('select owner, group_concat(serial) from cards where active=1 group by owner'): username = row[0].replace(' ', '.').lower() logging.info('Read name: {}, username: {}, cards: {}'.format(row[0], username, row[1])) card_data[username] = row[1] conn.close() last_modified_time = modified_time logging.info('Uploading card data to server...') r = requests.put(CARD_UPDATE_URL, headers=request_headers, data=card_data) if r.status_code == requests.codes.ok: logging.info('Number of cards updated: {}'.format(r.json()['updated'])) else: r.raise_for_status() except BaseException as e: logging.error(e) time.sleep(CARD_PUSH_DELAY)