<?php
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);
}
$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(array("groupID" => $groupID));
// Pagination
$pagination = new Pbs_Pagination();
$pagination->setPerPage(2);
$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($pageurl);
$this->view->page = $pagination->getRequestPage();
$this->view->prebootlist= $this->view->prebootlist;
$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/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->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/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)
{
//TODO ACL Is he allowed to update Preboots?
if(false)
$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
$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/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()
{
//TODO ACL Is he allowed to edit Preboots?
if(false)
$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',
'rights' => 'meta',
'page' => $this->page));
$prebootForm->populate($preboot->toArray());
}else{
$prebootForm = new user_Form_Preboot(array(
'action' => 'editpreboot',
'rights' => 'meta',
'page' => $this->page),$_POST);
if ($prebootForm->isValid($_POST)) {
$prebootold = $preboot;
$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/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()
{
//TODO ACL Is he allowed to delete Preboots?
if(false)
$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');
}
}