View script for controller bootmedia and script/action name index
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/bootmedia/list.phtml b/application/modules/backend/views/scripts/bootmedia/list.phtml
new file mode 100644
index 0000000..8d441c9
--- /dev/null
+++ b/application/modules/backend/views/scripts/bootmedia/list.phtml
@@ -0,0 +1,20 @@
+ if (!empty($this->listdata)): ?>
+ foreach ($this->listdata as $l): ?>
+
+ endforeach;?>
+ endif;?>
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/menu/index.phtml b/application/modules/backend/views/scripts/menu/index.phtml
new file mode 100644
index 0000000..2bd3dd3
--- /dev/null
+++ b/application/modules/backend/views/scripts/menu/index.phtml
@@ -0,0 +1 @@
+
View script for controller bootmedia and script/action name index
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/menu/list.phtml b/application/modules/backend/views/scripts/menu/list.phtml
new file mode 100644
index 0000000..e28e54e
--- /dev/null
+++ b/application/modules/backend/views/scripts/menu/list.phtml
@@ -0,0 +1,15 @@
+ if (!empty($this->listdata)): ?>
+ foreach ($this->listdata as $l): ?>
+
+ endforeach;?>
+ endif;?>
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/menu/listassignments.phtml b/application/modules/backend/views/scripts/menu/listassignments.phtml
new file mode 100644
index 0000000..2ca982b
--- /dev/null
+++ b/application/modules/backend/views/scripts/menu/listassignments.phtml
@@ -0,0 +1,18 @@
+ if (!empty($this->listdata)): ?>
+ foreach ($this->listdata as $l): ?>
+
+ endforeach;?>
+ endif;?>
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/menu/listentries.phtml b/application/modules/backend/views/scripts/menu/listentries.phtml
new file mode 100644
index 0000000..4d8431e
--- /dev/null
+++ b/application/modules/backend/views/scripts/menu/listentries.phtml
@@ -0,0 +1,19 @@
+ if (!empty($this->listdata)): ?>
+ foreach ($this->listdata as $l): ?>
+
+ endforeach;?>
+ endif;?>
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/mkiso/index.phtml b/application/modules/backend/views/scripts/mkiso/index.phtml
new file mode 100644
index 0000000..2bd3dd3
--- /dev/null
+++ b/application/modules/backend/views/scripts/mkiso/index.phtml
@@ -0,0 +1 @@
+
View script for controller bootmedia and script/action name index
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/system/add.phtml b/application/modules/backend/views/scripts/system/add.phtml
new file mode 100644
index 0000000..f09beb8
--- /dev/null
+++ b/application/modules/backend/views/scripts/system/add.phtml
@@ -0,0 +1 @@
+
View script for controller system and script/action name add
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/system/addkernel.phtml b/application/modules/backend/views/scripts/system/addkernel.phtml
new file mode 100644
index 0000000..e69de29
diff --git a/application/modules/backend/views/scripts/system/index.phtml b/application/modules/backend/views/scripts/system/index.phtml
new file mode 100644
index 0000000..690f955
--- /dev/null
+++ b/application/modules/backend/views/scripts/system/index.phtml
@@ -0,0 +1 @@
+
View script for controller system and script/action name index
\ No newline at end of file
diff --git a/application/modules/backend/views/scripts/system/sync.phtml b/application/modules/backend/views/scripts/system/sync.phtml
new file mode 100644
index 0000000..e69de29
diff --git a/application/modules/backend/views/scripts/system/updateinitramfs.phtml b/application/modules/backend/views/scripts/system/updateinitramfs.phtml
new file mode 100644
index 0000000..e69de29
diff --git a/application/modules/backend/views/scripts/system/updatekernel.phtml b/application/modules/backend/views/scripts/system/updatekernel.phtml
new file mode 100644
index 0000000..e69de29
diff --git a/application/modules/backend/views/scripts/user/index.phtml b/application/modules/backend/views/scripts/user/index.phtml
new file mode 100644
index 0000000..c04cb93
--- /dev/null
+++ b/application/modules/backend/views/scripts/user/index.phtml
@@ -0,0 +1 @@
+
View script for controller user and script/action name index
\ No newline at end of file
diff --git a/application/modules/bootloader/controllers/EnvController.php b/application/modules/bootloader/controllers/EnvController.php
new file mode 100644
index 0000000..aba575b
--- /dev/null
+++ b/application/modules/bootloader/controllers/EnvController.php
@@ -0,0 +1,218 @@
+_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+
+ }
+
+ public function indexAction()
+ {
+ }
+
+ function _ip_netmask_check ($ip, $net, $mask) {
+
+ if (empty($net) OR empty($mask)) return false;
+
+ $ip_net = ip2long ($net);
+ $ip_mask = ~((1 << (32 - $mask)) - 1);
+
+ $ip_ip = ip2long ($ip);
+
+ $ip_ip_net = $ip_ip & $ip_mask;
+
+ return ($ip_ip_net == $ip_net);
+ }
+
+ public function getmenuAction() {
+
+ $mid = $this->getRequest()->getParam('formedia');
+
+ $this->_mmenus = new Model_Menus();
+ $this->_mmenu_entries = new Model_Menuentries();
+ $this->_mmenu_assignments = new Model_Menuassignments();
+ $this->_mmenu_assignment_iprules = new Model_Menuassignmentip();
+ $this->_mmenu_assignment_bmrules = new Model_Menuassignmentbm();
+
+ $s = $this->_mmenu_assignments->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
+ $s->setIntegrityCheck(false)
+ ->joinLeft(array('m' => 'menus'), 'm.id = menu_assignments.menu_id',
+ array('m_name' => 'name'))
+ ->joinLeft(array('i' => 'menu_assignment_iprules'), 'i.menu_assignment_rule = menu_assignments.id',
+ array('i_ip' => 'ip',
+ 'i_netmask' => 'netmask'))
+ ->joinLeft(array('b' => 'menu_assignment_bmrules'), 'b.menu_assignment_rule = menu_assignments.id',
+ array('b_bootmedia_id' => 'bootmedia_id'))
+ ->joinLeft(array('bm' => 'bootmedia'), 'bm.id = b.bootmedia_id',
+ array('b_name' => 'name',
+ 'b_identifier' => 'identifier'))
+ ->order(array('menu_id', 'i_netmask', 'b_bootmedia'));
+ $data = $this->_mmenu_assignments->fetchAll($s)->toArray();
+
+ foreach ($data as $d) {
+ if ($this->_ip_netmask_check($_SERVER['REMOTE_ADDR'], $d['i_ip'], $d['i_netmask'])) {
+ if ($pbs_id == $d['b_identifier']) $r[4][] = $d['menu_id'];
+ else $r[3][] = $d['menu_id'];
+ } else {
+ if ($pbs_id == $d['b_identifier']) $r[2][] = $d['menu_id'];
+ else $r[1][] = $d['menu_id'];
+ }
+ }
+
+ for ($i = 4; $i>0; $i--) {
+ if (!empty($r[$i])) {
+ $r = array_shift($r[$i]);
+ break;
+ }
+ }
+
+ $s = $this->_mmenu_entries->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
+ $s->setIntegrityCheck(false)
+ ->where('menu_id = ?', $r)
+ ->joinLeft(array('s' => 'systems'), 's.id = menu_entries.system_id',
+ array('s_name' => 'name',
+ 's_append' => 'append',
+ 's_external_id' => 'external_id',
+ 's_source' => 'source'))
+ ->order('entry_order');
+ $data = $this->_mmenu_entries->fetchAll($s)->toArray();
+
+
+ $r = array();
+ $c = 1;
+ $mapping = "\n case $(cat result) in ";
+ foreach ($data as $d) {
+ $r[] = "$c \"" . (($d['overwrite_caption'] == 1)? $d['alternative_caption'] : $d['s_name']) . "\"";
+ $m = "\n %s)";
+ $m .= "\n echo \"systemid=%s\" >> /tmp/boot";
+ $m .= "\n echo \"systemname=\\\"%s\\\"\" >> /tmp/boot";
+ $m .= "\n echo \"sysname=%s\" >> /tmp/boot";
+ $m .= "\n echo \"syssource=%s\" >> /tmp/boot";
+ $m .= "\n echo \"append=%s\" >> /tmp/boot";
+ $m .= "\n ;;";
+ $mapping .= sprintf($m,
+ $c,
+ $d['id'],
+ (($d['overwrite_caption'] == 1)? $d['alternative_caption'] : $d['s_name']),
+ $d['s_external_id'],
+ $d['s_source'],
+ (($d['overwrite_append'] == 1)? $d['alternative_append'] : $d['s_append'])
+ );
+ $c++;
+ }
+ $mapping .= "\n esac";
+
+ $entryCount = count($r);
+ $entries = implode(" ", $r);
+
+ $v = $this->view;
+ $v->bootmenu = "$entryCount $entries";
+ $v->bootmenu_mapping = $mapping;
+ echo $v->render('env/bootmenu.dialog');
+ }
+
+ public function getinitAction() {
+
+ $mid = $this->getRequest()->getParam('formedia');
+
+ $v = $this->view;
+ #$v->dialog = "/bin/sh";
+ echo $v->render('env/prebootInit.sh');
+ }
+
+ public function getkernelAction() {
+ $sid = $this->getRequest()->getParam('forsystem');
+ $s = new Model_Systems();
+
+ $d = $s->find($sid)->toArray();
+ $d = $d[0];
+
+
+ $cmd = "atftp %s -g -r %s -l /tmp/vmlinuz";
+ $cmd = sprintf($cmd, $d['source'], $d['kernel']);
+
+ $output = array();
+ $returnval = null;
+ exec($cmd, $output, $returnval);
+
+ $file = "/tmp/vmlinuz";
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Transfer-Encoding: binary");
+ header("Content-Length: " . (string)filesize($file));
+ header('Content-Disposition: attachment; filename="vmlinuz"');
+
+ readfile($file);
+ }
+
+ public function getinitramfsAction() {
+ $sid = $this->getRequest()->getParam('forsystem');
+ $s = new Model_Systems();
+
+ $d = $s->find($sid)->toArray();
+ $d = $d[0];
+
+ $cmd = "atftp %s -g -r %s -l /tmp/initramfs";
+ $cmd = sprintf($cmd, $d['source'], $d['initrd']);
+
+ $output = array();
+ $returnval = null;
+ exec($cmd, $output, $returnval);
+
+ $file = "/tmp/initramfs";
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Transfer-Encoding: binary");
+ header("Content-Length: " . (string)filesize($file));
+ header('Content-Disposition: attachment; filename="initramfs"');
+
+ readfile($file);
+ }
+
+ public function getccAction() {
+ $sid = $this->getRequest()->getParam('forsystem');
+ $s = new Model_Systems();
+
+ $d = $s->find($sid)->toArray();
+ $d = $d[0];
+
+ $file = "/tmp/initramfs.".mktime();
+
+ $cmd = "atftp %s -g -r %s -l $file";
+ $cmd = sprintf($cmd, $d['source'], $d['external_id']);
+
+ $output = array();
+ $returnval = null;
+ exec($cmd, $output, $returnval);
+
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Transfer-Encoding: binary");
+ header("Content-Length: " . (string)filesize($file));
+ header('Content-Disposition: attachment; filename="initramfs"');
+
+ readfile($file);
+ }
+
+ public function __call($a, $b)
+ {
+ var_dump($a,$b);
+ }
+
+
+
+}
+
+
+
diff --git a/application/modules/bootloader/controllers/IndexController.php b/application/modules/bootloader/controllers/IndexController.php
new file mode 100644
index 0000000..7a2fcea
--- /dev/null
+++ b/application/modules/bootloader/controllers/IndexController.php
@@ -0,0 +1,29 @@
+bootmenu ?> 2>result
+done
+
+= $this->bootmenu_mapping ?>
\ No newline at end of file
diff --git a/application/modules/bootloader/views/scripts/env/prebootInit.sh b/application/modules/bootloader/views/scripts/env/prebootInit.sh
new file mode 100644
index 0000000..acf8f33
--- /dev/null
+++ b/application/modules/bootloader/views/scripts/env/prebootInit.sh
@@ -0,0 +1,71 @@
+#!/bin/ash
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# preboot script for user interaction with OpenSLX preloading environment for
+# Linux stateless clients (fetched by Preboot init over the net)
+
+# get configuration
+. /etc/initramfs-setup
+. /etc/pbs.conf
+. ./preboot-scripts/dialog.functions
+
+# bring the mac address into the standard format 01-
+client=$(echo 01-$macaddr|sed "s/:/-/g")
+
+# check if already a configuration is available to decide if user interaction
+# is required (path is to be fixed)
+#wget -q -O /tmp/have-user-config "$boot_uri/users.pl?user=${client}"
+#have_user_config=$(cat /tmp/have-user-config);
+
+#if [ "x1" == "x$have_user_config" ]; then
+# wget -q -O /tmp/oldconfig "$boot_uri/users.pl?user=${client}&action=read"
+# . /tmp/oldconfig
+# menu_oldconfig $oldconfig
+#else
+# menu_firststart
+#fi
+#rm result;
+
+# Switch here for several boot TYPE=fastboot/directkiosk/cfgkiosk/slxconfig
+# fastboot - no interaction use system from client config
+# directkiosk - start the default slx system into kiosk (using vmchooser)
+# cfgkiosk - offer the user changes to his kiosk system (GUI environment)
+# slxconfig - offer the user set of configuration options, like setting a non-
+# priviledged user, root password, standard gui, plugins to activate ...
+
+wget -q -O /preboot/bootmenu.dialog ${boot_uri}bootloader/env/getmenu/formedia/$pbs_id
+
+# we expect to have a system selection dialog file in /preboot/bootmenu.dialog
+chmod u+x /preboot/bootmenu.dialog
+/preboot/bootmenu.dialog
+
+. /tmp/boot
+
+
+# fetch kernel and initramfs of selected system
+dialog --infobox "Loading kernel of ${systemname} ..." 3 65
+#ddownload ${boot_uri}bootloader/env/getkernel/forsystem/$systemid "Kernel" /tmp/kernel
+wget -q -O /tmp/kernel ${boot_uri}bootloader/env/getkernel/forsystem/$systemid
+dialog --infobox "Loading initial ramfs of ${systemname} ..." 3 65
+#ddownload ${boot_uri}bootloader/env/getinitramfs/forsystem/$systemid "Initramfs" /tmp/initramfs
+wget -q -O /tmp/initramfs ${boot_uri}bootloader/env/getinitramfs/forsystem/$systemid
+
+# read primary IP configuration to pass it on (behaviour like IPAPPEND=1 of
+# PXElinux)
+. /tmp/ipstuff
+
+[ "x$DEBUGLEVEL" != x0 ] && { clear; ash; }
+
+# start the new kernel with initialramfs and composed cmdline
+dialog --infobox "Booting OpenSLX client $label ... (be patient this could take some time)" 3 69
+kexec -l /tmp/kernel --initrd=/tmp/initramfs \
+ --append="$append file=http://${syssource}/pbs/client-config/${sysname}/pbs.tgz $quiet ip=$ip:$siaddr:$router:$subnet:$dnssrv $debug" 2>/dev/null
+kexec -e >/dev/null 2>&1
diff --git a/application/modules/bootloader/views/scripts/index/index.phtml b/application/modules/bootloader/views/scripts/index/index.phtml
new file mode 100644
index 0000000..e69de29
diff --git a/application/modules/ui/controllers/DialogController.php b/application/modules/ui/controllers/DialogController.php
new file mode 100644
index 0000000..6bba3f8
--- /dev/null
+++ b/application/modules/ui/controllers/DialogController.php
@@ -0,0 +1,53 @@
+_helper->layout->disableLayout();
+ #$this->_helper->viewRenderer->setNoRender();
+
+ $this->_mkernels = new Model_Kernels();
+ $this->_msources = new Model_Sources();
+ $this->_mbootmedia = new Model_Bootmedia();
+
+
+ $this->_logger = new Zend_Log();
+ $w = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../data/debug.log');
+
+ $this->_logger->addWriter($w);
+ }
+
+ public function indexAction()
+ {
+
+ }
+
+ public function getAction()
+ {
+ $dialog = $this->getRequest()->getParam('bootmedia');
+
+ if (!empty($dialog)) {
+ if (in_array($dialog, array('create', 'progress')))
+ $this->view->dialog =
+ $this->view->render("dialog/bootmedia.$dialog.phtml");
+ }
+
+ $dialog = $this->getRequest()->getParam('menu');
+
+ if (!empty($dialog)) {
+ if (in_array($dialog, array('create', 'createentry', 'createassignment', 'createentry2', 'progress')))
+ $this->view->dialog =
+ $this->view->render("dialog/menu.$dialog.phtml");
+ }
+ }
+
+
+
+}
diff --git a/application/modules/ui/controllers/SubpageController.php b/application/modules/ui/controllers/SubpageController.php
new file mode 100644
index 0000000..51fadd3
--- /dev/null
+++ b/application/modules/ui/controllers/SubpageController.php
@@ -0,0 +1,60 @@
+_helper->layout->disableLayout();
+ #$this->_helper->viewRenderer->setNoRender();
+
+ $this->_mkernels = new Model_Kernels();
+ $this->_msources = new Model_Sources();
+ $this->_mbootmedia = new Model_Bootmedia();
+ $this->_mmenus = new Model_Menus();
+
+
+ $this->_logger = new Zend_Log();
+ $w = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../data/debug.log');
+
+ $this->_logger->addWriter($w);
+ }
+
+ public function indexAction()
+ {
+
+ }
+
+ public function getAction()
+ {
+ $subpage = $this->getRequest()->getParam('bootmedia');
+
+ if (!empty($subpage)) {
+ if (in_array($subpage, array('actionmenu', 'list')))
+ $this->view->subpage =
+ $this->view->render("subpage/bootmedia.$subpage.phtml");
+ }
+
+ $subpage = $this->getRequest()->getParam('menu');
+
+ if (!empty($subpage)) {
+ if (in_array($subpage, array('actionmenu','actionmenu-entries','actionmenu-menuassignment', 'list', 'entrylist', 'assignmentlist')))
+ if ($subpage == 'entrylist') {
+ $r = $this->_mmenus->find($this->getRequest()->getParam('id'));
+ $this->view->currentMenu = $r[0];
+ }
+ $this->view->subpage =
+ $this->view->render("subpage/menu.$subpage.phtml");
+ }
+
+ }
+
+
+
+}
diff --git a/application/modules/ui/views/scripts/dialog/bootmedia.create.phtml b/application/modules/ui/views/scripts/dialog/bootmedia.create.phtml
new file mode 100644
index 0000000..44e7569
--- /dev/null
+++ b/application/modules/ui/views/scripts/dialog/bootmedia.create.phtml
@@ -0,0 +1,18 @@
+
+
+ Enter meta data for the image and select the kernel version it should be based on..
+
\ No newline at end of file
diff --git a/application/views/scripts/index/menu.phtml b/application/views/scripts/index/menu.phtml
new file mode 100644
index 0000000..14eedc7
--- /dev/null
+++ b/application/views/scripts/index/menu.phtml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/data/db/README b/data/db/README
new file mode 100644
index 0000000..e69de29
diff --git a/data/syslinux/LICENSE b/data/syslinux/LICENSE
new file mode 100644
index 0000000..7233bc7
--- /dev/null
+++ b/data/syslinux/LICENSE
@@ -0,0 +1,3 @@
+This package is free software distributed under the GPL version 2.
+See http://openslx.org/COPYING. For additional information on the
+SYSLINUX component by H.P. Anwin check http://syslinux.zytor.com!
diff --git a/data/syslinux/README.iso b/data/syslinux/README.iso
new file mode 100644
index 0000000..f9abdbe
--- /dev/null
+++ b/data/syslinux/README.iso
@@ -0,0 +1,6 @@
+You seem to have the OpenSLX network demo CD/DVD still in your optical
+drive! This is not required. You may safely remove the medium just
+after the first kernel/initramfs is loaded ...
+
+If you have any feedback please consult http://openslx.org/feedback
+and send your comments to feedback@openslx.org!
diff --git a/data/syslinux/README.pxe b/data/syslinux/README.pxe
new file mode 100644
index 0000000..9a14ee5
--- /dev/null
+++ b/data/syslinux/README.pxe
@@ -0,0 +1,68 @@
+The PXE stuff uses HPAs syslinux, see http://syslinux.zytor.com!
+
+Example how the PXElinux information is gathered:
+
+############################## PXElinux-menu file ##############################
+##### first static information is written, can't be changed #####
+##### override with include-menu (except DEFAULT vesamenu.c32) #####
+# #
+# DEFAULT vesamenu.c32 #
+# NOESCAPE 0 #
+# PROMPT 0 #
+# #
+##### then theme specific information is written (if theme specified) #####
+##### #####
+# #
+# MENU BACKGROUND openslx.png #
+# MENU WIDTH 78 #
+# . #
+# . #
+# menu color unsel 37;40 #fff0f0f0 #ff8093a1 std #
+# . #
+# . #
+# . #
+# #
+##### now slxsettings configuration is being read #####
+##### #####
+# #
+# TIMEOUT 100 #
+# TOTALTIMEOUT 600 #
+# MENU MASTER PASSWD secret #
+# MENU TITLE Welcome to OpenSLX #
+# #
+##### after this /etc/opt/openslx/boot-env/syslinux/pxemenu-include is #####
+##### included if it is existing, overriding above statements #####
+# #
+# MENU PASSPROMPT Gesicherter Bereich, bitte Passwort eingeben: #
+# MENU AUTOBOOT Auswahl startet in # Sekunden #
+# . #
+# . #
+# . #
+# #
+##### at this point the system labels are being included #####
+##### #####
+# #
+# LABEL openslx-suse-11.0-default::nfs #
+# MENU LABEL ^SUSE 11.0 System / NFS #
+# KERNEL suse-11.0-default/vmlinuz-2.6.25.20-0.1-pae #
+# APPEND quiet vga=791 initrd=suse-11.0-default/initramfs-1 file #
+# IPAPPEND 3 #
+# TEXT HELP #
+# OpenSUSE 11.0 System #
+# ENDTEXT #
+# . #
+# . #
+# . #
+# #
+##### at the end /etc/opt/openslx/boot-env/syslinux/pxemenu-bottom is #####
+##### being incl. if existing #####
+##### please specify only systems and further menus #####
+# #
+# MENU SEPARATOR #
+# LABEL test #
+# MENU LABEL ^Testmenu #
+# MENU PASSWD test #
+# KERNEL pxechain.com #
+# APPEND 192.168.1.1::pxelinux.0 #
+# #
+########################## End of PXElinux-menu file ###########################
diff --git a/data/syslinux/extlinux b/data/syslinux/extlinux
new file mode 100755
index 0000000..d97dd70
Binary files /dev/null and b/data/syslinux/extlinux differ
diff --git a/data/syslinux/initramfs-shutdown b/data/syslinux/initramfs-shutdown
new file mode 100644
index 0000000..3e4376b
Binary files /dev/null and b/data/syslinux/initramfs-shutdown differ
diff --git a/data/syslinux/isolinux.bin b/data/syslinux/isolinux.bin
new file mode 100644
index 0000000..80f71c9
Binary files /dev/null and b/data/syslinux/isolinux.bin differ
diff --git a/data/syslinux/kernel-shutdown b/data/syslinux/kernel-shutdown
new file mode 100644
index 0000000..ddb180d
Binary files /dev/null and b/data/syslinux/kernel-shutdown differ
diff --git a/data/syslinux/mboot.c32 b/data/syslinux/mboot.c32
new file mode 100755
index 0000000..dfff378
Binary files /dev/null and b/data/syslinux/mboot.c32 differ
diff --git a/data/syslinux/mbr.bin b/data/syslinux/mbr.bin
new file mode 100644
index 0000000..8592b59
Binary files /dev/null and b/data/syslinux/mbr.bin differ
diff --git a/data/syslinux/menu.c32 b/data/syslinux/menu.c32
new file mode 100755
index 0000000..9413ec4
Binary files /dev/null and b/data/syslinux/menu.c32 differ
diff --git a/data/syslinux/pxechain.com b/data/syslinux/pxechain.com
new file mode 100644
index 0000000..8c4e0c5
Binary files /dev/null and b/data/syslinux/pxechain.com differ
diff --git a/data/syslinux/pxelinux.0 b/data/syslinux/pxelinux.0
new file mode 100644
index 0000000..743948e
Binary files /dev/null and b/data/syslinux/pxelinux.0 differ
diff --git a/data/syslinux/pxemenu-bottom.example b/data/syslinux/pxemenu-bottom.example
new file mode 100644
index 0000000..29ceee3
--- /dev/null
+++ b/data/syslinux/pxemenu-bottom.example
@@ -0,0 +1,39 @@
+# this include file will be loaded at the bottom of the menu after the system
+# labels, please define only further menus and systems
+# for theme configuration use theme.conf in your theme directory
+# general settings can be set via slxsettings
+# please copy to pxemenu-bottom if needed
+
+## example: shutdown label in menu
+#LABEL shutdown
+# MENU LABEL ^Shutdown PC
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## help label not selectable
+#LABEL help
+# MENU LABEL Press 'F1' for help
+# MENU DISABLE
+
+## example: add an additional menu on the same tftp server
+#LABEL test
+# MENU LABEL ^Testmeu
+# KERNEL vesamenu.c32
+# APPEND testmenu
+
+## example: add an additional menu on a different tftp server, with passwd
+#LABEL test2
+# MENU LABEL ^Testmeu
+# MENU PASSWD test
+# KERNEL pxechain.com
+# APPEND 192.168.101.102::pxelinux.0
+
+## example blank line / menu separator
+#MENU SEPARATOR
+
+## example localboot with passwd
+#LABEL local
+# MENU LABEL Boot from local ^Harddisk
+# MENU PASSWD local
+# localboot 0
+
diff --git a/data/syslinux/pxemenu-include.example b/data/syslinux/pxemenu-include.example
new file mode 100644
index 0000000..c09f8e7
--- /dev/null
+++ b/data/syslinux/pxemenu-include.example
@@ -0,0 +1,58 @@
+# this include file will be loaded at the end of theme and slxsettings
+# configuration but right before the system labels
+# it will overwrite existing defs
+# for theme configuration use theme.conf in your theme directory
+# general settings can be set via slxsettings
+# please copy to pxemenu-include if needed
+
+## example german help:
+#MENU PASSPROMPT Gesicherter Bereich, bitte Passwort eingeben:
+#MENU AUTOBOOT Auswahl startet in # Sekunden
+
+## example: shutdown on timeout
+#ONTIMEOUT shutdown
+#LABEL shutdown
+# MENU HIDE
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## example: shutdown label in menu
+#LABEL shutdown2
+# MENU LABEL ^Shutdown PC
+# KERNEL kernel-shutdown
+# APPEND initrd=initramfs-shutdown quiet
+
+## help/... text on F1 keypress
+#F1 help_01.txt
+## optionally with info
+#LABEL help
+# MENU LABEL Press 'F1' for help
+# MENU DISABLE
+
+## example: add an additional menu on the same tftp server
+#LABEL test
+# MENU LABEL ^Testmeu
+# KERNEL vesamenu.c32
+# APPEND testmenu
+
+## example: add an additional menu on a different tftp server, with passwd
+#LABEL test2
+# MENU LABEL ^Testmeu
+# MENU PASSWD test
+# KERNEL pxechain.com
+# APPEND 192.168.101.102::pxelinux.0
+
+## example non-selectable line
+#LABEL -
+# MENU LABEL ________________________________________________________
+# MENU DISABLE
+
+## example blank line / menu separator
+#MENU SEPARATOR
+
+## example localboot with passwd
+#LABEL local
+# MENU LABEL Boot from local ^Harddisk
+# MENU PASSWD local
+# localboot 0
+
diff --git a/data/syslinux/syslinux b/data/syslinux/syslinux
new file mode 100755
index 0000000..dd0319c
Binary files /dev/null and b/data/syslinux/syslinux differ
diff --git a/data/syslinux/themes/openslx/openslx.png b/data/syslinux/themes/openslx/openslx.png
new file mode 100644
index 0000000..fefbfdf
Binary files /dev/null and b/data/syslinux/themes/openslx/openslx.png differ
diff --git a/data/syslinux/themes/openslx/theme.conf b/data/syslinux/themes/openslx/theme.conf
new file mode 100644
index 0000000..7ee2ab2
--- /dev/null
+++ b/data/syslinux/themes/openslx/theme.conf
@@ -0,0 +1,40 @@
+# openslx theme style definition
+# please define only look of your theme
+# for non-theme definitions use slxsettings
+# or include file in /etc/opt/openslx/boot-env/syslinux/pxemenu-include
+
+MENU BACKGROUND openslx.png
+MENU WIDTH 78
+MENU MARGIN 9
+MENU PASSWORDMARGIN 9
+MENU ROWS 10
+MENU TABMSGROW 16
+MENU CMDLINEROW 16
+MENU ENDROW -1
+MENU PASSWORDROW 16
+MENU TIMEOUTROW 20
+MENU HELPMSGROW 16
+MENU HELPMSGENDROW -1
+MENU HSHIFT 0
+MENU VSHIFT 7
+
+#menu color screen 37;40 #80ffffff #00000000 std
+#menu color border 37;40 #40000000 #ff8093a1 std
+#menu color title 1 #ffff8b00 #ff8093a1 std
+#menu color unsel 37;40 #fff0f0f0 #ff8093a1 std
+menu color hotkey 1;37;40 #ffff8b00 #ff8093a1 std
+menu color sel 7;37;40 #ff1c2a33 #667799bb all
+#menu color hotsel 1;7;37;40 #ffff8b00 #667799bb all
+#menu color disabled 1;37;40 #ffff8b00 #ff8093a1 std
+#menu color scrollbar 37;40 #40000000 #ee000000 std
+#menu color tabmsg 37;40 #ffff8b00 #ff8093a1 std
+#menu color cmdmark 1;37;40 #ffff8b00 #ff8093a1 std
+#menu color cmdline 37;40 #fff0f0f0 #ff8093a1 std
+#menu color pwdborder 37;40 #40000000 #ff8093a1 std
+#menu color pwdheader 37;40 #ffff8b00 #ff8093a1 std
+#menu color pwdentry 37;40 #ffff8b00 #ff8093a1 std
+#menu color timeout_msg 37;40 #fff0f0f0 #ff8093a1 std
+#menu color timeout 1;37;40 #ffff8b00 #ff8093a1 std
+#menu color help 37;40 #ff1c2a33 #00000000 none
+MENU MSGCOLOR #ff1c2a33 #00000000 none
+
diff --git a/data/syslinux/vesamenu.c32 b/data/syslinux/vesamenu.c32
new file mode 100755
index 0000000..d988477
Binary files /dev/null and b/data/syslinux/vesamenu.c32 differ
diff --git a/library/OpenSLX/DB.php b/library/OpenSLX/DB.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/library/OpenSLX/DB.php
@@ -0,0 +1 @@
+bootstrap()
+ ->run();
diff --git a/public/js/jquery-1.3.2.min.js b/public/js/jquery-1.3.2.min.js
new file mode 100644
index 0000000..b1ae21d
--- /dev/null
+++ b/public/js/jquery-1.3.2.min.js
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"