install.lib.php 25.2 KB
Newer Older
1 2 3 4 5 6 7 8 9
<?php

/*
Copyright (c) 2007, Till Brehm, projektfarm Gmbh
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

10 11 12 13 14 15 16 17
		* Redistributions of source code must retain the above copyright notice,
			this list of conditions and the following disclaimer.
		* Redistributions in binary form must reproduce the above copyright notice,
			this list of conditions and the following disclaimer in the documentation
			and/or other materials provided with the distribution.
		* Neither the name of ISPConfig nor the names of its contributors
			may be used to endorse or promote products derived from this software without
			specific prior written permission.
18 19 20 21 22 23 24 25 26 27 28

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 30 31 32 33 34
*/
error_reporting(E_ALL|E_STRICT);


$FILE = realpath('../install.php');

35
//** Get distribution identifier
36
//** IMPORTANT!
37
//   This is the same code as in server/lib/classes/monitor_tools.inc.php
38
//   So if you change it here, you also have to change it in there!
39 40 41 42
//
//	This function returns a string that describes the installed
//	Linux distribution. e.g. debian40 for Debian GNU/Linux 4.0

43
function get_distname() {
44

tbrehm's avatar
tbrehm committed
45
	$distname = '';
46 47 48
	$distver = '';
	$distid = '';
	$distbaseid = '';
49

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
	//** Debian or Ubuntu
	if(file_exists('/etc/debian_version')) {
		
		// Check if this is Ubuntu and not Debian
		if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu') || (is_file('/etc/os-release') && stristr(file_get_contents('/etc/os-release'), 'Ubuntu'))) {
			
			$issue = file_get_contents('/etc/issue');
			
			// Use content of /etc/issue file
			if(strstr($issue,'Ubuntu')) {
				if (strstr(trim($issue), 'LTS')) {
					$lts=" LTS";
				} else {
					$lts="";
				}

				$distname = 'Ubuntu';
				$distid = 'debian40';
				$distbaseid = 'debian';
				$ver = explode(' ', $issue);
				$ver = array_filter($ver);
				$ver = next($ver);
				$mainver = explode('.', $ver);
				$mainver = array_filter($mainver);
				$mainver = current($mainver).'.'.next($mainver);
			// Use content of /etc/os-release file
76
			} else {
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
				$os_release = file_get_contents('/etc/os-release');
				if (strstr(trim($os_release), 'LTS')) {
					$lts = " LTS";
				} else {
					$lts = "";
				}
				
				$distname = 'Ubuntu';
				$distid = 'debian40';
				$distbaseid = 'debian';

				preg_match("/.*VERSION=\"(.*)\".*/ui", $os_release, $ver);
				$ver = str_replace("LTS", "", $ver[1]);
				$ver = explode(" ", $ver, 2);
				$ver = reset($ver);
				$mainver = $ver;
93 94 95
				$mainver = explode('.', $ver);
				$mainver = array_filter($mainver);
				$mainver = current($mainver).'.'.next($mainver);
96 97
			}
			switch ($mainver){
98 99 100 101
			case "17.04":
				$relname = "(Zesty Zapus)";
				$distconfid = 'ubuntu1604';
				break;
102 103 104 105
			case "16.10":
				$relname = "(Yakkety Yak)";
				$distconfid = 'ubuntu1604';
				break;
106 107
			case "16.04":
				$relname = "(Xenial Xerus)";
108
				$distconfid = 'ubuntu1604';
109
				break;
110 111 112
			case "15.10":
				$relname = "(Wily Werewolf)";
				break;
113 114 115
			case "15.04":
				$relname = "(Vivid Vervet)";
				break;
116 117 118
			case "14.10":
				$relname = "(Utopic Unicorn)";
				break;
Till Brehm's avatar
Till Brehm committed
119 120 121 122 123 124 125 126 127
			case "14.04":
				$relname = "(Trusty Tahr)";
				break;
			case "13.10":
				$relname = "(Saucy Salamander)";
				break;
			case "13.04":
				$relname = "(Raring Ringtail)";
				break;
128 129
			case "12.10":
				$relname = "(Quantal Quetzal)";
130
				break;
131 132
			case "12.04":
				$relname = "(Precise Pangolin)";
133
				break;
134 135
			case "11.10":
				$relname = "(Oneiric Ocelot)";
136
				break;
137 138
			case "11.14":
				$relname = "(Natty Narwhal)";
139
				break;
140 141
			case "10.10":
				$relname = "(Maverick Meerkat)";
142
				break;
143 144
			case "10.04":
				$relname = "(Lucid Lynx)";
145
				break;
146 147
			case "9.10":
				$relname = "(Karmic Koala)";
148
				break;
149 150
			case "9.04":
				$relname = "(Jaunty Jackpole)";
151
				break;
152
			case "8.10":
153 154
				$relname = "(Intrepid Ibex)";
				break;
155 156
			case "8.04":
				$relname = "(Hardy Heron)";
157
				break;
158 159
			case "7.10":
				$relname = "(Gutsy Gibbon)";
160
				break;
161 162
			case "7.04":
				$relname = "(Feisty Fawn)";
163
				break;
164 165
			case "6.10":
				$relname = "(Edgy Eft)";
166
				break;
167 168
			case "6.06":
				$relname = "(Dapper Drake)";
169
				break;
170 171
			case "5.10":
				$relname = "(Breezy Badger)";
172
				break;
173 174
			case "5.04":
				$relname = "(Hoary Hedgehog)";
175
				break;
176 177
			case "4.10":
				$relname = "(Warty Warthog)";
178
				break;
179 180
			default:
				$relname = "UNKNOWN";
181
				$distconfid = 'ubuntu1604';
182 183
			}
			$distver = $ver.$lts." ".$relname;
184
			swriteln("Operating System: ".$distname.' '.$distver."\n");
185
		} elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
186 187 188
			$distname = 'Debian';
			$distver = '4.0';
			$distid = 'debian40';
189
			$distbaseid = 'debian';
190
			swriteln("Operating System: Debian 4.0 or compatible\n");
191
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '5.0')) {
192
			$distname = 'Debian';
Fantu's avatar
Fantu committed
193
			$distver = 'Lenny';
194
			$distid = 'debian40';
195
			$distbaseid = 'debian';
Fantu's avatar
Fantu committed
196
			swriteln("Operating System: Debian Lenny or compatible\n");
197
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '6.0') || trim(file_get_contents('/etc/debian_version')) == 'squeeze/sid') {
Fantu's avatar
Fantu committed
198 199
			$distname = 'Debian';
			$distver = 'Squeeze/Sid';
200
			$distid = 'debian60';
Fantu's avatar
Fantu committed
201
			$distbaseid = 'debian';
202
			swriteln("Operating System: Debian 6.0 (Squeeze/Sid) or compatible\n");
203
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || substr(trim(file_get_contents('/etc/debian_version')),0,2) == '7.' || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
204 205
			$distname = 'Debian';
			$distver = 'Wheezy/Sid';
206
			$distid = 'debian60';
207
			$distbaseid = 'debian';
208
			swriteln("Operating System: Debian 7.0 (Wheezy/Sid) or compatible\n");
209 210 211 212 213 214
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '8') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '8') {
			$distname = 'Debian';
			$distver = 'Jessie';
			$distid = 'debian60';
			$distbaseid = 'debian';
			swriteln("Operating System: Debian 8.0 (Jessie) or compatible\n");
Till Brehm's avatar
Till Brehm committed
215 216 217 218 219 220 221
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '9') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '9') {
			$distname = 'Debian';
			$distver = 'Stretch';
			$distconfid = 'debian90';
			$distid = 'debian60';
			$distbaseid = 'debian';
			swriteln("Operating System: Debian 9.0 (Stretch) or compatible\n");
222 223 224 225 226 227 228
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) {
			$distname = 'Debian';
			$distver = 'Testing';
			$distid = 'debian60';
			$distconfid = 'debiantesting';
			$distbaseid = 'debian';
			swriteln("Operating System: Debian Testing\n");
229
		} else {
230 231
			$distname = 'Debian';
			$distver = 'Unknown';
232 233
			$distid = 'debian60';
			$distconfid = 'debian90';
234 235
			$distbaseid = 'debian';
			swriteln("Operating System: Debian or compatible, unknown version.\n");
236 237
		}
	}
238

239
	//** OpenSuSE
240
	elseif(file_exists('/etc/SuSE-release')) {
241
		if(stristr(file_get_contents('/etc/SuSE-release'), '11.0')) {
242 243 244
			$distname = 'openSUSE';
			$distver = '11.0';
			$distid = 'opensuse110';
245
			$distbaseid = 'opensuse';
246
			swriteln("Operating System: openSUSE 11.0 or compatible\n");
247
		} elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.1')) {
tbrehm's avatar
tbrehm committed
248 249 250 251 252
			$distname = 'openSUSE';
			$distver = '11.1';
			$distid = 'opensuse110';
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE 11.1 or compatible\n");
253
		} elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.2')) {
254
			$distname = 'openSUSE';
255 256
			$distver = '11.2';
			$distid = 'opensuse112';
257 258 259 260 261
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE 11.2 or compatible\n");
		}  else {
			$distname = 'openSUSE';
			$distver = 'Unknown';
262
			$distid = 'opensuse112';
263 264
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE or compatible, unknown version.\n");
tbrehm's avatar
tbrehm committed
265
		}
266
	}
267 268


269
	//** Redhat
270
	elseif(file_exists('/etc/redhat-release')) {
271

tbrehm's avatar
tbrehm committed
272
		$content = file_get_contents('/etc/redhat-release');
273

274
		if(stristr($content, 'Fedora release 9 (Sulphur)')) {
275 276 277
			$distname = 'Fedora';
			$distver = '9';
			$distid = 'fedora9';
278
			$distbaseid = 'fedora';
tbrehm's avatar
tbrehm committed
279
			swriteln("Operating System: Fedora 9 or compatible\n");
280
		} elseif(stristr($content, 'Fedora release 10 (Cambridge)')) {
281 282 283 284 285
			$distname = 'Fedora';
			$distver = '10';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Fedora 10 or compatible\n");
286
		} elseif(stristr($content, 'Fedora release 10')) {
287 288 289 290 291
			$distname = 'Fedora';
			$distver = '11';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Fedora 11 or compatible\n");
292
		} elseif(stristr($content, 'CentOS release 5.2 (Final)')) {
tbrehm's avatar
tbrehm committed
293 294 295 296 297
			$distname = 'CentOS';
			$distver = '5.2';
			$distid = 'centos52';
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5.2 or compatible\n");
298
		} elseif(stristr($content, 'CentOS release 5.3 (Final)')) {
299 300
			$distname = 'CentOS';
			$distver = '5.3';
tbrehm's avatar
tbrehm committed
301
			$distid = 'centos53';
302 303
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5.3 or compatible\n");
304
		} elseif(stristr($content, 'CentOS release 5')) {
305 306 307 308 309
			$distname = 'CentOS';
			$distver = 'Unknown';
			$distid = 'centos53';
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5 or compatible\n");
310
		} elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
Till Brehm's avatar
Till Brehm committed
311 312 313 314 315 316 317 318 319
			$distname = 'CentOS';
			$distver = 'Unknown';
			$distid = 'centos53';
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 6 or compatible\n");
		} elseif(stristr($content, 'CentOS Linux release 7')) {
			$distname = 'CentOS';
			$distver = 'Unknown';
			$distbaseid = 'fedora';
320 321 322 323 324 325 326 327 328
			$var=explode(" ", $content);
			$var=explode(".", $var[3]);
			$var=$var[0].".".$var[1];
			if($var=='7.0' || $var=='7.1') {
				$distid = 'centos70';
			} else {
				$distid = 'centos72';
			}
			swriteln("Operating System: CentOS $var\n");
329 330 331 332 333 334
		} else {
			$distname = 'Redhat';
			$distver = 'Unknown';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Redhat or compatible, unknown version.\n");
tbrehm's avatar
tbrehm committed
335
		}
336
	}
337

338
	//** Gentoo
339 340 341 342
	elseif(file_exists('/etc/gentoo-release')) {

		$content = file_get_contents('/etc/gentoo-release');

343
		preg_match_all('/([0-9]{1,2})/', $content, $version);
344 345 346 347 348 349
		$distname = 'Gentoo';
		$distver = $version[0][0].$version[0][1];
		$distid = 'gentoo';
		$distbaseid = 'gentoo';
		swriteln("Operating System: Gentoo $distver or compatible\n");

350
	} else {
351
		die('Unrecognized GNU/Linux distribution');
352
	}
353 354 355
	
	// Set $distconfid to distid, if no different id for the config is defined
	if(!isset($distconfid)) $distconfid = $distid;
356

357
	return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'confid' => $distconfid, 'baseid' => $distbaseid);
358 359 360
}

function sread() {
361 362
	$input = fgets(STDIN);
	return rtrim($input);
363 364
}

tbrehm's avatar
tbrehm committed
365
function swrite($text = '') {
366 367 368
	echo $text;
}

tbrehm's avatar
tbrehm committed
369
function swriteln($text = '') {
370 371 372 373
	echo $text."\n";
}

function ilog($msg){
374
	exec("echo `date` \"- [ISPConfig] - \"".$msg.' >> '.ISPC_LOG_FILE);
375 376 377
}

function error($msg){
378 379
	ilog($msg);
	die($msg."\n");
380 381 382
}

function caselog($command, $file = '', $line = '', $success = '', $failure = ''){
383
	exec($command, $arr, $ret_val);
384 385 386 387 388 389 390 391 392 393 394 395 396
	$arr = NULL;
	if(!empty($file) && !empty($line)){
		$pre = $file.', Line '.$line.': ';
	} else {
		$pre = '';
	}
	if($ret_val != 0){
		if($failure == '') $failure = 'could not '.$command;
		ilog($pre.'WARNING: '.$failure);
	} else {
		if($success == '') $success = $command;
		ilog($pre.$success);
	}
397 398 399
}

function phpcaselog($ret_val, $msg, $file = '', $line = ''){
400 401 402 403 404 405 406 407 408 409 410
	if(!empty($file) && !empty($line)){
		$pre = $file.', Line '.$line.': ';
	} else {
		$pre = '';
	}
	if($ret_val == true){
		ilog($pre.$msg);
	} else {
		ilog($pre.'WARNING: could not '.$msg);
	}
	return $ret_val;
411 412 413
}

function mkdirs($strPath, $mode = '0755'){
pedro_morgan's avatar
pedro_morgan committed
414
	if(isset($strPath) && $strPath != ''){
415 416 417 418 419 420 421 422 423 424 425 426 427 428
		//* Verzeichnisse rekursiv erzeugen
		if(is_dir($strPath)){
			return true;
		}
		$pStrPath = dirname($strPath);
		if(!mkdirs($pStrPath, $mode)){
			return false;
		}
		$old_umask = umask(0);
		$ret_val = mkdir($strPath, octdec($mode));
		umask($old_umask);
		return $ret_val;
	}
	return false;
429 430
}

431
function rfsel($file, $file2) {
432 433 434
	clearstatcache();
	if(is_file($file)) return rf($file);
	else return rf($file2);
435 436
}

437
function rf($file){
438
	clearstatcache();
tbrehm's avatar
tbrehm committed
439
	if(is_file($file)) {
440
		if(!$fp = fopen($file, 'rb')){
tbrehm's avatar
tbrehm committed
441 442 443 444 445
			ilog('WARNING: could not open file '.$file);
		}
		return filesize($file) > 0 ? fread($fp, filesize($file)) : '';
	} else {
		return '';
446
	}
447 448 449
}

function wf($file, $content){
450
	mkdirs(dirname($file));
451
	if(!$fp = fopen($file, 'wb')){
452 453 454 455
		ilog('WARNING: could not open file '.$file);
	}
	fwrite($fp, $content);
	fclose($fp);
456 457 458
}

function af($file, $content){
459
	mkdirs(dirname($file));
460
	if(!$fp = fopen($file, 'ab')){
461 462
		ilog('WARNING: could not open file '.$file);
	}
463
	fwrite($fp, $content);
464
	fclose($fp);
465 466 467
}

function aftsl($file, $content){
468
	if(!$fp = fopen($file, 'ab')){
469 470
		ilog('WARNING: could not open file '.$file);
	}
471
	fwrite($fp, $content);
472
	fclose($fp);
473 474 475
}

function unix_nl($input){
476 477 478
	$output = str_replace("\r\n", "\n", $input);
	$output = str_replace("\r", "\n", $output);
	return $output;
479 480 481
}

function remove_blank_lines($input, $file = 1){
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	//TODO ? Leerzeilen l�schen
	if($file){
		$content = unix_nl(rf($input)); // WTF -pedro !
	}else{
		$content = $input;
	}
	$lines = explode("\n", $content);
	if(!empty($lines)){
		foreach($lines as $line){
			if(trim($line) != '') $new_lines[] = $line;
		}
	}
	if(is_array($new_lines)){
		$content = implode("\n", $new_lines);
	} else {
		$content = '';
	}
	if($file){
		wf($input, $content);
	}else{
		return $content;
	}
504 505 506
}

function no_comments($file, $comment = '#'){
507 508 509 510 511 512 513
	$content = unix_nl(rf($file));
	$lines = explode("\n", $content);
	if(!empty($lines)){
		foreach($lines as $line){
			if(strstr($line, $comment)){
				$pos = strpos($line, $comment);
				if($pos != 0){
514
					$new_lines[] = substr($line, 0, $pos);
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
				}else{
					$new_lines[] = '';
				}
			}else{
				$new_lines[] = $line;
			}
		}
	}
	if(is_array($new_lines)){
		$content_without_comments = implode("\n", $new_lines);
		$new_lines = NULL;
		return $content_without_comments;
	} else {
		return '';
	}
530 531 532
}

function comment_out($file, $string){
533 534 535 536 537 538 539 540 541 542
	$inhalt = no_comments($file);
	$gesamt_inhalt = rf($file);
	$modules = explode(',', $string);
	foreach($modules as $val){
		$val = trim($val);
		if(strstr($inhalt, $val)){
			$gesamt_inhalt = str_replace($val, '##ISPConfig INSTALL## '.$val, $gesamt_inhalt);
		}
	}
	wf($file, $gesamt_inhalt);
543 544 545
}

function is_word($string, $text, $params = ''){
546 547 548 549 550 551 552 553 554
	//* params: i ??
	return preg_match("/\b$string\b/$params", $text);
	/*
	if(preg_match("/\b$string\b/$params", $text)) {
		return true;
	} else {
		return false;
	}
	*/
555 556 557
}

function grep($content, $string, $params = ''){
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
	// params: i, v, w
	$content = 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(!is_word($string, $line, 'i')) $find[] = $line;
				} else {
					if(is_word($string, $line, 'i')) $find[] = $line;
				}
			} else {
				if(strstr($params, 'v')){
					if(!is_word($string, $line)) $find[] = $line;
				} else {
					if(is_word($string, $line)) $find[] = $line;
				}
			}
		}
	}
	if(is_array($find)){
		$ret_val = implode("\n", $find);
594
		if(substr($ret_val, -1) != "\n") $ret_val .= "\n";
595 596 597 598 599
		$find = NULL;
		return $ret_val;
	} else {
		return false;
	}
600 601 602
}

function edit_xinetd_conf($service){
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
	$xinetd_conf = '/etc/xinetd.conf';
	$contents = unix_nl(rf($xinetd_conf));
	$lines = explode("\n", $contents);
	$j = sizeof($lines);
	for($i=0;$i<sizeof($lines);$i++){
		if(grep($lines[$i], $service, 'w')){
			$fundstelle_anfang = $i;
			$j = $i;
			$parts = explode($lines[$i], $contents);
		}
		if($j < sizeof($lines)){
			if(strstr($lines[$i], '}')){
				$fundstelle_ende = $i;
				$j = sizeof($lines);
			}
		}
	}
	if(isset($fundstelle_anfang) && isset($fundstelle_ende)){
		for($i=$fundstelle_anfang;$i<=$fundstelle_ende;$i++){
			if(strstr($lines[$i], 'disable')){
				$disable = explode('=', $lines[$i]);
				$disable[1] = ' yes';
				$lines[$i] = implode('=', $disable);
			}
		}
	}
	$fundstelle_anfang = NULL;
	$fundstelle_ende = NULL;
	$contents = implode("\n", $lines);
	wf($xinetd_conf, $contents);
633 634
}

635 636
//* Converts a ini string to array
function ini_to_array($ini) {
637
	$config = array();
638 639 640
	$ini = str_replace("\r\n", "\n", $ini);
	$lines = explode("\n", $ini);
	foreach($lines as $line) {
641
		$line = trim($line);
642 643 644 645 646 647 648 649 650 651 652
		if($line != '') {
			if(preg_match("/^\[([\w\d_]+)\]$/", $line, $matches)) {
				$section = strtolower($matches[1]);
			} elseif(preg_match("/^([\w\d_]+)=(.*)$/", $line, $matches) && $section != null) {
				$item = trim($matches[1]);
				$config[$section][$item] = trim($matches[2]);
			}
		}
	}
	return $config;
}
653 654


655
//* Converts a config array to a string
tbrehm's avatar
tbrehm committed
656
function array_to_ini($config_array = '') {
657 658 659 660 661 662
	if($config_array == '') $config_array = $this->config;
	$content = '';
	foreach($config_array as $section => $data) {
		$content .= "[$section]\n";
		foreach($data as $item => $value) {
			if($item != ''){
663 664
				$content .= "$item=$value\n";
			}
665 666 667 668 669 670
		}
		$content .= "\n";
	}
	return $content;
}

671
function is_user($user){
672 673 674 675 676 677 678 679 680 681 682 683 684
	global $mod;
	$user_datei = '/etc/passwd';
	$users = 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;
685 686 687
}

function is_group($group){
688 689 690 691 692 693 694 695 696 697 698 699 700
	global $mod;
	$group_datei = '/etc/group';
	$groups = 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;
701 702
}

703
function replaceLine($filename, $search_pattern, $new_line, $strict = 0, $append = 1) {
tbrehm's avatar
tbrehm committed
704
	if($lines = @file($filename)) {
tbrehm's avatar
tbrehm committed
705 706 707 708
		$out = '';
		$found = 0;
		foreach($lines as $line) {
			if($strict == 0) {
709
				if(stristr($line, $search_pattern)) {
tbrehm's avatar
tbrehm committed
710 711 712 713 714 715 716 717 718 719 720 721 722
					$out .= $new_line."\n";
					$found = 1;
				} else {
					$out .= $line;
				}
			} else {
				if(trim($line) == $search_pattern) {
					$out .= $new_line."\n";
					$found = 1;
				} else {
					$out .= $line;
				}
			}
723 724 725 726 727
			if (!$found) {
				if (trim($line) == $new_line) {
					$found = 1;
				}
			}
tbrehm's avatar
tbrehm committed
728 729
		}
		if($found == 0) {
730
			//* add \n if the last line does not end with \n or \r
731
			if(substr($out, -1) != "\n" && substr($out, -1) != "\r") $out .= "\n";
732
			//* add the new line at the end of the file
tbrehm's avatar
tbrehm committed
733
			if($append == 1) $out .= $new_line."\n";
tbrehm's avatar
tbrehm committed
734
		}
735
		file_put_contents($filename, $out);
tbrehm's avatar
tbrehm committed
736
	}
tbrehm's avatar
tbrehm committed
737
}
738

739
function removeLine($filename, $search_pattern, $strict = 0) {
tbrehm's avatar
tbrehm committed
740
	if($lines = @file($filename)) {
tbrehm's avatar
tbrehm committed
741 742 743
		$out = '';
		foreach($lines as $line) {
			if($strict == 0) {
744
				if(!stristr($line, $search_pattern)) {
tbrehm's avatar
tbrehm committed
745 746 747 748 749 750 751 752
					$out .= $line;
				}
			} else {
				if(!trim($line) == $search_pattern) {
					$out .= $line;
				}
			}
		}
753
		file_put_contents($filename, $out);
tbrehm's avatar
tbrehm committed
754
	}
tbrehm's avatar
tbrehm committed
755 756
}

Marius Cramer's avatar
Marius Cramer committed
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
function hasLine($filename, $search_pattern, $strict = 0) {
	if($lines = @file($filename)) {
		foreach($lines as $line) {
			if($strict == 0) {
				if(stristr($line, $search_pattern)) {
					return true;
				}
			} else {
				if(trim($line) == $search_pattern) {
					return true;
				}
			}
		}
	}
	return false;
}

tbrehm's avatar
tbrehm committed
774
function is_installed($appname) {
775 776
	exec('which '.escapeshellcmd($appname).' 2> /dev/null', $out, $returncode);
	if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) {
tbrehm's avatar
tbrehm committed
777 778 779 780 781 782
		return true;
	} else {
		return false;
	}
}

783 784 785 786 787 788
/*
* Get the port number of the ISPConfig controlpanel vhost
*/

function get_ispconfig_port_number() {
	global $conf;
789 790 791 792 793 794 795
	if($conf['nginx']['installed'] == true){
		$ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost';
		$regex = '/listen (\d+)/';
	} else {
		$ispconfig_vhost_file = $conf['apache']['vhost_conf_dir'].'/ispconfig.vhost';
		$regex = '/\<VirtualHost.*\:(\d{1,})\>/';
	}
796

797 798
	if(is_file($ispconfig_vhost_file)) {
		$tmp = file_get_contents($ispconfig_vhost_file);
799
		preg_match($regex, $tmp, $matches);
800
		$port_number = @intval($matches[1]);
801 802 803 804 805 806 807 808
		if($port_number > 0) {
			return $port_number;
		} else {
			return '8080';
		}
	}
}

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
/*
* Get the port number of the ISPConfig apps vhost
*/

function get_apps_vhost_port_number() {
	global $conf;
	if($conf['nginx']['installed'] == true){
		$ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/apps.vhost';
		$regex = '/listen (\d+)/';
	} else {
		$ispconfig_vhost_file = $conf['apache']['vhost_conf_dir'].'/apps.vhost';
		$regex = '/\<VirtualHost.*\:(\d{1,})\>/';
	}

	if(is_file($ispconfig_vhost_file)) {
		$tmp = file_get_contents($ispconfig_vhost_file);
		preg_match($regex, $tmp, $matches);
		$port_number = @intval($matches[1]);
		if($port_number > 0) {
			return $port_number;
		} else {
			return '8081';
		}
	}
}

835 836 837 838 839 840 841 842 843 844
/*
* Get the port number of the ISPConfig controlpanel vhost
*/

function is_ispconfig_ssl_enabled() {
	global $conf;
	$ispconfig_vhost_file = $conf['apache']['vhost_conf_dir'].'/ispconfig.vhost';

	if(is_file($ispconfig_vhost_file)) {
		$tmp = file_get_contents($ispconfig_vhost_file);
845
		if(stristr($tmp, 'SSLCertificateFile')) {
846 847 848 849 850 851 852
			return true;
		} else {
			return false;
		}
	}
}

853 854 855 856 857 858
/**
 Function to find the hash file for timezone detection
 (c) 2012 Marius Cramer, pixcept KG, m.cramer@pixcept.de
 */


859
function find_hash_file($hash, $dir, $basedir = '') {
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887
	$res = opendir($dir);
	if(!$res) return false;

	if(substr($basedir, -1) === '/') $basedir = substr($basedir, 0, strlen($basedir) - 1);
	if(substr($dir, -1) === '/') $dir = substr($dir, 0, strlen($dir) - 1);
	if($basedir === '') $basedir = $dir;

	while($cur = readdir($res)) {
		if($cur == '.' || $cur == '..') continue;
		$entry = $dir.'/'.$cur;
		if(is_dir($entry)) {
			$result = find_hash_file($hash, $entry, $basedir);
			if($result !== false) return $result;
		} elseif(md5_file($entry) === $hash) {
			$entry = substr($entry, strlen($basedir) + 1);
			if(substr($entry, 0, 7) === '/posix/') $entry = substr($entry, 7);
			return $entry;
		}
	}
	closedir($res);
	return false;
}


/**
 Function to get the timezone of the Linux system
 (c) 2012 Marius Cramer, pixcept KG, m.cramer@pixcept.de
 */
888
function get_system_timezone() {
889 890 891 892 893 894 895 896 897
	$timezone = false;
	if(file_exists('/etc/timezone') && is_readable('/etc/timezone')) {
		$timezone = trim(file_get_contents('/etc/timezone'));
		if(file_exists('/usr/share/zoneinfo/' . $timezone) == false) $timezone = false;
	}

	if(!$timezone && is_link('/etc/localtime')) {
		$timezone = readlink('/etc/localtime');
		$timezone = str_replace('/usr/share/zoneinfo/', '', $timezone);
898
		$timezone = str_replace('..', '', $timezone);
899 900 901 902 903 904 905 906 907 908
		if(substr($timezone, 0, 6) === 'posix/') $timezone = substr($timezone, 6);
	} elseif(!$timezone) {
		$hash = md5_file('/etc/localtime');
		$timezone = find_hash_file($hash, '/usr/share/zoneinfo');
	}

	if(!$timezone) {
		exec('date +%Z', $tzinfo);
		$timezone = $tzinfo[0];
	}
909 910
	
	if(substr($timezone, 0, 1) === '/') $timezone = substr($timezone, 1);
911 912

	return $timezone;
913 914
}

915
function getapacheversion($get_minor = false) {
916 917 918 919 920 921
	global $app;
	
	$cmd = '';
	if(is_installed('apache2ctl')) $cmd = 'apache2ctl -v';
	elseif(is_installed('apachectl')) $cmd = 'apachectl -v';
	else {
922
		ilog("Could not check apache version, apachectl not found.");
923 924 925 926 927
		return '2.2';
	}
	
	exec($cmd, $output, $return_var);
	if($return_var != 0 || !$output[0]) {
928
		ilog("Could not check apache version, apachectl did not return any data.");
929 930 931 932 933 934
		return '2.2';
	}
	
	if(preg_match('/version:\s*Apache\/(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) {
		return $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) && $get_minor == true ? '.' . $matches[5] : '');
	} else {
935
		ilog("Could not check apache version, did not find version string in apachectl output.");
936
		return '2.2';
937
	}
938
}
939

940 941 942 943 944 945 946
function getapachemodules() {
	global $app;
	
	$cmd = '';
	if(is_installed('apache2ctl')) $cmd = 'apache2ctl -t -D DUMP_MODULES';
	elseif(is_installed('apachectl')) $cmd = 'apachectl -t -D DUMP_MODULES';
	else {
947
		ilog("Could not check apache modules, apachectl not found.");
948 949 950
		return array();
	}
	
951
	exec($cmd . ' 2>/dev/null', $output, $return_var);
952
	if($return_var != 0 || !$output[0]) {
953
		ilog("Could not check apache modules, apachectl did not return any data.");
954 955 956 957 958 959 960 961 962 963 964 965
		return array();
	}
	
	$modules = array();
	for($i = 0; $i < count($output); $i++) {
		if(preg_match('/^\s*(\w+)\s+\((shared|static)\)\s*$/', $output[$i], $matches)) {
			$modules[] = $matches[1];
		}
	}
	
	return $modules;
}
966

967
?>