From 56eb8e78cc702792e3b032e3f5f45da9e5dbea9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 28 Dec 2007 14:38:45 +0000 Subject: [PATCH] The php script I wrote to demo Haiku online with a VNC applet... Not as slick as http://live.oszoo.org/ but does the job. Maybe we should consider submitting an image to oszoo... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23184 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- 3rdparty/onlinedemo/haiku.php | 235 ++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100755 3rdparty/onlinedemo/haiku.php diff --git a/3rdparty/onlinedemo/haiku.php b/3rdparty/onlinedemo/haiku.php new file mode 100755 index 0000000000..3c0d1cbf71 --- /dev/null +++ b/3rdparty/onlinedemo/haiku.php @@ -0,0 +1,235 @@ + 8bpp): +// on debian, apt-get install tightvnc-java will put them in +// /usr/share/tightvnc-java +define("VNCJAVA_PATH", "tightvnc-java"); +define("VNCJAR", "VncViewer.jar"); +define("VNCCLASS", "VncViewer.class"); + +// maximum count of qemu instances. +define("MAX_QEMUS", 8); + +// size of the java applet, must match the default resolution of the image. +define("APPLET_WIDTH", "800"); +define("APPLET_HEIGHT", "600"); +// vnc protocol base port. +define("VNCPORTBASE", 5900); + +// timeout before the demo session is killed, as argument to /bin/sleep +define("SESSION_TIMEOUT", "10m"); + +// path to qemu binary +define("QEMU_BIN", "/usr/bin/qemu"); +// default arguments: no network, emulate tablet, readonly image file. +define("QEMU_ARGS","-net none -usbdevice tablet -snapshot"); +// absolute path to the image. +define("QEMU_IMAGE_PATH","/home/revol/haiku/trunk/generated/haiku.image"); + +// name of session and pid files in /tmp +define("QEMU_SESSFILE_TMPL", "qemu-haiku-session-"); +define("QEMU_PIDFILE_TMPL", "qemu-haiku-pid-"); +// name of session variable holding the qemu slot; not yet used correctly +define("QEMU_IDX_VAR", "QEMU_HAIKU_SESSION_VAR"); + +session_start(); + +if (isset($_GET['frame'])) { +} + +?> + + +Haiku Test + + +"; +} else + echo ""; + +function dbg($str) +{ + echo "
$str
\n"; +} + +function err($str) +{ + echo "
$str
\n"; +} + +function make_qemu_sessionfile_name($idx) +{ + return "/tmp/" . QEMU_SESSFILE_TMPL . $idx; +} + +function make_qemu_pidfile_name($idx) +{ + return "/tmp/" . QEMU_PIDFILE_TMPL . $idx; +} + +function find_qemu_slot() +{ + for ($idx = 0; $idx < MAX_QEMUS; $idx++) { + $pidfile = make_qemu_pidfile_name($idx); + $sessfile = make_qemu_sessionfile_name($idx); + dbg("checking \"$pidfile\", \"$sessfile\"..."); + if (!file_exists($pidfile) && !file_exists($sessfile)) { + file_put_contents($sessfile, session_id()); + $sid = file_get_contents($sessfile); + if ($sid != session_id()) + continue; + $_SESSION[QEMU_IDX_VAR] = $idx; + return $idx; + } + } + return -1; +} + +function qemu_slot() +{ + return $_SESSION[QEMU_IDX_VAR]; +} + +function vnc_display() +{ + return qemu_slot(); +} + +function vnc_port() +{ + return VNCPORTBASE + vnc_display(); +} + +function is_my_session_valid() +{ + if (!isset($_SESSION[QEMU_IDX_VAR])) + return 0; + $idx = $_SESSION[QEMU_IDX_VAR]; + $sessfile = make_qemu_sessionfile_name($idx); + if (!file_exists($sessfile)) + return 0; + $qemusession=file_get_contents($sessfile); + // has expired + if ($qemusession != session_id()) { + return 0; + } + return 1; +} + + +function start_qemu() +{ + $idx = find_qemu_slot(); + if ($idx < 0) { + err("No available qemu slot, please try later."); + return $idx; + } + $pidfile = make_qemu_pidfile_name($idx); + $cmd = QEMU_BIN . " " . QEMU_ARGS . " -vnc " . vnc_display() . " -pidfile " . $pidfile . " " . QEMU_IMAGE_PATH; + + if (file_exists($pidfile)) + unlink($pidfile); + dbg("Starting " . $cmd . "..."); + + $descriptorspec = array( + // 0 => array("pipe", "r"), // stdin + // 1 => array("pipe", "w"), // stdout + // 2 => array("pipe", "w") // stderr + ); + //$cmd="/bin/ls"; + //passthru($cmd, $ret); + //dbg("ret=$ret"); + $cmd .= " &"; + $process = proc_open($cmd, $descriptorspec, $pipes); + sleep(1); + proc_close($process); + + dbg("Started QEMU."); + $sessfile = make_qemu_sessionfile_name($idx); + $cmd = "(sleep " . SESSION_TIMEOUT . "; kill -9 `cat " . $pidfile . "`; rm " . $pidfile . " " . $sessfile . ") &"; + + $process = proc_open($cmd, $descriptorspec, $wkpipes); + sleep(1); + proc_close($process); + + dbg("Started timed kill."); + dbg("Ready for a " . SESSION_TIMEOUT . " session."); +} + + +function output_applet_code() +{ + $w = APPLET_WIDTH; + $h = APPLET_HEIGHT; + $port = vnc_port(); + $vncjpath = VNCJAVA_PATH; + $jar = VNCJAR; + $class = VNCCLASS; + echo " + + + + + There should be a java applet here... make sure you have a JVM and it's enabled! + "; +} + +dbg("Checking if session is running..."); + +if (is_my_session_valid()) { + dbg("Session running"); + $qemuidx = qemu_slot(); +} else if ($closing != 1) { + dbg("Need to start qemu"); + + $qemuidx = start_qemu(); +} + +if ($qemuidx >= 0) { + if ($closing) { + dbg("closing..."); + unlink(make_qemu_sessionfile_name($qemuidx)); + //unlink(make_qemu_sessionfile_name($qemuidx)); + sleep(1); + //echo ""; + } else { + dbg("Waiting for vnc server..."); + sleep(5); + output_applet_code(); + } +} + + + +?> + + +