summaryrefslogtreecommitdiff
path: root/pexpect/examples/bd_serv.py
blob: d88f487fb8ade5429bf5e97d3e8fc8fa3be20418 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python
import socket, pexpect, ANSI
import time, sys, os

# Clearly having the password on the command line is not a good idea, but
# then this entire enterprise is probably not the most security concious thing
# I've ever built. This should be considered an experimental tool.
#    USER = sys.argv[1]
#    PASSWORD = sys.argv[2]
#    PORT = sys.argv[3]

def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    '''This forks the current process into a daemon.
    Almost none of this is necessary (or advisable) if your daemon 
    is being started by inetd. In that case, stdin, stdout and stderr are 
    all set up for you to refer to the network connection, and the fork()s 
    and session manipulation should not be done (to avoid confusing inetd). 
    Only the chdir() and umask() steps remain as useful. 

    References:
        UNIX Programming FAQ
        1.7 How do I get my program to act like a daemon?
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16

        Advanced Programming in the Unix Environment
        W. Richard Stevens, 1992, Addison-Wesley, ISBN 0-201-56317-7.

    The stdin, stdout, and stderr arguments are file names that
    will be opened and be used to replace the standard file descriptors
    in sys.stdin, sys.stdout, and sys.stderr.
    These arguments are optional and default to /dev/null.
    Note that stderr is opened unbuffered, so
    if it shares a file with stdout then interleaved output
    may not appear in the order that you expect.
    '''

    # Do first fork.
    try: 
        pid = os.fork() 
        if pid > 0:
            sys.exit(0)   # Exit first parent.
    except OSError, e: 
        sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
        sys.exit(1)

    # Decouple from parent environment.
    os.chdir("/") 
    os.umask(0) 
    os.setsid() 

    # Do second fork.
    try: 
        pid = os.fork() 
        if pid > 0:
            sys.exit(0)   # Exit second parent.
    except OSError, e: 
        sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
        sys.exit(1)

    # Now I am a daemon!
    
    # Redirect standard file descriptors.
    si = open(stdin, 'r')
    so = open(stdout, 'a+')
    se = open(stderr, 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

    # I now return as the daemon
    return 0

def main ():
    USER = sys.argv[1]
    PASSWORD = sys.argv[2]
    PORT = int(sys.argv[3])
    
    #daemonize ()
    #daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')

    sys.stdout.write ('Daemon started with pid %d\n' % os.getpid() )

    vs = ANSI.ANSI (24,80)
    p = pexpect.spawn ('ssh %(USER)s@localhost'%locals(), timeout=9)
    p.expect ('assword')
    p.sendline (PASSWORD)
    time.sleep (0.2)
    #p.sendline ('stty -echo')
    #time.sleep (0.2)
    p.sendline ('export PS1="HAON "')
    time.sleep (0.2)
    p.expect (pexpect.TIMEOUT)
    print p.before
    vs.process (p.before)
    HOST = '' # Symbolic name meaning the local host
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    print 'Listen'
    s.listen(1)
    print 'Accept'
    while 1:
        conn, addr = s.accept()
        print 'Connected by', addr
        data = conn.recv(1024)
        print data

        if data == 'exit':
            p.sendline (exit)
            break
        if not data == "pass":
            p.sendline (data)
            time.sleep (0.1)
            p.expect (['HAON ',pexpect.TIMEOUT])
            #response = p.before
            sh_response = p.before.replace ('\r', '')
            vs.process_list (sh_response)
        response = str (vs)
        print response
        sent = conn.send(response)
        if sent < len (response):
            print "Sent is too short"


if __name__ == "__main__":
#    daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')
    main()