source: CMTManagement/utils/bd_serv.py @ 695

Last change on this file since 695 was 421, checked in by garonne, 17 years ago
  • Property svn:executable set to *
File size: 3.9 KB
Line 
1#!/usr/bin/env python
2import socket, pexpect, ANSI
3import time, sys, os
4
5# Clearly having the password on the command line is not a good idea, but
6# then this entire enterprise is probably not the most security concious thing
7# I've ever built. This should be considered an experimental tool.
8#    USER = sys.argv[1]
9#    PASSWORD = sys.argv[2]
10#    PORT = sys.argv[3]
11
12def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
13    '''This forks the current process into a daemon.
14    Almost none of this is necessary (or advisable) if your daemon
15    is being started by inetd. In that case, stdin, stdout and stderr are
16    all set up for you to refer to the network connection, and the fork()s
17    and session manipulation should not be done (to avoid confusing inetd).
18    Only the chdir() and umask() steps remain as useful.
19
20    References:
21        UNIX Programming FAQ
22        1.7 How do I get my program to act like a daemon?
23        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
24
25        Advanced Programming in the Unix Environment
26        W. Richard Stevens, 1992, Addison-Wesley, ISBN 0-201-56317-7.
27
28    The stdin, stdout, and stderr arguments are file names that
29    will be opened and be used to replace the standard file descriptors
30    in sys.stdin, sys.stdout, and sys.stderr.
31    These arguments are optional and default to /dev/null.
32    Note that stderr is opened unbuffered, so
33    if it shares a file with stdout then interleaved output
34    may not appear in the order that you expect.
35    '''
36
37    # Do first fork.
38    try: 
39        pid = os.fork() 
40        if pid > 0:
41            sys.exit(0)   # Exit first parent.
42    except OSError, e: 
43        sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
44        sys.exit(1)
45
46    # Decouple from parent environment.
47    os.chdir("/") 
48    os.umask(0) 
49    os.setsid() 
50
51    # Do second fork.
52    try: 
53        pid = os.fork() 
54        if pid > 0:
55            sys.exit(0)   # Exit second parent.
56    except OSError, e: 
57        sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
58        sys.exit(1)
59
60    # Now I am a daemon!
61   
62    # Redirect standard file descriptors.
63    si = open(stdin, 'r')
64    so = open(stdout, 'a+')
65    se = open(stderr, 'a+', 0)
66    os.dup2(si.fileno(), sys.stdin.fileno())
67    os.dup2(so.fileno(), sys.stdout.fileno())
68    os.dup2(se.fileno(), sys.stderr.fileno())
69
70    # I now return as the daemon
71    return 0
72
73def main ():
74    USER = sys.argv[1]
75    PASSWORD = sys.argv[2]
76    PORT = int(sys.argv[3])
77   
78    #daemonize ()
79    #daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')
80
81    sys.stdout.write ('Daemon started with pid %d\n' % os.getpid() )
82
83    vs = ANSI.ANSI (24,80)
84    p = pexpect.spawn ('ssh %(USER)s@localhost'%locals(), timeout=9)
85    p.expect ('assword')
86    p.sendline (PASSWORD)
87    time.sleep (0.2)
88    #p.sendline ('stty -echo')
89    #time.sleep (0.2)
90    p.sendline ('export PS1="HAON "')
91    time.sleep (0.2)
92    p.expect (pexpect.TIMEOUT)
93    print p.before
94    vs.process (p.before)
95    HOST = '' # Symbolic name meaning the local host
96    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
97    s.bind((HOST, PORT))
98    print 'Listen'
99    s.listen(1)
100    print 'Accept'
101    while 1:
102        conn, addr = s.accept()
103        print 'Connected by', addr
104        data = conn.recv(1024)
105        print data
106
107        if data == 'exit':
108            p.sendline (exit)
109            break
110        if not data == "pass":
111            p.sendline (data)
112            time.sleep (0.1)
113            p.expect (['HAON ',pexpect.TIMEOUT])
114            #response = p.before
115            sh_response = p.before.replace ('\r', '')
116            vs.process_list (sh_response)
117        response = str (vs)
118        print response
119        sent = conn.send(response)
120        if sent < len (response):
121            print "Sent is too short"
122
123
124if __name__ == "__main__":
125#    daemonize('/dev/null','/tmp/daemon.log','/tmp/daemon.log')
126    main()
127
128
129
Note: See TracBrowser for help on using the repository browser.