components/openstack/nova/files/zone-vnc-console
author Niall Power <niall.power@oracle.com>
Wed, 01 Apr 2015 17:30:47 -0700
changeset 4046 47a996abe340
parent 3998 5bd484384122
child 4049 150852e281c4
permissions -rw-r--r--
20816861 zone-vnc-console goes into maintenance
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python2.6
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
     2
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     3
# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     4
#
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     5
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     6
#    not use this file except in compliance with the License. You may obtain
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     7
#    a copy of the License at
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     8
#
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
     9
#         http://www.apache.org/licenses/LICENSE-2.0
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    10
#
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    11
#    Unless required by applicable law or agreed to in writing, software
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    12
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    13
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    14
#    License for the specific language governing permissions and limitations
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    15
#    under the License.
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    16
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    17
import errno
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    18
import os
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    19
import pwd
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    20
import smf_include
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    21
import subprocess
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    22
import sys
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    23
import time
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    24
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    25
from subprocess import CalledProcessError, check_call, Popen
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    26
from tempfile import mkstemp
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    27
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    28
GTF = "/usr/bin/gtf"
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    29
SVCCFG = "/usr/sbin/svccfg"
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    30
SVCPROP = "/usr/bin/svcprop"
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    31
VNCSERVER = "/usr/bin/vncserver"
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    32
XRANDR = "/usr/bin/xrandr"
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    33
XSTARTUPHDR = "# WARNING: THIS FILE GENERATED BY SMF.\n" + \
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    34
              "#   DO NOT EDIT THIS FILE.  EDITS WILL BE LOST.\n"
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
    35
XRESOURCES = "[[ -f ~/.Xresources ]] && /usr/bin/xrdb -merge ~/.Xresources\n"
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    36
XTERM = "/usr/bin/xterm"
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    37
# Borderless, Monospsce font, point size 14, white foreground on black
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    38
# background are reasonable defaults.
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    39
XTERMOPTS = ' -b 0 -fa Monospace -fs 14 -fg white -bg black -title ' + \
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    40
            '"Zone Console: $ZONENAME"'
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    41
XWININFO = "/usr/bin/xwininfo"
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    42
# Enclose command in comments to prevent xterm consuming zlogin opts
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    43
ZLOGINOPTS = ' -e "/usr/bin/pfexec /usr/sbin/zlogin -C -E $ZONENAME"\n'
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
    44
XSTARTUP = XSTARTUPHDR + XRESOURCES + XTERM + XTERMOPTS + ZLOGINOPTS
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    45
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    46
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    47
def start():
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    48
    check_vncserver()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    49
    homedir = os.environ.get('HOME')
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    50
    if not homedir:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    51
        homedir = pwd.getpwuid(os.getuid()).pw_dir
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    52
        os.putenv("HOME", homedir)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    53
    set_xstartup(homedir)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    54
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    55
    try:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    56
        fmri = os.environ['SMF_FMRI']
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    57
        zonename = fmri.rsplit(':', 1)[1]
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    58
        os.putenv("ZONENAME", zonename)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    59
        desktop_name = zonename + ' console'
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    60
        # NOTE: 'geometry' below is that which matches the size of standard
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    61
        # 80 character undecorated xterm window using font style specified in
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    62
        # XTERMOPTS. The geometry doesn't matter too much because the display
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    63
        # will be resized using xrandr once the xterm geometry is established.
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    64
        cmd = [VNCSERVER, "-name", desktop_name, "-SecurityTypes=None",
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    65
               "-geometry", "964x580", "-localhost", "-autokill"]
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    66
        vnc = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    67
                    env=None)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    68
        out, err = vnc.communicate()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    69
        vncret = vnc.wait()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    70
        if vncret != 0:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    71
            print "Error starting VNC server: " + err
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    72
            return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    73
    except Exception as e:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    74
        print e
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    75
        return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    76
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    77
    output = err.splitlines()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    78
    for line in output:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    79
        if line.startswith("New '%s' desktop is" % desktop_name):
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    80
            display = line.rpartition(' ')[2]
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    81
            host, display_num = display.split(':', 1)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    82
            # set host prop
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    83
            port = 5900 + int(display_num)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    84
            print "VNC port: %d" % port
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    85
            # set port num prop
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    86
            cmd = [SVCCFG, '-s', fmri, 'setprop', 'vnc/port', '=', 'integer:',
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    87
                   str(port)]
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    88
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    89
            svccfg = subprocess.Popen(cmd, stdout=subprocess.PIPE,
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    90
                                      stderr=subprocess.PIPE)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    91
            out, err = svccfg.communicate()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    92
            retcode = svccfg.wait()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    93
            if retcode != 0:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    94
                print "Error updating 'vnc/port' property: " + err
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    95
                return smf_include.SMF_EXIT_ERR_FATAL
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    96
    resize_xserver(display, zonename)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
    97
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    98
    return smf_include.SMF_EXIT_OK
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
    99
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   100
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   101
def stop():
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   102
    try:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   103
        # first kill the SMF contract
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   104
        check_call(["/usr/bin/pkill", "-c", sys.argv[2]])
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   105
    except CalledProcessError as cpe:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   106
        # 1 is returncode if no SMF contract processes were matched,
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   107
        # meaning they have already terminated.
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   108
        if cpe.returncode != 1:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   109
                print "failed to kill the SMF contract: %s" % cpe
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   110
                return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   111
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   112
    try:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   113
        fmri = os.environ['SMF_FMRI']
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   114
        # reset port num prop to initial zero value
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   115
        cmd = [SVCCFG, '-s', fmri, 'setprop', 'vnc/port', '=', 'integer:',
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   116
               '0']
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   117
        svccfg = subprocess.Popen(cmd, stdout=subprocess.PIPE,
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   118
                                  stderr=subprocess.PIPE,)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   119
        out, err = svccfg.communicate()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   120
        retcode = svccfg.wait()
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   121
        if retcode != 0:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   122
            print "Error resetting 'vnc/port' property: " + err
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   123
            return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   124
    except Exception as e:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   125
        print e
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   126
        return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   127
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   128
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   129
def check_vncserver():
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   130
    if not os.path.exists(VNCSERVER):
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   131
        print("VNC console service not available on this compute node. "
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   132
              "%s is missing. Run 'pkg install x11/server/xvnc'"
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   133
              % VNCSERVER)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   134
        return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   135
    if not os.path.exists(XTERM):
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   136
        print("VNC console service not available on this compute node. "
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   137
              "%s is missing. Run 'pkg install terminal/xterm'"
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   138
              % XTERM)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   139
        return smf_include.SMF_EXIT_ERR_FATAL
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   140
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   141
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   142
def set_xstartup(homedir):
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   143
    vncdir = os.path.join(homedir, '.vnc')
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   144
    xstartup_path = os.path.join(vncdir, 'xstartup')
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   145
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   146
    try:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   147
        os.mkdir(vncdir)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   148
    except OSError as ose:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   149
        if ose.errno != errno.EEXIST:
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   150
            raise
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   151
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   152
    # Always clobber xstartup
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   153
    # stemp tuple = [fd, path]
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   154
    stemp = mkstemp(dir=vncdir)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   155
    os.write(stemp[0], XSTARTUP)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   156
    os.close(stemp[0])
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   157
    os.chmod(stemp[1], 0700)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   158
    os.rename(stemp[1], xstartup_path)
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   159
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   160
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   161
def resize_xserver(display, zonename):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   162
    """ Try to determine xterm window geometry and resize the Xvnc display
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   163
        to match using XRANDR. Treat failure as non-fatal since an
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   164
        incorrectly sized console is arguably better than none.
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   165
    """
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   166
    class UninitializedWindowError(Exception):
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   167
        pass
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   168
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   169
    class UnmappedWindowError(Exception):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   170
        pass
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   171
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   172
    def _get_window_geometry(display, windowname):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   173
        """ Find the xterm xwindow by name/title and extract its geometry
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   174
            Returns: tuple of window [width, height]
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   175
            Raises:
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   176
                UninitializedWindowError if window not yet initialized
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   177
                UnmappedWindowError if window is not viewable/mapped
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   178
        """
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   179
        cmd = [XWININFO, '-d', display, '-name', windowname]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   180
        xwininfo = subprocess.Popen(cmd, stdout=subprocess.PIPE,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   181
                                    stderr=subprocess.PIPE)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   182
        out, err = xwininfo.communicate()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   183
        retcode = xwininfo.wait()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   184
        if retcode != 0:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   185
            print "Error finding console xwindow info: " + err
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   186
            raise UninitializedWindowError
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   187
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   188
        width = None
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   189
        height = None
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   190
        mapped = False
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   191
        for line in out.splitlines():
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   192
            line = line.strip()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   193
            if line.startswith("Map State:"):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   194
                if line.split()[-1] != "IsViewable":
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   195
                    # Window is not mapped yet.
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   196
                    raise UnmappedWindowError
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   197
                else:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   198
                    mapped = True
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   199
            if line.startswith("Width:"):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   200
                width = int(line.split()[1])
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   201
            elif line.startswith("Height:"):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   202
                height = int(line.split()[1])
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   203
            if width and height and mapped:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   204
                return [width, height]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   205
        else:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   206
            # What, no width and height???
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   207
            print "No window geometry info returned by " + XWINFINFO
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   208
            raise UnmappedWindowError
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   209
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   210
    retries = 10
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   211
    sleep = 1
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   212
    uninit_count = 0
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   213
    unmap_count = 0
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   214
    width = 0
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   215
    height = 0
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   216
    while uninit_count < retries and unmap_count < retries:
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   217
        try:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   218
            width, height = _get_window_geometry(display,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   219
                                                 'Zone Console: ' + zonename)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   220
            print "Discovered xterm geometry: %d x %d" % (width, height)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   221
            break
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   222
        except UninitializedWindowError:
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   223
            if uninit_count < retries:
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   224
                print "xterm window not initialized yet. Retrying in %ds" \
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   225
                    % sleep
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   226
                uninit_count += 1
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   227
                time.sleep(sleep)
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   228
                continue
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   229
            else:
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   230
                print "xterm window is taking too long to initialize"
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   231
                break
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   232
        except UnmappedWindowError:
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   233
            if unmap_count < retries:
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   234
                print "Discovered xterm not mapped yet. Retrying in %ds" \
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   235
                    % sleep
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   236
                unmap_count += 1
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   237
                time.sleep(sleep)
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   238
                continue
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   239
            else:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   240
                print "Discovered xterm window is taking too long to map"
4046
47a996abe340 20816861 zone-vnc-console goes into maintenance
Niall Power <niall.power@oracle.com>
parents: 3998
diff changeset
   241
                break
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   242
    else:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   243
        print "Too many failed attempts to discover xterm window geometry"
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   244
        return
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   245
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   246
    # Generate a mode line for width and height, with a refresh of 60.0Hz
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   247
    cmd = [GTF, str(width), str(height), '60.0', '-x']
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   248
    gtf = subprocess.Popen(cmd, stdout=subprocess.PIPE,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   249
                           stderr=subprocess.PIPE)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   250
    out, err = gtf.communicate()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   251
    retcode = gtf.wait()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   252
    if retcode != 0:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   253
        print "Error creating new modeline for VNC display: " + err
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   254
        return
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   255
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   256
    for line in out.splitlines():
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   257
        line = line.strip()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   258
        if line.startswith('Modeline'):
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   259
            modeline = line.split('Modeline')[1]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   260
            print "New optimal modeline for Xvnc server: " + modeline
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   261
            mode = modeline.split()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   262
            break
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   263
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   264
    # Create a new mode for the Xvnc server using the modeline generated by gtf
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   265
    cmd = [XRANDR, '-d', display, '--newmode']
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   266
    cmd.extend(mode)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   267
    newmode = subprocess.Popen(cmd, stdout=subprocess.PIPE,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   268
                               stderr=subprocess.PIPE)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   269
    out, err = newmode.communicate()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   270
    retcode = newmode.wait()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   271
    if retcode != 0:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   272
        print "Error creating new xrandr modeline for VNC display: " + err
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   273
        return
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   274
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   275
    # Add the new mode to the default display output
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   276
    modename = mode[0]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   277
    cmd = [XRANDR, '-d', display, '--addmode', 'default', modename]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   278
    addmode = subprocess.Popen(cmd, stdout=subprocess.PIPE,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   279
                               stderr=subprocess.PIPE)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   280
    out, err = addmode.communicate()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   281
    retcode = addmode.wait()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   282
    if retcode != 0:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   283
        print "Error adding new xrandr modeline for VNC display: " + err
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   284
        return
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   285
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   286
    # Activate the new mode on the default display output
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   287
    cmd = [XRANDR, '-d', display, '--output', 'default', '--mode', modename]
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   288
    addmode = subprocess.Popen(cmd, stdout=subprocess.PIPE,
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   289
                               stderr=subprocess.PIPE)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   290
    out, err = addmode.communicate()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   291
    retcode = addmode.wait()
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   292
    if retcode != 0:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   293
        print "Error setting new xrandr modeline for VNC display: " + err
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   294
        return
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 3652
diff changeset
   295
3652
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   296
if __name__ == "__main__":
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   297
    os.putenv("LC_ALL", "C")
7e731a1b0b39 PSARC/2014/377 noVNC - A browser based VNC client
Niall Power <niall.power@oracle.com>
parents:
diff changeset
   298
    smf_include.smf_main()