Skip to content
system.inc.php 40.4 KiB
Newer Older
	             				if(isset($ifconfig['INTERFACE'][$main_interface.':'.$i])){
	               					$new_interface = $main_interface.':'.$i;
	           				exec('ifconfig '.$new_interface.' '.$to.' netmask '.$this->server_conf['server_netzmaske'].' up &> /dev/null');
	           				$ifconfig['INTERFACE'][$new_interface] = $to;
	  $content = $app->file->unix_nl($app->file->no_comments('/etc/fstab'));
	  $lines = explode("\n", $content);
	  foreach($lines as $line){
	    $line = trim($line);
	    if($line != ''){
	      $elms = explode("\t", $line);
	      foreach($elms as $elm){
	        if(trim($elm) != '') $f[] = $elm;
	      if(!empty($f) && stristr($f[3], 'userquota') && stristr($f[3], 'groupquota')){
	        $q_dirs[] = trim($f[1]);
	      }
	      unset($f);
	    }
	  }
	  if(!empty($q_dirs)){
	    return $q_dirs;
	  } else {
	    return false;
	  }
	}
	
	/**
	 * Scan the trash for virusses infection
	 *
	 */
	function make_trashscan(){
		global $app;
	  	//trashscan erstellen
	  	// Template ffnen
	  	$app->tpl->clear_all();
	  	$app->tpl->define( array(table    => 'trashscan.master'));
	  	if(!isset($this->server_conf['virusadmin']) || trim($this->server_conf['virusadmin']) == '') $this->server_conf['virusadmin'] = 'admispconfig@localhost';
	  	if(substr($this->server_conf['virusadmin'],0,1) == '#'){
		    $notify = 'no';
		    $notify = 'yes';
	  	$app->tpl->assign( array(VIRUSADMIN => $this->server_conf['virusadmin'],
	                           NOTIFICATION => $notify));
	
	  	$app->tpl->parse(TABLE, table);
	
	  	$trashscan_text = $app->tpl->fetch();
	
	  	$datei = '/home/admispconfig/ispconfig/tools/clamav/bin/trashscan';
	  	$app->file->wf($datei, $trashscan_text);
	
	  	chmod($datei, 0755);
	  	chown($datei,'admispconfig');
	  	chgrp($datei,'admispconfig');
	  $addr = 'http://www.ispconfig.org/';
	  $timeout = 1;
	  $url_parts = parse_url($addr);
	  $path = $url_parts['path'];
	  $urlHandle = @fsockopen($url_parts['host'], $port, $errno, $errstr, $timeout);
	  if ($urlHandle){
	    socket_set_timeout($urlHandle, $timeout);
	
	    $urlString = 'GET '.$path." HTTP/1.0\r\nHost: ".$url_parts['host']."\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
	    if ($user) $urlString .= 'Authorization: Basic '.base64_encode($user.':'.$pass)."\r\n";
	    $urlString .= "\r\n";
	    fputs($urlHandle, $urlString);
	
	    $month['Jan'] = '01';
	    $month['Feb'] = '02';
	    $month['Mar'] = '03';
	    $month['Apr'] = '04';
	    $month['May'] = '05';
	    $month['Jun'] = '06';
	    $month['Jul'] = '07';
	    $month['Aug'] = '08';
	    $month['Sep'] = '09';
	    $month['Oct'] = '10';
	    $month['Nov'] = '11';
	    $month['Dec'] = '12';
	    $c = 0;
	    $l = 0;
	    $startzeit = time();
	    while(!feof($urlHandle) && $c < 2 && $l == 0){
	      $line = trim(fgets($urlHandle,128));
	      $response .= $line;
	      $c = time() - $startzeit;
	      if($line == '' || substr($line, 0, 5) == 'Date:') $l += 1; // nur den Header auslesen
	      if(substr($line, 0, 5) == 'Date:'){
	        $parts = explode(' ', $line);
	        $tag = $parts[2];
	        $monat = $month[$parts[3]];
	        $jahr = $parts[4];
	        list($stunde, $minute, $sekunde) = explode(':', $parts[5]);
	        $timestamp = mktime($stunde,$minute,$sekunde,$monat,$tag,$jahr);
	      }
	    }
	
	    @fclose($urlHandle);
	
	    return $timestamp;
	  } else {
	    @fclose($urlHandle);
	    return false;
	  }
	}
	
	function replaceLine($filename,$search_pattern,$new_line,$strict = 0,$append = 1) {
		$lines = @file($filename);
		$out = '';
		$found = 0;
		if(is_array($lines)) {
			foreach($lines as $line) {
				if($strict == 0) {
					if(stristr($line,$search_pattern)) {
						$out .= $new_line."\n";
						$found = 1;
					} else {
						$out .= $line;
					}
				} else {
					if(trim($line) == $search_pattern) {
						$out .= $new_line."\n";
						$found = 1;
					} else {
						$out .= $line;
					}
				}
			}
		}
		
		if($found == 0) {
			//* add \n if the last line does not end with \n or \r
			if(substr($out,-1) != "\n" && substr($out,-1) != "\r" && filesize($filename) > 0) $out .= "\n";
			//* add the new line at the end of the file
			if($append == 1) {
				$out .= $new_line."\n";
			}
		}
		file_put_contents($filename,$out);
	}
	
	function removeLine($filename,$search_pattern,$strict = 0) {
	if($lines = @file($filename)) {
		$out = '';
		foreach($lines as $line) {
			if($strict == 0) {
				if(!stristr($line,$search_pattern)) {
					$out .= $line;
				}
			} else {
				if(!trim($line) == $search_pattern) {
					$out .= $line;
				}
			}
		}
		file_put_contents($filename,$out);
	}
	}
	
	function maildirmake($maildir_path, $user = '', $subfolder = '') {
		
		global $app;
		
		if($subfolder != '') {
			$dir = escapeshellcmd($maildir_path.'/.'.$subfolder);
		} else {

		if($user != '' && $user != 'root' && $this->is_user($user)) {
			// I assume that the name of the (vmail group) is the same as the name of the mail user in ISPConfig 3
			$group = $user;
			if(is_dir($dir)) chown($dir,$user);
			if(is_dir($dir)) chgrp($dir,$group);

			$chown_mdsub = true;
		$maildirsubs = array('cur','new','tmp');

		foreach ($maildirsubs as $mdsub) {
			if(!is_dir($dir.'/'.$mdsub)) mkdir($dir.'/'.$mdsub, 0700, true);
			if ($chown_mdsub) {
				chown($dir.'/'.$mdsub, $user);
				chgrp($dir.'/'.$mdsub, $group);
			}
		}

		chmod($dir, 0700);
		if($user != '' && $this->is_user($user) && $user != 'root') {
			// I assume that the name of the (vmail group) is the same as the name of the mail user in ISPConfig 3
			$group = $user;
			exec("chown $user:$group $dir $dir_cur $dir_new $dir_tmp");
		
		//* Add the subfolder to the subscriptions and courierimapsubscribed files
		if($subfolder != '') {
			// Courier
			if(!is_file($maildir_path.'/courierimapsubscribed')) {
				$tmp_file = escapeshellcmd($maildir_path.'/courierimapsubscribed');
				touch($tmp_file);
				chmod($tmp_file, 0744);
				chown($tmp_file,'vmail');
				chgrp($tmp_file,'vmail');
			}
			$this->replaceLine($maildir_path.'/courierimapsubscribed','INBOX.'.$subfolder,'INBOX.'.$subfolder,1,1);
			
			// Dovecot
			if(!is_file($maildir_path.'/subscriptions')) {
				$tmp_file = escapeshellcmd($maildir_path.'/subscriptions');
				touch($tmp_file);
				chmod($tmp_file, 0744);
				chown($tmp_file,'vmail');
				chgrp($tmp_file,'vmail');
			}
			$this->replaceLine($maildir_path.'/subscriptions',$subfolder,$subfolder,1,1);
		}
		
		$app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder,LOGLEVEL_DEBUG);
		
	}
	
	//* Function to create directory paths and chown them to a user and group
	function mkdirpath($path, $mode = 0755, $user = '', $group = '') {
		$path_parts = explode('/',$path);
		$new_path = '';
		if(is_array($path_parts)) {
			foreach($path_parts as $part) {
				$new_path .= '/'.$part;
				if(!@is_dir($new_path)) {
					mkdir($new_path);
					chmod($new_path,$mode);
					if($user != '') chown($new_path,$user);
					if($group != '') chgrp($new_path,$group);
				}
			}
		}
		
	}
	
	//* Check if a application is installed
	function is_installed($appname) {
		exec('which '.escapeshellcmd($appname).' 2> /dev/null',$out,$returncode);
		if(isset($out[0]) && stristr($out[0],$appname) && $returncode == 0) {
			return true;
		} else {
			return false;
		}
	}
	
	function web_folder_protection($document_root,$protect) {
		global $app,$conf;
		
		//* load the server configuration options
		$app->uses('getconf');
		$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
		
		if($protect == true && $web_config['web_folder_protection'] == 'y') {
			//* Add protection
			if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root,'..')) exec('chattr +i '.escapeshellcmd($document_root));
		} else {
			//* Remove protection
			if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root,'..')) exec('chattr -i '.escapeshellcmd($document_root));
		}
	}