#!/usr/bin/python

import os
import sys
import subprocess
import time
import signal
import socket

def get_config(name):
    return os.environ[name]

class LDM:
    def __init__(self, vt, display):
        self.vt = vt
        self.display = display
        self.server = get_config('SERVER')

    def run(self):
        null = open('/dev/null', 'w')
        logfile = open('/var/log/ldm.log', 'a')
        
        os.dup2(null.fileno(), sys.stdin.fileno())
        os.dup2(logfile.fileno(), sys.stdout.fileno())
        os.dup2(logfile.fileno(), sys.stderr.fileno())

        while True:
            server = subprocess.Popen(['Xorg', '-br', '-ac', '-noreset', self.vt, self.display], stdout=sys.stdout, stderr=sys.stderr)
            
            env = os.environ.copy()
            env['DISPLAY'] = self.display
            
            time.sleep(5)
            greeter = subprocess.Popen(['/usr/lib/ltsp/greeters/gtk'],
                                       stdout=subprocess.PIPE, stderr=sys.stderr, env=env)
            greeter_output = greeter.stdout.readlines()
            if len(greeter_output) == 2:
                username = greeter_output[0][:-1]
                password = greeter_output[1][:-1]

                self.spawn_session(username, password, '/etc/X11/Xsession')
            else:
                print "Didn't get the right output from the greeter"

            os.kill(server.pid, signal.SIGTERM)
            os.waitpid(server.pid, 0)

    def spawn_session(self, username, password, session_manager):
        pipe_read, pipe_write = os.pipe()
        pid = os.fork()

        if pid == 0:
            os.close(pipe_write)
            sys.stdin.close()
            os.setsid()
            os.environ['DISPLAY'] = self.display
            os.environ['LDM_ASKPASS_FD'] = str(pipe_read)
            os.environ['SSH_ASKPASS'] = '/usr/lib/ltsp/ldm-askpass'

            ssh_opts = ['-v',
                       '-X',
                        '-c', 'blowfish-cbc,aes128-cbc,3des-cbc']

            ssh_auth = ['%s@%s' % (username,self.server)]

            ssh_remote_command = ['env', 
                                  'LTSP_CLIENT="%s"' % (socket.gethostname()),
                                  session_manager,
                                  ';',
                                  'kill -1 $PPID']

            if 'NETWORK_COMPRESSION' in os.environ:
                ssh_opts.append('-C')
            
            command = ['ssh'] + ssh_opts + ssh_auth + ssh_remote_command
            print "ssh command line:", command
            sys.stdout.flush()

            os.execvp('ssh', command)
            sys.exit(1)

        os.close(pipe_read)
        os.write(pipe_write,password)
        os.close(pipe_write)
        os.waitpid(pid, 0)

if len(sys.argv) < 3:
    sys.stderr.write('Usage: ldm <vt[1-N]> <:[0-N]>\n')
    sys.exit(1)

vt, display = sys.argv[1:]
ldm = LDM(vt, display)
ldm.run()
