From a5fe2742b8e90e7bb2ee4a3a9df3ea64afd6eaff Mon Sep 17 00:00:00 2001 From: xaver <xaver@ispconfig3> Date: Fri, 09 Sep 2011 14:09:31 -0400 Subject: [PATCH] Fixed #1390 - Added 3ware controller (was my script i use 3ware) --- server/lib/classes/system.inc.php | 2185 +++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 1,222 insertions(+), 963 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 977ed33..5de2f81 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1,6 +1,7 @@ <?php + /* -Copyright (c) 2007, projektfarm Gmbh, Till Brehm, Falko Timme +Copyright (c) 2007, Till Brehm, projektfarm Gmbh All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -27,973 +28,1231 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - class system{ -var $FILE = "/root/ispconfig/scripts/lib/classes/ispconfig_system.lib.php"; -var $server_id; -var $server_conf; -var $data; + var $FILE = '/root/ispconfig/scripts/lib/classes/ispconfig_system.lib.php'; + var $server_id; + var $server_conf; + var $data; + + /** + * Construct for this class + * + * @return system + */ + public function system(){ + global $go_info; + $this->server_id = $go_info['isp']['server_id']; + $this->server_conf = $go_info['isp']['server_conf']; + $this->server_conf['passwd_datei'] = '/etc/passwd'; + $this->server_conf['shadow_datei'] = '/etc/shadow'; + $this->server_conf['group_datei'] = '/etc/group'; + } + + /** + * Get the hostname from the server + * + * @return string + */ + public function hostname(){ + $dist = $this->server_conf['dist']; + + ob_start(); + passthru('hostname'); + $hostname = ob_get_contents(); + ob_end_clean(); + $hostname = trim($hostname); + ob_start(); + if(!strstr($dist, 'freebsd')){ + passthru('dnsdomainname'); + } else { + passthru('domainname'); + } + $domainname = ob_get_contents(); + ob_end_clean(); + $domainname = trim($domainname); + if($domainname != ""){ + if(!strstr($hostname, $domainname)) $hostname .= ".".$domainname; + } + return $hostname; + } + + /** + * Add an user to the system + * + */ + public function adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + global $app; + if($this->is_user($user_username)){ + return false; + } else { + if(trim($user_username) != '') { + $user_datei = $this->server_conf['passwd_datei']; + $shadow_datei = $this->server_conf['shadow_datei']; + $shell = realpath($shell); + if(trim($passwort) == '') $passwort = '*'; + $new_user = "\n$user_username:x:$uid:$gid:$username:$homedir:$shell\n"; + $app->log->msg('USER: '.$new_user); + $app->file->af($user_datei, $new_user); + if($shadow_datei == '/etc/shadow'){ + $datum = time(); + $tage = floor($datum/86400); + $new_passwd = "\n$user_username:$passwort:$tage:0:99999:7:::\n"; + } else { + $new_passwd = "\n$user_username:$passwort:$uid:$gid::0:0:$username:$homedir:$shell\n"; + } + $app->file->af($shadow_datei, $new_passwd); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->file->remove_blank_lines($user_datei); + // TB: user Sortierung deaktiviert + //$this->order_users_groups(); + if($shadow_datei != '/etc/shadow'){ + $app->file->af($shadow_datei, "\n"); + // TB: leere Zeilen entfernen + $app->file->remove_blank_lines($shadow_datei); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + } + + /** + * Update users when someone edit it + * + */ + function updateuser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ + //* First delete the users + $this->deluser($user_username); + //* Add the user again + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + + /** + * Lock the user + * + */ + function deactivateuser($user_username){ + $passwort = str_rot13($this->getpasswd($user_username)); + $user_attr = $this->get_user_attributes($user_username); + $uid = $user_attr['uid']; + $gid = $user_attr['gid']; + $username = $user_attr['name']; + $homedir = $user_attr['homedir']; + $shell = '/dev/null'; + $this->deluser($user_username); + $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); + } + /** + * Delete a user from the system + * + */ + function deluser($user_username){ + global $app; + if($this->is_user($user_username)){ + $user_datei = $this->server_conf['passwd_datei']; + $shadow_datei = $this->server_conf['shadow_datei']; + $users = $app->file->rf($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ''){ + list($f1,) = explode(':', $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_users = implode("\n", $new_lines); + $app->file->wf($user_datei, $new_users); + unset($new_lines); + unset($lines); + unset($new_users); + } + $app->file->remove_blank_lines($user_datei); + + $passwds = $app->file->rf($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ''){ + list($f1,) = explode(':', $lines[$i]); + if($f1 != $user_username) $new_lines[] = $lines[$i]; + } + } + $new_passwds = implode("\n", $new_lines); + $app->file->wf($shadow_datei, $new_passwds); + unset($new_lines); + unset($lines); + unset($new_passwds); + } + $app->file->remove_blank_lines($shadow_datei); + + $group_file = $app->file->rf($this->server_conf['group_datei']); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ''){ + list($f1, $f2, $f3, $f4) = explode(':', $group_file_line); + $group_users = explode(',', str_replace(' ', '', $f4)); + if(in_array($user_username, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user_username) $g_users[] = $group_user; + } + $f4 = implode(',', $g_users); + } + $new_group_file[] = $f1.':'.$f2.':'.$f3.':'.$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf['group_datei'], $new_group_file); + // TB: auskommentiert + //$this->order_users_groups(); + + if($shadow_datei != '/etc/shadow'){ + $app->file->af($shadow_datei, "\n"); + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /** + * Add a usergroup to the system + * + */ + function addgroup($group, $gid, $members = ''){ + global $app; + if($this->is_group($group)){ + return false; + } else { + $group_datei = $this->server_conf['group_datei']; + $shadow_datei = $this->server_conf['shadow_datei']; + $new_group = "\n$group:x:$gid:$members\n"; + $app->file->af($group_datei, $new_group); + + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != '/etc/shadow'){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } + } + + /** + * Update usersgroup in way to delete and add it again + * + */ + function updategroup($group, $gid, $members = ''){ + $this->delgroup($group); + $this->addgroup($group, $gid, $members); + } + + /** + * Delete a usergroup from the system + * + */ + function delgroup($group){ + global $app; + if($this->is_group($group)){ + $group_datei = $this->server_conf['group_datei']; + $shadow_datei = $this->server_conf['shadow_datei']; + $groups = $app->file->rf($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + $num_lines = sizeof($lines); + for($i=0;$i<$num_lines;$i++){ + if(trim($lines[$i]) != ''){ + list($f1,) = explode(':', $lines[$i]); + if($f1 != $group) $new_lines[] = $lines[$i]; + } + } + $new_groups = implode("\n", $new_lines); + $app->file->wf($group_datei, $new_groups); + unset($new_lines); + unset($lines); + unset($new_groups); + } + // TB: auskommentiert + //$this->order_users_groups(); + if($shadow_datei != '/etc/shadow'){ + $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + /** + * Order usergroups + * + */ + function order_users_groups(){ + global $app; + $user_datei = $this->server_conf['passwd_datei']; + $shadow_datei = $this->server_conf['shadow_datei']; + $group_datei = $this->server_conf['group_datei']; + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4) = explode(':', $line); + $arr[$f3] = $line; + } + } + } + ksort($arr); + reset($arr); + if($shadow_datei != '/etc/shadow'){ + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)."\n"); + }else { + $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + } + unset($arr); + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3,) = explode(':', $line); + if($f1 != 'toor'){ + $arr[$f3] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($user_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3,) = explode(':', $line); + if($f1 != 'toor'){ + $uid = $this->getuid($f1); + if(!is_bool($uid)) $arr[$uid] = $line; + } else { + $arr[70000] = $line; + } + } + } + } + ksort($arr); + reset($arr); + $app->file->wf($shadow_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); + unset($arr); + } + + /** + * Find a user / group id + * + */ + function find_uid_gid($min, $max){ + global $app; + if($min < $max && $min >= 0 && $max >= 0 && $min <= 65536 && $max <= 65536 && is_int($min) && is_int($max)){ + for($i=$min;$i<=$max;$i++){ + $uid_arr[$i] = $gid_arr[$i] = 1; + } + $user_datei = $this->server_conf['passwd_datei']; + $group_datei = $this->server_conf['group_datei']; + + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(':', $line); + if($f3 >= $min && $f3 <= $max) unset($uid_arr[$f3]); + } + } + if(!empty($uid_arr)){ + foreach($uid_arr as $key => $val){ + $uids[] = $key; + } + $min_uid = min($uids); + unset($uid_arr); + } else { + return false; + } + } + + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4) = explode(':', $line); + if($f3 >= $min && $f3 <= $max) unset($gid_arr[$f3]); + } + } + if(!empty($gid_arr)){ + foreach($gid_arr as $key => $val){ + $gids[] = $key; + } + $min_gid = min($gids); + unset($gid_arr); + } else { + return false; + } + } + + $result = array_intersect($uids, $gids); + $new_id = (max($result)); + unset($uids); + unset($gids); + unset($result); + if($new_id <= $max){ + return $new_id; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Check if the users is really a user into the system + * + */ + function is_user($user){ + global $app; + $user_datei = $this->server_conf['passwd_datei']; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(':', $line); + if($f1 == $user) return true; + } + } + } + return false; + } + + /** + * Check if the group is on this system + * + */ + function is_group($group){ + global $app; + $group_datei = $this->server_conf['group_datei']; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ""){ + list($f1, $f2, $f3, $f4) = explode(':', $line); + if($f1 == $group) return true; + } + } + } + return false; + } + + /* + // Alternative implementation of the is_group function. Should be faster then the old one To be tested. + function is_group($group) { + $groupfile = '/etc/group'; + if(is_file($groupfile)) { + $handle = fopen ($groupfile, "r"); + while (!feof($handle)) { + $line = trim(fgets($handle, 4096)); + if($line != ""){ + $parts = explode(":", $line); + if($parts[0] == $group) { + fclose ($handle); + return true; + } + } + } + fclose ($handle); + } + return false; + } + */ + + function root_group(){ + global $app; + $group_datei = $this->server_conf['group_datei']; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4) = explode(':', $line); + if($f3 == 0) return $f1; + } + } + } + return false; + } + + /** + * Get the groups of an user + * + */ + function get_user_groups($username){ + global $app; + $user_groups = array(); + $group_datei = $this->server_conf['group_datei']; + $groups = $app->file->no_comments($group_datei); + $lines = explode("\n", $groups); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4) = explode(':', $line); + if(intval($f3) < intval($this->server_conf['groupid_von']) && trim($f1) != 'users'){ + $tmp_group_users = explode(',', str_replace(' ', '', $f4)); + if(in_array($username, $tmp_group_users) && trim($f1) != '') $user_groups[] = $f1; + unset($tmp_group_users); + } + } + } + } + if(!empty($user_groups)) return implode(',', $user_groups); + return ''; + } + + /** + * Get a user password + * + */ + function getpasswd($user){ + global $app; + if($this->is_user($user)){ + $shadow_datei = $this->server_conf['shadow_datei']; + $passwds = $app->file->no_comments($shadow_datei); + $lines = explode("\n", $passwds); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2,) = explode(':', $line); + if($f1 == $user) return $f2; + } + } + } + } else { + return false; + } + } + + /** + * Get the user id from an user + * + */ + function getuid($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf['passwd_datei']; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3,) = explode(':', $line); + if($f1 == $user) return $f3; + } + } + } + } else { + return false; + } + } + + /** + * Get all information from a user + * + */ + function get_user_attributes($user){ + global $app; + if($this->is_user($user)){ + $user_datei = $this->server_conf['passwd_datei']; + $users = $app->file->no_comments($user_datei); + $lines = explode("\n", $users); + if(is_array($lines)){ + foreach($lines as $line){ + if(trim($line) != ''){ + list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(':', $line); + if($f1 == $user){ + $user_attr['username'] = $f1; + $user_attr['x'] = $f2; + $user_attr['uid'] = $f3; + $user_attr['gid'] = $f4; + $user_attr['name'] = $f5; + $user_attr['homedir'] = $f6; + $user_attr['shell'] = $f7; + return $user_attr; + } + } + } + } + } else { + return false; + } + } + + /** + * Edit the owner of a file + * + */ + function chown($file, $owner, $group = ''){ + $owner_change = @chown($file, $owner); + if($group != ''){ + $group_change = @chgrp($file, $group); + } else { + $group_change = 1; + } + if($owner_change && $group_change){ + return true; + } else { + return false; + } + } + + /** + * Add an user to a specific group + * + */ + function add_user_to_group($group, $user = 'admispconfig'){ + global $app; + $group_file = $app->file->rf($this->server_conf['group_datei']); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + list($group_name,$group_x,$group_id,$group_users) = explode(':',$group_file_line); + if($group_name == $group){ + $group_users = explode(',', str_replace(' ', '', $group_users)); + if(!in_array($user, $group_users)){ + $group_users[] = $user; + } + $group_users = implode(',', $group_users); + if(substr($group_users,0,1) == ',') $group_users = substr($group_users,1); + $group_file_line = $group_name.':'.$group_x.':'.$group_id.':'.$group_users; + } + $new_group_file[] = $group_file_line; + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf['group_datei'], $new_group_file); + $app->file->remove_blank_lines($this->server_conf['group_datei']); + if($this->server_conf['shadow_datei'] != '/etc/shadow'){ + $app->log->caselog('pwd_mkdb '.$this->server_conf['shadow_datei'].' &> /dev/null', $this->FILE, __LINE__); + } + } + + function usermod($user, $groups){ + global $app; + if($this->is_user($user)){ + $groups = explode(',', str_replace(' ', '', $groups)); + $group_file = $app->file->rf($this->server_conf['group_datei']); + $group_file_lines = explode("\n", $group_file); + foreach($group_file_lines as $group_file_line){ + if(trim($group_file_line) != ""){ + list($f1, $f2, $f3, $f4) = explode(':', $group_file_line); + $group_users = explode(',', str_replace(' ', '', $f4)); + if(!in_array($f1, $groups)){ + if(in_array($user, $group_users)){ + $g_users = array(); + foreach($group_users as $group_user){ + if($group_user != $user) $g_users[] = $group_user; + } + $f4 = implode(',', $g_users); + } + } else { + if(!in_array($user, $group_users)){ + if(trim($group_users[0]) == '') unset($group_users); + $group_users[] = $user; + } + $f4 = implode(',', $group_users); + } + $new_group_file[] = $f1.':'.$f2.':'.$f3.':'.$f4; + } + } + $new_group_file = implode("\n", $new_group_file); + $app->file->wf($this->server_conf['group_datei'], $new_group_file); + $app->file->remove_blank_lines($this->server_conf['group_datei']); + if($this->server_conf['shadow_datei'] != '/etc/shadow'){ + $app->log->caselog('pwd_mkdb '.$this->server_conf['shadow_datei'].' &> /dev/null', $this->FILE, __LINE__); + } + return true; + } else { + return false; + } + } + + /**boot autostart etc + * + */ + function rc_edit($service, $rl, $action){ + // $action = "on|off"; + global $app; + $dist_init_scripts = $app->system->server_conf['dist_init_scripts']; + $dist_runlevel = $app->system->server_conf['dist_runlevel']; + $dist = $app->system->server_conf['dist']; + if(trim($dist_runlevel) == ''){ // falls es keine runlevel gibt (FreeBSD) + if($action == 'on'){ + @symlink($dist_init_scripts.'/'.$service, $dist_init_scripts.'/'.$service.'.sh'); + } + if($action == 'off'){ + if(is_link($dist_init_scripts.'/'.$service.'.sh')){ + unlink($dist_init_scripts.'/'.$service.'.sh'); + } else { + rename($dist_init_scripts.'/'.$service.'.sh',$dist_init_scripts.'/'.$service); + } + } + } else { // Linux + if(substr($dist, 0,4) == 'suse'){ + if($action == 'on'){ + exec("chkconfig --add $service &> /dev/null"); + } + if($action == 'off'){ + exec("chkconfig --del $service &> /dev/null"); + } + } else { + $runlevels = explode(',', $rl); + foreach($runlevels as $runlevel){ + $runlevel = trim($runlevel); + if($runlevel != '' && is_dir($dist_runlevel.'/rc'.$runlevel.'.d')){ + $handle=opendir($dist_runlevel.'/rc'.$runlevel.'.d'); + while($file = readdir($handle)){ + if($file != '.' && $file != '..'){ + $target = @readlink($dist_runlevel.'/rc'.$runlevel.'.d/'.$file); + if(strstr($file, $service) && strstr($target, $service) && substr($file,0,1) == 'S') $ln_arr[$runlevel][] = $dist_runlevel.'/rc'.$runlevel.'.d/'.$file; + } + } + closedir($handle); + } + if($action == 'on'){ + if(!is_array($ln_arr[$runlevel])) @symlink($dist_init_scripts.'/'.$service, $dist_runlevel.'/rc'.$runlevel.'.d/S99'.$service); + } + if($action == 'off'){ + if(is_array($ln_arr[$runlevel])){ + foreach($ln_arr[$runlevel] as $link){ + unlink($link); + } + } + } + } + } + } + } + + /** + * Filter information from the commands + * + */ + function grep($content, $string, $params = ''){ + global $app; + // params: i, v, w + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + if(!strstr($params, 'w')){ + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!stristr($line, $string)) $find[] = $line; + } else { + if(stristr($line, $string)) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!strstr($line, $string)) $find[] = $line; + } else { + if(strstr($line, $string)) $find[] = $line; + } + } + } else { + if(strstr($params, 'i')){ + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line, 'i')) $find[] = $line; + } else { + if($app->string->is_word($string, $line, 'i')) $find[] = $line; + } + } else { + if(strstr($params, 'v')){ + if(!$app->string->is_word($string, $line)) $find[] = $line; + } else { + if($app->string->is_word($string, $line)) $find[] = $line; + } + } + } + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Strip content from fields + * + */ + function cut($content, $field, $delimiter = ':'){ + global $app; + $content = $app->file->unix_nl($content); + $lines = explode("\n", $content); + foreach($lines as $line){ + $elms = explode($delimiter, $line); + $find[] = $elms[($field-1)]; + } + if(is_array($find)){ + $ret_val = implode("\n", $find); + if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; + $find = NULL; + return $ret_val; + } else { + return false; + } + } + + /** + * Get the content off a file + * + */ + function cat($file){ + global $app; + return $app->file->rf($file); + } + + /** + * Control services to restart etc + * + */ + function daemon_init($daemon, $action){ + //* $action = start|stop|restart|reload + global $app; + $dist = $this->server_conf['dist']; + $dist_init_scripts = $this->server_conf['dist_init_scripts']; + if(!strstr($dist, 'freebsd')){ + $app->log->caselog("$dist_init_scripts/$daemon $action &> /dev/null", $this->FILE, __LINE__); + } else { + if(is_file($dist_init_scripts.'/'.$daemon.'.sh') || is_link($dist_init_scripts.'/'.$daemon.'.sh')){ + if($action == 'start' || $action == 'stop'){ + $app->log->caselog($dist_init_scripts.'/'.$daemon.'.sh '.$action.' &> /dev/null', $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts.'/'.$daemon.'.sh stop &> /dev/null', $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts.'/'.$daemon.'.sh start &> /dev/null', $this->FILE, __LINE__); + } + } else { + if(is_file($dist_init_scripts.'/'.$daemon) || is_link($dist_init_scripts.'/'.$daemon)){ + if($action == 'start' || $action == 'stop'){ + $app->log->caselog($dist_init_scripts.'/'.$daemon.' '.$action.' &> /dev/null', $this->FILE, __LINE__); + } else { + $app->log->caselog($dist_init_scripts.'/'.$daemon.' stop &> /dev/null', $this->FILE, __LINE__); + sleep(3); + $app->log->caselog($dist_init_scripts.'/'.$daemon.' start &> /dev/null', $this->FILE, __LINE__); + } + } else { + if(is_file('/etc/rc.d/'.$daemon) || is_link('/etc/rc.d/'.$daemon)){ + if($action == 'start' || $action == 'stop'){ + $app->log->caselog('/etc/rc.d/'.$daemon.' '.$action.' &> /dev/null', $this->FILE, __LINE__); + } else { + $app->log->caselog('/etc/rc.d/'.$daemon.' stop &> /dev/null', $this->FILE, __LINE__); + sleep(3); + $app->log->caselog('/etc/rc.d/'.$daemon.' start &> /dev/null', $this->FILE, __LINE__); + } + } + } + } + } + } + + function netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode('.', trim($netmask)); + $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); + $parts = explode('0', $bin); + $bin = str_pad($parts[0], 32, '0', STR_PAD_RIGHT); + $bin = wordwrap($bin, 8, '.', 1); + list($f1,$f2,$f3,$f4) = explode('.', trim($bin)); + return bindec($f1).'.'.bindec($f2).'.'.bindec($f3).'.'.bindec($f4); + } + + function binary_netmask($netmask){ + list($f1,$f2,$f3,$f4) = explode('.', trim($netmask)); + $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); + $parts = explode('0', $bin); + return substr_count($parts[0], '1'); + } + + function network($ip, $netmask){ + $netmask = $this->netmask($netmask); + list($f1,$f2,$f3,$f4) = explode('.', $netmask); + $netmask_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); + 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); + for($i=0;$i<32;$i++){ + $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); + } + $network_bin = wordwrap($network_bin, 8, '.', 1); + list($f1,$f2,$f3,$f4) = explode('.', trim($network_bin)); + return bindec($f1).'.'.bindec($f2).'.'.bindec($f3).'.'.bindec($f4); + } + + /** + * Make a broadcast address from an IP number in combination with netmask + * + */ + function broadcast($ip, $netmask){ + $netmask = $this->netmask($netmask); + $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']; + ob_start(); + 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' '"); + } else { + 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']; + } else { + 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])){ + $i++; + } else { + $new_interface = $main_interface.':'.$i; + $i = -1; + } + } + exec('ifconfig '.$new_interface.' '.$to.' netmask '.$this->server_conf['server_netzmaske'].' up &> /dev/null'); + $ifconfig['INTERFACE'][$new_interface] = $to; + } + } + } + } + } + } + + function quota_dirs(){ + global $app; + $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'; + } else { + $notify = 'yes'; + } + + // Variablen zuweisen + $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'); + } + + /** + * Get the current time + * + */ + function get_time(){ + $addr = 'http://www.ispconfig.org/'; + $timeout = 1; + $url_parts = parse_url($addr); + $path = $url_parts['path']; + $port = 80; + $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 { + $dir = escapeshellcmd($maildir_path); + } + + if(!is_dir($dir)) mkdir($dir, 0700, true); -function system(){ - global $go_info; - $this->server_id = $go_info["isp"]["server_id"]; - $this->server_conf = $go_info["isp"]["server_conf"]; - $this->server_conf["passwd_datei"] = '/etc/passwd'; - $this->server_conf["shadow_datei"] = '/etc/shadow'; - $this->server_conf["group_datei"] = '/etc/group'; -} + if($user != '' && $user != 'root' && $this->is_user($user)) { + $user = escapeshellcmd($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); -function hostname(){ - $dist = $this->server_conf["dist"]; + $chown_mdsub = true; + } + + $maildirsubs = array('cur','new','tmp'); - ob_start(); - passthru("hostname"); - $hostname = ob_get_contents(); - ob_end_clean(); - $hostname = trim($hostname); - ob_start(); - if(!strstr($dist, "freebsd")){ - passthru("dnsdomainname"); - } else { - passthru("domainname"); - } - $domainname = ob_get_contents(); - ob_end_clean(); - $domainname = trim($domainname); - if($domainname != ""){ - if(!strstr($hostname, $domainname)) $hostname .= ".".$domainname; - } - return $hostname; -} + 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); + } + } -function adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ - global $app; - if($this->is_user($user_username)){ - return false; - } else { - if(trim($user_username) != '') { - $user_datei = $this->server_conf["passwd_datei"]; - $shadow_datei = $this->server_conf["shadow_datei"]; - $shell = realpath($shell); - if(trim($passwort) == "") $passwort = '*'; - $new_user = "\n$user_username:x:$uid:$gid:$username:$homedir:$shell\n"; - $app->log->msg("USER: $new_user"); - $app->file->af($user_datei, $new_user); - if($shadow_datei == "/etc/shadow"){ - $datum = time(); - $tage = floor($datum/86400); - $new_passwd = "\n$user_username:$passwort:$tage:0:99999:7:::\n"; - } else { - $new_passwd = "\n$user_username:$passwort:$uid:$gid::0:0:$username:$homedir:$shell\n"; - } - $app->file->af($shadow_datei, $new_passwd); - - // TB: leere Zeilen entfernen - $app->file->remove_blank_lines($shadow_datei); - $app->file->remove_blank_lines($user_datei); - // TB: user Sortierung deaktiviert - //$this->order_users_groups(); - if($shadow_datei != "/etc/shadow"){ - $app->file->af($shadow_datei, "\n"); - - // TB: leere Zeilen entfernen - $app->file->remove_blank_lines($shadow_datei); - - $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); - } - - return true; - } - } -} - -function updateuser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort = '*'){ - $this->deluser($user_username); - $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); -} - -function deactivateuser($user_username){ - $passwort = str_rot13($this->getpasswd($user_username)); - $user_attr = $this->get_user_attributes($user_username); - $uid = $user_attr["uid"]; - $gid = $user_attr["gid"]; - $username = $user_attr["name"]; - $homedir = $user_attr["homedir"]; - $shell = "/dev/null"; - $this->deluser($user_username); - $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); -} - -function deluser($user_username){ - global $app; - if($this->is_user($user_username)){ - $user_datei = $this->server_conf["passwd_datei"]; - $shadow_datei = $this->server_conf["shadow_datei"]; - $users = $app->file->rf($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - $num_lines = sizeof($lines); - for($i=0;$i<$num_lines;$i++){ - if(trim($lines[$i]) != ""){ - list($f1,) = explode(":", $lines[$i]); - if($f1 != $user_username) $new_lines[] = $lines[$i]; - } - } - $new_users = implode("\n", $new_lines); - $app->file->wf($user_datei, $new_users); - unset($new_lines); - unset($lines); - unset($new_users); - } - $app->file->remove_blank_lines($user_datei); - - $passwds = $app->file->rf($shadow_datei); - $lines = explode("\n", $passwds); - if(is_array($lines)){ - $num_lines = sizeof($lines); - for($i=0;$i<$num_lines;$i++){ - if(trim($lines[$i]) != ""){ - list($f1,) = explode(":", $lines[$i]); - if($f1 != $user_username) $new_lines[] = $lines[$i]; - } - } - $new_passwds = implode("\n", $new_lines); - $app->file->wf($shadow_datei, $new_passwds); - unset($new_lines); - unset($lines); - unset($new_passwds); - } - $app->file->remove_blank_lines($shadow_datei); - - $group_file = $app->file->rf($this->server_conf["group_datei"]); - $group_file_lines = explode("\n", $group_file); - foreach($group_file_lines as $group_file_line){ - if(trim($group_file_line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); - $group_users = explode(",", str_replace(" ", "", $f4)); - if(in_array($user_username, $group_users)){ - $g_users = array(); - foreach($group_users as $group_user){ - if($group_user != $user_username) $g_users[] = $group_user; - } - $f4 = implode(",", $g_users); - } - $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; - } - } - $new_group_file = implode("\n", $new_group_file); - $app->file->wf($this->server_conf["group_datei"], $new_group_file); - // TB: auskommentiert - //$this->order_users_groups(); - - if($shadow_datei != "/etc/shadow"){ - $app->file->af($shadow_datei, "\n"); - $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); - } - return true; - } else { - return false; - } -} - -function addgroup($group, $gid, $members = ''){ - global $app; - if($this->is_group($group)){ - return false; - } else { - $group_datei = $this->server_conf["group_datei"]; - $shadow_datei = $this->server_conf["shadow_datei"]; - $new_group = "\n$group:x:$gid:$members\n"; - $app->file->af($group_datei, $new_group); - - // TB: auskommentiert - //$this->order_users_groups(); - if($shadow_datei != "/etc/shadow"){ - $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); - } - return true; - } -} - -function updategroup($group, $gid, $members = ''){ - $this->delgroup($group); - $this->addgroup($group, $gid, $members); -} - -function delgroup($group){ - global $app; - if($this->is_group($group)){ - $group_datei = $this->server_conf["group_datei"]; - $shadow_datei = $this->server_conf["shadow_datei"]; - $groups = $app->file->rf($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - $num_lines = sizeof($lines); - for($i=0;$i<$num_lines;$i++){ - if(trim($lines[$i]) != ""){ - list($f1,) = explode(":", $lines[$i]); - if($f1 != $group) $new_lines[] = $lines[$i]; - } - } - $new_groups = implode("\n", $new_lines); - $app->file->wf($group_datei, $new_groups); - unset($new_lines); - unset($lines); - unset($new_groups); - } - // TB: auskommentiert - //$this->order_users_groups(); - if($shadow_datei != "/etc/shadow"){ - $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); - } - return true; - } else { - return false; - } -} - -function order_users_groups(){ - global $app; - $user_datei = $this->server_conf["passwd_datei"]; - $shadow_datei = $this->server_conf["shadow_datei"]; - $group_datei = $this->server_conf["group_datei"]; - - $groups = $app->file->no_comments($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $line); - $arr[$f3] = $line; - } - } - } - ksort($arr); - reset($arr); - if($shadow_datei != "/etc/shadow"){ - $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)."\n"); - }else { - $app->file->wf($group_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); - } - unset($arr); - - $users = $app->file->no_comments($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3,) = explode(":", $line); - if($f1 != "toor"){ - $arr[$f3] = $line; - } else { - $arr[70000] = $line; - } - } - } - } - ksort($arr); - reset($arr); - $app->file->wf($user_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); - unset($arr); - - $passwds = $app->file->no_comments($shadow_datei); - $lines = explode("\n", $passwds); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3,) = explode(":", $line); - if($f1 != "toor"){ - $uid = $this->getuid($f1); - if(!is_bool($uid)) $arr[$uid] = $line; - } else { - $arr[70000] = $line; - } - } - } - } - ksort($arr); - reset($arr); - $app->file->wf($shadow_datei, $app->file->remove_blank_lines(implode("\n", $arr), 0)); - unset($arr); -} - -function find_uid_gid($min, $max){ - global $app; - if($min < $max && $min >= 0 && $max >= 0 && $min <= 65536 && $max <= 65536 && is_int($min) && is_int($max)){ - for($i=$min;$i<=$max;$i++){ - $uid_arr[$i] = $gid_arr[$i] = 1; - } - $user_datei = $this->server_conf["passwd_datei"]; - $group_datei = $this->server_conf["group_datei"]; - - $users = $app->file->no_comments($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); - if($f3 >= $min && $f3 <= $max) unset($uid_arr[$f3]); - } - } - if(!empty($uid_arr)){ - foreach($uid_arr as $key => $val){ - $uids[] = $key; - } - $min_uid = min($uids); - unset($uid_arr); - } else { - return false; - } - } - - $groups = $app->file->no_comments($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $line); - if($f3 >= $min && $f3 <= $max) unset($gid_arr[$f3]); - } - } - if(!empty($gid_arr)){ - foreach($gid_arr as $key => $val){ - $gids[] = $key; - } - $min_gid = min($gids); - unset($gid_arr); - } else { - return false; - } - } - - $result = array_intersect($uids, $gids); - $new_id = (max($result)); - unset($uids); - unset($gids); - unset($result); - if($new_id <= $max){ - return $new_id; - } else { - return false; - } - } else { - return false; - } -} - -function is_user($user){ - global $app; - $user_datei = $this->server_conf["passwd_datei"]; - $users = $app->file->no_comments($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); - if($f1 == $user) return true; - } - } - } - return false; -} - -function is_group($group){ - global $app; - $group_datei = $this->server_conf["group_datei"]; - $groups = $app->file->no_comments($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $line); - if($f1 == $group) return true; - } - } - } - return false; -} - -function root_group(){ - global $app; - $group_datei = $this->server_conf["group_datei"]; - $groups = $app->file->no_comments($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $line); - if($f3 == 0) return $f1; - } - } - } - return false; -} - -function get_user_groups($username){ - global $app; - $user_groups = array(); - $group_datei = $this->server_conf["group_datei"]; - $groups = $app->file->no_comments($group_datei); - $lines = explode("\n", $groups); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $line); - if(intval($f3) < intval($this->server_conf["groupid_von"]) && trim($f1) != 'users'){ - $tmp_group_users = explode(',', str_replace(' ', '', $f4)); - if(in_array($username, $tmp_group_users) && trim($f1) != '') $user_groups[] = $f1; - unset($tmp_group_users); - } - } - } - } - if(!empty($user_groups)) return implode(',', $user_groups); - return ''; -} - -function getpasswd($user){ - global $app; - if($this->is_user($user)){ - $shadow_datei = $this->server_conf["shadow_datei"]; - $passwds = $app->file->no_comments($shadow_datei); - $lines = explode("\n", $passwds); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2,) = explode(":", $line); - if($f1 == $user) return $f2; - } - } - } - } else { - return false; - } -} - -function getuid($user){ - global $app; - if($this->is_user($user)){ - $user_datei = $this->server_conf["passwd_datei"]; - $users = $app->file->no_comments($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3,) = explode(":", $line); - if($f1 == $user) return $f3; - } - } - } - } else { - return false; - } -} - -function get_user_attributes($user){ - global $app; - if($this->is_user($user)){ - $user_datei = $this->server_conf["passwd_datei"]; - $users = $app->file->no_comments($user_datei); - $lines = explode("\n", $users); - if(is_array($lines)){ - foreach($lines as $line){ - if(trim($line) != ""){ - list($f1, $f2, $f3, $f4, $f5, $f6, $f7) = explode(":", $line); - if($f1 == $user){ - $user_attr["username"] = $f1; - $user_attr["x"] = $f2; - $user_attr["uid"] = $f3; - $user_attr["gid"] = $f4; - $user_attr["name"] = $f5; - $user_attr["homedir"] = $f6; - $user_attr["shell"] = $f7; - return $user_attr; - } - } - } - } - } else { - return false; - } -} - -function chown($file, $owner, $group = ''){ - $owner_change = @chown($file, $owner); - if($group != ""){ - $group_change = @chgrp($file, $group); - } else { - $group_change = 1; - } - if($owner_change && $group_change){ - return true; - } else { - return false; - } -} - -function add_user_to_group($group, $user = 'admispconfig'){ - global $app; - $group_file = $app->file->rf($this->server_conf["group_datei"]); - $group_file_lines = explode("\n", $group_file); - foreach($group_file_lines as $group_file_line){ - list($group_name,$group_x,$group_id,$group_users) = explode(":",$group_file_line); - if($group_name == $group){ - $group_users = explode(",", str_replace(" ", "", $group_users)); - if(!in_array($user, $group_users)){ - $group_users[] = $user; - } - $group_users = implode(",", $group_users); - if(substr($group_users,0,1) == ",") $group_users = substr($group_users,1); - $group_file_line = $group_name.":".$group_x.":".$group_id.":".$group_users; - } - $new_group_file[] = $group_file_line; - } - $new_group_file = implode("\n", $new_group_file); - $app->file->wf($this->server_conf["group_datei"], $new_group_file); - $app->file->remove_blank_lines($this->server_conf["group_datei"]); - if($this->server_conf["shadow_datei"] != "/etc/shadow"){ - $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); - } -} - -function usermod($user, $groups){ - global $app; - if($this->is_user($user)){ - $groups = explode(",", str_replace(" ", "", $groups)); - $group_file = $app->file->rf($this->server_conf["group_datei"]); - $group_file_lines = explode("\n", $group_file); - foreach($group_file_lines as $group_file_line){ - if(trim($group_file_line) != ""){ - list($f1, $f2, $f3, $f4) = explode(":", $group_file_line); - $group_users = explode(",", str_replace(" ", "", $f4)); - if(!in_array($f1, $groups)){ - if(in_array($user, $group_users)){ - $g_users = array(); - foreach($group_users as $group_user){ - if($group_user != $user) $g_users[] = $group_user; - } - $f4 = implode(",", $g_users); - } - } else { - if(!in_array($user, $group_users)){ - if(trim($group_users[0]) == "") unset($group_users); - $group_users[] = $user; - } - $f4 = implode(",", $group_users); - } - $new_group_file[] = $f1.":".$f2.":".$f3.":".$f4; - } - } - $new_group_file = implode("\n", $new_group_file); - $app->file->wf($this->server_conf["group_datei"], $new_group_file); - $app->file->remove_blank_lines($this->server_conf["group_datei"]); - if($this->server_conf["shadow_datei"] != "/etc/shadow"){ - $app->log->caselog("pwd_mkdb ".$this->server_conf["shadow_datei"]." &> /dev/null", $this->FILE, __LINE__); - } - return true; - } else { - return false; - } -} - -function rc_edit($service, $rl, $action){ - // $action = "on|off"; - global $app; - $dist_init_scripts = $app->system->server_conf["dist_init_scripts"]; - $dist_runlevel = $app->system->server_conf["dist_runlevel"]; - $dist = $app->system->server_conf["dist"]; - if(trim($dist_runlevel) == ""){ // falls es keine runlevel gibt (FreeBSD) - if($action == "on"){ - @symlink($dist_init_scripts."/".$service, $dist_init_scripts."/".$service.".sh"); - } - if($action == "off"){ - if(is_link($dist_init_scripts."/".$service.".sh")){ - unlink($dist_init_scripts."/".$service.".sh"); - } else { - exec("mv -f ".$dist_init_scripts."/".$service.".sh ".$dist_init_scripts."/".$service." &> /dev/null"); - } - } - } else { // Linux - if(substr($dist, 0,4) == 'suse'){ - if($action == "on"){ - exec("chkconfig --add $service &> /dev/null"); - } - if($action == "off"){ - exec("chkconfig --del $service &> /dev/null"); - } - } else { - $runlevels = explode(",", $rl); - foreach($runlevels as $runlevel){ - $runlevel = trim($runlevel); - if($runlevel != "" && is_dir($dist_runlevel."/rc".$runlevel.".d")){ - $handle=opendir($dist_runlevel."/rc".$runlevel.".d"); - while($file = readdir($handle)){ - if($file != "." && $file != ".."){ - $target = @readlink($dist_runlevel."/rc".$runlevel.".d/".$file); - if(strstr($file, $service) && strstr($target, $service) && substr($file,0,1) == "S") $ln_arr[$runlevel][] = $dist_runlevel."/rc".$runlevel.".d/".$file; - } - } - closedir($handle); - } - if($action == "on"){ - if(!is_array($ln_arr[$runlevel])) @symlink($dist_init_scripts."/".$service, $dist_runlevel."/rc".$runlevel.".d/S99".$service); - } - if($action == "off"){ - if(is_array($ln_arr[$runlevel])){ - foreach($ln_arr[$runlevel] as $link){ - unlink($link); - } - } - } - } - } - } -} - -function grep($content, $string, $params = ''){ - global $app; - // params: i, v, w - $content = $app->file->unix_nl($content); - $lines = explode("\n", $content); - foreach($lines as $line){ - if(!strstr($params, 'w')){ - if(strstr($params, 'i')){ - if(strstr($params, 'v')){ - if(!stristr($line, $string)) $find[] = $line; - } else { - if(stristr($line, $string)) $find[] = $line; - } - } else { - if(strstr($params, 'v')){ - if(!strstr($line, $string)) $find[] = $line; - } else { - if(strstr($line, $string)) $find[] = $line; - } - } - } else { - if(strstr($params, 'i')){ - if(strstr($params, 'v')){ - if(!$app->string->is_word($string, $line, 'i')) $find[] = $line; - } else { - if($app->string->is_word($string, $line, 'i')) $find[] = $line; - } - } else { - if(strstr($params, 'v')){ - if(!$app->string->is_word($string, $line)) $find[] = $line; - } else { - if($app->string->is_word($string, $line)) $find[] = $line; - } - } - } - } - if(is_array($find)){ - $ret_val = implode("\n", $find); - if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; - $find = NULL; - return $ret_val; - } else { - return false; - } -} - -function cut($content, $field, $delimiter = ':'){ - global $app; - $content = $app->file->unix_nl($content); - $lines = explode("\n", $content); - foreach($lines as $line){ - $elms = explode($delimiter, $line); - $find[] = $elms[($field-1)]; - } - if(is_array($find)){ - $ret_val = implode("\n", $find); - if(substr($ret_val,-1) != "\n") $ret_val .= "\n"; - $find = NULL; - return $ret_val; - } else { - return false; - } -} - -function cat($file){ - global $app; - return $app->file->rf($file); -} - -function daemon_init($daemon, $action){ - // $action = start|stop|restart|reload - global $app; - $dist = $this->server_conf["dist"]; - $dist_init_scripts = $this->server_conf["dist_init_scripts"]; - if(!strstr($dist, "freebsd")){ - $app->log->caselog("$dist_init_scripts/$daemon $action &> /dev/null", $this->FILE, __LINE__); - } else { - if(is_file($dist_init_scripts."/".$daemon.".sh") || is_link($dist_init_scripts."/".$daemon.".sh")){ - if($action == "start" || $action == "stop"){ - $app->log->caselog($dist_init_scripts."/".$daemon.".sh ".$action." &> /dev/null", $this->FILE, __LINE__); - } else { - $app->log->caselog($dist_init_scripts."/".$daemon.".sh stop &> /dev/null", $this->FILE, __LINE__); - sleep(3); - $app->log->caselog($dist_init_scripts."/".$daemon.".sh start &> /dev/null", $this->FILE, __LINE__); - } - } else { - if(is_file($dist_init_scripts."/".$daemon) || is_link($dist_init_scripts."/".$daemon)){ - if($action == "start" || $action == "stop"){ - $app->log->caselog($dist_init_scripts."/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); - } else { - $app->log->caselog($dist_init_scripts."/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); - sleep(3); - $app->log->caselog($dist_init_scripts."/".$daemon." start &> /dev/null", $this->FILE, __LINE__); - } - } else { - if(is_file("/etc/rc.d/".$daemon) || is_link("/etc/rc.d/".$daemon)){ - if($action == "start" || $action == "stop"){ - $app->log->caselog("/etc/rc.d/".$daemon." ".$action." &> /dev/null", $this->FILE, __LINE__); - } else { - $app->log->caselog("/etc/rc.d/".$daemon." stop &> /dev/null", $this->FILE, __LINE__); - sleep(3); - $app->log->caselog("/etc/rc.d/".$daemon." start &> /dev/null", $this->FILE, __LINE__); - } - } - } - } - } -} - -function netmask($netmask){ - list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); - $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); - $parts = explode("0", $bin); - $bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT); - $bin = wordwrap($bin, 8, ".", 1); - list($f1,$f2,$f3,$f4) = explode(".", trim($bin)); - return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); -} - -function binary_netmask($netmask){ - list($f1,$f2,$f3,$f4) = explode(".", trim($netmask)); - $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); - $parts = explode("0", $bin); - return substr_count($parts[0], "1"); -} - -function network($ip, $netmask){ - $netmask = $this->netmask($netmask); - list($f1,$f2,$f3,$f4) = explode(".", $netmask); - $netmask_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); - 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); - for($i=0;$i<32;$i++){ - $network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1); - } - $network_bin = wordwrap($network_bin, 8, ".", 1); - list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin)); - return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4); -} - -function broadcast($ip, $netmask){ - $netmask = $this->netmask($netmask); - $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); -} - -function network_info(){ - $dist = $this->server_conf["dist"]; - ob_start(); - 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' '"); - }else { - 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; - } -} - -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"]; - } else { - 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])){ - $i++; - } else { - $new_interface = $main_interface.":".$i; - $i = -1; - } - } - exec("ifconfig ".$new_interface." ".$to." netmask ".$this->server_conf["server_netzmaske"]." up &> /dev/null"); - $ifconfig["INTERFACE"][$new_interface] = $to; - } - } - } - } - } -} - -function quota_dirs(){ - global $app; - $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; - } -} - -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"; - } else { - $notify = "yes"; - } - - // Variablen zuweisen - $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); - - exec("chown admispconfig:admispconfig $datei &> /dev/null"); - exec("chmod 755 $datei"); -} - -function get_time(){ - $addr = "http://www.ispconfig.org/"; - $timeout = 1; - $url_parts = parse_url($addr); - $path = $url_parts["path"]; - $port = 80; - $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; - } -} + chmod($dir, 0700); + + /* + if($user != '' && $this->is_user($user) && $user != 'root') { + $user = escapeshellcmd($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; + 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); + + } } -?> \ No newline at end of file +?> -- Gitblit v1.9.1