<?php
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;
}
}
$this->view->bootoslist = array_reverse($this->view->bootoslist);
$this->view->update = array();
$update = $this->_request->getParam('checkupdate');
$groupMapper = new Application_Model_GroupMapper();
$configMapper = new Application_Model_ConfigMapper();
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->setConfigID("[".$bootos->getConfigID()."] ".$configMapper->find($bootos->getConfigID())->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(5);
$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($pageurl);
$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));
$configMapper = new Application_Model_ConfigMapper();
$configlist = $configMapper->findBy(array("groupID" => $groupID));
if (!isset($_POST["createbootos"])){
$bootosForm = new user_Form_Bootos(array(
'action' => 'createbootos',
'groupdepth' => $childgroups,
'configlist'=>$configlist,
'page' => $this->page));
} else {
$bootosForm = new user_Form_Bootos(array(
'action' => 'createbootos',
'groupdepth' => $childgroups,
'configlist'=>$configlist,
'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);
if(!array_pop($status) || !array_pop($status2)){
$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/";
mkdir($initpath ,0777, true);
mkdir($kernelpath ,0777, true);
exec("mv ../resources/bootos/kernel$hash $kernelpath"."kernel");
exec("mv ../resources/bootos/initramfs$hash $initpath"."initramfs");
}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")){
$kernelolddate = filemtime("../resources/bootos/".$bootosID."/kernel/kernel");
$initolddate = filemtime("../resources/bootos/".$bootosID."/initramfs/initramfs");
}
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);
$kerneldate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($kerneldate))));
$initdate = strtotime(trim(str_replace('Last-Modified:', '', array_pop($initdate))));
//print_a($bootos->getPath_kernel(),$kerneldate,$kernelolddate,$initname,$initdate,$initolddate);
if($kerneldate > $kernelolddate || $initdate > $initolddate){
$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/";
$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);
if(!array_pop($status) || !array_pop($status2)){
$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");
$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));
$configMapper = new Application_Model_ConfigMapper();
$configlist = $configMapper->findBy(array("groupID" => $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,
'configlist'=>$configlist,
'page' => $this->page));
$bootosForm->populate($bootos->toArray());
}else{
$bootosForm = new user_Form_Bootos(array(
'action' => 'editbootos',
'groupdepth' => $childgroups,
'configlist'=>$configlist,
'page' => $this->page),$_POST);
if ($bootosForm->isValid($_POST)) {
$bootosold = $bootos;
$bootos = new Application_Model_BootOs($_POST);
$bootos->setGroupID($this->membership->getGroupID());
$bootos->setCreated(time());
if($bootos->getConfigID() == '')
$bootos->setConfigID(NULL);
$bootos->setID($bootosID);
if( $bootos->getConfigID() != $bootosold->getConfigID() ||
$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_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);
if(!array_pop($status) || !array_pop($status2)){
$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/";
mkdir($initpath ,0777, true);
mkdir($kernelpath ,0777, true);
exec("mv ../resources/bootos/kernel$hash $kernelpath"."kernel");
exec("mv ../resources/bootos/initramfs$hash $initpath"."initramfs");
}
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');
}
}