|
|
<?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 Ipxe_ResourceController extends Zend_Controller_Action {
private $session;
private $host;
private $httpmode;
public function init() {
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$this->session = new Application_Model_Session();
$sessionMapper = new Application_Model_SessionMapper();
//TODO Error Messages if something failed
$alphaID = $this->_request->getParam('alpha');
if(isset($alphaID)) {
$alphasessionID = $alphaID;
$result = $sessionMapper->findBy(array('alphasessionID' => $alphasessionID), true);
# print_a($result);
$this->session = $this->session->setOptions($result[0]);
$this->session->setID($result[0]['sessionID']);
}
if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on')
{
$this->httpmode = 'https';
}else{
$this->httpmode = 'http';
}
$this->host = $_SERVER['HTTP_HOST'];
}
public function getvesamenuconfigAction() {
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="vesamenu.conf"');
header('Pragma: no-cache');
header('Expires: 0');
$vesamenuView = new Zend_View();
$vesamenuView->addScriptPath(APPLICATION_PATH.'/modules/ipxe/views/scripts/resource/');
$vesamenuView->host = $_SERVER['HTTP_HOST'];
$vesamenuView->error = $this->_request->getParam('error');
if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on')
{
$vesamenuView->httpmode = 'https';
}else{
$vesamenuView->httpmode = 'http';
}
if (isset($this->session)) {
$vesamenuView->alphaID = $this->session->getAlphasessionID();
if ($this->session->getPersonID() != null) {
$personMapper = new Application_Model_PersonMapper();
$person = $personMapper->find($this->session->getPersonID());
$vesamenuView->name = $person->getName();
$vesamenuView->firstname = $person->getFirstname();
$vesamenuView->loggedin = true;
} else {
$vesamenuView->loggedin = false;
}
if($this->session->getMembershipID() != null) {
$groupMapper = new Application_Model_GroupMapper();
$membershipMapper = new Application_Model_MembershipMapper();
$membership = $membershipMapper->find($this->session->getMembershipID());
$vesamenuView->group = $groupMapper->find($membership->getGroupID())->getTitle();
$_SESSION['userIDs']['membershipID'] = $this->session->getMembershipID();
$_SESSION['userIDs']['groupID'] = $membership->getGroupID();
}
if ($this->session->getPersonID() != null && $this->session->getMembershipID() == null ) {
$groupMapper = new Application_Model_GroupMapper();
$roleMapper = new Application_Model_RoleMapper();
$membershipMapper = new Application_Model_MembershipMapper();
$memberships = $membershipMapper->findBy(array('personID' => $this->session->getPersonID()), true);
if(isset($memberships)) {
foreach($memberships as $membership) {
$group = $groupMapper->find($membership['groupID']);
$role = $roleMapper->find($membership['roleID']);
$membershipList[] = array(
'membershipID' => $membership['membershipID'],
'group' => $group->getTitle(),
'role' => $role->getTitle()
);
}
$vesamenuView->memberships = $membershipList;
} else {
$vesamenuView->memberships = null;
}
$vesamenuView->action = "selectmembership";
}
// Request Bootmenu
$_SESSION['alphasessionID'] = $this->session->getAlphasessionID();
$pbsFilter = new Pbs_Filter();
$bootmenuID = $pbsFilter->evaluate();
if($bootmenuID != null) {
$bootmenuMapper = new Application_Model_BootMenuMapper();
$bm = $bootmenuMapper->find($bootmenuID);
$vesamenuView->title = $bm->getTitle();
$vesamenuView->startcounter = $bm->getStartcounter();
$bootmenuentriesMapper = new Application_Model_BootMenuEntriesMapper();
$res = $bootmenuentriesMapper->findBy(array('bootmenuID' => $bootmenuID), false);
$vesamenuView->bmelist = $res;
} else {
$vesamenuView->bmelist = null;
}
} else {
$vesamenuView->serialnumber = $this->_request->getParam('serialnumber');
$vesamenuView->mac = $this->_request->getParam('mac');
if($vesamenuView->error == "serial") {
$vesamenuView->error = "serial";
} else {
$vesamenuView->error = "session";
}
}
$vesamenu = $vesamenuView->render('getvesamenu.phtml');
header("Content-Length: ".(strlen($vesamenu)));
echo $vesamenu;
}
public function getsignatureAction() {
$bootosID = $this->session->getBootosID();
$file = $this->_request->getParam('file');
if(is_dir("../resources/bootos/$bootosID/signatures/") && 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="'.$file.'.sig"');
header('Pragma: no-cache');
header('Expires: 0');
// create the gzipped tarfile.
chdir("../resources/bootos/$bootosID/signatures/");
header("Content-Length: ".filesize(getcwd()."/".$file.".sig"));
passthru( "cat ". $file.".sig");
} else {
header('HTTP/1.0 404 Not Found');
}
}
public function getkernelAction() {
//TODO session & bme error
$bootosID = $this->session->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 getinitramfsAction() {
$bootosID = $this->session->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 bootsystemAction() {
$bootmenuntryID = $this->_request->getParam('bme');
if(isset($bootmenuntryID) && isset($this->session)) {
//TODO check if allowed
$sessionMapper = new Application_Model_SessionMapper();
$bootmenuentriesMapper = new Application_Model_BootMenuEntriesMapper();
$bootmenuentry = new Application_Model_BootMenuEntries();
$bootmenuentriesMapper->find($bootmenuntryID, $bootmenuentry);
$this->session->setBootmenuentryID($bootmenuntryID);
$this->session->setBootosID($bootmenuentry->getBootosID());
$sessionMapper->save($this->session);
}
header('Content-Type: text/plain');
$result = "#!ipxe\n";
if(isset($this->session)) {
$bootosID = $this->session->getBootosID();
$bootosmapper = new Application_Model_BootOsMapper();
$kcl = $bootosmapper->find($bootosID)->getDefaultkcl();
$result .= "kernel --name kernel $this->httpmode://$this->host/ipxe/resource/getkernel/alpha/".$this->session->getAlphasessionID()."\n";
$result .= "initrd --name initramfs $this->httpmode://$this->host/ipxe/resource/getinitramfs/alpha/".$this->session->getAlphasessionID()."\n";
if($bootmenuentry->getKcl() && $kcl != null){
$result .= "imgargs kernel $kcl alpha=".$this->session->getAlphasessionID()." file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bootmenuentry->getKclappend()."\n";
}else{
$result .= "imgargs kernel alpha=".$this->session->getAlphasessionID()." file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bootmenuentry->getKclappend()."\n";
}
$result .= "boot";
} else {
$result .= "chain http://".$_SERVER['HTTP_HOST']."/ipxe/vesamenu.c32 http://".$_SERVER['HTTP_HOST']."/ipxe/resource/getvesamenuconfig/serialnumber/$serialnumber/mac/$mac/error/session\n";
}
header("Content-Length: ".(strlen($result)));
echo $result;
}
public function boottrustedsystemAction() {
$bootmenuntryID = $this->_request->getParam('bme');
if(isset($bootmenuntryID) && isset($this->session)) {
//TODO check if allowed
$sessionMapper = new Application_Model_SessionMapper();
$bootmenuentriesMapper = new Application_Model_BootMenuEntriesMapper();
$bootmenuentry = new Application_Model_BootMenuEntries();
$bootmenuentriesMapper->find($bootmenuntryID, $bootmenuentry);
$this->session->setBootmenuentryID($bootmenuntryID);
$this->session->setBootosID($bootmenuentry->getBootosID());
$sessionMapper->save($this->session);
}
header('Content-Type: text/plain');
$result = "#!ipxe\n";
if(isset($this->session)) {
$bootosID = $this->session->getBootosID();
$bootosmapper = new Application_Model_BootOsMapper();
$kcl = $bootosmapper->find($bootosID)->getDefaultkcl();
$result .= "imgtrust --permanent\n";
$result .= "kernel --name kernel $this->httpmode://$this->host/ipxe/resource/getkernel/alpha/".$this->session->getAlphasessionID()."\n";
$result .= "imgverify kernel $this->httpmode://$this->host/ipxe/resource/getsignature/file/kernel/alpha/".$this->session->getAlphasessionID()."\n";
$result .= "initrd --name initramfs $this->httpmode://$this->host/ipxe/resource/getinitramfs/alpha/".$this->session->getAlphasessionID()."\n";
$result .= "imgverify initramfs $this->httpmode://$this->host/ipxe/resource/getsignature/file/initramfs/alpha/".$this->session->getAlphasessionID()."\n";
if($bootmenuentry->getKcl() && $kcl != null){
$result .= "imgargs kernel $kcl alpha=".$this->session->getAlphasessionID()." file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bootmenuentry->getKclappend()."\n";
}else{
$result .= "imgargs kernel alpha=".$this->session->getAlphasessionID()." file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bootmenuentry->getKclappend()."\n";
}
//$result .= "boot || echo BLA";
} else {
$result .= "chain http://".$_SERVER['HTTP_HOST']."/ipxe/vesamenu.c32 http://".$_SERVER['HTTP_HOST']."/ipxe/resource/getvesamenuconfig/serialnumber/$serialnumber/mac/$mac/error/session\n";
}
header("Content-Length: ".(strlen($result)));
echo $result;
}
}
|