Revision b129b0c0 vncauthproxy/client.py
b/vncauthproxy/client.py | ||
---|---|---|
25 | 25 |
except ImportError: |
26 | 26 |
import json |
27 | 27 |
|
28 |
DEFAULT_CTRL_SOCKET = "/var/run/vncauthproxy/ctrl.sock" |
|
28 |
try: |
|
29 |
from gevent import sleep |
|
30 |
except ImportError: |
|
31 |
import sleep |
|
32 |
|
|
33 |
DEFAULT_SERVER_ADDRESS = '127.0.0.1' |
|
34 |
DEFAULT_SERVER_PORT = 24999 |
|
29 | 35 |
|
30 | 36 |
|
31 | 37 |
def parse_arguments(args): |
32 | 38 |
from optparse import OptionParser |
33 | 39 |
|
34 | 40 |
parser = OptionParser() |
35 |
parser.add_option("-c", "--socket", dest="ctrl_socket", |
|
36 |
default=DEFAULT_CTRL_SOCKET, |
|
37 |
metavar="PATH", |
|
38 |
help=("UNIX socket for connecting to vncauthproxy " |
|
39 |
"(default: %s)" % DEFAULT_CTRL_SOCKET)) |
|
41 |
parser.add_option("--server", dest="server_address", |
|
42 |
default=DEFAULT_SERVER_ADDRESS, |
|
43 |
metavar="SERVER", |
|
44 |
help=("vncauthproxy server")) |
|
45 |
parser.add_option("--server-port", dest="server_port", |
|
46 |
default=DEFAULT_SERVER_PORT, type="int", |
|
47 |
metavar="SERVER_PORT", |
|
48 |
help=("vncauthproxy port")) |
|
40 | 49 |
parser.add_option('-s', dest="sport", |
41 | 50 |
default=0, type="int", |
42 | 51 |
metavar='PORT', |
... | ... | |
59 | 68 |
(opts, args) = parser.parse_args(args) |
60 | 69 |
|
61 | 70 |
# Mandatory arguments |
71 |
if not opts.server_address: |
|
72 |
parser.error("The --server argument is mandatory.") |
|
62 | 73 |
if not opts.password: |
63 | 74 |
parser.error("The -P/--password argument is mandatory.") |
64 | 75 |
if not opts.daddr: |
... | ... | |
70 | 81 |
|
71 | 82 |
|
72 | 83 |
def request_forwarding(sport, daddr, dport, password, |
73 |
ctrl_socket=DEFAULT_CTRL_SOCKET): |
|
84 |
server_address=DEFAULT_SERVER_ADDRESS, |
|
85 |
server_port=DEFAULT_SERVER_PORT): |
|
74 | 86 |
"""Connect to vncauthproxy and request a VNC forwarding.""" |
75 | 87 |
if not password: |
76 | 88 |
raise ValueError("You must specify a non-empty password") |
... | ... | |
79 | 91 |
"source_port": int(sport), |
80 | 92 |
"destination_address": daddr, |
81 | 93 |
"destination_port": int(dport), |
82 |
"password": password |
|
94 |
"password": password,
|
|
83 | 95 |
} |
84 | 96 |
|
85 |
ctrl = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) |
|
86 |
ctrl.connect(ctrl_socket) |
|
87 |
ctrl.send(json.dumps(req)) |
|
88 |
|
|
89 |
response = ctrl.recv(1024) |
|
97 |
retries = 5 |
|
98 |
while retries: |
|
99 |
# Initiate server connection |
|
100 |
for res in socket.getaddrinfo(server_address, server_port, |
|
101 |
socket.AF_UNSPEC, |
|
102 |
socket.SOCK_STREAM, 0, |
|
103 |
socket.AI_PASSIVE): |
|
104 |
af, socktype, proto, canonname, sa = res |
|
105 |
try: |
|
106 |
server = socket.socket(af, socktype, proto) |
|
107 |
except socket.error: |
|
108 |
server = None |
|
109 |
continue |
|
110 |
|
|
111 |
server.settimeout(60.0) |
|
112 |
|
|
113 |
try: |
|
114 |
server.connect(sa) |
|
115 |
except socket.error: |
|
116 |
server.close() |
|
117 |
server = None |
|
118 |
continue |
|
119 |
|
|
120 |
retries = 0 |
|
121 |
break |
|
122 |
|
|
123 |
sleep(0.2) |
|
124 |
|
|
125 |
if server is None: |
|
126 |
raise Exception("Failed to connect to server") |
|
127 |
|
|
128 |
server.send(json.dumps(req)) |
|
129 |
|
|
130 |
response = server.recv(1024) |
|
131 |
server.close() |
|
90 | 132 |
res = json.loads(response) |
91 | 133 |
return res |
92 | 134 |
|
... | ... | |
95 | 137 |
(opts, args) = parse_arguments(sys.argv[1:]) |
96 | 138 |
|
97 | 139 |
res = request_forwarding(sport=opts.sport, daddr=opts.daddr, |
98 |
dport=opts.dport, password=opts.password, |
|
99 |
ctrl_socket=opts.ctrl_socket) |
|
140 |
dport=opts.dport, password=opts.password) |
|
100 | 141 |
|
101 | 142 |
sys.stderr.write("Forwaring %s -> %s:%s: %s\n" % (res['source_port'], |
102 | 143 |
opts.daddr, opts.dport, |
Also available in: Unified diff