#!/usr/bin/env python3 import argparse import sys import psutil import subprocess import os screensavers = [ # slock {'start': ['xautolock','-locker','slock'], 'stop': ['xautolock','-exit'], 'test': lambda : cmd_exists('xautolock') and cmd_exists('slock'), 'running': 'xautolock', }, # xscreensaver {'start' : ['XENVIRONMENT=~/.xscreensaver','/usr/bin/xscreensaver'], 'stop' : ['xscreensaver-command','-exit'], 'test' : lambda : cmd_exists('xscreensaver'), 'running' : 'xscreensaver', }, # xautolock {'start': ('xautolock','-notifier','true','-bell','0'), 'stop': ('xautolock','-exit'), 'test': lambda : cmd_exists('xautolock'), 'running' : 'xautolock', }, ] #' Determine if named command exists on the path and is executable def cmd_exists (cmd): return True def cmd_running (cmd): user = os.getuid() for proc in psutil.process_iter(): if proc.name() == cmd and proc.is_running() and proc.uids()[0] == user: return True return False def parse_arguments(): """Parses the arguments for the screensaver command """ parser = argparse.ArgumentParser( description="A command to turn on/off screesavers" ) parser.add_argument('command',choices=('sleep','off','stop','on','start')) return parser.parse_args() def fork(cmd): try: pid = os.fork() if pid > 0: # parent process so return return except OSError as e: print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) os.setsid() try: pid = os.fork() if pid > 0: # parent process so return return except OSError as e: print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) subprocess.Popen(cmd) os._exit(os.EX_OK) def fork_sleep_and_forget(delay,cmd): sleep(delay) fork(cmd) def should_stop(args): if args.command == 'stop' or args.command == 'off': return True return False def should_start(args): if args.command == 'start' or args.command == 'on': return True return False def should_sleep(args): if args.command == 'sleep' or args.command == 'pause': return True return False args = parse_arguments() for screensaver in screensavers: if screensaver['test'](): if should_stop(args): if cmd_running(screensaver['running']): fork(screensaver['stop']) elif should_start(args): if not cmd_running(screensaver['running']): fork(screensaver['start']) elif should_sleep(args): if cmd_running(screensaver['running']): fork(screensaver['stop']) fork_sleep_and_forget(args.sleep,screensaver['start']) else: print >>sys.stderr,"Unknown command" exit(0) print >> sys.stderr,"No screensaver"