xscreen_usb_unlocker 0.90.2 → 0.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +11 -12
- data/RELEASE.md +10 -0
- data/bin/xscreen_usb_unlocker +45 -54
- data/lib/xscreen_usb_unlocker.rb +50 -1
- data/lib/xscreen_usb_unlocker/config.rb +3 -3
- data/lib/xscreen_usb_unlocker/log.rb +6 -3
- data/lib/xscreen_usb_unlocker/optparser.rb +0 -7
- data/lib/xscreen_usb_unlocker/version.rb +1 -1
- metadata +3 -2
data/README.md
CHANGED
@@ -10,31 +10,31 @@ This will work best with a device that presents a unique serial number, and you
|
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
13
|
-
|
13
|
+
### Automatic
|
14
14
|
|
15
|
-
|
15
|
+
To try to detect devices do:
|
16
16
|
|
17
|
-
$
|
17
|
+
$ xscreen_usb_unlocker --select-device
|
18
18
|
|
19
|
-
|
19
|
+
Obviously, the device has to be plugged in for this to work. Give it a try and let me know if anything doesn't work. It's interactive and will save a config file for you.
|
20
20
|
|
21
|
-
|
21
|
+
### Manual
|
22
22
|
|
23
|
-
|
23
|
+
You can also do all this by hand via methods like this via the output of lsusb.
|
24
24
|
|
25
|
-
|
25
|
+
Once you find the device (if it has a serial, most phone's do.)
|
26
26
|
|
27
|
-
$ xscreen_usb_unlocker -
|
27
|
+
$ xscreen_usb_unlocker -s SERIAL
|
28
28
|
|
29
29
|
You can also save these so you don't have to retype them, or have them in your history:
|
30
30
|
|
31
31
|
$ xscreen_usb_unlocker -s SERIAL -d 1234:ABCD --save-config
|
32
32
|
|
33
|
-
|
33
|
+
### Running
|
34
34
|
|
35
|
-
|
35
|
+
Last, it can be daemonized, if this happens it will write a log to your homedirectory in: `~/.logs/xscreen_usb_unlocker.log`.
|
36
36
|
|
37
|
-
|
37
|
+
$ xscreen_usb_unlocker -D
|
38
38
|
|
39
39
|
If you unlock xscreensaver by hand, you are not disabling this, the next time you plug/unplug your usb device, it will lock again. This is useful if for some reason your usb device isn't available, you can still use your system as normal.
|
40
40
|
|
@@ -48,7 +48,6 @@ All it does is start/kill (safely) xscreensaver based on scanning for usb device
|
|
48
48
|
|
49
49
|
## TODO:
|
50
50
|
|
51
|
-
* Add a --kill option to remove the other daemonizes.
|
52
51
|
* Add a --name to trap for the device name (regex? substring?)
|
53
52
|
* Add basic device detection to print out a pretty table to help configure it (offer options and save automatically?)
|
54
53
|
|
data/RELEASE.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Release Notes
|
2
|
+
|
3
|
+
#### 0.91.0
|
4
|
+
|
5
|
+
* Added a way to select devices interactively. Try --select-device to see.
|
6
|
+
* Added -(-k)ill-daemon to stop a background copy of xscreen_usb_unlocker
|
7
|
+
* Dropped auto daemonize when a config file is found.
|
8
|
+
* Updated the README with clearer examples.
|
9
|
+
* Added this RELEASE file.
|
10
|
+
|
data/bin/xscreen_usb_unlocker
CHANGED
@@ -5,79 +5,69 @@ Options.banner = "Usage: Used to lock/unlock xscreensaver based on usb device id
|
|
5
5
|
Options.on("-s", "--serial SERIAL", "make sure the device matches this serial.") { |s| Options[:serial] = s}
|
6
6
|
Options.on("-d", "--device DEVICE", "make sure it is this specific device.") { |d| Options[:device] = d}
|
7
7
|
Options.on("-D", "--daemonize", "Daemonize this process in the background.") { |d| Options[:daemonize] = true}
|
8
|
+
Options.on("-k", "--kill-daemon", "Kill any pids available in memory.") { |d| Options[:kill_daemon] = true }
|
9
|
+
Options.on("--select-device", "Select a device to lock the screen with..") { |d| Options[:select_device] = true}
|
8
10
|
Options.on("--save-config", "Save the device and serial to a XscreenUsbUnlocker::Config file and exit.") { |d| Options[:save_config] = true}
|
9
11
|
Options.parse!
|
10
12
|
|
11
|
-
if !Options[:device] && !Options[:serial]
|
12
|
-
puts 'Must supply a device or serial to look for.'
|
13
|
-
exit
|
14
|
-
end
|
15
|
-
|
16
|
-
def lock_screen
|
17
|
-
Log.info 'locking'
|
18
|
-
p = spawn "xscreensaver -no-splash"
|
19
|
-
Process.detach p
|
20
|
-
%x[xscreensaver-command -lock]
|
21
|
-
end
|
22
|
-
|
23
|
-
def unlock_screen
|
24
|
-
Log.info 'unlocking'
|
25
|
-
|
26
|
-
if xscreensaver_pids
|
27
|
-
xscreensaver_pids.each do |p|
|
28
|
-
Log.info "Appears to be pid: #{p.pid}"
|
29
|
-
Process.kill "QUIT", p.pid
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def xscreensaver_running?
|
35
|
-
xscreensaver_pids.any?
|
36
|
-
end
|
37
|
-
|
38
|
-
def xscreensaver_pids
|
39
|
-
Sys::ProcTable.ps.select{|x| x.cmdline.include?("xscreensaver") && !x.cmdline.include?("ruby")}
|
40
|
-
end
|
41
13
|
|
42
|
-
|
14
|
+
if Options[:select_device]
|
43
15
|
usb = LIBUSB::Context.new
|
44
|
-
|
16
|
+
devices = usb.devices.select{|x| x.bDeviceClass != 9} # this probably doesn't need to be a '9' but I haven't looked it up yet.
|
17
|
+
if devices.any?
|
18
|
+
devices.each do |d|
|
19
|
+
puts "(#{devices.index d}) #{d.manufacturer} #{d.product}"
|
20
|
+
end
|
21
|
+
puts "Which device would you like to lock with?"
|
45
22
|
|
46
|
-
|
47
|
-
|
48
|
-
options_hash[:idVendor] = v.hex if v && !v.empty?
|
49
|
-
options_hash[:idProduct] = p.hex if p && !p.empty?
|
50
|
-
end
|
23
|
+
print "-> "
|
24
|
+
c = STDIN.getc
|
51
25
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
26
|
+
d = devices[c.to_i]
|
27
|
+
if !d
|
28
|
+
puts "No such selection #{c}"
|
29
|
+
exit
|
30
|
+
end
|
31
|
+
puts "Using #{d.product} to lock/unlock."
|
32
|
+
new_config = XscreenUsbUnlocker::ConfigBlob.new(load = false)
|
56
33
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
34
|
+
if d.serial_number == "?"
|
35
|
+
puts "Warning, this device doesn't appear to have a serial number, anybody with the same device will be able to unlock your screen."
|
36
|
+
else
|
37
|
+
new_config["serial"] = d.serial_number
|
38
|
+
end
|
39
|
+
new_config["device"] = "%04x:%04x" % [d.idVendor, d.idProduct]
|
40
|
+
new_config.save!
|
41
|
+
puts "Saved configuration to #{new_config.file}"
|
42
|
+
exit
|
61
43
|
else
|
62
|
-
|
63
|
-
lock_screen
|
44
|
+
puts "You don't have anything plugged in via USB, is that even possible nowadays?"
|
64
45
|
end
|
46
|
+
exit
|
65
47
|
end
|
66
48
|
|
67
|
-
|
68
|
-
|
49
|
+
if !Options[:device] && !Options[:serial]
|
50
|
+
puts 'Must supply a device or serial to look for.'
|
51
|
+
exit
|
52
|
+
end
|
69
53
|
|
70
54
|
# should we save our config and bail?
|
71
55
|
if Options[:save_config]
|
72
56
|
XscreenUsbUnlocker::Config["serial"] = Options[:serial] if Options[:serial]
|
73
57
|
XscreenUsbUnlocker::Config["device"] = Options[:device] if Options[:device]
|
74
58
|
XscreenUsbUnlocker::Config.save!
|
75
|
-
puts "Saved configuration to #{Config.file}"
|
59
|
+
puts "Saved configuration to #{XscreenUsbUnlocker::Config.file}"
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
if Options[:kill_daemon]
|
64
|
+
App.kill_daemon
|
65
|
+
puts "Killing daemon."
|
76
66
|
exit
|
77
67
|
end
|
78
68
|
|
79
69
|
# kill a running copy of xscreensaver
|
80
|
-
if xscreensaver_running?
|
70
|
+
if XscreenUsbUnlocker.xscreensaver_running?
|
81
71
|
Log.info "xscreensaver appears to be running, killing so we can trap it."
|
82
72
|
%x[killall -QUIT xscreensaver]
|
83
73
|
end
|
@@ -86,15 +76,15 @@ end
|
|
86
76
|
Notifier = INotify::Notifier.new
|
87
77
|
Dir.glob("/dev/bus/usb/*").each do |d|
|
88
78
|
Notifier.watch(d, :delete, :create) do
|
89
|
-
toggle_lock
|
79
|
+
XscreenUsbUnlocker.toggle_lock
|
90
80
|
end
|
91
81
|
end
|
92
82
|
|
93
83
|
# fire off the lock cycle once.
|
94
|
-
toggle_lock
|
84
|
+
XscreenUsbUnlocker.toggle_lock
|
95
85
|
|
96
86
|
# start the notifier, which will fire off callbacks as needed.
|
97
|
-
if Options[:daemonize]
|
87
|
+
if Options[:daemonize]
|
98
88
|
Log.debug "Opening logfile."
|
99
89
|
Log.filename "/home/ebrodeur/.logs/xscreensaver_unlocker.log"
|
100
90
|
Log.debug "Daemonizing."
|
@@ -102,3 +92,4 @@ if Options[:daemonize] || File.file?(XscreenUsbUnlocker::Config.file)
|
|
102
92
|
else
|
103
93
|
Notifier.run
|
104
94
|
end
|
95
|
+
|
data/lib/xscreen_usb_unlocker.rb
CHANGED
@@ -10,5 +10,54 @@ require 'xscreen_usb_unlocker/optparser'
|
|
10
10
|
require "xscreen_usb_unlocker/version"
|
11
11
|
|
12
12
|
module XscreenUsbUnlocker
|
13
|
-
|
13
|
+
def self.lock_screen
|
14
|
+
Log.info 'locking'
|
15
|
+
p = spawn "xscreensaver -no-splash"
|
16
|
+
Process.detach p
|
17
|
+
%x[xscreensaver-command -lock]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.unlock_screen
|
21
|
+
Log.info 'unlocking'
|
22
|
+
|
23
|
+
if xscreensaver_pids
|
24
|
+
xscreensaver_pids.each do |p|
|
25
|
+
Log.info "Appears to be pid: #{p.pid}"
|
26
|
+
Process.kill "QUIT", p.pid
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.xscreensaver_running?
|
32
|
+
xscreensaver_pids.any?
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.xscreensaver_pids
|
36
|
+
Sys::ProcTable.ps.select{|x| x.cmdline.include?("xscreensaver") && !x.cmdline.include?("ruby")}
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.plugged_in?
|
40
|
+
usb = LIBUSB::Context.new
|
41
|
+
options_hash = {}
|
42
|
+
|
43
|
+
if Options[:device]
|
44
|
+
v, p = Options[:device].split(":")
|
45
|
+
options_hash[:idVendor] = v.hex if v && !v.empty?
|
46
|
+
options_hash[:idProduct] = p.hex if p && !p.empty?
|
47
|
+
end
|
48
|
+
|
49
|
+
devices = usb.devices(options_hash)
|
50
|
+
return true if devices.select { |d| d.serial_number == Options[:serial]}.any?
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.toggle_lock
|
55
|
+
if plugged_in?
|
56
|
+
Log.info 'unlock requested'
|
57
|
+
unlock_screen
|
58
|
+
else
|
59
|
+
Log.info 'lock request'
|
60
|
+
lock_screen
|
61
|
+
end
|
62
|
+
end
|
14
63
|
end
|
@@ -2,11 +2,11 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module XscreenUsbUnlocker
|
4
4
|
class ConfigBlob < Hash
|
5
|
-
BaseDir = "/home/ebrodeur/.config
|
5
|
+
BaseDir = "/home/ebrodeur/.config"
|
6
6
|
|
7
|
-
def initialize
|
7
|
+
def initialize(load = true)
|
8
8
|
FileUtils.mkdir_p BaseDir if !Dir.exist? BaseDir
|
9
|
-
load
|
9
|
+
load if load
|
10
10
|
end
|
11
11
|
|
12
12
|
def file
|
@@ -69,7 +69,10 @@ module XscreenUsbUnlocker
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def create_logger
|
72
|
-
|
72
|
+
if @options[:filename] != STDOUT && !File.file?(@options[:filename])
|
73
|
+
FileUtils.mkdir_p File.dirname @options[:filename]
|
74
|
+
end
|
75
|
+
|
73
76
|
@l = ::Logger.new(@options[:filename])
|
74
77
|
@l.level = @options[:level]
|
75
78
|
|
@@ -86,11 +89,11 @@ end
|
|
86
89
|
|
87
90
|
# better way to do this with: Kernel.module_eval def puts ...
|
88
91
|
module Kernel
|
89
|
-
def puts (
|
92
|
+
def puts (*args)
|
90
93
|
if Log.override_puts?
|
91
94
|
Log.info s
|
92
95
|
else
|
93
|
-
Kernel::puts
|
96
|
+
Kernel::puts args
|
94
97
|
end
|
95
98
|
end
|
96
99
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xscreen_usb_unlocker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.91.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rb-inotify
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- Gemfile
|
105
105
|
- LICENSE
|
106
106
|
- README.md
|
107
|
+
- RELEASE.md
|
107
108
|
- Rakefile
|
108
109
|
- bin/xscreen_usb_unlocker
|
109
110
|
- lib/xscreen_usb_unlocker.rb
|