forked from cryptax/fittools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
donglelock.py
121 lines (100 loc) · 4.01 KB
/
donglelock.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env python
'''
__author__ = "Axelle Apvrille"
__status__ = "Alpha"
__copyright__ = "Copyright 2015, Fortinet, Fortiguard Labs"
__license__ = "MIT License"
Interesting refs:
https://stackoverflow.com/questions/469243/how-can-i-listen-for-usb-device-inserted-events-in-linux-in-python
http://pyudev.readthedocs.org/en/latest/api/pyudev.glib.html#pyudev.glib.MonitorObserver
Requires python-pyudev
'''
import glib
from pyudev import Context, Monitor
from pyudev.glib import GUDevMonitorObserver as MonitorObserver
import re
import subprocess
import argparse
monitored_idVendor = ''
monitored_idProduct = ''
monitored_serial = ''
monitored_path = ''
verbose = False
__version__ = '0.2'
def get_arguments():
parser = argparse.ArgumentParser(description='Tool that detects removal of USB devices', epilog = 'Version '+__version__+' - Greetz from Axelle Apvrille')
parser.add_argument('-v', '--verbose', help='get more detailed messages', action='store_true')
args = parser.parse_args()
global verbose
verbose = args.verbose
return args
def display_device_attributes(device):
print 'VendorId : {0}'.format(device.attributes.get('idVendor'))
print 'ProductId : {0}'.format(device.attributes.get('idProduct'))
print 'Manufacturer: {0}'.format(device.attributes.get('manufacturer'))
print 'Product : {0}'.format(device.attributes.get('product'))
print 'SerialNo : {0}'.format(device.attributes.get('serial'))
def add_event(observer, device):
global verbose
if verbose:
print 'Adding device (monitoring %s.%s)' % (monitored_idVendor, monitored_idProduct)
if device.attributes.get('idVendor') == monitored_idVendor and device.attributes.get('idProduct') == monitored_idProduct and device.attributes.get('serial') == monitored_serial:
# recording the device path
display_device_attributes(device)
print "You have just added the monitored device!"
global monitored_path
monitored_path = device.device_path
def remove_event(observer, device):
global verbose
if verbose:
print 'Removing device (monitoring %s.%s)' % (monitored_idVendor, monitored_idProduct)
if device.device_path == monitored_path:
if verbose:
display_device_attributes(device)
print "You have just removed the monitored device!"
# customize this command with your own!
subprocess.call(["mate-screensaver-command", "--lock"])
quit()
def monitor():
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
observer = MonitorObserver(monitor)
observer.connect('device-removed', remove_event)
observer.connect('device-added', add_event)
monitor.start()
glib.MainLoop().run()
def select_devices():
context = Context()
devices = context.list_devices(subsystem="usb")
num = 1
for dev in devices:
print "%02d- %s %s SerialNo: %s %s" % (num, dev.attributes.get('idVendor'), dev.attributes.get('idProduct'), dev.attributes.get('serial'), dev.attributes.get('manufacturer'))
num += 1
try:
choice = int(raw_input("Select device: [1-%d] " % (num)))
except ValueError:
print "Please enter a number!"
quit()
assert choice >=1 and choice <= num, "Please enter a valid number"
num = 1
for dev in devices:
if num == choice:
global verbose
if verbose:
print "Selected device: "
display_device_attributes(dev)
global monitored_idVendor
monitored_idVendor = dev.attributes.get('idVendor')
global monitored_idProduct
monitored_idProduct = dev.attributes.get('idProduct')
global monitored_serial
monitored_serial = dev.attributes.get('serial')
global monitored_path
monitored_path = dev.device_path
break
num +=1
if __name__ == '__main__':
args = get_arguments()
select_devices()
monitor()