#!/usr/bin/python3 # Auto import script for media devices import os from posixpath import ismount import sys import time import subprocess import datetime import shutil import json import logging from random import randrange from paho.mqtt import client as mqtt_client class mqtt_sender(): def __init__(self, broker, port, name, password): self.broker = broker self.name = name self.password = password self.port = port client_id = "dasdasdasd333" try: client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, client_id) except: client = mqtt_client.Client() client.username_pw_set(self.name, self.password) def send_mqtt_message(_self, topic, msg): try: _self.client.connect(_self.broker,_self.port,60) _self.client.publish(topic, json.dumps(msg)) _self.client.disconnect() except ValueError as e: print("Failed to send") print(e) mqtt_s = mqtt_sender("mqtt.home.lan", 1883, "jaydee", "l4c1j4yd33Du5lo") mqtt_s.send_mqtt_message("sectorq/auto_import/import", {"status": "started"}) # Log file location and log level LOG_FILE = "/tmp/auto_import.log" _LOG_LEVEL = "DEBUG" # Configure logging based on log level if _LOG_LEVEL == "DEBUG": logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.debug('using debug loging') elif _LOG_LEVEL == "ERROR": logging.basicConfig(filename=LOG_FILE, level=logging.ERROR, format='%(asctime)s : %(levelname)s : %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.info('using error loging') elif _LOG_LEVEL == "SCAN": logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.info('using error loging') else: logging.basicConfig(filename=LOG_FILE, level=logging.INFO, format='%(asctime)s : %(levelname)s : %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.info("script started") # Get current process id and check for duplicate running processes pid = os.getpid() cmnd = "ps -ef|grep test.py|grep -v grep" status, output = subprocess.getstatusoutput(cmnd) logging.info(output) logging.info(pid) pid = os.getpid() cmnd = "ps -ef|grep test.py|grep -v grep |grep -v {}|wc -l".format(pid) status, output = subprocess.getstatusoutput(cmnd) if int(output) > 0: logging.info("Running already!") sys.exit() # List all disk UUIDs and write output to a temp file myCmd = "ls /dev/disk/by-uuid" status, output = subprocess.getstatusoutput(myCmd) f = open("/tmp/lalala", "w") contents = f.write(output) f.close() # Set destination and initialize variables _DEST = "/media/nas/nas-photo/imported" _DEV = "" import_drives = [] drives = ["6362-3938","3239-3439", "5766-67E6","5766-67A3"] # Log current user and id myCmd = "id" status, output = subprocess.getstatusoutput(myCmd) logging.debug(output) myCmd = "whoami" status, output = subprocess.getstatusoutput(myCmd) logging.debug(output) myCmd = "ls /dev/disk/by-uuid" status, output = subprocess.getstatusoutput(myCmd) # Find drives to import for l in output.splitlines(): if l in drives: logging.debug(l) import_drives.append(l) # Main import loop for each drive for d in import_drives: logging.debug(f"Working on {d}") _DEV_MOUNT = f"/mnt/{d}" _DEV_DIR = f"{_DEV_MOUNT}/DCIM" _IMP_FILE = f"{_DEV_MOUNT}/auto_import" _DEV_DATA = f"{_DEV_MOUNT}/MISC/version.txt" myCmd = f"mkdir -p {_DEV_MOUNT}" logging.debug(myCmd) status, output = subprocess.getstatusoutput(myCmd) myCmd = f"sudo mount --uuid {d} {_DEV_MOUNT}" #myCmd = f"sudo mount /dev/sde1 {_DEV_MOUNT}" logging.debug(myCmd) status, output = subprocess.getstatusoutput(myCmd) logging.debug(output) if os.path.ismount(_DEV_MOUNT): # If version.txt exists, parse device info if os.path.exists(_DEV_DATA): file = open(_DEV_DATA, 'r') content = file.read() file.close() strToReplace = ',' replacementStr = '' strToReplaceReversed = strToReplace[::-1] replacementStrReversed = replacementStr[::-1] strValue = content[::-1].replace(strToReplaceReversed, replacementStrReversed, 1)[::-1] c = content.replace("\n","") logging.debug("--------------") logging.debug(c[-2]) logging.debug("--------------") logging.debug(strValue) _DEV_CONT = json.loads(strValue) logging.debug(_DEV_CONT) logging.debug(_DEV_CONT["wifi mac"]) wifimac = _DEV_CONT["wifi mac"] # Identify device by wifi mac if wifimac == "2474f742c017": _DEV = "gopro9_1" logging.debug("gopro9_1 registered") elif wifimac == "XXXDJIMINI4": _DEV = "dji_mini_4" logging.debug("dji_mini_4 registered") # If auto_import file exists and device is not set, read device info if os.path.exists(_IMP_FILE) and _DEV == "": logging.debug("path exist") time.sleep(5) if _DEV == "": file = open(_IMP_FILE, 'r') content = file.read() _DEV = json.loads(content)["device"] file.close() x = datetime.datetime.now() logging.debug(x.year) _DAT = x.strftime("%Y%m%d") # If DCIM folder is empty, unmount and continue if len(os.listdir(_DEV_DIR)) == 0: logging.debug("Folder is empty!") myCmd = f"umount {_DEV_DIR}" status, output = subprocess.getstatusoutput(myCmd) time.sleep(5) continue # myCmd = "/sbin/hal_app --se_buzzer enc_id=0,mode=101;sleep 1;/sbin/hal_app --se_buzzer enc_id=0,mode=101;sleep 1;/sbin/hal_app --se_buzzer enc_id=0,mode=101" # status, output = subprocess.getstatusoutput(myCmd) # If device is set and DCIM exists, move files by date if not _DEV == "": if os.path.exists(_DEV_DIR): for file_or_dir in os.listdir(_DEV_DIR): FULL_PATH = os.path.join(_DEV_DIR, file_or_dir) logging.debug(f"Full path : {FULL_PATH}") if os.path.isdir(FULL_PATH): logging.debug(f"Folder: {file_or_dir}") for filename in os.listdir(FULL_PATH): logging.debug(filename) c_time = os.path.getctime("{}/{}".format(FULL_PATH,filename)) dt_c = datetime.datetime.fromtimestamp(c_time) logging.debug(dt_c) _CDAT = dt_c.strftime("%Y-%m-%d") logging.debug(_CDAT) _FDEST = "{}/{}/{}".format(_DEST,_DEV, _CDAT) if not os.path.exists(_FDEST): cmnd = "mkdir -p {}".format(_FDEST) status, output = subprocess.getstatusoutput(cmnd) logging.debug("Moving file {} into {}".format(filename, _FDEST)) try: shutil.move("{}/{}".format(FULL_PATH,filename),_FDEST) except: try: shutil.move("{}/{}".format(FULL_PATH,filename),"{}/{}".format(_FDEST,filename)) except: logging.debug("failed to move file {}".format(filename)) logging.debug("Umounting") myCmd = f"sudo umount {_DEV_MOUNT}" status, output = subprocess.getstatusoutput(myCmd) logging.debug(output) logging.debug(status) #myCmd = "/sbin/hal_app --se_buzzer enc_id=0,mode=100" subprocess.getstatusoutput(myCmd) else: logging.debug(f"File: {file_or_dir}") try: shutil.move("{}/{}".format(_DEV_DIR,file_or_dir),_FDEST) except: try: shutil.move("{}/{}".format(_DEV_DIR,file_or_dir),"{}/{}".format(_FDEST,file_or_dir)) except: logging.debug("failed to move file {}".format(file_or_dir)) else: logging.debug("Nothing to import") else: logging.debug("Unknown device") else: logging.debug("Usb does not connected")