diff --git a/.gitignore b/.gitignore index 8bfd033..aa3c9c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ debian/tmp/ +debian/debhelper-build-stamp debian/python3-validity/ debian/python3-validity.substvars debian/python3-validity.prerm.debhelper diff --git a/dbus_service/50-python-validity.rules b/dbus_service/50-python-validity.rules deleted file mode 100644 index d2dcfee..0000000 --- a/dbus_service/50-python-validity.rules +++ /dev/null @@ -1,4 +0,0 @@ -# TODO me - -ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", TAG+="systemd", ENV{SYSTEMD_WANTS}+="python-validity@usb-$env{BUSNUM}-$env{DEVNUM}.service" - diff --git a/dbus_service/dbus-service b/dbus_service/dbus-service index 55332ec..62ca9df 100755 --- a/dbus_service/dbus-service +++ b/dbus_service/dbus-service @@ -5,6 +5,7 @@ import re import dbus import dbus.mainloop.glib import dbus.service +from binascii import hexlify, unhexlify dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) from gi.repository import GObject, GLib import logging @@ -147,6 +148,12 @@ class Device(dbus.service.Object): def EnrollStatus(self, result, done): logging.debug('EnrollStatus') + @dbus.service.method(dbus_interface=INTERFACE_NAME, + in_signature='s', + out_signature='s') + def RunCmd(self, cmd): + logging.debug('RunCmd') + return hexlify(tls.app(unhexlify(cmd))).decode() if __name__ == '__main__': parser = argparse.ArgumentParser('Open fprintd DBus service') diff --git a/dbus_service/python-validity@.service b/dbus_service/python-validity@.service deleted file mode 100644 index 81d9212..0000000 --- a/dbus_service/python-validity@.service +++ /dev/null @@ -1,12 +0,0 @@ -# TODO me - -[Unit] -Description=python-validity driver dbus service for %I - -[Service] -Type=simple -ExecStart=/usr/lib/python-validity/dbus-service %i -Restart=no - -#[Install] -#WantedBy=multi-user.target diff --git a/debian/compat b/debian/compat index ec63514..b4de394 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -9 +11 diff --git a/debian/control b/debian/control index f33b6e5..b05af9f 100644 --- a/debian/control +++ b/debian/control @@ -2,12 +2,12 @@ Source: python-validity Section: misc Priority: optional Maintainer: uunicorn -Build-Depends: debhelper (>= 7.0.50~), +Build-Depends: debhelper (>= 11~), dh-python, python3-all, python3-setuptools X-Python3-Version: >= 3.6 -Standards-Version: 3.9.2 +Standards-Version: 4.1.4 Package: python3-validity Architecture: all diff --git a/debian/python3-validity.postinst b/debian/python3-validity.postinst new file mode 100644 index 0000000..0a27942 --- /dev/null +++ b/debian/python3-validity.postinst @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +#DEBHELPER# + +if [ "$1" = "configure" ]; then + systemctl daemon-reload || true + udevadm control --reload-rules || true + udevadm trigger || true +fi + diff --git a/debian/python3-validity.prerm b/debian/python3-validity.prerm new file mode 100644 index 0000000..3f77718 --- /dev/null +++ b/debian/python3-validity.prerm @@ -0,0 +1,12 @@ +#! /bin/sh + +set -e + +# Stop the socket on remove so syslog-ng is not restarted via socket activation +if [ -x "/usr/bin/deb-systemd-invoke" ] && [ "$1" = remove ]; then + deb-systemd-invoke stop 'python3-validity@*' || true +fi + +#DEBHELPER# + +exit 0 diff --git a/debian/python3-validity.udev b/debian/python3-validity.udev new file mode 100644 index 0000000..776cf26 --- /dev/null +++ b/debian/python3-validity.udev @@ -0,0 +1,19 @@ +SUBSYSTEM!="usb", GOTO="python_validity_end" +ENV{DEVTYPE}!="usb_device", GOTO="python_validity_end" + +ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0090", GOTO="python_validity_match" +ATTRS{idVendor}=="138a", ATTRS{idProduct}=="0097", GOTO="python_validity_match" +ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="009a", GOTO="python_validity_match" + +GOTO="python_validity_end" + +LABEL="python_validity_match" + +#TAG+="validity" + +ACTION=="add|change", RUN+="/bin/systemctl --no-block start python3-validity@usb-$env{BUSNUM}-$env{DEVNUM}.service" +ACTION=="remove", RUN+="/bin/systemctl --no-block stop python3-validity@usb-$env{BUSNUM}-$env{DEVNUM}.service" +# TODO: Figure out why the following is not working properly instead: +#TAG+="systemd", ENV{SYSTEMD_WANTS}+="python3-validity@usb-$env{BUSNUM}-$env{DEVNUM}.service" + +LABEL="python_validity_end" diff --git a/debian/python3-validity@.service b/debian/python3-validity@.service new file mode 100644 index 0000000..03bf2fd --- /dev/null +++ b/debian/python3-validity@.service @@ -0,0 +1,9 @@ +[Unit] +Description=python-validity driver dbus service for %I +#StopWhenUnneeded=true + +[Service] +Type=simple +ExecStart=/usr/lib/python-validity/dbus-service --devpath %i +Restart=no + diff --git a/debian/rules b/debian/rules index 541e53b..125f295 100755 --- a/debian/rules +++ b/debian/rules @@ -5,6 +5,10 @@ %: dh $@ --with python3 --buildsystem=pybuild +override_dh_installsystemd: + dh_installsystemd + + override_dh_auto_install: python3 ./setup.py install --root=$(CURDIR)/debian/tmp --prefix=/usr --install-layout=deb diff --git a/scripts/dbus-cmd.py b/scripts/dbus-cmd.py new file mode 100755 index 0000000..d6658db --- /dev/null +++ b/scripts/dbus-cmd.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import argparse +import re +import dbus +import dbus.mainloop.glib +dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) +from gi.repository import GObject, GLib +import sys + +bus = dbus.SystemBus() +o = bus.get_object('net.reactivated.Fprint', '/net/reactivated/Fprint/Manager', introspect=False) +o = o.GetDefaultDevice() +o = bus.get_object('net.reactivated.Fprint', o, introspect=False) +o = dbus.Interface(o, 'net.reactivated.Fprint.Device') +print(o.RunCmd(sys.argv[1])) diff --git a/factory-reset.py b/scripts/factory-reset.py similarity index 100% rename from factory-reset.py rename to scripts/factory-reset.py diff --git a/scripts/lsdbus.py b/scripts/lsdbus.py new file mode 100755 index 0000000..637e255 --- /dev/null +++ b/scripts/lsdbus.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import argparse +import re +import dbus +import dbus.mainloop.glib +dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) +from gi.repository import GObject, GLib + +import pwd + +bus = dbus.SystemBus() +o = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') +o = dbus.Interface(o, 'org.freedesktop.DBus') +ls = o.ListNames() +for n in ls: + if n[0] != ':': + continue + + pid = o.GetConnectionUnixProcessID(n) + + with open('/proc/%d/cmdline' % pid) as f: + s=f.read() + s=s.split('\0') + print('%-10s %-5d %s' % (n, pid, ' '.join(s))) diff --git a/pair.py b/scripts/pair.py similarity index 100% rename from pair.py rename to scripts/pair.py diff --git a/prototype.py b/scripts/prototype.py similarity index 100% rename from prototype.py rename to scripts/prototype.py diff --git a/setup.py b/setup.py index c1f33a4..9309715 100755 --- a/setup.py +++ b/setup.py @@ -15,8 +15,14 @@ setup(name='python-validity', 'pyusb >= 1.0.2' ], data_files=[ - ('share/python-validity/playground/', ['factory-reset.py', 'pair.py', 'prototype.py']), ('share/dbus-1/system.d/', ['dbus_service/io.github.uunicorn.Fprint.conf']), ('lib/python-validity/', ['dbus_service/dbus-service']), + ('share/python-validity/playground/', [ + 'scripts/dbus-cmd.py', + 'scripts/lsdbus.py', + 'scripts/factory-reset.py', + 'scripts/pair.py', + 'scripts/prototype.py' + ]), ] )