#!/usr/bin/python

import os
import pty
import select
import socket

PIDFILE="/var/run/topd.pid"
PORT=4097

listener = socket.socket( socket.AF_INET, socket.SOCK_STREAM, 0 )
listener.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
listener.bind( ( "", PORT ) )
listener.listen( 4 )

if os.fork() > 0:
    os._exit( 0 )

try:
    f = open( PIDFILE, "w" )
    f.write( str( os.getpid() ) )
    f.close()
    os.setuid( 65534 )
except:
    pass

clients = []

( pid, top ) = pty.fork()

if pid == 0:
    os.execl( "/usr/bin/top", "top" )
    os._exit( 1 )

while True:
    ( r, w, x ) = select.select( [ listener, top ], [], [] )
    if listener in r:
        ( n, addr ) = listener.accept()
        n.setblocking( 0 )
        clients.append( n )
        os.write( top, "0" ) # Ugly hack to draw entire screen for
            # new client... old clients will get refreshed too.  Too bad.
    if top in r:
        buf = os.read( top, 1024 )
        for c in clients:
            try:
                c.send( buf )
            except Exception as e:
                c.close()
                clients.remove( c )
