summaryrefslogblamecommitdiffstats
path: root/application/modules/user/controllers/BootosController.php
blob: 5d69527658af15c70ef5527a306f0467cbc6fa56 (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_BootosController extends Zend_Controller_Action
{

	protected $bootosMapper;
	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->bootosMapper = new Application_Model_BootOsMapper();
				
			$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 BootOs sehen?
		if(!Pbs_Acl::checkRight('boai') && !Pbs_Acl::checkRight('boui'))
		$this->_redirect('/user/index');

		$groupgroupsMapper = new Application_Model_GroupGroupsMapper();
		 
		$parents = array();
		$this->view->bootoslist = array();
		$parents = $groupgroupsMapper->getParentGroups($groupID);
		 
		foreach($parents as $k => $parent){
			foreach($parent as  $p){
				$bootos = $this->bootosMapper->findBy(array("groupID" => $p));
				foreach ($bootos as $b)
				if($b->getPublic() - $k >= 0 )
				$this->view->bootoslist[] = $b;
				elseif($k == 0 && $b->getPublic() == -1 && Pbs_Acl::checkRight('boc'))
				$this->view->bootoslist[] = $b;
			}
		}
		 
		$this->view->bootoslist = array_reverse($this->view->bootoslist);

		$this->view->update = array();
		$update = $this->_request->getParam('checkupdate');
		$groupMapper = new Application_Model_GroupMapper();
		 
		if(count($this->view->bootoslist)>0){
			foreach ($this->view->bootoslist as $bootos){
				$this->view->update[$bootos->getID()] = $update && $this->checkupdateAction($bootos);
				if($bootos->getDefaultkcl() == null)
				$bootos->setDefaultkcl("none (edit Bootos to set KCL)");
				$bootos->setGroupID("[".$bootos->getGroupID()."] ".$groupMapper->find($bootos->getGroupID())->getTitle());
				$bootos->setCreated(date(Zend_Registry::get('dateformat'),$bootos->getCreated()));
				@$bootos->setExpires(date(Zend_Registry::get('dateformat'),$bootos->getExpires()));
			}
		}

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

		$this->view->pagination = $pagination->pagination();
		$this->view->page 		= $pagination->getRequestPage();
		 
		 
	}
	public function searchAction(){
		$this->_redirect('/user/bootos/index/search/'.($_GET['search']));
	}

	public function createbootosAction()
	{
		 
		//ACL Darf er BootISOs erstellen?
		if(!Pbs_Acl::checkRight('boc'))
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/addresult/forbidden');
		 
		$groupID = $this->membership->getGroupID();

		$groupgroupsMapper = new Application_Model_GroupGroupsMapper();
		$childgroups = count($groupgroupsMapper->getChildGroups($groupID));
		 
		if (!isset($_POST["createbootos"])){
			$bootosForm = new user_Form_Bootos(array(
    	        							'action' => 'createbootos', 
    	        							'groupdepth' => $childgroups, 
    	        							'page' => $this->page));
		} else {
			 
			$bootosForm = new user_Form_Bootos(array(
    	        							'action' => 'createbootos', 
    	        							'groupdepth' => $childgroups, 
    	        							'page' => $this->page),$_POST);

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

				$bootos = new Application_Model_BootOs($_POST);
					
				$bootos->setGroupID($this->membership->getGroupID());
				$bootos->setCreated(time());

				try {

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

					$hash = md5(microtime(1));
					exec("wget -O '".$path_tmp."kernel".$hash."' ".escapeshellcmd($bootos->getPath_kernel())." 2>&1 | grep 'saved'", $status);
					exec("wget -O '".$path_tmp."initramfs".$hash."' ".escapeshellcmd($bootos->getPath_init())." 2>&1 | grep 'saved'", $status2);
					exec("wget -O '".$path_tmp."config".$hash."' ".escapeshellcmd($bootos->getPath_config())." 2>&1 | grep 'saved'", $status3);

					if(!array_pop($status) && $bootos->getPath_kernel() != null || !array_pop($status2)  && $bootos->getPath_init() != null || !array_pop($status3) && $bootos->getPath_config() != null ){
						$this->view->bootosForm = $bootosForm;
						$pbsNotifier = new Pbs_Notifier();
						echo $pbsNotifier->notify('The Resource was not found on the specified path','error');
							
						return;
					}

					$bootosID = $this->bootosMapper->save($bootos);

					$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);

					exec("mv ../resources/bootos/kernel$hash $kernelpath"."kernel");
					exec("mv ../resources/bootos/initramfs$hash $initpath"."initramfs");
					exec("mv ../resources/bootos/config$hash $configpath"."config.tgz");

				}catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					$this->_redirect('/user/bootos/index/page/'.$this->page.'/addresult/error');
					//TODO Delete File & delete bootiso from DB
						
				}

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

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

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

		if(is_file("../resources/bootos/$bootosID/kernel/kernel") && is_file("../resources/bootos/$bootosID/initramfs/initramfs") && is_file("../resources/bootos/$bootosID/config/config.tgz")){
			$kernelolddate = filemtime("../resources/bootos/".$bootosID."/kernel/kernel");
			$initolddate = filemtime("../resources/bootos/".$bootosID."/initramfs/initramfs");
			$configolddate = filemtime("../resources/bootos/".$bootosID."/config/config.tgz");
		}
		else
		{
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('There are updates available','ok');
			return true;
		}
		 
		exec("wget --server-response --spider '".escapeshellcmd($bootos->getPath_kernel())."' 2>&1 | grep 'Last-Modified:'", $kerneldate);
		exec("wget --server-response --spider '".escapeshellcmd($bootos->getPath_init())."' 2>&1 | grep 'Last-Modified:'", $initdate);
		exec("wget --server-response --spider '".escapeshellcmd($bootos->getPath_config())."' 2>&1 | grep 'Last-Modified:'", $configdate);
		 
		$kerneldate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($kerneldate))));
		$initdate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($initdate))));
		$configdate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($configdate))));

		//print_a($bootos->getPath_kernel(),$kerneldate,$kernelolddate,$initname,$initdate,$initolddate);
		 
		if($kerneldate > $kernelolddate || $initdate > $initolddate || $configdate > $configolddate){
			$this->view->notification = $pbsNotifier->notify('There are updates available','ok');
			return true;
		}else{
			return false;
		}
			
	}

	public function updatebootosAction()
	{
		 
		//ACL Is he allowed to update Preboots?
		if(!Pbs_Acl::checkRight('bou'))
		$this->_redirect('/user/bootiso/index/page/'.$this->page.'/updateresult/forbidden');
		 
		$bootosID = $this->_request->getParam('bootosID');
		if (!is_numeric($bootosID))
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/updateresult/forbidden');

		$bootos = $this->bootosMapper->find($bootosID);
		 
		if($this->membership->getGroupID() != $bootos->getGroupID())
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/updateresult/forbidden');
		 
		$initpath = "../resources/bootos/".$bootosID."/initramfs/";
		$kernelpath = "../resources/bootos/".$bootosID."/kernel/";
		$configpath = "../resources/bootos/".$bootosID."/config/";
		$path_tmp = "../resources/bootos/";
		 
		$hash = md5(microtime(1));
		exec("wget -O '".$path_tmp."kernel".$hash."' ".escapeshellcmd($bootos->getPath_kernel())." 2>&1 | grep 'saved'", $status);
		exec("wget -O '".$path_tmp."initramfs".$hash."' ".escapeshellcmd($bootos->getPath_init())." 2>&1 | grep 'saved'", $status2);
		exec("wget -O '".$path_tmp."config".$hash."' ".escapeshellcmd($bootos->getPath_config())." 2>&1 | grep 'saved'", $status3);

		if(!array_pop($status) || !array_pop($status2) || !array_pop($status3)){
			$this->_redirect('/user/bootos/index/page/'.$this->page.'/updateresult/404');
			//TODO Delete Files in tmp
		}

		exec("mv ../resources/bootos/kernel$hash $kernelpath"."kernel");
		exec("mv ../resources/bootos/initramfs$hash $initpath"."initramfs");
		exec("mv ../resources/bootos/config$hash $initpath"."config.tgz");
		 
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/updateresult/ok');
	}

	public function editbootosAction()
	{

		//ACL Is he allowed to edit Preboots?
		if(!Pbs_Acl::checkRight('boe') && !Pbs_Acl::checkRight('boem'))
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/forbidden');
		 
		$bootosID = $this->_request->getParam('bootosID');
		if (!is_numeric($bootosID))
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/forbidden');

		$groupID = $this->membership->getGroupID();

		$groupgroupsMapper = new Application_Model_GroupGroupsMapper();
		$childgroups = count($groupgroupsMapper->getChildGroups($groupID));
		 
		$bootos = new Application_Model_BootOs();
		$bootos = $this->bootosMapper->find($bootosID);

		if($this->membership->getGroupID() != $bootos->getGroupID())
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/forbidden');
		 
		if (!isset($_POST["editbootos"])){

			$bootosForm = new user_Form_Bootos(array(
    									'action' => 'editbootos', 
    									'groupdepth' => $childgroups, 
    	        						'page' => $this->page));

			$bootosForm->populate($bootos->toArray());
			 
		}else{
			$bootosForm = new user_Form_Bootos(array(
    									'action' => 'editbootos', 
    									'groupdepth' => $childgroups, 
    	        						'page' => $this->page),$_POST);

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

				$bootosold = $bootos;

				$bootos = new Application_Model_BootOs($_POST);
				$bootos->setGroupID($this->membership->getGroupID());
				$bootos->setCreated(time());
				$bootos->setID($bootosID);
					
				if(	$bootos->getSource() != $bootosold->getSource() ||
				$bootos->getDistro() != $bootosold->getDistro() ||
				$bootos->getDistroversion() != $bootosold->getDistroversion() ||
				$bootos->getShare() != $bootosold->getShare() ||
				$bootos->getShortname() != $bootosold->getShortname() ||
				$bootos->getDefaultkcl() != $bootosold->getDefaultkcl() ||
				$bootos->getExpires() != $bootosold->getExpires() ||
				$bootos->getPublic() != $bootosold->getPublic() ){
					//ACL Is he allowed to edit this?
					if(!Pbs_Acl::checkRight('boe'))
					$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/forbidden');
				}
				 
				if($bootos->getPath_config() != $bootosold->getPath_config() || $bootos->getPath_kernel() != $bootosold->getPath_kernel() || $bootos->getPath_init() != $bootosold->getPath_init()){
					//ACL Is he allowed to edit the Kernel/Init Path?
					if(!Pbs_Acl::checkRight('boe'))
					$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/forbidden');
						
					$path_tmp = "../resources/bootos/";
						
					$hash = md5(microtime(1));
					exec("wget -O '".$path_tmp."kernel".$hash."' ".escapeshellcmd($bootos->getPath_kernel())." 2>&1 | grep 'saved'", $status);
					exec("wget -O '".$path_tmp."initramfs".$hash."' ".escapeshellcmd($bootos->getPath_init())." 2>&1 | grep 'saved'", $status2);
					exec("wget -O '".$path_tmp."config".$hash."' ".escapeshellcmd($bootos->getPath_config())." 2>&1 | grep 'saved'", $status3);

					if(!array_pop($status) && $bootos->getPath_kernel() != null || !array_pop($status2)  && $bootos->getPath_init() != null || !array_pop($status3) && $bootos->getPath_config() != null ){
						$this->view->bootosForm = $bootosForm;
						$pbsNotifier = new Pbs_Notifier();
						echo $pbsNotifier->notify('The Resource was not found on the specified path','error');
							
						return;
					}
					 
					$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);

					exec("mv ../resources/bootos/kernel$hash $kernelpath"."kernel");
					exec("mv ../resources/bootos/initramfs$hash $initpath"."initramfs");
					exec("mv ../resources/bootos/config$hash $initpath"."config.tgz");
				}
					
				try {
					$this->bootosMapper->save($bootos);

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

				$this->_redirect('/user/bootos/index/page/'.$this->page.'/modifyresult/ok');
			}
			 
		}
		 
		$this->view->bootosForm = $bootosForm;
		 
	}

	public function deletebootosAction()
	{
		//ACL Is he allowed to delete Bootos?
		if(!Pbs_Acl::checkRight('bod'))
		$this->_redirect('/user/bootos/index/page/'.$this->page.'/deleteresult/forbidden');
		 
		try{
			$bootosID = $this->_request->getParam('bootosID');
			if (!is_numeric($bootosID))
			$this->_redirect('/user/bootos/index/page/'.$this->page.'/deleteresult/forbidden');

			$bootos = new Application_Model_BootOs();
			$this->bootosMapper->find($bootosID, $bootos);
			 
			if($this->membership->getGroupID() != $bootos->getGroupID())
			$this->_redirect('/user/bootos/index/page/'.$this->page.'/deleteresult/forbidden');
	   
			$this->bootosMapper->delete($bootos);
			exec("rm -r ../resources/bootos/".$bootosID);

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


}