summaryrefslogblamecommitdiffstats
path: root/application/modules/user/controllers/PrebootController.php
blob: f3eac390c2910d3d01ec521769271d3a49493930 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
     









                                                                           


                                                           
 


                                    
                        



                                                              

                                                                                  
                                                                
                         
                                
                                                                                     
                                






                                                                                                           







                                                                 













                                                                                           
                                                                    



                                                                                           









                                                                                                      



                                                              
                                  

                                                                                               
                 
                                                                  



                                                   
                                                                  
                                                                               
                                                                                                                                

                                                                      
                                                                    











                                                                                                               

                                                                                  









                                                                                                 

                                                                                                                    


                                                                   

                                                                                                                       

















                                                                                                                                                                         
                                                        










































                                                                                                                                                   

                                                                                                             

































                                                                                                             
                                                                                                                                            
 
                                        


                                                                                                      


                                                           
                                
                                                                               


                                           



                                                                                                            
                                                
                                                                                                                                                       







                                                                                                                   

                                         






























                                                                                                        
                                                                                                                  
                                                                                                                




                                                                    
                                                                                                                  
                                                                                                                       




















                                                                                                                                                                      

                                                                                                                                      




                                                                    



                                                                                                       
                                                                   






                                                                                                                                                                               







                                                                                                                                           
                                                 
















                                                                                                                                
                                                                                                             

































                                                                                                            



 
 
 
<?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 User_PrebootController extends Zend_Controller_Action
{

	protected $prebootMapper;
	protected $membershipMapper;
	protected $membership;
	protected $page;

	public function init()
	{
		if (Zend_Auth::getInstance()->hasIdentity()) {
			$userIDsNamespace = Zend_Session::namespaceGet('userIDs');
			if($userIDsNamespace['membershipID'] ==''){
				$this->_redirect('/user/index');
			}
				
			$this->prebootMapper = new Application_Model_PreBootMapper();
				
			$this->membershipMapper = new Application_Model_MembershipMapper();
			$this->membership = new Application_Model_Membership();
			$this->membershipMapper->find($userIDsNamespace['membershipID'],$this->membership);

			$this->db = Zend_Db_Table::getDefaultAdapter();
		} else {
			$this->_helper->redirector('login', 'auth');
		}
		$this->page = $this->_request->getParam('page');
	}


	public function indexAction()
	{
		$result = $this->_request->getParam('addresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('create',$result);
		}
		$result = $this->_request->getParam('deleteresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('delete',$result);
		}
		$result = $this->_request->getParam('modifyresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('modify',$result);
		}
		$result = $this->_request->getParam('updateresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('update',$result);
		}

		$groupID = $this->membership->getGroupID();
		 
		//ACL Darf er PrebootMenu sehen?
		if(!Pbs_Acl::checkRight('pro'))
		$this->_redirect('/user/index');

		$this->view->prebootlist = $this->prebootMapper->findBy(array("groupID" => $groupID));
		 
		// Search
		$search = $this->_request->getParam('search');
		$mySearch = new Pbs_Search();
		$mySearch->setSearchTerm($search);
		$mySearch->setModule('preboot');
		if($search != ''){
			$this->view->search = $mySearch->getSearchTerm();
			$this->view->prebootlist = $mySearch->search($this->view->prebootlist);
		}
		$this->view->searchform = $mySearch->searchForm();
		 
		// Pagination
		$pagination = new Pbs_Pagination();
		$pagination->setPerPage(10);
		$pagination->setElement($this->view->prebootlist);
		$pagination->setRequestPage($this->_request->getParam('page'));
		$pagination->setPageUrl('/user/preboot/index'.((isset($this->view->search))?'/search/'.$this->view->search:''));
		$this->view->prebootlist = $pagination->getElements();

		$this->view->pagination = $pagination->pagination();
		$this->view->page 		= $pagination->getRequestPage();

		$this->view->update = array();
		 
		$update = $this->_request->getParam('checkupdate');
		 
		foreach ($this->view->prebootlist as $preboot){
			$this->view->update[$preboot->getID()] = $update && $this->checkupdateAction($preboot);
		}
	}

	public function searchAction(){
		$this->_redirect('/user/preboot/index/search/'.($_GET['search']));
	}

	public function createprebootAction()
	{
		 
		//ACL Is he allowed to create Preboots?
		if(!Pbs_Acl::checkRight('prc'))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/addresult/forbidden');
		 
		if (!isset($_POST["createpreboot"])){
			$prebootForm = new user_Form_Preboot(array(
    	        									'action' => 'createpreboot',
    	        									'page' => $this->page));
		} else {
			 
			$prebootForm = new user_Form_Preboot(array(
    	        									'action' => 'createpreboot',
    	        									'page' => $this->page),$_POST);

			if ($prebootForm->isValid($_POST)) {

				$preboot = new Application_Model_PreBoot($_POST);
				$preboot->setGroupID($this->membership->getGroupID());

				try {

					$path_tmp = "../resources/bootmedium/";
					mkdir($path_tmp ,0777, true);

					$hash = md5(microtime(1));
					exec("wget -O '".$path_tmp."preboot.zip".$hash."' ".escapeshellcmd($preboot->getPath_preboot())." 2>&1 | grep 'saved'", $status);

					if(!array_pop($status)){
						$this->view->prebootForm = $prebootForm;
						$pbsNotifier = new Pbs_Notifier();
						echo $pbsNotifier->notify('The Resource was not found on the specified path','error');
							
						return;
					}

					$prebootID = $this->prebootMapper->save($preboot);

					$path_preboot = "../resources/bootmedium/$prebootID/";
					mkdir($path_preboot ,0777, true);

					exec("mv ../resources/bootmedium/preboot.zip$hash ../resources/bootmedium/$prebootID/preboot.zip");

				}catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					$this->_redirect('/user/preboot/index/page/'.$this->page.'/addresult/error');
					//TODO Delete folder + preboot in DB
						
				}
				$this->_redirect('/user/preboot/index/page/'.$this->page.'/addresult/ok');
			}
		}

		$this->view->prebootForm = $prebootForm;
	}

	public function checkupdateAction($preboot)
	{
		 
		//ACL Is he allowed to update Preboots?
		if(!Pbs_Acl::checkRight('pru'))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/updateresult/forbidden');
		 
		$prebootID = $preboot->getID();
		exec("wget --server-response --spider ".escapeshellcmd($preboot->getPath_preboot())." 2>&1 | grep 'Last-Modified:'", $prebootdate);

		//print_a($prebootdate);
		 
		$prebootdate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($prebootdate))));
		 
		if(is_file("../resources/bootmedium/$prebootID/preboot.zip")){
			$prebootolddate = filemtime("../resources/bootmedium/".$prebootID."/preboot.zip");
		}else{
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('There are updates available','ok');
			return true;
		}
		 
		//print_a($prebootname,$prebootdate,$prebootolddate);
		 
		$pbsNotifier = new Pbs_Notifier();
		 
		if($prebootdate > $prebootolddate){
			$this->view->notification = $pbsNotifier->notify('There are updates available','ok');
			return true;
		}
		else
		return false;
			
	}

	public function updateprebootAction()
	{
		//ACL Is he allowed to update Preboots?
		if(!Pbs_Acl::checkRight('pru'))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/updateresult/forbidden');

		$prebootID = $this->_request->getParam('prebootID');
		if (!is_numeric($prebootID))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/updateresult/forbidden');
		 
		$preboot = new Application_Model_PreBoot();
		$this->prebootMapper->find($prebootID,$preboot);
		 
		if($this->membership->getGroupID() != $preboot->getGroupID())
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/updateresult/forbidden');
		 
		 
		$path_preboot = "../resources/bootmedium/$prebootID/";
		 
		exec("wget -O '".$path_preboot."preboot.zip' ".escapeshellcmd($preboot->getPath_preboot())." 2>&1 | grep 'saved'", $status);

		if(!array_pop($status)){
			$this->_redirect('/user/preboot/index/page/'.$this->page.'/updateresult/404');
		}

		try{
			$filelist = array();
			$filelist = scandir($path_preboot);
				
			$bootisoMapper = new Application_Model_BootIsoMapper();
				
			//TODO Lock preboot
				
			foreach($filelist as $file){
				if($file == preg_match('![0-9]+\.zip!')){
					$bootisoID = str_replace('.zip', '', $file);
					$serialnumber = $bootisoMapper->find($bootisoID)->getSerialnumber();
						
					copy("../resources/bootmedium/$prebootID/preboot.zip", "../resources/bootmedium/$prebootID/$bootisoID".".zip");
					$zip = new ZipArchive();
					$res = $zip->open("../resources/bootmedium/$prebootID/$bootisoID".".zip");
					if($res === true){
						$rootdir = $zip->getNameIndex(0);
						$zip->addFromString($rootdir."build/rootfs/serial", $serialnumber);
						$zip->close();
					}
				}
			}
		}catch(Zend_Exception $e)
		{
			echo "Caught exception: " . get_class($e) . "<br/>";
			echo "Message: " . $e->getMessage() . "<br/>";
			$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/error');
			//TODO Delete Folder + Preboot
		}

		$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/ok');
	}

	public function editprebootAction()
	{
		//ACL Is he allowed to edit Preboots?
		if(!Pbs_Acl::checkRight('pre') && !Pbs_Acl::checkRight('prem'))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/forbidden');
		 
		$prebootID = $this->_request->getParam('prebootID');
		 
		if (!is_numeric($prebootID))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/forbidden');
		 

		$preboot = new Application_Model_PreBoot();
		$this->prebootMapper->find($prebootID, $preboot);
		 
		if($this->membership->getGroupID() != $preboot->getGroupID())
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/forbidden');
		 
		if (!isset($_POST["editpreboot"])){
	   
			$prebootForm = new user_Form_Preboot(array(
    	 										'action' => 'editpreboot',
    	 										'page' => $this->page));
			$prebootForm->populate($preboot->toArray());

		}else{

			$prebootForm = new user_Form_Preboot(array(
    											'action' => 'editpreboot',
    	 										'page' => $this->page),$_POST);
			 
			if ($prebootForm->isValid($_POST)) {

				$prebootold = $preboot;

				$preboot = new Application_Model_PreBoot($_POST);
				$preboot->setGroupID($this->membership->getGroupID());
				$preboot->setID($prebootID);
					
				$path_preboot = "../resources/bootmedium/$prebootID/";
					
				if($preboot->getPath_preboot() != $prebootold->getPath_preboot()){

					//ACL Is he allowed to edit the Preboot Path?
					if(!Pbs_Acl::checkRight('pre'))
					$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/forbidden');

					exec("wget -O '".$path_preboot."preboot.zip' ".escapeshellcmd($preboot->getPath_preboot()) ." 2>&1 | grep 'saved'" , $status);
					if(!array_pop($status)){
						$this->view->prebootForm = $prebootForm;
						$pbsNotifier = new Pbs_Notifier();
						echo $pbsNotifier->notify('The Resource was not found on the specified path','error');
							
						return;
					}
					 
					try{
						$filelist = array();
						$filelist = scandir($path_preboot);
							
						$bootisoMapper = new Application_Model_BootIsoMapper();
							
						//TODO Lock preboot
							
						foreach($filelist as $file){
							if(preg_match('![0-9]+\.zip!',$file)){
								$bootisoID = str_replace('.zip', '', $file);
								$serialnumber = $bootisoMapper->find($bootisoID)->getSerialnumber();
									
								copy("../resources/bootmedium/$prebootID/preboot.zip", "../resources/bootmedium/$prebootID/$bootisoID".".zip");
								$zip = new ZipArchive();
								$res = $zip->open("../resources/bootmedium/$prebootID/$bootisoID".".zip");
								if($res === true){
									$rootdir = $zip->getNameIndex(0);
									$zip->addFromString($rootdir."build/rootfs/serial", $serialnumber);
									$zip->close();
								}
							}
						}
					}catch(Zend_Exception $e){
						echo "Caught exception: " . get_class($e) . "<br/>";
						echo "Message: " . $e->getMessage() . "<br/>";
						$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/error');
					}
				}
	    
				try {
					$this->prebootMapper->save($preboot);

				}catch(Zend_Exception $e){
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/error');
					//TODO Delete Folder + Preboot
				}

				$this->_redirect('/user/preboot/index/page/'.$this->page.'/modifyresult/ok');
			}
		}

		$this->view->prebootForm = $prebootForm;
	}

	public function deleteprebootAction()
	{
		 
		//ACL Is he allowed to delete Preboots?
		if(!Pbs_Acl::checkRight('prd'))
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/deleteresult/forbidden');
		 
		try{
			$prebootID = $this->_request->getParam('prebootID');
			if (!is_numeric($prebootID))
			$this->_redirect('/user/preboot/index/page/'.$this->page.'/deleteresult/forbidden');
			 
			$preboot = new Application_Model_PreBoot();
			$this->prebootMapper->find($prebootID, $preboot);

			if($this->membership->getGroupID() != $preboot->getGroupID())
			$this->_redirect('/user/preboot/index/page/'.$this->page.'/deleteresult/forbidden');
				
			$this->prebootMapper->delete($preboot);
			exec("rm -r ../resources/bootmedium/".$prebootID);

		}catch(Zend_Exception $e){
			echo "Caught exception: " . get_class($e) . "<br/>";
			echo "Message: " . $e->getMessage() . "<br/>";
			$this->_redirect('/user/preboot/index/page/'.$this->page.'/deleteresult/error');
		}
		$this->_redirect('/user/preboot/index/page/'.$this->page.'/deleteresult/ok');
	}


}