_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(){ 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(); } $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()."\t".$groupMapper->find($bootiso->getGroupID())->getTitle().", ".$bootiso->getTitle().",\t\tDownload available: ".$download."\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 = ""; $result2 .= ""; $result2 .= ""; $result2 .= ""; $result2 .= ""; $result2 .= ""; $result2 .= "
info: ".$result['info']."
kernel: ".$result['kernel']."
initramfs: ".$result['initramfs']."
kcl: ".$result['kcl']."
config: ".$result['config']."
"; 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; } }