summaryrefslogblamecommitdiffstats
path: root/application/modules/ipxe/controllers/ResourceController.php
blob: d95b6121bc939494fe9e56b348ea763a5efd7cce (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     

                                                     











                                                                          

                    


















                                                                                         








                                                              
 















                                                                                                                      
                                                              
     


                                          

        
















































































                                                                                                           






















                                                                                                                                  















































                                                                                                                        
  
                                      




                                                             
                                                                       

























                                                                                                                                                                                                                
                           








                                                                                                                                                                                                   
 








 
<?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();
    	$result .= "initrd --name initramfs $this->httpmode://$this->host/ipxe/resource/getinitramfs/alpha/".$this->session->getAlphasessionID();
    	
    	if($bootmenuentry->getKcl() && $kcl != null){
    		$result .= "imgargs kernel $kcl alpha=".$this->session->getAlphasessionID()."file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bme->getKclappend();
    	}else{
			$result .= "imgargs kernel alpha=".$this->session->getAlphasessionID()."file=$this->httpmode://$this->host/c/".$this->session->getAlphasessionID()."/default.tgz ".$bme->getKclappend();
    	}
    	$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;
  	
  	
  }


}