Skip to content
system.inc.php 46.4 KiB
Newer Older
	  	$binary_netmask = $this->binary_netmask($netmask);
	  	list($f1,$f2,$f3,$f4) = explode('.', $ip);
	  	$ip_bin = str_pad(decbin($f1),8,'0',STR_PAD_LEFT).str_pad(decbin($f2),8,'0',STR_PAD_LEFT).str_pad(decbin($f3),8,'0',STR_PAD_LEFT).str_pad(decbin($f4),8,'0',STR_PAD_LEFT);
	  	$broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,'1',STR_PAD_RIGHT);
	  	$broadcast_bin = wordwrap($broadcast_bin, 8, '.', 1);
	  	list($f1,$f2,$f3,$f4) = explode('.', trim($broadcast_bin));
	  	return bindec($f1).'.'.bindec($f2).'.'.bindec($f3).'.'.bindec($f4);
	}
	
	/**
	 * Get the network address information
	 *
	 */
	function network_info(){
		$dist = $this->server_conf['dist'];
	  	passthru('ifconfig');
	  	$output = ob_get_contents();
	  	ob_end_clean();
	  	$lines = explode("\n", $output);
	  	foreach($lines as $line){
		    $elms = explode(' ', $line);
	    	if(trim($elms[0]) != '' && substr($elms[0],0,1) != "\t"){
	      		$elms[0] = trim($elms[0]);
	      		if(strstr($dist, 'freebsd')) $elms[0] = substr($elms[0],0,-1);
	      		$interfaces[] = $elms[0];
	    	}
	  	}
	  	if(!empty($interfaces)){
		    foreach($interfaces as $interface){
	    		ob_start();
	      		if(!strstr($dist, 'freebsd')){
	        		passthru('ifconfig '.$interface." | grep -iw 'inet' | cut -f2 -d: | cut -f1 -d' '");
	        		passthru('ifconfig '.$interface." | grep -iw 'inet' | grep -iv 'inet6' | cut -f2 -d' '");
	      		}
	      		$output = trim(ob_get_contents());
	      		ob_end_clean();
	      		if($output != ''){
	        		$ifconfig['INTERFACE'][$interface] = $output;
	        		$ifconfig['IP'][$output] = $interface;
	      		}
	    	}
	    	if(!empty($ifconfig)){
	      		return $ifconfig;
	    	} else {
	      		return false;
	    	}
	  	} else {
	    	return false;
	  	}
	}
	
	/**
	 * Configure the network settings from the system
	 *
	 */
	function network_config(){
		$ifconfig = $this->network_info();
	  	if($ifconfig){
	    	$main_interface = $ifconfig['IP'][$this->server_conf['server_ip']];
	    	if(strstr($main_interface, ':')){
	      		$parts = explode(':', $main_interface);
	      		$main_interface = trim($parts[0]);
	    	}
	    	if($main_interface != ''){
	      		$ips = $this->data['isp_server_ip'];
	      		if(!empty($ips)){
	        		foreach($ips as $ip){
	          			if(!isset($ifconfig['IP'][$ip['server_ip']])){
	            			$to_set[] = $ip['server_ip'];
	            			unset($ifconfig['IP'][$ip['server_ip']]);
	        		if(!empty($ifconfig['IP'])){
	          			foreach($ifconfig['IP'] as $key => $val){
	            			if(!strstr($val, 'lo') && !strstr($val, 'lp') && strstr($val, $main_interface)){
	              				exec('ifconfig '.$val.' down &> /dev/null');
	              				unset($ifconfig['INTERFACE'][$val]);
	            			}
	          			}
	        		}
	        		if(!empty($to_set)){
	         			foreach($to_set as $to){
	           				$i = 0;
	           				while($i >= 0){
	             				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) {
		if($this->checkpath($filename) == false) {
			$app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN);
			return false;
		}
		$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($this->checkpath($filename) == false) {
		$app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN);
		return false;
	}
	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)) $this->chown($dir,$user);
			if(is_dir($dir)) $this->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)) {
					$this->mkdir($new_path);
					$this->chmod($new_path,$mode);
					if($user != '') $this->chown($new_path,$user);
					if($group != '') $this->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;
		
		if($this->checkpath($document_root) == false) {
			$app->log("Action aborted, target is a symlink: $document_root",LOGLEVEL_DEBUG);
			return false;
		}
		
		//* 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));
		}
	}
	
	function usermod($username, $uid = 0, $gid = 0, $home = '', $shell = '', $password = '', $login = '') {
		global $app;
		
		if($login == '') $login = $username;
		
		//* Change values in /etc/passwd
		$passwd_file_array = file('/etc/passwd');
		if(is_array($passwd_file_array)) {
			foreach($passwd_file_array as $line) {
				$line = trim($line);
				$parts = explode(':',$line);
				if($parts[0] == $username) {
					if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login);
					if(!empty($uid)) $parts[2] = trim($uid);
					if(!empty($gid)) $parts[3] = trim($gid);
					if(trim($home) != '') $parts[5] = trim($home);
					if(trim($shell) != '') $parts[6] = trim($shell);
					$new_line = implode(':',$parts);
					copy('/etc/passwd','/etc/passwd~');
					chmod('/etc/passwd~',0600);
					$app->uses('system');
					$app->system->replaceLine('/etc/passwd',$line,$new_line,1,0);
				}
			}
			unset($passwd_file_array);
		}
		
		//* If username != login, change username in group and gshadow file
		if($username  != $login) {
			$group_file_array = file('/etc/group');
			if(is_array($group_file_array)) {
				foreach($group_file_array as $line) {
					$line = trim($line);
					$parts = explode(':',$line);
					if(strstr($parts[3],$username)) {
						$uparts = explode(',',$parts[3]);
						if(is_array($uparts)) {
							foreach($uparts as $key => $val) {
								if($val == $username) $uparts[$key] = $login;
							}
						}
						$parts[3] = implode(',',$uparts);
						$new_line = implode(':',$parts);
						copy('/etc/group','/etc/group~');
						chmod('/etc/group~',0600);
						$app->system->replaceLine('/etc/group',$line,$new_line,1,0);
					}
				}
			}
			unset($group_file_array);
			
			$gshadow_file_array = file('/etc/gshadow');
			if(is_array($gshadow_file_array)) {
				foreach($gshadow_file_array as $line) {
					$line = trim($line);
					$parts = explode(':',$line);
					if(strstr($parts[3],$username)) {
						$uparts = explode(',',$parts[3]);
						if(is_array($uparts)) {
							foreach($uparts as $key => $val) {
								if($val == $username) $uparts[$key] = $login;
							}
						}
						$parts[3] = implode(',',$uparts);
						$new_line = implode(':',$parts);
						copy('/etc/gshadow','/etc/gshadow~');
						chmod('/etc/gshadow~',0600);
						$app->system->replaceLine('/etc/gshadow',$line,$new_line,1,0);
					}
				}
			}
			unset($group_file_array);
		}
		
		
		//* When password or login name has been changed
		if($password != '' || $username  != $login) {
			$shadow_file_array = file('/etc/shadow');
			if(is_array($shadow_file_array)) {
				foreach($shadow_file_array as $line) {
					$line = trim($line);
					$parts = explode(':',$line);
					if($parts[0] == $username) {
						if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login);
						if(trim($password) != '') $parts[1] = trim($password);
						$new_line = implode(':',$parts);
						copy('/etc/shadow','/etc/shadow~');
						chmod('/etc/shadow~',0600);
						$app->system->replaceLine('/etc/shadow',$line,$new_line,1,0);
					}
				}
			}
			unset($shadow_file_array);
		}
	}