install.lib.php 25.1 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');

oliver's avatar
oliver committed
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
tbrehm's avatar
tbrehm committed
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;
Marius Burkard's avatar
Marius Burkard committed
93 94 95
				$mainver = explode('.', $ver);
				$mainver = array_filter($mainver);
				$mainver = current($mainver).'.'.next($mainver);
tbrehm's avatar
tbrehm committed
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;
Till Brehm's avatar
Till Brehm committed
106 107
			case "16.04":
				$relname = "(Xenial Xerus)";
108
				$distconfid = 'ubuntu1604';
Till Brehm's avatar
Till Brehm committed
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)";
tbrehm's avatar
tbrehm committed
130
				break;
131 132
			case "12.04":
				$relname = "(Precise Pangolin)";
tbrehm's avatar
tbrehm committed
133
				break;
134 135
			case "11.10":
				$relname = "(Oneiric Ocelot)";
tbrehm's avatar
tbrehm committed
136
				break;
137 138
			case "11.14":
				$relname = "(Natty Narwhal)";
tbrehm's avatar
tbrehm committed
139
				break;
140 141
			case "10.10":
				$relname = "(Maverick Meerkat)";
tbrehm's avatar
tbrehm committed
142
				break;
143 144
			case "10.04":
				$relname = "(Lucid Lynx)";
tbrehm's avatar
tbrehm committed
145
				break;
146 147
			case "9.10":
				$relname = "(Karmic Koala)";
tbrehm's avatar
tbrehm committed
148
				break;
149 150
			case "9.04":
				$relname = "(Jaunty Jackpole)";
tbrehm's avatar
tbrehm committed
151
				break;
152
			case "8.10":
tbrehm's avatar
tbrehm committed
153 154
				$relname = "(Intrepid Ibex)";
				break;
155 156
			case "8.04":
				$relname = "(Hardy Heron)";
tbrehm's avatar
tbrehm committed
157
				break;
158 159
			case "7.10":
				$relname = "(Gutsy Gibbon)";
tbrehm's avatar
tbrehm committed
160
				break;
161 162
			case "7.04":
				$relname = "(Feisty Fawn)";
tbrehm's avatar
tbrehm committed
163
				break;
164 165
			case "6.10":
				$relname = "(Edgy Eft)";
tbrehm's avatar
tbrehm committed
166
				break;
167 168
			case "6.06":
				$relname = "(Dapper Drake)";
tbrehm's avatar
tbrehm committed
169
				break;
170 171
			case "5.10":
				$relname = "(Breezy Badger)";
tbrehm's avatar
tbrehm committed
172
				break;
173 174
			case "5.04":
				$relname = "(Hoary Hedgehog)";
tbrehm's avatar
tbrehm committed
175
				break;
176 177
			case "4.10":
				$relname = "(Warty Warthog)";
tbrehm's avatar
tbrehm committed
178
				break;
179 180
			default:
				$relname = "UNKNOWN";
tbrehm's avatar
tbrehm committed
181 182
			}
			$distver = $ver.$lts." ".$relname;
183
			swriteln("Operating System: ".$distname.' '.$distver."\n");
tbrehm's avatar
tbrehm committed
184
		} elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
tbrehm's avatar
tbrehm committed
185 186 187
			$distname = 'Debian';
			$distver = '4.0';
			$distid = 'debian40';
tbrehm's avatar
tbrehm committed
188
			$distbaseid = 'debian';
189
			swriteln("Operating System: Debian 4.0 or compatible\n");
190
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '5.0')) {
tbrehm's avatar
tbrehm committed
191
			$distname = 'Debian';
Fantu's avatar
Fantu committed
192
			$distver = 'Lenny';
tbrehm's avatar
tbrehm committed
193
			$distid = 'debian40';
tbrehm's avatar
tbrehm committed
194
			$distbaseid = 'debian';
Fantu's avatar
Fantu committed
195
			swriteln("Operating System: Debian Lenny or compatible\n");
196
		} 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
197 198
			$distname = 'Debian';
			$distver = 'Squeeze/Sid';
199
			$distid = 'debian60';
Fantu's avatar
Fantu committed
200
			$distbaseid = 'debian';
201
			swriteln("Operating System: Debian 6.0 (Squeeze/Sid) or compatible\n");
202
		} 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') {
203 204
			$distname = 'Debian';
			$distver = 'Wheezy/Sid';
205
			$distid = 'debian60';
206
			$distbaseid = 'debian';
207
			swriteln("Operating System: Debian 7.0 (Wheezy/Sid) or compatible\n");
208 209 210 211 212 213
		} 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
214 215 216 217 218 219 220
		} 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");
221 222 223 224 225 226 227
		} 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");
228
		} else {
229 230 231 232 233
			$distname = 'Debian';
			$distver = 'Unknown';
			$distid = 'debian40';
			$distbaseid = 'debian';
			swriteln("Operating System: Debian or compatible, unknown version.\n");
oliver's avatar
oliver committed
234 235
		}
	}
236

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


oliver's avatar
oliver committed
267
	//** Redhat
268
	elseif(file_exists('/etc/redhat-release')) {
269

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

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

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

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

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

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

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

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

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

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

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

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

function caselog($command, $file = '', $line = '', $success = '', $failure = ''){
381
	exec($command, $arr, $ret_val);
382 383 384 385 386 387 388 389 390 391 392 393 394
	$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);
	}
395 396 397
}

function phpcaselog($ret_val, $msg, $file = '', $line = ''){
398 399 400 401 402 403 404 405 406 407 408
	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;
409 410 411
}

function mkdirs($strPath, $mode = '0755'){
pedro_morgan's avatar
pedro_morgan committed
412
	if(isset($strPath) && $strPath != ''){
413 414 415 416 417 418 419 420 421 422 423 424 425 426
		//* 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;
427 428
}

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

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

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

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

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

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

function remove_blank_lines($input, $file = 1){
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
	//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;
	}
502 503 504
}

function no_comments($file, $comment = '#'){
505 506 507 508 509 510 511
	$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){
512
					$new_lines[] = substr($line, 0, $pos);
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
				}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 '';
	}
528 529 530
}

function comment_out($file, $string){
531 532 533 534 535 536 537 538 539 540
	$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);
541 542 543
}

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

function grep($content, $string, $params = ''){
556 557 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
	// 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);
592
		if(substr($ret_val, -1) != "\n") $ret_val .= "\n";
593 594 595 596 597
		$find = NULL;
		return $ret_val;
	} else {
		return false;
	}
598 599 600
}

function edit_xinetd_conf($service){
601 602 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
	$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);
631 632
}

633 634
//* Converts a ini string to array
function ini_to_array($ini) {
635
	$config = array();
636 637 638
	$ini = str_replace("\r\n", "\n", $ini);
	$lines = explode("\n", $ini);
	foreach($lines as $line) {
639
		$line = trim($line);
640 641 642 643 644 645 646 647 648 649 650
		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;
}
651 652


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

669
function is_user($user){
670 671 672 673 674 675 676 677 678 679 680 681 682
	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;
683 684 685
}

function is_group($group){
686 687 688 689 690 691 692 693 694 695 696 697 698
	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;
699 700
}

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

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

Marius Cramer's avatar
Marius Cramer committed
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
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
772
function is_installed($appname) {
773 774
	exec('which '.escapeshellcmd($appname).' 2> /dev/null', $out, $returncode);
	if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) {
tbrehm's avatar
tbrehm committed
775 776 777 778 779 780
		return true;
	} else {
		return false;
	}
}

781 782 783 784 785 786
/*
* Get the port number of the ISPConfig controlpanel vhost
*/

function get_ispconfig_port_number() {
	global $conf;
787 788 789 790 791 792 793
	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,})\>/';
	}
794

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

807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
/*
* 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';
		}
	}
}

833 834 835 836 837 838 839 840 841 842
/*
* 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);
843
		if(stristr($tmp, 'SSLCertificateFile')) {
844 845 846 847 848 849 850
			return true;
		} else {
			return false;
		}
	}
}

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


857
function find_hash_file($hash, $dir, $basedir = '') {
858 859 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
	$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
 */
886
function get_system_timezone() {
887 888 889 890 891 892 893 894 895
	$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);
896
		$timezone = str_replace('..', '', $timezone);
897 898 899 900 901 902 903 904 905 906
		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];
	}
Marius Cramer's avatar
Marius Cramer committed
907 908
	
	if(substr($timezone, 0, 1) === '/') $timezone = substr($timezone, 1);
909 910

	return $timezone;
911 912
}

913
function getapacheversion($get_minor = false) {
914 915 916 917 918 919
	global $app;
	
	$cmd = '';
	if(is_installed('apache2ctl')) $cmd = 'apache2ctl -v';
	elseif(is_installed('apachectl')) $cmd = 'apachectl -v';
	else {
920
		ilog("Could not check apache version, apachectl not found.");
921 922 923 924 925
		return '2.2';
	}
	
	exec($cmd, $output, $return_var);
	if($return_var != 0 || !$output[0]) {
926
		ilog("Could not check apache version, apachectl did not return any data.");
927 928 929 930 931 932
		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 {
933
		ilog("Could not check apache version, did not find version string in apachectl output.");
934
		return '2.2';
935
	}
936
}
937

938 939 940 941 942 943 944
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 {
945
		ilog("Could not check apache modules, apachectl not found.");
946 947 948
		return array();
	}
	
949
	exec($cmd . ' 2>/dev/null', $output, $return_var);
950
	if($return_var != 0 || !$output[0]) {
951
		ilog("Could not check apache modules, apachectl did not return any data.");
952 953 954 955 956 957 958 959 960 961 962 963
		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;
}
964

965
?>