aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xen/lib/util/console_client.py
blob: 7ac63aeb75379f3a0ce7ce5feb8a7dc597915611 (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
#!/usr/bin/env python

##############################################
# Console client for Xen guest OSes
# Copyright (c) 2004, K A Fraser
##############################################

import errno, os, signal, socket, struct, sys

from termios import *
# Indexes into termios.tcgetattr() list.
IFLAG  = 0
OFLAG  = 1
CFLAG  = 2
LFLAG  = 3
ISPEED = 4
OSPEED = 5
CC     = 6

def __child_death(signum, frame):
    global stop
    stop = True

def __recv_from_sock(sock):
    global stop
    stop = False
    while not stop:
        try:
            data = sock.recv(1024)
            os.write(1, data)
        except socket.error, error:
            if error[0] != errno.EINTR:
                raise
    os.wait()

def __send_to_sock(sock):
    while 1:
        data = os.read(0,1024)
        if ord(data[0]) == ord(']')-64:
            break
        try:
            sock.send(data)
        except socket.error, error:
            if error[0] == errno.EPIPE:
                sys.exit(0)
            if error[0] != errno.EINTR:
                raise
    sys.exit(0)

def connect(host,port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
    sock.connect((host,port))

    oattrs = tcgetattr(0)
    nattrs = tcgetattr(0)
    nattrs[IFLAG] = nattrs[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON)
    nattrs[OFLAG] = nattrs[OFLAG] & ~(OPOST)
    nattrs[CFLAG] = nattrs[CFLAG] & ~(CSIZE | PARENB)
    nattrs[CFLAG] = nattrs[CFLAG] | CS8
    nattrs[LFLAG] = nattrs[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG)
    nattrs[CC][VMIN] = 1
    nattrs[CC][VTIME] = 0

    if os.fork():
        signal.signal(signal.SIGCHLD, __child_death)
        print "************ REMOTE CONSOLE: CTRL-] TO QUIT ********"
        tcsetattr(0, TCSAFLUSH, nattrs)
        try:
            __recv_from_sock(sock)
        finally:
            tcsetattr(0, TCSAFLUSH, oattrs)
            print
            print "************ REMOTE CONSOLE EXITED *****************"
    else:
        signal.signal(signal.SIGPIPE, signal.SIG_IGN)
        __send_to_sock(sock)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print sys.argv[0] + " <host> <port>"
        sys.exit(1)
    connect(str(sys.argv[1]),int(sys.argv[2]))