components/openstack/nova/files/zone-vnc-console
author Niall Power <niall.power@oracle.com>
Fri, 10 Jul 2015 15:45:53 -0700
branchs11-update
changeset 4628 21e8147a2b1e
parent 4625 18adb92d4193
permissions -rw-r--r--
21038378 Nova VNC console not accessible in multi-node and multi-network configuration 21197115 Potential startup race conditition in zone console SMF method zone-vnc-console 20931076 nova doesn't build on s12-72 21197138 Nova VNC console should not allow popup menu access 20662640 console should show scrollbar and provide longer scrollback
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()