Automatically restart on crash
authorStefan Hajnoczi <stefanha@gmail.com>
Sat, 20 Mar 2010 05:17:26 +0000 (05:17 +0000)
committerStefan Hajnoczi <stefanha@gmail.com>
Sat, 20 Mar 2010 05:17:26 +0000 (05:17 +0000)
gpxebot.py

index 65c52d7..a97721d 100755 (executable)
@@ -123,18 +123,28 @@ add_handler('376', autojoin, NO_ARGS)
 add_handler('PING', ping, 2)
 add_handler('PRIVMSG', privmsg, 3)
 
-if len(sys.argv) == 3 and sys.argv[1] == '--socket-fd':
-    # Restart with existing IRC session
-    fd = int(sys.argv[2])
-    sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
-    os.close(fd)
-    autojoin()
-else:
-    # Connect to server and start new IRC session
-    sock = socket.socket()
-    sock.connect((config.HOST, config.PORT))
-    cmd('NICK %s' % config.NICK)
-    cmd('USER %s none none :%s' % (config.IDENT, config.REALNAME))
+try:
+    if len(sys.argv) == 3 and sys.argv[1] == '--socket-fd':
+        # Restart with existing IRC session
+        fd = int(sys.argv[2])
+        sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
+        os.close(fd)
+        autojoin()
+    else:
+        # Connect to server and start new IRC session
+        sock = socket.socket()
+        sock.connect((config.HOST, config.PORT))
+        cmd('NICK %s' % config.NICK)
+        cmd('USER %s none none :%s' % (config.IDENT, config.REALNAME))
+except Exception, e:
+    # Log top-level exceptions and restart
+    try:
+        sock.close()
+    except Exception:
+        pass
+    sys.stderr.write(str(e) + '\n')
+    time.sleep(10) # prevent spinning on repeated failure
+    os.execl(sys.argv[0], sys.argv[0])
 
 # Try to create command FIFO
 try:
@@ -148,26 +158,34 @@ cmdfifo = open(config.FIFO, 'r+')
 
 restart = False
 sockbuf = ''
-while not restart:
-    rlist, _, xlist = select.select([sock, cmdfifo], [], [sock])
-
-    if sock in rlist or sock in xlist:
-        r = sock.recv(4096)
-        if not r:
-            break
-        sockbuf += r
-
-        while '\r\n' in sockbuf:
-            line, sockbuf = sockbuf.split('\r\n', 1)
-            if not line:
-                continue
-            utils.dbg('READ ' + line)
-            mask, args = parse(line)
-            restart = dispatch(args)
-
-    if cmdfifo in rlist:
-        words = cmdfifo.readline().strip().split()
-        restart = do_response(cmds.do_command(cmds.Who(config.NICK, True), config.NICK, config.NICK, words)) or restart
+try:
+    while not restart:
+        rlist, _, xlist = select.select([sock, cmdfifo], [], [sock])
+
+        if sock in rlist or sock in xlist:
+            r = sock.recv(4096)
+            if not r:
+                break
+            sockbuf += r
+
+            while '\r\n' in sockbuf:
+                line, sockbuf = sockbuf.split('\r\n', 1)
+                if not line:
+                    continue
+                utils.dbg('READ ' + line)
+                mask, args = parse(line)
+                restart = dispatch(args)
+
+        if cmdfifo in rlist:
+            words = cmdfifo.readline().strip().split()
+            restart = do_response(cmds.do_command(cmds.Who(config.NICK, True), config.NICK, config.NICK, words)) or restart
+except Exception, e:
+    # Log top-level exceptions and restart
+    cmdfifo.close()
+    sock.close()
+    sys.stderr.write(str(e) + '\n')
+    time.sleep(10) # prevent spinning on repeated failure
+    os.execl(sys.argv[0], sys.argv[0])
 
 cmdfifo.close()