]> git.donarmstrong.com Git - bin.git/blob - screensaver
add reset usb bus command
[bin.git] / screensaver
1 #!/usr/bin/env python3
2
3 import argparse
4 import sys
5 import psutil
6 import subprocess
7 import os
8
9 screensavers = [
10     # slock
11     {'start': ['xss-lock','-l','--','/home/don/bin/locker'],
12      'stop': ['pkill','-TERM','xss-lock'],
13      'test': lambda : cmd_exists('xss-lock') and cmd_exists('/home/don//bin/locker'),
14      'running': 'xss-lock',
15     },
16     # slock
17     {'start': ['xautolock','-locker','slock'],
18      'stop': ['xautolock','-exit'],
19      'test': lambda : cmd_exists('xautolock') and cmd_exists('slock'),
20      'running': 'xautolock',
21     },
22     # xscreensaver
23     {'start' : ['XENVIRONMENT=~/.xscreensaver','/usr/bin/xscreensaver'],
24      'stop' : ['xscreensaver-command','-exit'],
25      'test' : lambda : cmd_exists('xscreensaver'),
26      'running' : 'xscreensaver',
27     },
28     # xautolock
29     {'start': ('xautolock','-notifier','true','-bell','0'),
30      'stop': ('xautolock','-exit'),
31      'test': lambda : cmd_exists('xautolock'),
32      'running' : 'xautolock',
33     },
34 ]
35
36 #' Determine if named command exists on the path and is executable
37 def cmd_exists (cmd):
38     return True
39
40 def cmd_running (cmd):
41     user = os.getuid()
42     for proc in psutil.process_iter():
43         if proc.name() == cmd and proc.is_running() and proc.uids()[0] == user:
44             return True
45     return False
46
47 def parse_arguments():
48     """Parses the arguments for the screensaver command
49     """
50     parser = argparse.ArgumentParser(
51         description="A command to turn on/off screesavers"
52         )
53     parser.add_argument('command',choices=('sleep','off','stop','on','start'))
54     return parser.parse_args()
55
56 def fork(cmd):
57     try: 
58         pid = os.fork() 
59         if pid > 0:
60             # parent process so return
61             return
62     except OSError as e:
63         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
64         sys.exit(1)
65
66     os.setsid()
67     try: 
68         pid = os.fork() 
69         if pid > 0:
70             # parent process so return
71             return
72     except OSError as e:
73         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) 
74         sys.exit(1)
75     subprocess.Popen(cmd)
76     os._exit(os.EX_OK)
77
78 def fork_sleep_and_forget(delay,cmd):
79     sleep(delay)
80     fork(cmd)
81
82     
83 def should_stop(args):
84     if args.command == 'stop' or args.command == 'off':
85         return True
86     return False
87
88 def should_start(args):
89     if args.command == 'start' or args.command == 'on':
90         return True
91     return False
92
93 def should_sleep(args):
94     if args.command == 'sleep' or args.command == 'pause':
95         return True
96     return False
97
98 args = parse_arguments()
99
100 for screensaver in screensavers:
101     if screensaver['test']():
102         if should_stop(args):
103             if cmd_running(screensaver['running']):
104                 fork(screensaver['stop'])
105         elif should_start(args):
106             if not cmd_running(screensaver['running']):
107                 fork(screensaver['start'])
108         elif should_sleep(args):
109             if cmd_running(screensaver['running']):
110                 fork(screensaver['stop'])
111             fork_sleep_and_forget(args.sleep,screensaver['start'])
112         else:
113             print >>sys.stderr,"Unknown command"
114         exit(0)
115         
116 print >> sys.stderr,"No screensaver"
117