#!/usr/bin/env python
-VERSION = "2.0"
+VERSION = "2.1"
-import asyncore, asynchat, socket
-import os, os.path, random, sys, time
+import asyncore
+import asynchat
+import socket
+import os
+import random
+import sys
+import time
from optparse import OptionParser
import logging
try:
class Cycler(object):
def init(self, options, paths, oneshot=False):
self.cycle_time = options.cycle_time
- self.history_filename = options.history_filename
+ self.cache_filename = options.cache_filename
logging.debug("Initialising wallchanger")
wallchanger.init(options.background_colour, options.permanent, options.convert)
for path in paths:
self.filelist.add_path(path)
- if self.filelist.load_cache(self.history_filename):
+ if self.filelist.load_cache(self.cache_filename):
logging.debug("Loaded cache successfully")
else:
logging.debug("Could not load cache")
self.cmd_reload()
def finish(self):
- self.filelist.store_cache(self.history_filename)
+ self.filelist.store_cache(self.cache_filename)
def find_files(self, options, paths):
return filelist
self.task.cancel()
self.task = asyncsched.schedule(self.cycle_time, next)
logging.debug("Reset timer for %s seconds" % self.cycle_time)
- self.filelist.store_cache(self.history_filename)
+ self.filelist.store_cache(self.cache_filename)
def cmd_reload(self):
image = self.filelist.get_current_image()
self.filelist.add_to_favourites()
class Server(asynchat.async_chat):
- def __init__(self, cycler, conn, addr):
- asynchat.async_chat.__init__(self, conn=conn)
+ def __init__(self, cycler, sock):
+ asynchat.async_chat.__init__(self, sock)
self.cycler = cycler
self.ibuffer = []
self.set_terminator("\n")
logging.debug('Unknown command received "%s"' % cmd)
+class SockHackWrap(object):
+ def __init__(self, sock, addr):
+ self.__sock = sock
+ self.__addr = addr
+ def getpeername(self):
+ return self.__addr
+ def __getattr__(self, key):
+ return getattr(self.__sock, key)
+
class Listener(asyncore.dispatcher):
def __init__(self, socket_filename, cycler):
asyncore.dispatcher.__init__(self)
self.cycler = cycler
self.create_socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ try:
+ os.unlink(socket_filename)
+ except OSError:
+ pass
self.bind(socket_filename)
self.listen(2) # Backlog = 2
def handle_accept(self):
- conn, addr = self.accept()
- Server(self.cycler, conn, addr)
+ sock, addr = self.accept()
+ Server(self.cycler, SockHackWrap(sock, addr))
def writable(self):
return False
parser.add_option("--socket",
action="store", type="string", dest="socket_filename", default=os.path.expanduser('~/.randombg_socket'),
help="Location of the command/control socket.")
- parser.add_option("--history-file",
- action="store", type="string", dest="history_filename", default=os.path.expanduser('~/.randombg_historyfile'),
+ parser.add_option("--cache-file",
+ action="store", type="string", dest="cache_filename", default=os.path.expanduser('~/.randombg_cache'),
help="Stores the location of the last image to be loaded.")
+ parser.add_option("--server",
+ action="store_true", dest="server", default=False,
+ help="Run in server mode to listen for clients.")
return parser
def main():
elif options.verbose >= 2:
logging.getLogger().setLevel(logging.DEBUG)
+ if options.server:
+ do_server(options, args)
+ return
+
if options.oneshot:
do_oneshot(options, args)
- else:
- if os.path.exists(options.socket_filename):
- do_client(options, args)
- else:
- do_server(options, args)
+ return
+
+ try:
+ do_client(options, args)
+ return
+ except Exception, e:
+ print >>sys.stderr, "Failed to connect to server:", e
if __name__ == "__main__":