diff --git a/mms2mail b/mms2mail index 69c35f6..a8fa85c 100755 --- a/mms2mail +++ b/mms2mail @@ -25,8 +25,6 @@ if sys.version_info[0] == 3 and sys.version_info[1] > 8: import argparse import configparser -import re -import time import getpass import socket import mimetypes @@ -38,8 +36,6 @@ from marrow.mailer import Mailer, Message from gi.repository import GLib import dbus import dbus.mainloop.glib -from watchdog.observers import Observer -from watchdog.events import FileSystemEventHandler class MMS2Mail: @@ -214,74 +210,21 @@ class MMS2Mail: self.mailer.stop() -class FSWatcher: - """ - Use OS filesystem notification to watch for new MMS (DEPRECATED). - - Events are send to the FSHandler class - """ - - # Path to modemmanager storage - mms_folder = f"{Path.home()}/.mms/modemmanager" - - def __init__(self): - """Construct an instance.""" - self.observer = Observer() - self.patternold = re.compile('[0-9A-F]{40}$') - self.pattern = re.compile('[0-9a-f]{36}$') - - def is_mmsd_mms_file(self, path): - """ - Test if the provided file seems to be a mms file created by mmsd. - - :param path: the mms filesystem path - :type path: str - - :rtype boolean - :return: the test result - """ - if self.pattern.search(path) or self.patternold.search(path): - return True - else: - return False - - def run(self): - """Run the watcher mainloop.""" - event_handler = FSHandler() - self.observer.schedule(event_handler, self.mms_folder, recursive=False) - self.observer.start() - try: - while True: - time.sleep(5) - finally: - self.observer.stop() - self.observer.join() - - -class FSHandler(FileSystemEventHandler): - """Handle the FSWatcher event.""" - - @staticmethod - def on_any_event(event): - """Trigger conversion on event by the FSWatcher.""" - if event.is_directory: - return None - elif event.event_type == 'created' or event.event_type == 'modified': - if w.is_mmsd_mms_file(event.src_path): - print(f"New MMS found : {event.src_path}.", file=sys.stderr) - m.convert(event.src_path) - elif event.event_type == 'moved': - if w.is_mmsd_mms_file(event.dest_path): - print(f"New MMS found : {event.dest_path}.", file=sys.stderr) - m.convert(event.dest_path) - - class DbusWatcher(): """Use DBus Signal notification to watch for new MMS.""" + def __init__(self, mms2mail): + """ + Return a DBusWatcher instance. + + :param mms2mail: An mms2mail instance to convert new mms + :type mms2mail: mms2mail() + """ + self.mms2mail = mms2mail + def run(self): """Run the watcher mainloop.""" - bus = m.get_bus() + bus = self.mms2mail.get_bus() bus.add_signal_receiver(self.message_added, bus_name="org.ofono.mms", signal_name="MessageAdded", @@ -289,25 +232,29 @@ class DbusWatcher(): path_keyword="path", interface_keyword="interface") mainloop = GLib.MainLoop() - mainloop.run() + print("Starting DBus watcher mainloop") + try: + mainloop.run() + except KeyboardInterrupt: + print("Stopping DBus watcher mainloop") + mainloop.quit() def message_added(self, name, value, member, path, interface): """Trigger conversion on MessageAdded signal.""" if value['Status'] == 'downloaded' or value['Status'] == 'received': print(f"New incoming MMS found ({name.split('/')[-1]})") - m.convert(value['Attachments'][0][2], name) + self.mms2mail.convert(value['Attachments'][0][2], name) else: print(f"New outgoing MMS found ({name.split('/')[-1]})") -if __name__ == '__main__': +def main(): + """Run the different functions handling mms and mail.""" parser = argparse.ArgumentParser() mode = parser.add_mutually_exclusive_group() mode.add_argument("-d", "--daemon", - help="Use dbus signal from mmsd by default but can also \ - watch mmsd storage folder (useful for mmsd < 1.0)", - nargs="?", default="dbus", - choices=['dbus', 'filesystem'], dest='watcher') + help="Use dbus signal from mmsd to trigger conversion", + action='store_true', dest='watcher') mode.add_argument("-f", "--file", nargs='+', help="Parse specified mms files and quit", dest='files') parser.add_argument('--delete', action='store_true', dest='delete', @@ -322,13 +269,13 @@ if __name__ == '__main__': if args.files: for mms_file in args.files: m.convert(mms_file) - elif args.watcher == 'dbus': - print("Starting mms2mail in daemon mode with dbus watcher") - w = DbusWatcher() - w.run() - elif args.watcher == 'filesystem': - print("Starting mms2mail in daemon mode with filesystem watcher") - w = FSWatcher() + elif args.watcher: + print("Starting mms2mail in daemon mode") + w = DbusWatcher(m) w.run() else: parser.print_help() + + +if __name__ == '__main__': + main() diff --git a/mms2mail.service b/mms2mail.service index 82703d8..4f24954 100644 --- a/mms2mail.service +++ b/mms2mail.service @@ -3,7 +3,7 @@ Description=Multimedia Messaging Service to Mail converter Daemon After=mmsd.service [Service] -ExecStart=python3 %h/.local/bin/mms2mail -d dbus +ExecStart=python3 %h/.local/bin/mms2mail -d Restart=on-failure RestartSec=10s