[pve-devel] [RFC manager 1/2] load novnc index dynamically
Dominik Csapak
d.csapak at proxmox.com
Mon Jan 23 13:59:26 CET 2017
instead of hardcoding the html into perl, we open the file and
do a regex replace for the relevant strings
this has some advantes:
* whenever upstream novnc changes the html file, we just need to update
the novnc-pve package, not pve-manager
* the html code will only be in memory when using novnc, since perl
does not have to allocate the content as a string
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
PVE/NoVncIndex.pm | 174 +++---------------------------------------------------
1 file changed, 8 insertions(+), 166 deletions(-)
diff --git a/PVE/NoVncIndex.pm b/PVE/NoVncIndex.pm
index 2869c2a..950dff7 100644
--- a/PVE/NoVncIndex.pm
+++ b/PVE/NoVncIndex.pm
@@ -6,175 +6,17 @@ use warnings;
sub get_index {
my ($lang, $username, $csrftoken, $console, $nodename) = @_;
- my $page = <<_EOD;
-<!DOCTYPE html>
-<html>
-<head>
- <title>$nodename - Proxmox Console</title>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <!-- Apple iOS Safari settings -->
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
- <!-- Stylesheets -->
- <link rel="stylesheet" href="/novnc/include/base.css"/>
-_EOD
+ my $vncfile = '/usr/share/novnc-pve/vnc.html';
+ my $page;
- my $langfile = "/usr/share/pve-manager/locale/pve-lang-${lang}.js";
- if (-f $langfile) {
- $page .= "<script type='text/javascript' src='/pve2/locale/pve-lang-${lang}.js'></script>";
- } else {
- $page .= '<script type="text/javascript">function gettext(buf) { return buf; }</script>';
+ if (! -f $vncfile) {
+ die 'no novnc installed';
}
- $page .= <<_EOD;
- <script type="text/javascript">
-if (typeof(PVE) === 'undefined') PVE = {};
-PVE.UserName = '$username';
-PVE.CSRFPreventionToken = '$csrftoken';
-INCLUDE_URI='/novnc/include/';
- </script>
-</head>
-<body>
- <div id="noVNC-control-bar">
- <!--noVNC Mobile Device only Buttons-->
- <div class="noVNC-buttons-left">
- <input type="image" alt="viewport drag" src="/novnc/images/drag.png"
- id="noVNC_view_drag_button" class="noVNC_status_button"
- title="Move/Drag Viewport">
- <div id="noVNC_mobile_buttons">
- <input type="image" alt="No mousebutton" src="/novnc/images/mouse_none.png"
- id="noVNC_mouse_button0" class="noVNC_status_button">
- <input type="image" alt="Left mousebutton" src="/novnc/images/mouse_left.png"
- id="noVNC_mouse_button1" class="noVNC_status_button">
- <input type="image" alt="Middle mousebutton" src="/novnc/images/mouse_middle.png"
- id="noVNC_mouse_button2" class="noVNC_status_button">
- <input type="image" alt="Right mousebutton" src="/novnc/images/mouse_right.png"
- id="noVNC_mouse_button4" class="noVNC_status_button">
- <input type="image" alt="Keyboard" src="/novnc/images/keyboard.png"
- id="showKeyboard" class="noVNC_status_button"
- value="Keyboard" title="Show Keyboard"/>
- <!-- Note that Google Chrome on Android doesn't respect any of these,
- html attributes which attempt to disable text suggestions on the
- on-screen keyboard. Let's hope Chrome implements the ime-mode
- style for example -->
- <textarea id="keyboardinput" autocapitalize="off"
- autocorrect="off" autocomplete="off" spellcheck="false"
- mozactionhint="Enter" onsubmit="return false;"
- style="ime-mode: disabled;"></textarea>
- <div id="noVNC_extra_keys">
- <input type="image" alt="Extra keys" src="/novnc/images/showextrakeys.png"
- id="showExtraKeysButton" class="noVNC_status_button">
- <input type="image" alt="Ctrl" src="/novnc/images/ctrl.png"
- id="toggleCtrlButton" class="noVNC_status_button">
- <input type="image" alt="Alt" src="/novnc/images/alt.png"
- id="toggleAltButton" class="noVNC_status_button">
- <input type="image" alt="Tab" src="/novnc/images/tab.png"
- id="sendTabButton" class="noVNC_status_button">
- <input type="image" alt="Esc" src="/novnc/images/esc.png"
- id="sendEscButton" class="noVNC_status_button">
- <input type="image" alt="Ctrl+Alt+Del" src="/novnc/images/ctrlaltdel.png"
- id="sendCtrlAltDelButton" class="noVNC_status_button">
- </div>
- </div>
- </div>
-
- <div id="noVNC_status">Loading</div>
-
- <!--noVNC Buttons-->
- <div class="noVNC-buttons-right">
- <input type="image" alt="Send keys" src="/novnc/images/showextrakeys.png"
- id="showSendKeysButton" class="noVNC_status_button"
- title="Send keys" />
- <input type="image" alt="Clipboard" src="/novnc/images/clipboard.png"
- id="clipboardButton" class="noVNC_status_button"
- title="Clipboard" />
- <input type="image" alt="Fullscreen" src="/novnc/images/fullscreen.png"
- id="fullscreenButton" class="noVNC_status_button"
- title="Fullscreen" />
- <input type="image" alt="Commands" src="/novnc/images/power.png"
- id="pveCommandsButton" class="noVNC_status_button"
- title="Commands" />
- </div>
-
- <div id="noVNC_description" class="">
- </div>
-
- <!-- Popup Status Panel -->
- <div id="noVNC_popup_status" class="">
- </div>
-
- <!-- Clipboard Panel -->
- <div id="noVNC_clipboard" class="triangle-right top">
- <textarea id="noVNC_clipboard_text" rows=5>
- </textarea>
- <br />
- <input id="noVNC_clipboard_clear_button" type="button"
- value="Clear">
- </div>
-
- <!-- PVE command Panel -->
- <div id="noVNC_pve_commands" class="triangle-right top">
- <span id="noVNC_pve_command_menu">
- </span>
- </div>
-
- <!-- Settings Panel -->
- <div id="noVNC_settings" class="triangle-right top">
- <span id="noVNC_settings_menu">
- <ul>
- <li><input id="noVNC_encrypt" type="checkbox"> Encrypt</li>
- <li><input id="noVNC_true_color" type="checkbox" checked> True Color</li>
- <li><input id="noVNC_cursor" type="checkbox"> Local Cursor</li>
- <li><input id="noVNC_clip" type="checkbox" value="true"> Clip to Window</li>
- <li><input id="noVNC_shared" type="checkbox"> Shared Mode</li>
- <li><input id="noVNC_view_only" type="checkbox"> View Only</li>
- <li><input id="noVNC_path" type="input" value="websockify"> Path</li>
- <li><input id="noVNC_repeaterID" type="input" value=""> Repeater ID</li>
- <li><input id="noVNC_stylesheet" type="input" value=""> Stylesheet</li>
- <li><input id="noVNC_resize" type="input" value=""> Resize</li>
- <li><input id="noVNC_logging" type="input" value=""> Logging</li>
-
- </ul>
- </span>
- </div>
-
- <!-- PVE Send Key Panel -->
- <div id="noVNC_send_keys" class="triangle-right top">
- <span id="noVNC_send_keys_panel">
- </span>
- </div>
-
- <!-- Connection Panel -->
- <div id="noVNC_controls" class="triangle-right top">
- <ul>
- <li><label><strong>Host: </strong><input id="noVNC_host" /></label></li>
- <li><label><strong>Port: </strong><input id="noVNC_port" /></label></li>
- <li><label><strong>Password: </strong><input id="noVNC_password" type="password" /></label></li>
- <li><input id="noVNC_connect_button" type="button" value="Connect"></li>
- </ul>
- </div>
-
- </div> <!-- End of noVNC-control-bar -->
-
- <div id="noVNC_screen">
- <div id="noVNC_screen_pad"></div>
-
- <h1 id="noVNC_logo"><span>no</span><br />VNC</h1>
-
- <!-- HTML5 Canvas -->
- <div id="noVNC_container">
- <canvas id="noVNC_canvas" width="640" height="400">
- Canvas not supported.
- </canvas>
- </div>
-
- </div>
- <script src="/novnc/include/util.js"></script>
- <script src="/novnc/include/pveui.js"></script>
-</body>
-</html>
-_EOD
-
+ $page = PVE::Tools::file_get_contents($vncfile);
+ $page =~ s/{PVECSRFTOKEN}/$csrftoken/;
+ $page =~ s/{PVEUSERNAME}/$username/;
+ $page =~ s/{PVETITLE}/$nodename - Proxmox Console/;
return $page;
}
--
2.1.4
More information about the pve-devel
mailing list