Newer
Older
}
return true;
/**
* This function checks the free space for a given directory
* @param path check path
* @param limit min. free space in bytes
* @return bool - true when the the free space is above limit ohterwise false, opt. available disk-space
function check_free_space($path, $limit = 0, &$free_space = 0) {
$path = rtrim($path, '/');
/**
* Make sure that we have only existing directories in the path.
* Given a file name instead of a directory, the behaviour of the disk_free_space
function is unspecified and may differ between operating systems and PHP versions.
*/
while(!is_dir($path) && $path != '/') $path = realpath(dirname($path));
$free_space = disk_free_space($out);
if (!$free_space) {
$free_space = 0;
return false;
}
return true;
} else {
return false;
}
}
/**
* Add an user to a specific group
*
*/
function add_user_to_group($group, $user = 'admispconfig'){
global $app;
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
$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 {
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
*/
/**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'){
$this->exec_safe("chkconfig --add ? &> /dev/null", $service);
}
if($action == 'off'){
$this->exec_safe("chkconfig --del ? &> /dev/null", $service);
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
}
} 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;
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
// 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
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
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'];
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
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)){
$this->exec_safe('ifconfig ? down &> /dev/null', $val);
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;
}
}
$this->exec_safe('ifconfig ? ? netmask ? up &> /dev/null', $new_interface, $to, $this->server_conf['server_netzmaske']);
$ifconfig['INTERFACE'][$new_interface] = $to;
}
}
}
}
}
function quota_dirs(){
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
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;
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
//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(){
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
$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) {
if($this->checkpath($filename) == false) {
$app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN);
return false;
}
$lines = @file($filename);
$out = '';
$found = 0;
if(is_array($lines)) {
foreach($lines as $line) {
if($strict == 0 && preg_match('/^REGEX:(.*)$/', $search_pattern)) {
if(preg_match(substr($search_pattern, 6), $line)) {
$out .= $new_line."\n";
$found = 1;
} else {
$out .= $line;
}
} elseif($strict == 0) {
if(stristr($line, $search_pattern)) {
$out .= $new_line."\n";
$found = 1;
} else {
$out .= $line;
}
} else {
if(trim($line) == $search_pattern) {
$out .= $new_line."\n";
$found = 1;
} else {
$out .= $line;
}
}
}
}
if($found == 0) {
//* add \n if the last line does not end with \n or \r
if(substr($out, -1) != "\n" && substr($out, -1) != "\r" && filesize($filename) > 0) $out .= "\n";
//* add the new line at the end of the file
if($append == 1) {
$out .= $new_line."\n";
}
file_put_contents($filename, $out);
}
function removeLine($filename, $search_pattern, $strict = 0) {
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 && preg_match('/^REGEX:(.*)$/', $search_pattern)) {
if(preg_match(substr($search_pattern, 6), $line)) {
$out .= $new_line."\n";
$found = 1;
} else {
$out .= $line;
}
} elseif($strict == 0) {
if(!stristr($line, $search_pattern)) {
$out .= $line;
}
} else {
if(!trim($line) == $search_pattern) {
$out .= $line;
}
file_put_contents($filename, $out);
function maildirmake($maildir_path, $user = '', $subfolder = '', $group = '') {
Till Brehm
committed
global $app, $conf;
Till Brehm
committed
// load the server configuration options
$app->uses("getconf");
$mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail');
Marius Burkard
committed
$dir = $maildir_path.'/.'.$subfolder;
Marius Burkard
committed
$dir = $maildir_path;
tbrehm
committed
if(!is_dir($dir)) mkdir($dir, 0700, true);
if($user != '' && $user != 'root' && $this->is_user($user)) {
if(is_dir($dir)) $this->chown($dir, $user);
if($group != '' && $group != 'root' && $this->is_group($group)) {
if(is_dir($dir)) $this->chgrp($dir, $group);
$chgrp_mdsub = true;
}
$maildirsubs = array('cur', 'new', 'tmp');
foreach ($maildirsubs as $mdsub) {
if(!is_dir($dir.'/'.$mdsub)) mkdir($dir.'/'.$mdsub, 0700, true);
if ($chown_mdsub) chown($dir.'/'.$mdsub, $user);
if ($chgrp_mdsub) chgrp($dir.'/'.$mdsub, $group);
}
chmod($dir, 0700);
//* Add the subfolder to the subscriptions and courierimapsubscribed files
if($subfolder != '') {
Till Brehm
committed
if($mail_config['pop3_imap_daemon'] == 'courier') {
if(!is_file($maildir_path.'/courierimapsubscribed')) {
Marius Burkard
committed
$tmp_file = $maildir_path.'/courierimapsubscribed';
Till Brehm
committed
touch($tmp_file);
chmod($tmp_file, 0744);
chown($tmp_file, 'vmail');
chgrp($tmp_file, 'vmail');
}
$this->replaceLine($maildir_path.'/courierimapsubscribed', 'INBOX.'.$subfolder, 'INBOX.'.$subfolder, 1, 1);
Till Brehm
committed
if($mail_config['pop3_imap_daemon'] == 'dovecot') {
if(!is_file($maildir_path.'/subscriptions')) {
Marius Burkard
committed
$tmp_file = $maildir_path.'/subscriptions';
Till Brehm
committed
touch($tmp_file);
chmod($tmp_file, 0744);
chown($tmp_file, 'vmail');
chgrp($tmp_file, 'vmail');
}
$this->replaceLine($maildir_path.'/subscriptions', $subfolder, $subfolder, 1, 1);
$app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder, LOGLEVEL_DEBUG);
//* Function to create directory paths and chown them to a user and group
function mkdirpath($path, $mode = 0755, $user = '', $group = '', $run_as_user = null) {
$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, false, 0777, false, $run_as_user);
$this->chmod($new_path, $mode);
if($user != '') $this->chown($new_path, $user);
if($group != '') $this->chgrp($new_path, $group);
function _exec($command, $allow_return_codes = null) {
global $app;
$out = array();
$ret = 0;
$app->log('exec: '.$command, LOGLEVEL_DEBUG);
exec($command, $out, $ret);
if(is_array($allow_return_codes) && in_array($ret, $allow_return_codes)) return true;
elseif($ret != 0) return false;
tbrehm
committed
//* Check if a application is installed
function is_installed($appname) {
$this->exec_safe('which ? 2> /dev/null', $appname);
$out = $this->last_exec_out();
$returncode = $this->last_exec_retcode();
if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) {
tbrehm
committed
return true;
} else {
return false;
}
}
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
function set_immutable($path, $enable = true, $recursive = false) {
global $app;
if($this->checkpath($path) == false) {
$app->log("Action aborted, target is a symlink: $path", LOGLEVEL_DEBUG);
return false;
}
if($path != '' && $path != '/' && strlen($path) > 6 && strpos($path, '..') === false && (is_file($path) || is_dir($path))) {
if($enable) {
$this->exec_safe('chattr +i ?', $path);
} else {
$this->exec_safe('chattr -i ?', $path);
}
if($enable === false && $recursive === true && is_dir($path)) {
// only allow when removing immutable
$this->exec_safe('chattr -R -i ?', $path);
}
}
}
public function is_blacklisted_web_path($path) {
$blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var', 'proc', 'net', 'sys', 'srv', 'sbin', 'run');
$path = ltrim($path, '/');
$parts = explode('/', $path);
if(in_array(strtolower($parts[0]), $blacklist, true)) {
return true;
}
return false;
}
function web_folder_protection($document_root, $protect) {
global $app, $conf;
if($this->checkpath($document_root) == false) {
$app->log("Action aborted, target is a symlink: $document_root", LOGLEVEL_DEBUG);
return false;
}
//* load the server configuration options
$app->uses('getconf');
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
if($protect == true && $web_config['web_folder_protection'] == 'y') {
//* Add protection
if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root, '..')) $this->exec_safe('chattr +i ?', $document_root);
} else {
//* Remove protection
if($document_root != '' && $document_root != '/' && strlen($document_root) > 6 && !stristr($document_root, '..')) $this->exec_safe('chattr -i ?', $document_root);
function usermod($username, $uid = 0, $gid = 0, $home = '', $shell = '', $password = '', $login = '') {
global $app;
if($login == '') $login = $username;
//* Change values in /etc/passwd
$passwd_file_array = file('/etc/passwd');
if(is_array($passwd_file_array)) {
foreach($passwd_file_array as $line) {
$line = trim($line);
$parts = explode(':', $line);
if($parts[0] == $username) {
if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login);
if(!empty($uid)) $parts[2] = trim($uid);
if(!empty($gid)) $parts[3] = trim($gid);
if(trim($home) != '') $parts[5] = trim($home);
if(trim($shell) != '') $parts[6] = trim($shell);
$new_line = implode(':', $parts);
copy('/etc/passwd', '/etc/passwd~');
chmod('/etc/passwd~', 0600);
$app->uses('system');
$app->system->replaceLine('/etc/passwd', $line, $new_line, 1, 0);
}
}
unset($passwd_file_array);
}
//* If username != login, change username in group and gshadow file
if($username != $login) {
$group_file_array = file('/etc/group');
if(is_array($group_file_array)) {
foreach($group_file_array as $line) {
$line = trim($line);
$parts = explode(':', $line);
if(strstr($parts[3], $username)) {
$uparts = explode(',', $parts[3]);
if(is_array($uparts)) {
foreach($uparts as $key => $val) {
if($val == $username) $uparts[$key] = $login;
}
}
$parts[3] = implode(',', $uparts);
$new_line = implode(':', $parts);
copy('/etc/group', '/etc/group~');
chmod('/etc/group~', 0600);
$app->system->replaceLine('/etc/group', $line, $new_line, 1, 0);
}
}
}
unset($group_file_array);
$gshadow_file_array = file('/etc/gshadow');
if(is_array($gshadow_file_array)) {
foreach($gshadow_file_array as $line) {
$line = trim($line);
$parts = explode(':', $line);
if(strstr($parts[3], $username)) {
$uparts = explode(',', $parts[3]);
if(is_array($uparts)) {
foreach($uparts as $key => $val) {
if($val == $username) $uparts[$key] = $login;
}
}
$parts[3] = implode(',', $uparts);
$new_line = implode(':', $parts);
copy('/etc/gshadow', '/etc/gshadow~');
chmod('/etc/gshadow~', 0600);
$app->system->replaceLine('/etc/gshadow', $line, $new_line, 1, 0);
}
}
}
unset($group_file_array);
}
//* When password or login name has been changed
if($password != '' || $username != $login) {
$shadow_file_array = file('/etc/shadow');
if(is_array($shadow_file_array)) {
foreach($shadow_file_array as $line) {
$line = trim($line);
$parts = explode(':', $line);
if($parts[0] == $username) {
if(trim($login) != '' && trim($login) != trim($username)) $parts[0] = trim($login);
if(trim($password) != '') $parts[1] = trim($password);
$new_line = implode(':', $parts);
copy('/etc/shadow', '/etc/shadow~');
chmod('/etc/shadow~', 0600);
$app->system->replaceLine('/etc/shadow', $line, $new_line, 1, 0);
}
}
}
unset($shadow_file_array);
}
}
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);
}
}
function is_mounted($mountpoint){
//$cmd = 'df 2>/dev/null | grep " '.$mountpoint.'$"';
$cmd = 'mount 2>/dev/null | grep ?';
$this->exec_safe($cmd, ' on '. $mountpoint . ' type ');
$return_var = $this->last_exec_retcode();
return $return_var == 0 ? true : false;
function mount_backup_dir($backup_dir, $mount_cmd = '/usr/local/ispconfig/server/scripts/backup_dir_mount.sh'){
Florian Schaal
committed
global $app, $conf;
if($this->is_mounted($backup_dir)) return true;
$mounted = true;
if ( is_file($mount_cmd) &&
is_executable($mount_cmd) &&
fileowner($mount_cmd) === 0
) {
if (!$this->is_mounted($backup_dir)){
exec($mount_cmd);
sleep(1);
if (!$this->is_mounted($backup_dir)) $mounted = false;
}
} else $mounted = false;
Florian Schaal
committed
if (!$mounted) {
//* send email to admin that backup directory could not be mounted
$global_config = $app->getconf->get_global_config('mail');
if($global_config['admin_mail'] != ''){
$subject = 'Backup directory '.$backup_dir.' could not be mounted';
$message = "Backup directory ".$backup_dir." could not be mounted.\n\nThe command\n\n".$mount_cmd."\n\nfailed.";
mail($global_config['admin_mail'], $subject, $message);
}
}
return $mounted;
}
function umount_backup_dir($backup_dir, $mount_cmd = '/usr/local/ispconfig/server/scripts/backup_dir_umount.sh'){
Florian Schaal
committed
global $app, $conf;
if ( is_file($mount_cmd) &&
is_executable($mount_cmd) &&
fileowner($mount_cmd) === 0
) {
if ($this->is_mounted($backup_dir)){
exec($mount_cmd);
sleep(1);
$unmounted = $this->is_mounted($backup_dir) == 0 ? true : false;
if(!$unmounted) {
//* send email to admin that backup directory could not be unmounted
$global_config = $app->getconf->get_global_config('mail');
if($global_config['admin_mail'] != ''){
$subject = 'Backup directory '.$backup_dir.' could not be unmounted';
$message = "Backup directory ".$backup_dir." could not be unmounted.\n\nThe command\n\n".$mount_cmd."\n\nfailed.";
mail($global_config['admin_mail'], $subject, $message);
}
}
Florian Schaal
committed
}
}
return $unmounted;