<?php
/*
* Copyright (c) 2011 - OpenSLX GmbH, RZ Uni Freiburg
* This program is free software distributed under the GPL version 2.
* See http://gpl.openslx.org/
*
* If you have any feedback please consult http://feedback.openslx.org/ and
* send your suggestions, praise, or complaints to feedback@openslx.org
*
* General information about OpenSLX can be found at http://openslx.org/
*/
class ResourceController extends Zend_Controller_Action {
private $thisSession;
private $page;
private $membership;
private $rightrolesMapper;
public function init() {
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$session = new Application_Model_Session();
$sm = new Application_Model_SessionMapper();
//TODO Error Messages if something failed
$alpha = $this->_request->getParam('alpha');
$apikey = $this->_request->getParam('apikey');
if($apikey != "") {
$membershipMapper = new Application_Model_MembershipMapper();
$this->rightrolesMapper = new Application_Model_RightRolesMapper();
$this->membership = array_shift($membershipMapper->findBy(array('apikey' => $apikey)));
if($this->membership == null) {
header('Content-Type: text/html');
echo "Wrong API Key\n";
die();
}
}
elseif($alpha == "0") {
$bootmenuentryID = $this->_request->getParam('bootmenuentryID');
$this->page = $this->_request->getParam('page');
if(!is_numeric($bootmenuentryID)) {
$this->_redirect('/user/bootmenu/index/page/'.$this->page.'/json/error');
}
$bootmenuentry = new Application_Model_BootMenuEntries();
$bootmenuentryMapper = new Application_Model_BootMenuEntriesMapper();
$bootmenuMapper = new Application_Model_BootMenuMapper();
$bootmenuentryMapper->find($bootmenuentryID, $bootmenuentry);
$session->setBootosID($bootmenuentry->getBootosID())
->setBootmenuentryID($bootmenuentry->getID())
->setTime(time())
->setMembershipID('1')
->setIp($_SERVER['REMOTE_ADDR'])
->setAlphasessionID('0');
$this->thisSession = $session;
}
elseif($alpha != "") {
$alphasessionID = $alpha;
$result = $sm->findBy(array('alphasessionID' => $alphasessionID), true);
# print_a($result);
$this->thisSession = $session->setOptions($result[0]);
$this->thisSession->setID($result[0]['sessionID']);
}
}
public function indexAction() {
}
//TODO Try/Catch + Metadata check
public function addbootosAction() {
list($rightroles) = $this->rightrolesMapper->findBy(array('rightID' => '55', 'roleID' => $this->membership->getRoleID()));
if($rightroles == null) {
header('HTTP/1.0 403 No Right to Create Bootos');
die();
}
$apikey = $this->_request->getParam('apikey');
if($apikey == "") {
header('HTTP/1.0 400 No API-Key');
die();
}
$params = $this->_request->getParams();
$source = $_SERVER['REMOTE_ADDR'];
if($params['title'] == '' || $params['distro'] == '' || $params['distroversion'] == '' || $params['share'] == '' || $source == '') {
header('HTTP/1.0 400 Title, Distro, Distroversion and Share must be set');
die();
}
if($_FILES['config']['size'] == 0 && $_FILES['config']['name'] != '' || $_FILES['kernel']['size'] == 0 && $_FILES['kernel']['name'] != '' || $_FILES['init']['size'] == 0 && $_FILES['init']['name'] != '') {
header('HTTP/1.0 400 File must be larger than 0 bytes');
die();
}
$bootosMapper = new Application_Model_BootOsMapper();
$groupID = $this->membership->getGroupID();
list($bootos) = $bootosMapper->findBy(array('groupid' => $groupID, 'title' => $params['title'], 'distro' => $params['distro'], 'distroversion' => $params['distroversion'], 'source' => $source, 'share' => $params['share']));
if($bootos != null) {
list($rightroles) = $this->rightrolesMapper->findBy(array('rightID' => '58', 'roleID' => $this->membership->getRoleID()));
if($rightroles == null) {
header('HTTP/1.0 403 No Right to Edit Bootos');
die();
}
$bootosID = $bootos->getID();
$bootossrc = $bootos->getSource();
$bootos->setOptions($params);
$bootos->setID($bootosID);
$bootos->setGroupID($groupID);
$bootos->setSource($bootossrc);
$bootos->setCreated(time());
$bootos->setPublic('-1');
$initpath = "../resources/bootos/".$bootosID."/initramfs/";
$kernelpath = "../resources/bootos/".$bootosID."/kernel/";
$configpath = "../resources/bootos/".$bootosID."/config/";
mkdir($initpath , 0777, true);
mkdir($kernelpath , 0777, true);
mkdir($configpath , 0777, true);
if($_FILES['config']['name'] != '') {
$bootos->setSource($_SERVER['REMOTE_ADDR']);
move_uploaded_file($_FILES['config']['tmp_name'], $configpath."default.tgz");
}
if($_FILES['kernel']['name'] != '') {
$bootos->setSource($_SERVER['REMOTE_ADDR']);
move_uploaded_file($_FILES['kernel']['tmp_name'], $kernelpath."kernel");
}
if($_FILES['init']['name'] != '') {
$bootos->setSource($_SERVER['REMOTE_ADDR']);
move_uploaded_file($_FILES['init']['tmp_name'], $initpath."initramfs");
}
$bootosMapper->save($bootos);
header('HTTP/1.0 201 Bootos edited');
} else {
$bootos = new Application_Model_BootOs();
$bootos->setOptions($params);
$bootos->setGroupID($groupID);
$bootos->setSource($source);
$bootos->setCreated(time());
$bootos->setPublic('-1');
$bootosID = $bootosMapper->save($bootos);
$bootos->setID($bootosID);
$initpath = "../resources/bootos/".$bootosID."/initramfs/";
$kernelpath = "../resources/bootos/".$bootosID."/kernel/";
$configpath = "../resources/bootos/".$bootosID."/config/";
mkdir($initpath , 0777, true);
mkdir($kernelpath , 0777, true);
mkdir($configpath , 0777, true);
if($_FILES['config']['name'] != '') {
move_uploaded_file($_FILES['config']['tmp_name'], $configpath."default.tgz");
}
if($_FILES['kernel']['name'] != '') {
move_uploaded_file($_FILES['kernel']['tmp_name'], $kernelpath."kernel");
}
if($_FILES['init']['name'] != '') {
move_uploaded_file($_FILES['init']['tmp_name'], $initpath."initramfs");
$newconfig = new Pbs_NewConfig();
$newconfig->createDefaultConfig($bootos);
}
header('HTTP/1.0 201 Bootos created');
}
}
public function getprebootserialsAction(){
$apikey = $this->_request->getParam('apikey');
if($apikey == "") {
header('Content-Type: text/html');
echo "Error: No API Key\n";
die();
}
list($rightroles) = $this->rightrolesMapper->findBy(array('rightID' => '40', 'roleID' => $this->membership->getRoleID()));
if($rightroles == null) {
header('HTTP/1.0 403 No Right to Create Preboots');
die();
}
$serialnr = $this->_request->getParam('serialnr');
$membershipMapper = new Application_Model_MembershipMapper();
$member = array_shift($membershipMapper->findBy(array('apikey' => $apikey)));
$groupID = $member->getGroupID();
$groupgroupsMapper = new Application_Model_GroupGroupsMapper();
$bootisoMapper = new Application_Model_BootIsoMapper();
$groupMapper = new Application_Model_GroupMapper();
$preboottypeMapper = new Application_Model_PreBootTypeMapper();
$personMapper = new Application_Model_PersonMapper();
$prebootMapper = new Application_Model_PreBootMapper();
$parents = array();
$this->view->bootisolist = array();
$parents = $groupgroupsMapper->getParentGroups($groupID);
foreach($parents as $k => $parent) {
foreach($parent as $p) {
$bootiso = $bootisoMapper->findBy(array("groupID" => $p));
foreach ($bootiso as $b)
if($b->getPublic() - $k >= 0 )
{
$bootisolist[] = $b;
}
elseif($k == 0 && $b->getPublic() == -1 && Pbs_Acl::checkRight('bc'))
$bootisolist[] = $b;
}
}
$bootisolist = array_reverse($bootisolist);
header('Content-Type: text/html');
$content_disp = ( ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']) == 'IE') ? 'inline' : 'attachment';
header('Content-Disposition: ' . $content_disp . '; filename="serials.txt"');
header('Pragma: no-cache');
header('Expires: 0');
$person = $personMapper->find($member->getPersonID());
if(is_numeric($serialnr)){
$bootiso = $bootisolist[$serialnr-1];
$result = $bootiso->getSerialnumber();
}else if($serialnr == 'r'){
$serial = time();
for($i = 2; $i < 14; $i += 3)
{
$serial = substr($serial, 0, $i) .'-'. substr($serial, $i, strlen($serial));
}
$result = $serial;
}else {
$result = "Serials available to Member: ".$person->getFirstname()." ".$person->getName()." in Group: ".$groupMapper->find($member->getGroupID())->getTitle()."\n";
$result .= "------------------------------------------------------------------------------------\n";
foreach($bootisolist as $k => $bootiso){
$preboot = $prebootMapper->findBy(array('serialnumber' => $bootiso->getSerialnumber(), 'preboottypeID' => $bootiso->getPreboottypeID()));
$download = (count($preboot)!=0)?"yes":"no";
$result .= ($k + 1).". ".$preboottypeMapper->find($bootiso->getPreboottypeID())->getName().", ".$bootiso->getSerialnumber()."\tDownload available: ".$download."\t".$groupMapper->find($bootiso->getGroupID())->getTitle().", ".$bootiso->getTitle()."\n";
}
}
header("Content-Length: ".(strlen($result)));
echo $result;
}
public function addprebootAction() {
list($rightroles) = $this->rightrolesMapper->findBy(array('rightID' => '40', 'roleID' => $this->membership->getRoleID()));
if($rightroles == null) {
header('HTTP/1.0 403 No Right to Create Preboots');
die();
}
$apikey = $this->_request->getParam('apikey');
if($apikey == "") {
header('HTTP/1.0 400 No API-Key');
die();
}
$params = $this->_request->getParams();
$source = $_SERVER['REMOTE_ADDR'];
if($params['title'] == '' || $_FILES['preboot']['name'] == '') {
header('HTTP/1.0 400 Title and Preboot must be set');
die();
}
if($_FILES['preboot']['size'] == 0 && $_FILES['preboot']['name'] != '') {
header('HTTP/1.0 400 File must be larger than 0 bytes');
die();
}
$prebootMapper = new Application_Model_PreBootMapper();
$groupID = $this->membership->getGroupID();
list($preboot) = $prebootMapper->findBy(array('groupid' => $groupID, 'title' => $params['title']));
if($preboot != null) {
header('HTTP/1.0 400 Preboot already exists');
die();
}
$preboot = new Application_Model_PreBoot();
$preboot->setOptions($params);
$preboot->setGroupID($groupID);
$preboot->setSource($source);
$preboot->setCreated(time());
$prebootID = $prebootMapper->save($preboot);
$prebootpath = "../resources/bootmedium/".$prebootID."/";
mkdir($prebootpath , 0777, true);
if($_FILES['preboot']['name'] != '' ) {
move_uploaded_file($_FILES['preboot']['tmp_name'], $prebootpath."preboot.zip");
}
header('HTTP/1.0 201 Preboot created');
}
public function editprebootAction() {
list($rightroles) = $this->rightrolesMapper->findBy(array('rightID' => '41', 'roleID' => $this->membership->getRoleID()));
if($rightroles == null) {
header('HTTP/1.0 403 No Right to Edit Preboot');
die();
}
$apikey = $this->_request->getParam('apikey');
if($apikey == "") {
header('HTTP/1.0 400 No API-Key');
die();
}
$params = $this->_request->getParams();
$source = $_SERVER['REMOTE_ADDR'];
if($params['title'] == '') {
header('HTTP/1.0 400 Title must be set');
die();
}
if($_FILES['preboot']['size'] == 0 && $_FILES['preboot']['name'] != '') {
header('HTTP/1.0 400 File must be larger than 0 bytes');
die();
}
$prebootMapper = new Application_Model_PreBootMapper();
$groupID = $this->membership->getGroupID();
$preboot = new Application_Model_PreBoot();
list($preboot) = $prebootMapper->findBy(array('groupid' => $groupID, 'title' => $params['title']));
if($preboot == null) {
header('HTTP/1.0 400 Preboot not found');
die();
}
$prebootsrc = $preboot->getSource();
$prebootID = $preboot->getID();
$preboot->setOptions($params);
$preboot->setGroupID($groupID);
$preboot->setSource($prebootsrc);
$preboot->setCreated(time());
$prebootpath = "../resources/bootmedium/".$prebootID."/";
mkdir($prebootpath , 0777, true);
if($_FILES['preboot']['name'] != '') {
$preboot->setSource($source);
move_uploaded_file($_FILES['preboot']['tmp_name'], $prebootpath."preboot.zip");
}
$prebootMapper->save($preboot);
header('HTTP/1.0 201 Preboot edited');
}
public function getinitramfsAction() {
$bootosID = $this->thisSession->getBootosID();
if(is_dir("../resources/bootos/$bootosID/initramfs/") && is_numeric($bootosID)) {
header('Content-Type: application/x-gzip');
$content_disp = ( ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']) == 'IE') ? 'inline' : 'attachment';
header('Content-Disposition: ' . $content_disp . '; filename="initramfs"');
header('Pragma: no-cache');
header('Expires: 0');
// create file.
chdir("../resources/bootos/$bootosID/initramfs/");
$initname = array_pop(scandir("./"));
header("Content-Length: ".filesize(getcwd()."/".$initname));
passthru( "cat ".$initname);
} else {
header('HTTP/1.0 404 Not Found');
}
}
public function getconfigAction() {
$bootmenuentryID = $this->thisSession->getBootmenuentryID();
$bootmenuentry = new Application_Model_BootMenuEntries();
$bmm = new Application_Model_BootMenuEntriesMapper();
$bmm->find($bootmenuentryID, $bootmenuentry);
$configID = $bootmenuentry->getConfigID();
$bootosID = $this->thisSession->getBootosID();
if(is_dir("../resources/bootos/$bootosID/config/")) {
header('Content-Type: application/x-gzip');
$content_disp = ( ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']) == 'IE') ? 'inline' : 'attachment';
header('Content-Disposition: ' . $content_disp . '; filename="default.tgz"');
header('Pragma: no-cache');
header('Expires: 0');
if($configID == null) {
chdir("../resources/bootos/$bootosID/config/");
passthru( "cat default.tgz");
} else {
$bootosuserMapper = new Application_Model_BootOsUserMapper();
$bootosuser = $bootosuserMapper->findBy(array('configID' => $configID));
$hash = md5(microtime(1));
$tmp_conf = "../resources/config/$hash";
mkdir($tmp_conf , 0777, true);
exec("tar -C $tmp_conf -xf ../resources/bootos/$bootosID/config/default.tgz", $restul);
exec("tar -C $tmp_conf/rootfs/ -xf ../resources/config/etc.tgz");
exec("mkdir -p $tmp_conf/rootfs/etc/opt/kdm");
exec("cp $tmp_conf/rootfs/etc/kde4/kdm/kdmrc $tmp_conf/rootfs/etc/opt/kdm/");
$username = '';
$userpassword = '';
if($this->thisSession->getMembershipID() != null) {
$person = new Application_Model_Person();
$personMapper = new Application_Model_PersonMapper();
$membershipMapper = new Application_Model_MembershipMapper();
$personID = $membershipMapper->find($this->thisSession->getMembershipID())->getPersonID();
$person = $personMapper->find($personID);
$username = strtolower($person->getName());
$username = preg_replace("!\s!", "", $username);
$userpassword = $person->getLoginPassword();
}
$anzUsers = count($bootosuser);
$test = array();
if($anzUsers <= 2) {
foreach($bootosuser as $user)
$test[] = $user->getLogin();
}
$configView = new Zend_View();
$f = fopen("$tmp_conf/initramfs/postinit.local", "a");
$userid = 1000;
foreach($bootosuser as $user) {
if($user->getLogin() == '%username%') {
$configView->loginname = $username;
} else {
$configView->loginname = $user->getLogin();
}
$configView->userid = $userid++;
if($user->getPassword() == '%password%') {
$configView->password = $userpassword;
} else {
$configView->password = $user->getPassword();
}
if($user->getHometypeID() == 2) {
$configView->homepath = $user->getHomepath();
}
elseif($user->getHometypeID() == 1) {
$configView->homepath = "/media/openslx-stick/home/".$configView->loginname;
}
else {
$configView->homepath = "/home/".$configView->loginname;
}
if($configView->loginname != '' && $configView->password != '') {
if($user->getHometypeID() == 1) {
$configView->usb = true;
} else {
$configView->usb = false;
if($anzUsers <= 2 && $user->getLogin() == 'kiosk' && in_array('%username%', $test) && $this->thisSession->getMembershipID() == null)
{ $configView->autologin = true; }
elseif($anzUsers <= 2 && $user->getLogin() == '%username%' && $this->thisSession->getMembershipID() != null)
$configView->autologin = true;
else
{ $configView->autologin = false; }
}
$configView->addScriptPath(APPLICATION_PATH.'/views/scripts/resource/');
$config = $configView->render('getconfig.phtml');
fputs($f, $config);
}
}
fclose($f);
// create the gzipped tarfile.
chdir($tmp_conf);
passthru( "tar cz *");
exec("rm -rf ../$hash");
}
} else {
header('HTTP/1.0 404 Not Found');
}
}
public function getkernelAction() {
$bootosID = $this->thisSession->getBootosID();
if(is_dir("../resources/bootos/$bootosID/kernel/") && is_numeric($bootosID)) {
header('Content-Type: application/x-gzip');
$content_disp = ( ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']) == 'IE') ? 'inline' : 'attachment';
header('Content-Disposition: ' . $content_disp . '; filename="kernel"');
header('Pragma: no-cache');
header('Expires: 0');
// create the gzipped tarfile.
chdir("../resources/bootos/$bootosID/kernel/");
$kernelname = array_pop(scandir("./"));
header("Content-Length: ".filesize(getcwd()."/".$kernelname));
passthru( "cat ". $kernelname);
} else {
header('HTTP/1.0 404 Not Found');
}
}
public function getkclAction() {
$bmeID = $this->thisSession->getBootmenuentryID();
if(is_numeric($bmeID)) {
$bmemapper = new Application_Model_BootMenuEntriesMapper();
$bme = new Application_Model_BootMenuEntries();
$bootosmapper = new Application_Model_BootOsMapper();
$bmemapper->find($bmeID, $bme);
header('Content-Type: text/html');
$content_disp = ( ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']) == 'IE') ? 'inline' : 'attachment';
header('Content-Disposition: ' . $content_disp . '; filename="kcl.txt"');
header('Pragma: no-cache');
header('Expires: 0');
$kcl = $bootosmapper->find($bme->getBootosID())->getDefaultkcl();
if($bme->getKcl() && $kcl != null) {
$result = $kcl . " alpha=" . $this->_request->getParam('alpha') . " file=http://".$_SERVER['HTTP_HOST']."/c/".$this->_request->getParam('alpha')."/default.tgz ".$bme->getKclappend();
} else {
$result = "alpha=" . $this->_request->getParam('alpha') . " file=http://".$_SERVER['HTTP_HOST']."/c/".$this->_request->getParam('alpha')."/default.tgz ".$bme->getKclappend();
}
$result = trim($result);
header("Content-Length: ".(strlen($result)));
echo $result;
}
}
public function getbootmenuentryAction() {
// obsolete function (now only for debugging)
// after selecting the BootOS it will be saved in session
// so getkclAction, getkernelAction, getconfigAction and getinitramfsAction
// can be called with session-identifier
$return_val =
array(
'info' => 'This function is for debugging purpose only',
'kernel' => $this->generateURL('getkernel', 'alpha', $this->thisSession->getAlphasessionID(), "kernel"),
'initramfs' => $this->generateURL('getinitramfs', 'alpha', $this->thisSession->getAlphasessionID(), "initramfs"),
'kcl' => $this->generateURL('getkcl', 'alpha', $this->thisSession->getAlphasessionID(), "kcl.txt"),
'config' => $this->generateURL('getconfig', 'alpha', $this->thisSession->getAlphasessionID(), 'default.tgz')
);
$result = $return_val;
$result2 = "<table class='json'>";
$result2 .= "<tr><td><b>info</b>: </td><td>".$result['info']."</td></tr>";
$result2 .= "<tr><td><b>kernel</b>: </td><td><a href=".$result['kernel'].">".$result['kernel']."<a></td></tr>";
$result2 .= "<tr><td><b>initramfs</b>: </td><td><a href=".$result['initramfs'].">".$result['initramfs']."<a></td></tr>";
$result2 .= "<tr><td><b>kcl</b>: </td><td><a href=".$result['kcl'].">".$result['kcl']."<a></td></tr>";
$result2 .= "<tr><td><b>config</b>: </td><td><a href=".$result['config'].">".$result['config']."<a></td></tr>";
$result2 .= "</table>";
echo $result2;
}
private function generateURL($action, $varname, $varvalue, $filename) {
$path = '/resource/'. $action .'/' . $varname .'/' . $varvalue .'/bootmenuentryID/'.$this->thisSession->getBootmenuentryID().'/file/' . $filename ;
$path = "http://" . $_SERVER['SERVER_NAME'] . $path;
return $path;
}
}