| | |
| | | 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'; |
| | | //$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 |
| | | * |
| | |
| | | */ |
| | | public function hostname(){ |
| | | $dist = $this->server_conf['dist']; |
| | | |
| | | ob_start(); |
| | | passthru('hostname'); |
| | | $hostname = ob_get_contents(); |
| | | ob_end_clean(); |
| | | |
| | | 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; |
| | | 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); |
| | | 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"); |
| | | $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->file->remove_blank_lines($shadow_datei); |
| | | $app->log->caselog("pwd_mkdb $shadow_datei &> /dev/null", $this->FILE, __LINE__); |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * Update users when someone edit it |
| | | * |
| | |
| | | //* First delete the users |
| | | $this->deluser($user_username); |
| | | //* Add the user again |
| | | $this->adduser($user_username, $uid, $gid, $username, $homedir, $shell, $passwort); |
| | | $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); |
| | | $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; |
| | | } |
| | | 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; |
| | | } |
| | | 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); |
| | | $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; |
| | | } |
| | | 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); |
| | | $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; |
| | | } |
| | | 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)){ |
| | | $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; |
| | | 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; |
| | | $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) { |
| | |
| | | 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; |
| | | $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 ''; |
| | | $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; |
| | | } |
| | | 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; |
| | | } |
| | | 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 the group id from an group |
| | | * |
| | | */ |
| | | function getgid($group){ |
| | | global $app; |
| | | if($this->is_group($group)){ |
| | | $group_datei = $this->server_conf['group_datei']; |
| | | if($this->is_group($group)){ |
| | | $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){ |
| | | foreach($lines as $line){ |
| | | if(trim($line) != ""){ |
| | | list($f1, $f2, $f3, $f4) = explode(':', $line); |
| | | if($f1 == $group) return $f3; |
| | | } |
| | | } |
| | | } |
| | | } else { |
| | | return false; |
| | | } |
| | | } else { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * Return info about a group by name |
| | | * |
| | | */ |
| | | * Return info about a group by name |
| | | * |
| | | */ |
| | | function posix_getgrnam($group) { |
| | | if(!function_exists('posix_getgrnam')){ |
| | | $group_datei = $this->server_conf['group_datei']; |
| | |
| | | } else { |
| | | $members = array(); |
| | | } |
| | | $group_details = array( 'name' => $group, |
| | | 'passwd' => $f2, |
| | | 'members' => $members, |
| | | 'gid' => $f3); |
| | | return $group_details; |
| | | $group_details = array( 'name' => $group, |
| | | 'passwd' => $f2, |
| | | 'members' => $members, |
| | | 'gid' => $f3); |
| | | return $group_details; |
| | | } else { |
| | | return posix_getgrnam($group); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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; |
| | | } |
| | | 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, $allow_symlink = false){ |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if(file_exists($file)) { |
| | | if(@chown($file, $owner)) { |
| | | return true; |
| | | } else { |
| | | $app->log("chown failed: $file : $owner",LOGLEVEL_DEBUG); |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | } |
| | | if(file_exists($file)) { |
| | | if(@chown($file, $owner)) { |
| | | return true; |
| | | } else { |
| | | $app->log("chown failed: $file : $owner", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | function chgrp($file, $group = '', $allow_symlink = false){ |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if(file_exists($file)) { |
| | | if(@chgrp($file, $group)) { |
| | | return true; |
| | | } else { |
| | | $app->log("chgrp failed: $file : $group",LOGLEVEL_DEBUG); |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | } |
| | | if(file_exists($file)) { |
| | | if(@chgrp($file, $group)) { |
| | | return true; |
| | | } else { |
| | | $app->log("chgrp failed: $file : $group", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | //* Change the mode of a file |
| | | function chmod($file, $mode, $allow_symlink = false) { |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($file) == false) { |
| | | $app->log("Action aborted, file is a symlink: $file",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $file", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if(@chmod($file, $mode)) { |
| | | return true; |
| | | } else { |
| | | $app->log("chmod failed: $file : $mode",LOGLEVEL_DEBUG); |
| | | $app->log("chmod failed: $file : $mode", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | function file_put_contents($filename, $data, $allow_symlink = false) { |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if(file_exists($filename)) unlink($filename); |
| | | return file_put_contents($filename, $data); |
| | | } |
| | | |
| | | |
| | | function file_get_contents($filename, $allow_symlink = false) { |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return file_get_contents($filename, $data); |
| | | } |
| | | |
| | | |
| | | function rename($filename, $new_filename, $allow_symlink = false) { |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | return rename($filename, $new_filename); |
| | | } |
| | | |
| | | |
| | | function mkdir($dirname, $allow_symlink = false) { |
| | | global $app; |
| | | if($allow_symlink == false && $this->checkpath($dirname) == false) { |
| | | $app->log("Action aborted, file is a symlink: $dirname",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $dirname", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if(@mkdir($dirname)) { |
| | | return true; |
| | | } else { |
| | | $app->log("mkdir failed: $dirname",LOGLEVEL_DEBUG); |
| | | $app->log("mkdir failed: $dirname", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | function unlink($filename) { |
| | | if(file_exists($filename) || is_link($filename)) { |
| | | return unlink($filename); |
| | | } |
| | | } |
| | | |
| | | function copy($file1,$file2) { |
| | | return copy($file1,$file2); |
| | | |
| | | function copy($file1, $file2) { |
| | | return copy($file1, $file2); |
| | | } |
| | | |
| | | |
| | | function touch($file, $allow_symlink = false){ |
| | | global $app; |
| | | if($allow_symlink == false && @file_exists($file) && $this->checkpath($file) == false) { |
| | | $this->unlink($file); |
| | | } |
| | | if(@touch($file)) { |
| | | global $app; |
| | | if($allow_symlink == false && @file_exists($file) && $this->checkpath($file) == false) { |
| | | $this->unlink($file); |
| | | } |
| | | if(@touch($file)) { |
| | | return true; |
| | | } else { |
| | | $app->log("touch failed: $file",LOGLEVEL_DEBUG); |
| | | } else { |
| | | $app->log("touch failed: $file", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | function checkpath($path) { |
| | | $path = trim($path); |
| | | //* We allow only absolute paths |
| | | if(substr($path,0,1) != '/') return false; |
| | | |
| | | if(substr($path, 0, 1) != '/') return false; |
| | | |
| | | //* We allow only some characters in the path |
| | | // * is allowed, for example it is part of wildcard certificates/keys: *.example.com.crt |
| | | if(!preg_match('@^/[-a-zA-Z0-9_/.*~]{1,}$@',$path)) return false; |
| | | |
| | | if(!preg_match('@^/[-a-zA-Z0-9_/.*~]{1,}$@', $path)) return false; |
| | | |
| | | //* Check path for symlinks |
| | | $path_parts = explode('/',$path); |
| | | $path_parts = explode('/', $path); |
| | | $testpath = ''; |
| | | foreach($path_parts as $p) { |
| | | $testpath .= '/'.$p; |
| | | if(is_link($testpath)) return false; |
| | | } |
| | | |
| | | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 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__); |
| | | } |
| | | $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; |
| | |
| | | } |
| | | } |
| | | */ |
| | | |
| | | |
| | | /**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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | 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; |
| | | } |
| | | // 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; |
| | | } |
| | | $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); |
| | | 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__); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | 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); |
| | | 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'); |
| | | 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); |
| | | $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); |
| | | $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; |
| | | } |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | 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; |
| | | } |
| | | 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'); |
| | | //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; |
| | | } |
| | | $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) { |
| | | |
| | | function replaceLine($filename, $search_pattern, $new_line, $strict = 0, $append = 1) { |
| | | global $app; |
| | | if($this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | $lines = @file($filename); |
| | |
| | | if(is_array($lines)) { |
| | | foreach($lines as $line) { |
| | | if($strict == 0) { |
| | | if(stristr($line,$search_pattern)) { |
| | | if(stristr($line, $search_pattern)) { |
| | | $out .= $new_line."\n"; |
| | | $found = 1; |
| | | } else { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | 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"; |
| | | 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); |
| | | file_put_contents($filename, $out); |
| | | } |
| | | |
| | | function removeLine($filename,$search_pattern,$strict = 0) { |
| | | global $app; |
| | | if($this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename",LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if($lines = @file($filename)) { |
| | | $out = ''; |
| | | foreach($lines as $line) { |
| | | if($strict == 0) { |
| | | if(!stristr($line,$search_pattern)) { |
| | | $out .= $line; |
| | | } |
| | | } else { |
| | | if(!trim($line) == $search_pattern) { |
| | | $out .= $line; |
| | | |
| | | function removeLine($filename, $search_pattern, $strict = 0) { |
| | | global $app; |
| | | if($this->checkpath($filename) == false) { |
| | | $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); |
| | | return false; |
| | | } |
| | | if($lines = @file($filename)) { |
| | | $out = ''; |
| | | foreach($lines as $line) { |
| | | if($strict == 0) { |
| | | if(!stristr($line, $search_pattern)) { |
| | | $out .= $line; |
| | | } |
| | | } else { |
| | | if(!trim($line) == $search_pattern) { |
| | | $out .= $line; |
| | | } |
| | | } |
| | | } |
| | | file_put_contents($filename, $out); |
| | | } |
| | | 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); |
| | | |
| | | 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)) $this->chown($dir,$user); |
| | | if(is_dir($dir)) $this->chgrp($dir,$group); |
| | | if(is_dir($dir)) $this->chown($dir, $user); |
| | | if(is_dir($dir)) $this->chgrp($dir, $group); |
| | | |
| | | $chown_mdsub = true; |
| | | } |
| | | |
| | | $maildirsubs = array('cur','new','tmp'); |
| | | |
| | | $maildirsubs = array('cur', 'new', 'tmp'); |
| | | |
| | | foreach ($maildirsubs as $mdsub) { |
| | | if(!is_dir($dir.'/'.$mdsub)) mkdir($dir.'/'.$mdsub, 0700, true); |
| | |
| | | } |
| | | |
| | | chmod($dir, 0700); |
| | | |
| | | |
| | | /* |
| | | if($user != '' && $this->is_user($user) && $user != 'root') { |
| | | $user = escapeshellcmd($user); |
| | |
| | | exec("chown $user:$group $dir $dir_cur $dir_new $dir_tmp"); |
| | | } |
| | | */ |
| | | |
| | | |
| | | //* Add the subfolder to the subscriptions and courierimapsubscribed files |
| | | if($subfolder != '') { |
| | | // Courier |
| | |
| | | $tmp_file = escapeshellcmd($maildir_path.'/courierimapsubscribed'); |
| | | touch($tmp_file); |
| | | chmod($tmp_file, 0744); |
| | | chown($tmp_file,'vmail'); |
| | | chgrp($tmp_file,'vmail'); |
| | | chown($tmp_file, 'vmail'); |
| | | chgrp($tmp_file, 'vmail'); |
| | | } |
| | | $this->replaceLine($maildir_path.'/courierimapsubscribed','INBOX.'.$subfolder,'INBOX.'.$subfolder,1,1); |
| | | |
| | | $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'); |
| | | chown($tmp_file, 'vmail'); |
| | | chgrp($tmp_file, 'vmail'); |
| | | } |
| | | $this->replaceLine($maildir_path.'/subscriptions',$subfolder,$subfolder,1,1); |
| | | $this->replaceLine($maildir_path.'/subscriptions', $subfolder, $subfolder, 1, 1); |
| | | } |
| | | |
| | | $app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder,LOGLEVEL_DEBUG); |
| | | |
| | | |
| | | $app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder, LOGLEVEL_DEBUG); |
| | | |
| | | } |
| | | |
| | | |
| | | //* Function to create directory paths and chown them to a user and group |
| | | function mkdirpath($path, $mode = 0755, $user = '', $group = '') { |
| | | $path_parts = explode('/',$path); |
| | | $path_parts = explode('/', $path); |
| | | $new_path = ''; |
| | | if(is_array($path_parts)) { |
| | | foreach($path_parts as $part) { |
| | | $new_path .= '/'.$part; |
| | | if(!@is_dir($new_path)) { |
| | | $this->mkdir($new_path); |
| | | $this->chmod($new_path,$mode); |
| | | if($user != '') $this->chown($new_path,$user); |
| | | if($group != '') $this->chgrp($new_path,$group); |
| | | $this->chmod($new_path, $mode); |
| | | if($user != '') $this->chown($new_path, $user); |
| | | if($group != '') $this->chgrp($new_path, $group); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | //* Check if a application is installed |
| | | function is_installed($appname) { |
| | | exec('which '.escapeshellcmd($appname).' 2> /dev/null',$out,$returncode); |
| | | if(isset($out[0]) && stristr($out[0],$appname) && $returncode == 0) { |
| | | exec('which '.escapeshellcmd($appname).' 2> /dev/null', $out, $returncode); |
| | | if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) { |
| | | return true; |
| | | } else { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | function web_folder_protection($document_root,$protect) { |
| | | global $app,$conf; |
| | | |
| | | |
| | | function web_folder_protection($document_root, $protect) { |
| | | global $app, $conf; |
| | | |
| | | if($this->checkpath($document_root) == false) { |
| | | $app->log("Action aborted, target is a symlink: $document_root",LOGLEVEL_DEBUG); |
| | | $app->log("Action aborted, target is a symlink: $document_root", LOGLEVEL_DEBUG); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | //* load the server configuration options |
| | | $app->uses('getconf'); |
| | | $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); |
| | | |
| | | |
| | | if($protect == true && $web_config['web_folder_protection'] == 'y') { |
| | | //* Add protection |
| | | if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root,'..')) exec('chattr +i '.escapeshellcmd($document_root)); |
| | | if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root, '..')) exec('chattr +i '.escapeshellcmd($document_root)); |
| | | } else { |
| | | //* Remove protection |
| | | if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root,'..')) exec('chattr -i '.escapeshellcmd($document_root)); |
| | | if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root, '..')) exec('chattr -i '.escapeshellcmd($document_root)); |
| | | } |
| | | } |
| | | |
| | | |
| | | function usermod($username, $uid = 0, $gid = 0, $home = '', $shell = '', $password = '', $login = '') { |
| | | global $app; |
| | | |
| | | |
| | | if($login == '') $login = $username; |
| | | |
| | | |
| | | //* Change values in /etc/passwd |
| | | $passwd_file_array = file('/etc/passwd'); |
| | | if(is_array($passwd_file_array)) { |
| | | foreach($passwd_file_array as $line) { |
| | | $line = trim($line); |
| | | $parts = explode(':',$line); |
| | | $parts = explode(':', $line); |
| | | if($parts[0] == $username) { |
| | | if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login); |
| | | if(!empty($uid)) $parts[2] = trim($uid); |
| | | if(!empty($gid)) $parts[3] = trim($gid); |
| | | if(trim($home) != '') $parts[5] = trim($home); |
| | | if(trim($shell) != '') $parts[6] = trim($shell); |
| | | $new_line = implode(':',$parts); |
| | | copy('/etc/passwd','/etc/passwd~'); |
| | | chmod('/etc/passwd~',0600); |
| | | $new_line = implode(':', $parts); |
| | | copy('/etc/passwd', '/etc/passwd~'); |
| | | chmod('/etc/passwd~', 0600); |
| | | $app->uses('system'); |
| | | $app->system->replaceLine('/etc/passwd',$line,$new_line,1,0); |
| | | $app->system->replaceLine('/etc/passwd', $line, $new_line, 1, 0); |
| | | } |
| | | } |
| | | unset($passwd_file_array); |
| | | } |
| | | |
| | | |
| | | //* If username != login, change username in group and gshadow file |
| | | if($username != $login) { |
| | | $group_file_array = file('/etc/group'); |
| | | if(is_array($group_file_array)) { |
| | | foreach($group_file_array as $line) { |
| | | $line = trim($line); |
| | | $parts = explode(':',$line); |
| | | if(strstr($parts[3],$username)) { |
| | | $uparts = explode(',',$parts[3]); |
| | | $parts = explode(':', $line); |
| | | if(strstr($parts[3], $username)) { |
| | | $uparts = explode(',', $parts[3]); |
| | | if(is_array($uparts)) { |
| | | foreach($uparts as $key => $val) { |
| | | if($val == $username) $uparts[$key] = $login; |
| | | } |
| | | } |
| | | $parts[3] = implode(',',$uparts); |
| | | $new_line = implode(':',$parts); |
| | | copy('/etc/group','/etc/group~'); |
| | | chmod('/etc/group~',0600); |
| | | $app->system->replaceLine('/etc/group',$line,$new_line,1,0); |
| | | $parts[3] = implode(',', $uparts); |
| | | $new_line = implode(':', $parts); |
| | | copy('/etc/group', '/etc/group~'); |
| | | chmod('/etc/group~', 0600); |
| | | $app->system->replaceLine('/etc/group', $line, $new_line, 1, 0); |
| | | } |
| | | } |
| | | } |
| | | unset($group_file_array); |
| | | |
| | | |
| | | $gshadow_file_array = file('/etc/gshadow'); |
| | | if(is_array($gshadow_file_array)) { |
| | | foreach($gshadow_file_array as $line) { |
| | | $line = trim($line); |
| | | $parts = explode(':',$line); |
| | | if(strstr($parts[3],$username)) { |
| | | $uparts = explode(',',$parts[3]); |
| | | $parts = explode(':', $line); |
| | | if(strstr($parts[3], $username)) { |
| | | $uparts = explode(',', $parts[3]); |
| | | if(is_array($uparts)) { |
| | | foreach($uparts as $key => $val) { |
| | | if($val == $username) $uparts[$key] = $login; |
| | | } |
| | | } |
| | | $parts[3] = implode(',',$uparts); |
| | | $new_line = implode(':',$parts); |
| | | copy('/etc/gshadow','/etc/gshadow~'); |
| | | chmod('/etc/gshadow~',0600); |
| | | $app->system->replaceLine('/etc/gshadow',$line,$new_line,1,0); |
| | | $parts[3] = implode(',', $uparts); |
| | | $new_line = implode(':', $parts); |
| | | copy('/etc/gshadow', '/etc/gshadow~'); |
| | | chmod('/etc/gshadow~', 0600); |
| | | $app->system->replaceLine('/etc/gshadow', $line, $new_line, 1, 0); |
| | | } |
| | | } |
| | | } |
| | | unset($group_file_array); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | //* When password or login name has been changed |
| | | if($password != '' || $username != $login) { |
| | | $shadow_file_array = file('/etc/shadow'); |
| | | if(is_array($shadow_file_array)) { |
| | | foreach($shadow_file_array as $line) { |
| | | $line = trim($line); |
| | | $parts = explode(':',$line); |
| | | $parts = explode(':', $line); |
| | | if($parts[0] == $username) { |
| | | if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login); |
| | | if(trim($password) != '') $parts[1] = trim($password); |
| | | $new_line = implode(':',$parts); |
| | | copy('/etc/shadow','/etc/shadow~'); |
| | | chmod('/etc/shadow~',0600); |
| | | $app->system->replaceLine('/etc/shadow',$line,$new_line,1,0); |
| | | $new_line = implode(':', $parts); |
| | | copy('/etc/shadow', '/etc/shadow~'); |
| | | chmod('/etc/shadow~', 0600); |
| | | $app->system->replaceLine('/etc/shadow', $line, $new_line, 1, 0); |
| | | } |
| | | } |
| | | } |
| | | unset($shadow_file_array); |
| | | } |
| | | } |
| | | |
| | | |
| | | function intval($string, $force_numeric = false) { |
| | | if(intval($string) == 2147483647) { |
| | | if($force_numeric == true) return floatval($string); |
| | | elseif(preg_match('/^([-]?)[0]*([1-9][0-9]*)([^0-9].*)*$/', $string, $match)) return $match[1].$match[2]; |
| | | else return 0; |
| | | } else { |
| | | return intval($string); |
| | | } |
| | | } |
| | | |
| | | if(intval($string) == 2147483647) { |
| | | if($force_numeric == true) return floatval($string); |
| | | elseif(preg_match('/^([-]?)[0]*([1-9][0-9]*)([^0-9].*)*$/', $string, $match)) return $match[1].$match[2]; |
| | | else return 0; |
| | | } else { |
| | | return intval($string); |
| | | } |
| | | } |
| | | |
| | | function is_mounted($mountpoint){ |
| | | //$cmd = 'df 2>/dev/null | grep " '.$mountpoint.'$"'; |
| | | $cmd = 'mount 2>/dev/null | grep " on '.$mountpoint.' type "'; |
| | | exec($cmd, $output, $return_var); |
| | | return $return_var == 0 ? true : false; |
| | | return $return_var == 0 ? true : false; |
| | | } |
| | | |
| | | |
| | | function getinitcommand($servicename, $action, $init_script_directory = ''){ |
| | | global $conf; |
| | | // systemd |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | ?> |