diff --git a/TODO.txt b/TODO.txt index 277c754e8fe1b1d3e45aad6fe14eb88c45a95190..5b409f9552cad3ce6f9f8abaee8a8bc98fca205b 100644 --- a/TODO.txt +++ b/TODO.txt @@ -73,6 +73,3 @@ General tasks - Add, extend or modify comments in PEAR syntax so that they can be read with phpdocumentor. -- Add a function to prevent brute force password attacks to the login script. E.g. by - logging all login attempts and allowing only 5 logins every 15 minutes. - Task assigned to: BPSsoft diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 2a2d640cd1d92b59cb37cffe959d4e5afb7bd759..eeb7c5912bfaa43eb052130898384a720a33e491 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -217,10 +217,21 @@ class db public function closeConn() { + if($this->linkId) + { + mysql_close($this->linkId); + return true; + } else { return false; } } - public function freeResult() + public function freeResult($query) { + if(mysql_free_result($query)) + { + return true; + } else { + return false; + } } public function delete() diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 977ed33cd9a9f383db79e5395473fa7b320a8577..f6fce77822d2d6d89bd14a3b42bd02506a996ec5 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -30,970 +30,1083 @@ 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; - -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'; -} - -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; -} - -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; - } -} + 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; + } + + 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 { + 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); + } + } + } + } + } + } + } + + /** + * 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); + + exec("chown admispconfig:admispconfig $datei &> /dev/null"); + exec("chmod 755 $datei"); + } + + /** + * 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; + } + } } ?> \ No newline at end of file