summaryrefslogblamecommitdiffstats
path: root/application/controllers/ResourceController.php
blob: 089e5ba9b348b3f28115f1f00e40425fe978f755 (plain) (tree)
1
2
3
     

                                                     




























                                                                          

                                                                         
                                                                                             
                                     

                                          


























































































































































                                                                                                                                                                                                                                   
                                            


                                                      
                                                  
                                           





                                                                                                                                  


                      

                                                          








                                                                                     
                                                               




















                                                                                                                          
                                                                                      




                                                              
                                  
                                                     













                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                  
                 
         




                                                     










































































































































































                                                                                                                              


                                                                                     


































































































































































                                                                                                                                                                                              





                                                                                                                             








                                                                                                                                                        
 








 
<?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;
  }



}