author | Niall Power <niall.power@oracle.com> |
Fri, 10 Jul 2015 15:45:53 -0700 | |
branch | s11-update |
changeset 4628 | 21e8147a2b1e |
parent 4625 | 18adb92d4193 |
permissions | -rw-r--r-- |
4625
18adb92d4193
20816335 move the core OpenStack components to Python 2.7
Drew Fisher <drew.fisher@oracle.com>
parents:
4072
diff
changeset
|
1 |
#!/usr/bin/python2.7 |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
2 |
|
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
3 |
# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
4 |
# |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
5 |
# Licensed under the Apache License, Version 2.0 (the "License"); you may |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
6 |
# not use this file except in compliance with the License. You may obtain |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
7 |
# a copy of the License at |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
8 |
# |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
9 |
# http://www.apache.org/licenses/LICENSE-2.0 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
10 |
# |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
11 |
# Unless required by applicable law or agreed to in writing, software |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
12 |
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
13 |
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
14 |
# License for the specific language governing permissions and limitations |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
15 |
# under the License. |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
16 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
17 |
import ConfigParser |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
18 |
import contextlib |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
19 |
import errno |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
20 |
import fcntl |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
21 |
import os |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
22 |
import pwd |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
23 |
import smf_include |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
24 |
import socket |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
25 |
import subprocess |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
26 |
import sys |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
27 |
import tempfile |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
28 |
import time |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
29 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
30 |
from oslo_config import cfg |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
31 |
|
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
32 |
GTF = "/usr/bin/gtf" |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
33 |
SVCADM = "/usr/sbin/svcadm" |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
34 |
SVCCFG = "/usr/sbin/svccfg" |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
35 |
SVCPROP = "/usr/bin/svcprop" |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
36 |
VNCSERVER = "/usr/bin/vncserver" |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
37 |
XRANDR = "/usr/bin/xrandr" |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
38 |
NOVACFG = "/etc/nova/nova.conf" |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
39 |
XSTARTUPHDR = "# WARNING: THIS FILE GENERATED BY SMF.\n" + \ |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
40 |
"# DO NOT EDIT THIS FILE. EDITS WILL BE LOST.\n" |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
41 |
XRESOURCES = "[[ -f ~/.Xresources ]] && /usr/bin/xrdb -merge ~/.Xresources\n" |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
42 |
XTERM = "/usr/bin/xterm" |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
43 |
# Borderless, Monospsce font, point size 14, white foreground on black |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
44 |
# background are reasonable defaults. |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
45 |
XTERMOPTS = ' -b 0 -fa Monospace -fs 14 -fg white -bg black -title ' + \ |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
46 |
'"Zone Console: $ZONENAME"' |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
47 |
XWININFO = "/usr/bin/xwininfo" |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
48 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
49 |
# Port ranges allocated for VNC and X11 sockets. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
50 |
VNCPORT_START = 5900 |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
51 |
VNCPORT_END = 5999 |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
52 |
X11PORT_START = 6000 |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
53 |
|
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
54 |
# Enclose command in comments to prevent xterm consuming zlogin opts |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
55 |
ZLOGINOPTS = ' -e "/usr/bin/pfexec /usr/sbin/zlogin -C -E $ZONENAME"\n' |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
56 |
XSTARTUP = XSTARTUPHDR + XRESOURCES + XTERM + XTERMOPTS + ZLOGINOPTS |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
57 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
58 |
CONF = cfg.CONF |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
59 |
CONF.import_opt('vncserver_listen', 'nova.vnc') |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
60 |
|
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
61 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
62 |
def start(): |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
63 |
fmri = os.environ['SMF_FMRI'] |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
64 |
# This is meant to be an on-demand service. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
65 |
# Determine if nova-compute requested enablement of this instance. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
66 |
# Exit with SMF_EXIT_TEMP_DISABLE if not true. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
67 |
cmd = [SVCPROP, '-p', 'vnc/nova-enabled', fmri] |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
68 |
svcprop = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
69 |
stderr=subprocess.PIPE) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
70 |
out, err = svcprop.communicate() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
71 |
retcode = svcprop.wait() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
72 |
if retcode != 0: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
73 |
print "Error reading 'vnc/nova-enabled' property: " + err |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
74 |
return smf_include.SMF_EXIT_ERR_FATAL |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
75 |
enabled = out.strip() == 'true' |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
76 |
if not enabled: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
77 |
smf_include.smf_method_exit( |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
78 |
smf_include.SMF_EXIT_TEMP_DISABLE, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
79 |
"nova_enabled", |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
80 |
"nova-compute starts this service on demand") |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
81 |
|
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
82 |
check_vncserver() |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
83 |
homedir = os.environ.get('HOME') |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
84 |
if not homedir: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
85 |
homedir = pwd.getpwuid(os.getuid()).pw_dir |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
86 |
os.putenv("HOME", homedir) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
87 |
set_xstartup(homedir) |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
88 |
display = None |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
89 |
vncport = None |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
90 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
91 |
try: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
92 |
zonename = fmri.rsplit(':', 1)[1] |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
93 |
os.putenv("ZONENAME", zonename) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
94 |
desktop_name = zonename + ' console' |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
95 |
novacfg = ConfigParser.RawConfigParser() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
96 |
novacfg.readfp(open(NOVACFG)) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
97 |
try: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
98 |
vnc_listenip = novacfg.get("DEFAULT", "vncserver_listen") |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
99 |
except ConfigParser.NoOptionError: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
100 |
vnc_listenip = CONF.vncserver_listen |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
101 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
102 |
with lock_available_port(vnc_listenip, VNCPORT_START, VNCPORT_END, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
103 |
homedir) as n: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
104 |
# NOTE: 'geometry' is that which matches the size of standard |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
105 |
# 80 character undecorated xterm window using font style specified |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
106 |
# in XTERMOPTS. The geometry doesn't matter too much because the |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
107 |
# display will be resized using xrandr once the xterm geometry is |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
108 |
# established. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
109 |
display = ":%d" % n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
110 |
cmd = [VNCSERVER, display, "-name", desktop_name, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
111 |
"-SecurityTypes=None", "-geometry", "964x580", |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
112 |
"-interface", vnc_listenip, "-autokill"] |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
113 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
114 |
vncport = VNCPORT_START + n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
115 |
x11port = X11PORT_START + n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
116 |
print "Using VNC server port: " + str(vncport) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
117 |
print "Using X11 server port: %d, display %s" % (x11port, display) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
118 |
vnc = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
119 |
stderr=subprocess.PIPE, env=None) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
120 |
out, err = vnc.communicate() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
121 |
vncret = vnc.wait() |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
122 |
if vncret != 0: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
123 |
print "Error starting VNC server: " + err |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
124 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
125 |
except Exception as e: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
126 |
print e |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
127 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
128 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
129 |
# set SMF instance port num prop |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
130 |
cmd = [SVCCFG, '-s', fmri, 'setprop', 'vnc/port', '=', 'integer:', |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
131 |
str(vncport)] |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
132 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
133 |
svccfg = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
134 |
stderr=subprocess.PIPE) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
135 |
out, err = svccfg.communicate() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
136 |
retcode = svccfg.wait() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
137 |
if retcode != 0: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
138 |
print "Error updating 'vnc/port' property: " + err |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
139 |
return smf_include.SMF_EXIT_ERR_FATAL |
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
140 |
resize_xserver(display, zonename) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
141 |
|
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
142 |
return smf_include.SMF_EXIT_OK |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
143 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
144 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
145 |
def stop(): |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
146 |
try: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
147 |
# first kill the SMF contract |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
148 |
subprocess.check_call(["/usr/bin/pkill", "-c", sys.argv[2]]) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
149 |
except subprocess.CalledProcessError as cpe: |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
150 |
# 1 is returncode if no SMF contract processes were matched, |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
151 |
# meaning they have already terminated. |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
152 |
if cpe.returncode != 1: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
153 |
print "failed to kill the SMF contract: %s" % cpe |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
154 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
155 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
156 |
try: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
157 |
fmri = os.environ['SMF_FMRI'] |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
158 |
# reset port num prop to initial zero value |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
159 |
cmd = [SVCCFG, '-s', fmri, 'setprop', 'vnc/port', '=', 'integer:', |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
160 |
'0'] |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
161 |
svccfg = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
162 |
stderr=subprocess.PIPE,) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
163 |
out, err = svccfg.communicate() |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
164 |
retcode = svccfg.wait() |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
165 |
if retcode != 0: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
166 |
print "Error resetting 'vnc/port' property: " + err |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
167 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
168 |
except Exception as e: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
169 |
print e |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
170 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
171 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
172 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
173 |
def check_vncserver(): |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
174 |
if not os.path.exists(VNCSERVER): |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
175 |
print("VNC console service not available on this compute node. " |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
176 |
"%s is missing. Run 'pkg install x11/server/xvnc'" |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
177 |
% VNCSERVER) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
178 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
179 |
if not os.path.exists(XTERM): |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
180 |
print("VNC console service not available on this compute node. " |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
181 |
"%s is missing. Run 'pkg install terminal/xterm'" |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
182 |
% XTERM) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
183 |
return smf_include.SMF_EXIT_ERR_FATAL |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
184 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
185 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
186 |
def set_xstartup(homedir): |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
187 |
vncdir = os.path.join(homedir, '.vnc') |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
188 |
xstartup_path = os.path.join(vncdir, 'xstartup') |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
189 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
190 |
try: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
191 |
os.mkdir(vncdir) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
192 |
except OSError as ose: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
193 |
if ose.errno != errno.EEXIST: |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
194 |
raise |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
195 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
196 |
# Always clobber xstartup |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
197 |
# stemp tuple = [fd, path] |
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
198 |
stemp = tempfile.mkstemp(dir=vncdir) |
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
199 |
os.write(stemp[0], XSTARTUP) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
200 |
os.close(stemp[0]) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
201 |
os.chmod(stemp[1], 0700) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
202 |
os.rename(stemp[1], xstartup_path) |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
203 |
|
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
204 |
|
4072
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
205 |
def resize_xserver(display, zonename): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
206 |
""" Try to determine xterm window geometry and resize the Xvnc display |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
207 |
to match using XRANDR. Treat failure as non-fatal since an |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
208 |
incorrectly sized console is arguably better than none. |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
209 |
""" |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
210 |
class UninitializedWindowError(Exception): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
211 |
pass |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
212 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
213 |
class UnmappedWindowError(Exception): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
214 |
pass |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
215 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
216 |
def _get_window_geometry(display, windowname): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
217 |
""" Find the xterm xwindow by name/title and extract its geometry |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
218 |
Returns: tuple of window [width, height] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
219 |
Raises: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
220 |
UninitializedWindowError if window not yet initialized |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
221 |
UnmappedWindowError if window is not viewable/mapped |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
222 |
""" |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
223 |
cmd = [XWININFO, '-d', display, '-name', windowname] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
224 |
xwininfo = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
225 |
stderr=subprocess.PIPE) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
226 |
out, err = xwininfo.communicate() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
227 |
retcode = xwininfo.wait() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
228 |
if retcode != 0: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
229 |
print "Error finding console xwindow info: " + err |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
230 |
raise UninitializedWindowError |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
231 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
232 |
width = None |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
233 |
height = None |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
234 |
mapped = False |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
235 |
for line in out.splitlines(): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
236 |
line = line.strip() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
237 |
if line.startswith("Map State:"): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
238 |
if line.split()[-1] != "IsViewable": |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
239 |
# Window is not mapped yet. |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
240 |
raise UnmappedWindowError |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
241 |
else: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
242 |
mapped = True |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
243 |
if line.startswith("Width:"): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
244 |
width = int(line.split()[1]) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
245 |
elif line.startswith("Height:"): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
246 |
height = int(line.split()[1]) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
247 |
if width and height and mapped: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
248 |
return [width, height] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
249 |
else: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
250 |
# What, no width and height??? |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
251 |
print "No window geometry info returned by " + XWINFINFO |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
252 |
raise UnmappedWindowError |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
253 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
254 |
retries = 10 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
255 |
sleep = 1 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
256 |
uninit_count = 0 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
257 |
unmap_count = 0 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
258 |
width = 0 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
259 |
height = 0 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
260 |
while uninit_count < retries and unmap_count < retries: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
261 |
try: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
262 |
width, height = _get_window_geometry(display, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
263 |
'Zone Console: ' + zonename) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
264 |
print "Discovered xterm geometry: %d x %d" % (width, height) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
265 |
break |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
266 |
except UninitializedWindowError: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
267 |
if uninit_count < retries: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
268 |
print "xterm window not initialized yet. Retrying in %ds" \ |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
269 |
% sleep |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
270 |
uninit_count += 1 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
271 |
time.sleep(sleep) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
272 |
continue |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
273 |
else: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
274 |
print "xterm window is taking too long to initialize" |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
275 |
break |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
276 |
except UnmappedWindowError: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
277 |
if unmap_count < retries: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
278 |
print "Discovered xterm not mapped yet. Retrying in %ds" \ |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
279 |
% sleep |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
280 |
unmap_count += 1 |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
281 |
time.sleep(sleep) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
282 |
continue |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
283 |
else: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
284 |
print "Discovered xterm window is taking too long to map" |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
285 |
break |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
286 |
else: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
287 |
print "Too many failed attempts to discover xterm window geometry" |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
288 |
return |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
289 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
290 |
# Generate a mode line for width and height, with a refresh of 60.0Hz |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
291 |
cmd = [GTF, str(width), str(height), '60.0', '-x'] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
292 |
gtf = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
293 |
stderr=subprocess.PIPE) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
294 |
out, err = gtf.communicate() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
295 |
retcode = gtf.wait() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
296 |
if retcode != 0: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
297 |
print "Error creating new modeline for VNC display: " + err |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
298 |
return |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
299 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
300 |
for line in out.splitlines(): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
301 |
line = line.strip() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
302 |
if line.startswith('Modeline'): |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
303 |
modeline = line.split('Modeline')[1] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
304 |
print "New optimal modeline for Xvnc server: " + modeline |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
305 |
mode = modeline.split() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
306 |
break |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
307 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
308 |
# Create a new mode for the Xvnc server using the modeline generated by gtf |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
309 |
cmd = [XRANDR, '-d', display, '--newmode'] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
310 |
cmd.extend(mode) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
311 |
newmode = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
312 |
stderr=subprocess.PIPE) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
313 |
out, err = newmode.communicate() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
314 |
retcode = newmode.wait() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
315 |
if retcode != 0: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
316 |
print "Error creating new xrandr modeline for VNC display: " + err |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
317 |
return |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
318 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
319 |
# Add the new mode to the default display output |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
320 |
modename = mode[0] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
321 |
cmd = [XRANDR, '-d', display, '--addmode', 'default', modename] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
322 |
addmode = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
323 |
stderr=subprocess.PIPE) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
324 |
out, err = addmode.communicate() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
325 |
retcode = addmode.wait() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
326 |
if retcode != 0: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
327 |
print "Error adding new xrandr modeline for VNC display: " + err |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
328 |
return |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
329 |
|
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
330 |
# Activate the new mode on the default display output |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
331 |
cmd = [XRANDR, '-d', display, '--output', 'default', '--mode', modename] |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
332 |
addmode = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
333 |
stderr=subprocess.PIPE) |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
334 |
out, err = addmode.communicate() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
335 |
retcode = addmode.wait() |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
336 |
if retcode != 0: |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
337 |
print "Error setting new xrandr modeline for VNC display: " + err |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
338 |
return |
db0cec748ec0
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
3809
diff
changeset
|
339 |
|
4628
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
340 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
341 |
@contextlib.contextmanager |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
342 |
def lock_available_port(address, port_start, port_end, lockdir): |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
343 |
"""Ensures instance exclusive use of VNC, X11 service ports |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
344 |
and related resources. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
345 |
Generator yields an integer of the port relative to port_start to use. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
346 |
eg. 32: VNC port 5932, X11 port 6032, X11 display :32 |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
347 |
lockfile is port specific and prevents multiple instances from |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
348 |
attempting to use the same port number during SMF start method |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
349 |
execution. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
350 |
Socket binding on address:port establishes that the port is not |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
351 |
already in use by another Xvnc process |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
352 |
""" |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
353 |
for n in range(port_end - port_start): |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
354 |
vncport = port_start + n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
355 |
x11port = X11PORT_START + n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
356 |
lockfile = os.path.join(lockdir, '.port-%d.lock' % vncport) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
357 |
try: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
358 |
# Acquire port file lock first to lock out other instances trying |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
359 |
# to come online in parallel. They will grab the next available |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
360 |
# port lock. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
361 |
lock = open(lockfile, 'w') |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
362 |
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
363 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
364 |
try: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
365 |
# Check the VNC/RFB and X11 ports. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
366 |
for testport in [vncport, x11port]: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
367 |
sock = socket.socket(socket.AF_INET) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
368 |
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
369 |
try: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
370 |
sock.bind((address, testport)) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
371 |
finally: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
372 |
sock.close() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
373 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
374 |
# Ensure the standard X11 locking files are not present |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
375 |
# /tmp/.X<n>-lock |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
376 |
# /tmp/X11-unix/X<n> |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
377 |
xfiles = ['/tmp/.X%d-lock' % n, |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
378 |
'/tmp/X11-unix/X%d' % n] |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
379 |
for xfile in xfiles: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
380 |
if os.path.exists(xfile): |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
381 |
print ("Warning: X11 display :{0} is taken because of " |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
382 |
"{1}\nRemove this file if there is no X " |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
383 |
"server on display :{0}".format(str(n), xfile)) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
384 |
raise Exception |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
385 |
|
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
386 |
except (socket.error, Exception): |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
387 |
lock.close() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
388 |
os.remove(lockfile) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
389 |
continue |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
390 |
# Yay, we found a free VNC/X11 port pair. |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
391 |
yield n |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
392 |
lock.close() |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
393 |
os.remove(lockfile) |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
394 |
break |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
395 |
except IOError: |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
396 |
print "Port %d already reserved, skipping" % vncport |
21e8147a2b1e
21038378 Nova VNC console not accessible in multi-node and multi-network configuration
Niall Power <niall.power@oracle.com>
parents:
4625
diff
changeset
|
397 |
|
3809
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
398 |
if __name__ == "__main__": |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
399 |
os.putenv("LC_ALL", "C") |
eb8d6ce0657e
PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff
changeset
|
400 |
smf_include.smf_main() |