Skip to content

NetCDF visualization tools in Docker #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions netcdf-xpra/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
FROM ndslabs/xpra-base:latest

RUN yum update -q -y && \
yum install -y \
java-1.8.0-openjdk \
openbox xorg-x11-apps \
xterm \
antlr \
antlr-C++ \
bison \
make \
automake \
gcc \
gcc-c++ \
kernel-devel \
flex \
gdb \
git \
gsl-bin \
gsl-devel \
pax \
vim \
wget \
netcdf \
expat-devel \
zlib-devel \
numpy \
scipy \
matplotlib \
libX11-devel \
libXaw-devel \
libpng-devel \
netcdf4-python && \
cd / && wget https://www.giss.nasa.gov/tools/panoply/download/PanoplyJ-4.8.1.tgz && \
tar xvfz PanoplyJ-4.8.1.tgz

RUN cd /usr/local/src && \
wget ftp://ftp.unidata.ucar.edu/pub/udunits/udunits-2.2.24.tar.gz && \
gunzip -c udunits-2.2.24.tar.gz | pax -r && \
cd udunits-2.2.24 && ./configure && make install && make clean

RUN cd /usr/local/src && \
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.0-patch1/src/hdf5-1.10.0-patch1.tar.gz && \
tar xvfz hdf5-1.10.0-patch1.tar.gz && \
cd hdf5-1.10.0-patch1 && ./configure --prefix=/usr/local && make install && make clean && \
cd /usr/local/src

RUN wget https://github.com/Unidata/netcdf-c/archive/v4.4.1.1.tar.gz -O netcdf-v4.4.1.1.tar.gz && \
tar xvfz netcdf-v4.4.1.1.tar.gz && \
cd netcdf-c-4.4.1.1/ && ./configure --prefix=/usr/local/ && make install && make clean && \
cd /usr/local/src

RUN wget https://github.com/nco/nco/archive/4.6.6.tar.gz -O nco-4.6.6.tar.gz && \
tar xvzf nco-4.6.6.tar.gz && cd nco-4.6.6/ && \
./configure --enable-static --enable-shared --enable-udunits2 --disable-udunits --enable-gsl --enable-ncoxx --enable-netcdf4 --enable-regex --disable-dap && \
make install && make clean

RUN cd /usr/local/src && \
wget ftp://cirrus.ucsd.edu/pub/ncview/ncview-2.1.7.tar.gz && \
tar xvfz ncview-2.1.7.tar.gz && cd ncview-2.1.7/ && \
./configure && make install && make clean

ENV PATH /PanoplyJ:$PATH
COPY entrypoint.sh /
COPY index.html /usr/share/xpra/www
VOLUME /root
EXPOSE 10000

CMD [ "/entrypoint.sh"]
5 changes: 5 additions & 0 deletions netcdf-xpra/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Xpra + OpenBox + NetCDF

This image uses [Xpra](xpra.org) with [OpenBox](http://openbox.org/) to provide access to a think desktop environment to run NetCDF visualization tools including [Panoply](https://www.giss.nasa.gov/tools/panoply/) and [Ncview](http://meteora.ucsd.edu/~pierce/ncview_home_page.html). Image also contains dependencies necessary for NCO development.

This image is intended for use with the TERRA-REF Analysis Workbench for hyperspectral data products.
7 changes: 7 additions & 0 deletions netcdf-xpra/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

#xpra start --daemon=no --exit-with-children --mdns=no --pulseaudio=no --printing=no --webcam=no --bind-tcp=0.0.0.0:10000 --html=on --start-child=/PanoplyJ/panoply.sh

xpra start-desktop --start=openbox-session --bind-tcp=0.0.0.0:10000 --html=on

sleep infinity
302 changes: 302 additions & 0 deletions netcdf-xpra/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

<!--
Copyright (c) 2013-2017 Antoine Martin <antoine@devloop.org.uk>
Copyright (c) 2014 Joshua Higgins <josh@kxes.net>
Licensed under MPL 2.0
-->

<title>xpra websockets client</title>
<meta charset="utf-8">
<meta name="description" content="xpra websockets client">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" href="/favicon.png">

<link rel="stylesheet" href="css/client.css">
<link rel="stylesheet" href="css/spinner.css">

<script type="text/javascript" src="js/lib/jquery.js"></script>
<script type="text/javascript" src="js/lib/jquery-ui.js"></script>
<script type="text/javascript" src="js/lib/jquery.ba-throttle-debounce.js"></script>

<script type="text/javascript" src="js/lib/bencode.js"></script>
<script type="text/javascript" src="js/lib/zlib.js"></script>
<script type="text/javascript" src="js/lib/lz4.js"></script>
<script type="text/javascript" src="js/lib/forge.js"></script>

<script type="text/javascript" src="js/lib/broadway/Decoder.js"></script>
<script type="text/javascript" src="js/lib/aurora/aurora.js"></script>
<!--
<script type="text/javascript" src="js/lib/aurora/mp3.js"></script>
<script type="text/javascript" src="js/lib/aurora/flac.js"></script>
-->
<script type="text/javascript" src="js/lib/aurora/aurora-xpra.js"></script>

<script type="text/javascript" src="js/Keycodes.js"></script>
<script type="text/javascript" src="js/Protocol.js"></script>
<script type="text/javascript" src="js/Window.js"></script>
<script type="text/javascript" src="js/Notifications.js"></script>
<script type="text/javascript" src="js/Utilities.js"></script>
<script type="text/javascript" src="js/MediaSourceUtil.js"></script>
<script type="text/javascript" src="js/Client.js"></script>
</head>

<body>
<div id="dpi" style="width: 1in; height: 1in; left: -100%; top: -100%; position: absolute;">
</div>

<div id="screen" style="width: 100%; height:100%;">
</div>

<div class="notifications">
</div>

<div>
<textarea id="pasteboard" onblur="this.focus()" autofocus style="display: block; position: absolute; left: -99em;"></textarea>
</div>

<script>

if (!window.location.getParameter) {
window.location.getParameter = function(key) {
function parseParams() {
var params = {},
e,
a = /\+/g, // Regex for replacing addition symbol with a space
r = /([^&=]+)=?([^&]*)/g,
d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
q = window.location.search.substring(1);

while (e = r.exec(q))
params[d(e[1])] = d(e[2]);

return params;
}

if (!this.queryStringParams)
this.queryStringParams = parseParams();

return this.queryStringParams[key];
};
}

// disable right click menu:
window.oncontextmenu = function(e) {
//showCustomMenu();
return false;
}

function getparam(name) {
return window.location.getParameter(name);
}
function getboolparam(name, default_value) {
var v = window.location.getParameter(name);
if(v==null) {
return default_value;
}
return ["true", "on", "1"].indexOf(String(v).toLowerCase())>=0;
}

function encodeData(s) {
return encodeURIComponent(s);
}

$(document).ready(function() {
// look at url parameters
var username = getparam("username") || null;
var password = getparam("password") || null;
var sound = getparam("sound") || null;
var audio_codec = getparam("audio_codec") || null;
var encoding = getparam("encoding") || null;
var action = getparam("action") || "connect";
var submit = getparam("submit") || null;
var server = getparam("server") || window.location.hostname;
var port = getparam("port") || window.location.port;
var encryption = getparam("encryption") || null;
var key = getparam("key") || null;
var keyboard_layout = getparam("keyboard_layout") || null;
var start = getparam("start");
var exit_with_children = getparam("exit_with_children") || "";
var exit_with_client = getparam("exit_with_client") || "";
var sharing = getboolparam("sharing", false);
var video = getboolparam("video", false);
var mediasource_video = getboolparam("mediasource_video", false);
var normal_fullscreen = getboolparam("normal_fullscreen", false);
var remote_logging = getboolparam("remote_logging", true);
var debug = getboolparam("debug", false);
var insecure = getboolparam("insecure", false);
var ignore_audio_blacklist = getboolparam("ignore_audio_blacklist", false);
var clipboard = getboolparam("clipboard", true);

// create the client
var client = new XpraClient('screen');
client.debug = debug;
client.remote_logging = remote_logging;
client.sharing = sharing;
client.insecure = insecure;
client.clipboard_enabled = clipboard;

// mediasource video
if(video) {
client.supported_encodings.push("h264");
if(mediasource_video) {
client.supported_encodings.push("vp8+webm", "h264+mp4", "mpeg4+mp4");
}
}
else if(encoding && (encoding !== "auto")) {
// the primary encoding can be set
client.enable_encoding(encoding);
}
// encodings can be disabled like so
// client.disable_encoding("h264");
if(action && (action!="connect")) {
sns = {
"mode" : action,
};
if(start) {
sns["start"] = [start];
}
if (exit_with_children) {
sns["exit-with-children"] = true;
}
if (exit_with_client) {
sns["exit-with-client"] = true;
}
client.start_new_session = sns
}

// see if we should undecorate and maximise normal windows
if(normal_fullscreen) {
client.normal_fullscreen_mode = true;
}

// sound support
if(sound) {
client.audio_enabled = true;
console.log("sound enabled, audio codec string: "+audio_codec);
if(audio_codec && audio_codec.indexOf(":")>0) {
var acparts = audio_codec.split(":");
client.audio_framework = acparts[0];
client.audio_codec = acparts[1];
}
client.audio_mediasource_enabled = getboolparam("mediasource", true);
client.audio_aurora_enabled = getboolparam("aurora", true);
}

if(keyboard_layout) {
client.keyboard_layout = keyboard_layout;
}

// check for username and password
if(username) {
client.username = username;
}
if(password) {
client.authentication_key = password;
}

// check for encryption parameters
if(encryption) {
client.encryption = encryption;
if(key) {
client.encryption_key = key;
}
}

// attach a callback for when client closes
if(!debug) {
client.callback_close = function(reason) {
if(submit) {
var message = "Connection closed (socket closed)";
if(reason) {
message = reason;
}
var url = "/connect.html?disconnect="+encodeData(message);
var props = {
"username" : username,
"password" : password,
"encoding" : encoding,
"keyboard_layout" : keyboard_layout,
"action" : action,
"sound" : sound,
"audio_codec" : audio_codec,
"clipboard" : clipboard,
"exit_with_children": exit_with_children,
"exit_with_client" : exit_with_client,
"sharing" : sharing,
"normal_fullscreen" : normal_fullscreen,
"video" : video,
"mediasource_video" : mediasource_video,
"debug" : debug,
"remote_logging" : remote_logging,
"insecure" : insecure,
"ignore_audio_blacklist" : ignore_audio_blacklist,
}
for (var name in props) {
var value = props[name];
if(value) {
url += "&"+name+"="+encodeData(value);
}
}
window.location=url;
} else {
// if we didn't submit through the form, silently redirect to the connect gui
window.location="connect.html";
}
}
}
client.init(ignore_audio_blacklist);

// and connect
var ssl = document.location.protocol=="https:";
client.connect(server, port, ssl);

if (clipboard) {
//clipboard hooks:
var pasteboard = $('#pasteboard');
pasteboard.on('paste', function (e) {
var paste_data = (e.originalEvent || e).clipboardData.getData('text/plain');
client.send_clipboard_token(unescape(encodeURIComponent(paste_data)));
return false;
});
pasteboard.on('copy', function (e) {
var clipboard_buffer = client.get_clipboard_buffer();
$('#pasteboard').text(decodeURIComponent(escape(clipboard_buffer)));
$('#pasteboard').select();
client.clipboard_pending = false;
return true;
});
pasteboard.on('cut', function (e) {
var clipboard_buffer = client.get_clipboard_buffer();
$('#pasteboard').text(decodeURIComponent(escape(clipboard_buffer)));
$('#pasteboard').select();
client.clipboard_pending = false;
return true;
});
$('#screen').on('click', function (e) {
//console.log("click pending=", client.clipboard_pending, "buffer=", client.clipboard_buffer);
if (client.clipboard_pending) {
var clipboard_buffer = client.get_clipboard_buffer();
$('#pasteboard').text(client.clipboard_buffer);
$('#pasteboard').select();
//for IE:
var success = true;
if (window.clipboardData && window.clipboardData.setData) {
clipboardData.setData("Text", this.clipboard_buffer);
}
else {
success = document.execCommand('copy');
//console.log("copy success=", success);
}
if (success) {
client.clipboard_pending = false;
}
}
});
}
});
</script>
</body>
</html>