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













                                                                                  
                                                                










































































































                                                                                                                                                                                               
                                                                            


















































                                                                                                                                           











                                                                                                                                            
                                                                                






















































                                                                                                                                                       
                                                                                                           



                                                             
                                                                                                                  








                                                                              
                                                    
















































                                                                                                                                                                               



































                                                                                                
                












                                                                                
<?php

class User_PrebootController extends Zend_Controller_Action
{
		
	protected $prebootMapper;
	protected $membershipMapper;
	protected $membership;
	
    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');
		}
    }
    

    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);
		}
    	
    	$groupMapper = new Application_Model_GroupMapper();    	
    	$personMapper = new Application_Model_PersonMapper();
    	
    	$groupID = $this->membership->getGroupID();    	
    	
    	//TODO ACL Darf er PrebootMenu sehen?
    	if(false)
    		$this->_redirect('/user/index');

    	$this->view->prebootlist = $this->prebootMapper->findBy("groupID", $groupID);
    	
    	$this->view->update = array();
    	
    	$update = $this->_request->getParam('checkupdate');
    	
    	foreach ($this->view->prebootlist as $preboot){
    		$this->view->update[$preboot->getID()] = $update && $this->checkupdateAction($preboot);    
    		$preboot->setGroupID("[".$preboot->getGroupID()."] ".$groupMapper->find($preboot->getGroupID())->getTitle());
    		$preboot->setMembershipID("[".$preboot->getMembershipID()."] ".$personMapper->find($this->membershipMapper->find($preboot->getMembershipID())->getPersonID())->getFirstname());
    	}
    }
    
    public function createprebootAction()
    {
    	
    		//TODO ACL Is he allowed to create Preboots?
    		if(false)
    			$this->_redirect('/user/preboot/index/addresult/forbidden');
    	
           	if (!isset($_POST["createpreboot"])){
    	        $prebootForm = new user_Form_Preboot(array('action' => 'createpreboot'));
    		} else {
    			
    	        $prebootForm = new user_Form_Preboot(array('action' => 'createpreboot'),$_POST);
    			    			
    		    if ($prebootForm->isValid($_POST)) {

    		    	$preboot = new Application_Model_PreBoot($_POST);
    		    	$preboot->setMembershipID($this->membership->getID());
    		    	$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/addresult/error');
    					//TODO Delete folder + preboot in DB
    					
    		        }
					$this->_redirect('/user/preboot/index/addresult/ok');
    		     }
    		}
    
            $this->view->prebootForm = $prebootForm;
    }
    
    public function checkupdateAction($preboot)
    {
    	
    	//TODO ACL Is he allowed to update Preboots?
    	if(false)
    		$this->_redirect('/user/preboot/index/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 
    		$prebootolddate = false;    	
    	
    	//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()
    {
    	//TODO ACL Is he allowed to update Preboots?
    	if(false)
    		$this->_redirect('/user/preboot/index/updateresult/forbidden');
    		
    	$prebootID = $this->_request->getParam('prebootID');
    	if (!is_numeric($prebootID))
   			$this->_redirect('/user/preboot/index/updateresult/forbidden');
    	
    	$preboot = new Application_Model_PreBoot();
    	$this->prebootMapper->find($prebootID,$preboot);
    	
    	if($this->membership->getGroupID() != $preboot->getGroupID())
    		$this->_redirect('/user/preboot/index/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/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/modifyresult/error');	
    		//TODO Delete Folder + Preboot
    	}
		
    	$this->_redirect('/user/preboot/index/modifyresult/ok');
    }

    public function editprebootAction()
    {
    	//TODO ACL Is he allowed to edit Preboots?
    	if(false)
    		$this->_redirect('/user/preboot/index/modifyresult/forbidden');
    	
    	$prebootID = $this->_request->getParam('prebootID');
    	
    	if (!is_numeric($prebootID))
    		$this->_redirect('/user/preboot/index/modifyresult/forbidden');	
    	    	    	
    	if (!isset($_POST["editpreboot"])){
    		
     		$preboot = new Application_Model_PreBoot();
    		$this->prebootMapper->find($prebootID, $preboot);
     
    		if($this->membership->getGroupID() != $preboot->getGroupID())
    			$this->_redirect('/user/preboot/index/modifyresult/forbidden');	
    		    		
    	 	$prebootForm = new user_Form_Preboot(array('action' => 'editpreboot', 'rights' => 'meta'));
    		$prebootForm->populate($preboot->toArray()); 
    		
    	}else{
    		
    		$prebootForm = new user_Form_Preboot(array('action' => 'editpreboot', 'rights' => 'meta'),$_POST);
	    
    		if ($prebootForm->isValid($_POST)) {
	
    			$prebootold = new Application_Model_PreBoot();
    			$this->prebootMapper->find($prebootID, $prebootold);
	    			
    			$preboot = new Application_Model_PreBoot($_POST);
    		   	$preboot->setMembershipID($this->membership->getID());
    		    $preboot->setGroupID($this->membership->getGroupID());
	    		$preboot->setID($prebootID);
	    		    
    		    $path_preboot = "../resources/bootmedium/$prebootID/";
	    		    
    			if($preboot->getPath_preboot() != $prebootold->getPath_preboot()){
    				
    				//TODO ACL Is he allowed to edit the Preboot Path?
    				if(false)
    					$this->_redirect('/user/preboot/index/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/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/modifyresult/error');	
    				//TODO Delete Folder + Preboot
    		    }
    		    
				$this->_redirect('/user/preboot/index/modifyresult/ok');
    		}		
    	}
    
    	$this->view->prebootForm = $prebootForm;
    }

    public function deleteprebootAction()
    {
    	
    	//TODO ACL Is he allowed to delete Preboots?
    	if(false)
    		$this->_redirect('/user/preboot/index/deleteresult/forbidden');
    	
    	try{
	   		$prebootID = $this->_request->getParam('prebootID');
	   		if (!is_numeric($prebootID))
	   			$this->_redirect('/user/preboot/index/deleteresult/forbidden');
	   	
	    	$preboot = new Application_Model_PreBoot();
	    	$this->prebootMapper->find($prebootID, $preboot);
	
	    	if($this->membership->getGroupID() != $preboot->getGroupID())
	   			$this->_redirect('/user/preboot/index/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/deleteresult/error');	
    	}
	   		$this->_redirect('/user/preboot/index/deleteresult/ok');
    	}


}