install.lib.php 28.3 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 36
require_once realpath(dirname(__FILE__)) . '/classes/libbashcolor.inc.php';

Marius Burkard's avatar
Marius Burkard committed
37 38 39 40 41 42 43 44 45 46 47
function is_supported_dist($dist) {
	$name = $dist['name'];
	$version = $dist['version'];
	
	$min_version = false;
	if($name === 'Ubuntu') {
		$tmp = explode(" ", $version);
		$version = reset($tmp); // Dist name is appended on get_distname
		$min_version = '16.04';
		$add_versions = array('Testing', 'Unknown');
	} elseif($name === 'Debian') {
48
		$min_version = '9';
49
		$add_versions = array('Testing', 'Unknown', 'Stretch', 'Buster');
Marius Burkard's avatar
Marius Burkard committed
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
	} elseif($name === 'Devuan') {
		$min_version = '1.0';
		$add_versions = array('Jessie', 'Ceres');
	} elseif($name === 'openSUSE') {
		$min_version = '11.2';
		$add_versions = false;
	} elseif($name === 'Fedora') {
		$min_version = '11';
		$add_versions = array('Unknown');
	} elseif($name === 'CentOS') {
		$min_version = '7.0';
		$add_versions = array('Unknown');
	} elseif($name === 'Gentoo') {
		$min_version = '1.0';
	}
	
	if($version && $min_version && preg_match('/^[0-9]+/', $version)) {
		if(version_compare($version, $min_version, '>=')) return true;
	} elseif($version && !preg_match('/^[0-9]+/', $version) && !empty($add_versions)) {
		if(in_array($version, $add_versions, true)) return true;
	}
	
	return false;
}

oliver's avatar
oliver committed
75
//** Get distribution identifier
76
//** IMPORTANT!
77
//   This is the same code as in server/lib/classes/monitor_tools.inc.php
78
//   So if you change it here, you also have to change it in there!
79 80 81 82
//
//	This function returns a string that describes the installed
//	Linux distribution. e.g. debian40 for Debian GNU/Linux 4.0

83
function get_distname() {
84

tbrehm's avatar
tbrehm committed
85
	$distname = '';
86 87 88
	$distver = '';
	$distid = '';
	$distbaseid = '';
89

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
	//** 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
116
			} else {
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
				$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
133 134 135
				$mainver = explode('.', $ver);
				$mainver = array_filter($mainver);
				$mainver = current($mainver).'.'.next($mainver);
tbrehm's avatar
tbrehm committed
136 137
			}
			switch ($mainver){
138 139 140 141
			case "18.04":
				$relname = "(Bionic Beaver)";
				$distconfid = 'ubuntu1804';
				break;
142 143 144 145
			case "17.10":
				$relname = "(Artful Aardvark)";
				$distconfid = 'ubuntu1710';
				break;
146 147 148 149
			case "17.04":
				$relname = "(Zesty Zapus)";
				$distconfid = 'ubuntu1604';
				break;
150 151 152 153
			case "16.10":
				$relname = "(Yakkety Yak)";
				$distconfid = 'ubuntu1604';
				break;
Till Brehm's avatar
Till Brehm committed
154 155
			case "16.04":
				$relname = "(Xenial Xerus)";
156
				$distconfid = 'ubuntu1604';
Till Brehm's avatar
Till Brehm committed
157
				break;
158 159 160
			case "15.10":
				$relname = "(Wily Werewolf)";
				break;
161 162 163
			case "15.04":
				$relname = "(Vivid Vervet)";
				break;
164 165 166
			case "14.10":
				$relname = "(Utopic Unicorn)";
				break;
Till Brehm's avatar
Till Brehm committed
167 168 169 170 171 172 173 174 175
			case "14.04":
				$relname = "(Trusty Tahr)";
				break;
			case "13.10":
				$relname = "(Saucy Salamander)";
				break;
			case "13.04":
				$relname = "(Raring Ringtail)";
				break;
176 177
			case "12.10":
				$relname = "(Quantal Quetzal)";
tbrehm's avatar
tbrehm committed
178
				break;
179 180
			case "12.04":
				$relname = "(Precise Pangolin)";
tbrehm's avatar
tbrehm committed
181
				break;
182 183
			case "11.10":
				$relname = "(Oneiric Ocelot)";
tbrehm's avatar
tbrehm committed
184
				break;
185 186
			case "11.14":
				$relname = "(Natty Narwhal)";
tbrehm's avatar
tbrehm committed
187
				break;
188 189
			case "10.10":
				$relname = "(Maverick Meerkat)";
tbrehm's avatar
tbrehm committed
190
				break;
191 192
			case "10.04":
				$relname = "(Lucid Lynx)";
tbrehm's avatar
tbrehm committed
193
				break;
194 195
			case "9.10":
				$relname = "(Karmic Koala)";
tbrehm's avatar
tbrehm committed
196
				break;
197 198
			case "9.04":
				$relname = "(Jaunty Jackpole)";
tbrehm's avatar
tbrehm committed
199
				break;
200
			case "8.10":
tbrehm's avatar
tbrehm committed
201 202
				$relname = "(Intrepid Ibex)";
				break;
203 204
			case "8.04":
				$relname = "(Hardy Heron)";
tbrehm's avatar
tbrehm committed
205
				break;
206 207
			case "7.10":
				$relname = "(Gutsy Gibbon)";
tbrehm's avatar
tbrehm committed
208
				break;
209 210
			case "7.04":
				$relname = "(Feisty Fawn)";
tbrehm's avatar
tbrehm committed
211
				break;
212 213
			case "6.10":
				$relname = "(Edgy Eft)";
tbrehm's avatar
tbrehm committed
214
				break;
215 216
			case "6.06":
				$relname = "(Dapper Drake)";
tbrehm's avatar
tbrehm committed
217
				break;
218 219
			case "5.10":
				$relname = "(Breezy Badger)";
tbrehm's avatar
tbrehm committed
220
				break;
221 222
			case "5.04":
				$relname = "(Hoary Hedgehog)";
tbrehm's avatar
tbrehm committed
223
				break;
224 225
			case "4.10":
				$relname = "(Warty Warthog)";
tbrehm's avatar
tbrehm committed
226
				break;
227 228
			default:
				$relname = "UNKNOWN";
229
				$distconfid = 'ubuntu1604';
tbrehm's avatar
tbrehm committed
230 231
			}
			$distver = $ver.$lts." ".$relname;
232
			swriteln("Operating System: ".$distname.' '.$distver."\n");
tbrehm's avatar
tbrehm committed
233
		} elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') {
tbrehm's avatar
tbrehm committed
234 235 236
			$distname = 'Debian';
			$distver = '4.0';
			$distid = 'debian40';
tbrehm's avatar
tbrehm committed
237
			$distbaseid = 'debian';
238
			swriteln("Operating System: Debian 4.0 or compatible\n");
239
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '5.0')) {
tbrehm's avatar
tbrehm committed
240
			$distname = 'Debian';
Fantu's avatar
Fantu committed
241
			$distver = 'Lenny';
tbrehm's avatar
tbrehm committed
242
			$distid = 'debian40';
tbrehm's avatar
tbrehm committed
243
			$distbaseid = 'debian';
Fantu's avatar
Fantu committed
244
			swriteln("Operating System: Debian Lenny or compatible\n");
245
		} 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
246 247
			$distname = 'Debian';
			$distver = 'Squeeze/Sid';
248
			$distid = 'debian60';
Fantu's avatar
Fantu committed
249
			$distbaseid = 'debian';
250
			swriteln("Operating System: Debian 6.0 (Squeeze/Sid) or compatible\n");
251
		} 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') {
252 253
			$distname = 'Debian';
			$distver = 'Wheezy/Sid';
254
			$distid = 'debian60';
255
			$distbaseid = 'debian';
256
			swriteln("Operating System: Debian 7.0 (Wheezy/Sid) or compatible\n");
257 258 259 260 261 262
		} 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
263
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '9') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '9') {
Oliver's avatar
Oliver committed
264 265
			$distname = 'Debian';
			$distver = 'Stretch';
Till Brehm's avatar
Till Brehm committed
266 267
			$distconfid = 'debian90';
			$distid = 'debian60';
Oliver's avatar
Oliver committed
268
			$distbaseid = 'debian';
269
			swriteln("Operating System: <strong>Debian 9.0 (Stretch)</strong> or compatible\n");
270 271 272
		} elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) {
			$distname = 'Debian';
			$distver = 'Testing';
Oliver's avatar
Oliver committed
273
			$distid = 'debian60';
274 275 276
			$distconfid = 'debiantesting';
			$distbaseid = 'debian';
			swriteln("Operating System: Debian Testing\n");
277
		} else {
278 279
			$distname = 'Debian';
			$distver = 'Unknown';
280 281
			$distid = 'debian60';
			$distconfid = 'debian90';
282 283
			$distbaseid = 'debian';
			swriteln("Operating System: Debian or compatible, unknown version.\n");
oliver's avatar
oliver committed
284 285
		}
	}
286

EndelWar's avatar
EndelWar committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
    //** Devuan
    elseif(file_exists('/etc/devuan_version')) {
		if(false !== strpos(trim(file_get_contents('/etc/devuan_version')), 'jessie')) {
			$distname = 'Devuan';
			$distver = 'Jessie';
			$distid = 'debian60';
			$distbaseid = 'debian';
			swriteln("Operating System: Devuan 1.0 (Jessie) or compatible\n");
		} elseif(false !== strpos(trim(file_get_contents('/etc/devuan_version')), 'ceres')) {
            $distname = 'Devuan';
            $distver = 'Ceres';
            $distid = 'debiantesting';
            $distbaseid = 'debian';
            swriteln("Operating System: Devuan Unstable (Ceres) or compatible\n");
        }
    }

tbrehm's avatar
tbrehm committed
304
	//** OpenSuSE
305
	elseif(file_exists('/etc/SuSE-release')) {
306
		if(stristr(file_get_contents('/etc/SuSE-release'), '11.0')) {
tbrehm's avatar
tbrehm committed
307 308 309
			$distname = 'openSUSE';
			$distver = '11.0';
			$distid = 'opensuse110';
tbrehm's avatar
tbrehm committed
310
			$distbaseid = 'opensuse';
tbrehm's avatar
tbrehm committed
311
			swriteln("Operating System: openSUSE 11.0 or compatible\n");
312
		} elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.1')) {
tbrehm's avatar
tbrehm committed
313 314 315 316 317
			$distname = 'openSUSE';
			$distver = '11.1';
			$distid = 'opensuse110';
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE 11.1 or compatible\n");
318
		} elseif(stristr(file_get_contents('/etc/SuSE-release'), '11.2')) {
319
			$distname = 'openSUSE';
320 321
			$distver = '11.2';
			$distid = 'opensuse112';
322 323 324 325 326
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE 11.2 or compatible\n");
		}  else {
			$distname = 'openSUSE';
			$distver = 'Unknown';
327
			$distid = 'opensuse112';
328 329
			$distbaseid = 'opensuse';
			swriteln("Operating System: openSUSE or compatible, unknown version.\n");
tbrehm's avatar
tbrehm committed
330
		}
tbrehm's avatar
tbrehm committed
331
	}
332 333


oliver's avatar
oliver committed
334
	//** Redhat
335
	elseif(file_exists('/etc/redhat-release')) {
336

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

339
		if(stristr($content, 'Fedora release 9 (Sulphur)')) {
tbrehm's avatar
tbrehm committed
340 341 342
			$distname = 'Fedora';
			$distver = '9';
			$distid = 'fedora9';
tbrehm's avatar
tbrehm committed
343
			$distbaseid = 'fedora';
tbrehm's avatar
tbrehm committed
344
			swriteln("Operating System: Fedora 9 or compatible\n");
345
		} elseif(stristr($content, 'Fedora release 10 (Cambridge)')) {
Falko Timme's avatar
Falko Timme committed
346 347 348 349 350
			$distname = 'Fedora';
			$distver = '10';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Fedora 10 or compatible\n");
351
		} elseif(stristr($content, 'Fedora release 10')) {
352 353 354 355 356
			$distname = 'Fedora';
			$distver = '11';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Fedora 11 or compatible\n");
357
		} elseif(stristr($content, 'CentOS release 5.2 (Final)')) {
tbrehm's avatar
tbrehm committed
358 359 360 361 362
			$distname = 'CentOS';
			$distver = '5.2';
			$distid = 'centos52';
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5.2 or compatible\n");
363
		} elseif(stristr($content, 'CentOS release 5.3 (Final)')) {
364 365
			$distname = 'CentOS';
			$distver = '5.3';
tbrehm's avatar
tbrehm committed
366
			$distid = 'centos53';
367 368
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5.3 or compatible\n");
369
		} elseif(stristr($content, 'CentOS release 5')) {
370 371 372 373 374
			$distname = 'CentOS';
			$distver = 'Unknown';
			$distid = 'centos53';
			$distbaseid = 'fedora';
			swriteln("Operating System: CentOS 5 or compatible\n");
375
		} elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
Till Brehm's avatar
Till Brehm committed
376 377 378 379 380 381 382 383 384
			$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';
385 386 387
			$var=explode(" ", $content);
			$var=explode(".", $var[3]);
			$var=$var[0].".".$var[1];
Marius Burkard's avatar
Marius Burkard committed
388
			$distver = $var;
389 390 391 392 393 394
			if($var=='7.0' || $var=='7.1') {
				$distid = 'centos70';
			} else {
				$distid = 'centos72';
			}
			swriteln("Operating System: CentOS $var\n");
395 396 397 398 399 400
		} else {
			$distname = 'Redhat';
			$distver = 'Unknown';
			$distid = 'fedora9';
			$distbaseid = 'fedora';
			swriteln("Operating System: Redhat or compatible, unknown version.\n");
tbrehm's avatar
tbrehm committed
401
		}
402
	}
403

404
	//** Gentoo
405 406 407 408
	elseif(file_exists('/etc/gentoo-release')) {

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

409
		preg_match_all('/([0-9]{1,2})/', $content, $version);
410 411 412 413 414 415
		$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
416
	} else {
417
		die('Unrecognized GNU/Linux distribution');
oliver's avatar
oliver committed
418
	}
419 420 421
	
	// Set $distconfid to distid, if no different id for the config is defined
	if(!isset($distconfid)) $distconfid = $distid;
422

423
	return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'confid' => $distconfid, 'baseid' => $distbaseid);
424 425 426
}

function sread() {
427 428
	$input = fgets(STDIN);
	return rtrim($input);
429 430
}

tbrehm's avatar
tbrehm committed
431
function swrite($text = '') {
432 433 434
	echo $text;
}

tbrehm's avatar
tbrehm committed
435
function swriteln($text = '') {
436
	echo PXBashColor::getString($text, true)."\n";
437 438 439
}

function ilog($msg){
440
	exec("echo `date` \"- [ISPConfig] - \"".$msg.' >> '.ISPC_LOG_FILE);
441 442 443
}

function error($msg){
444 445
	ilog($msg);
	die($msg."\n");
446 447 448
}

function caselog($command, $file = '', $line = '', $success = '', $failure = ''){
449
	exec($command, $arr, $ret_val);
450 451 452 453 454 455 456 457 458 459 460 461 462
	$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);
	}
463 464 465
}

function phpcaselog($ret_val, $msg, $file = '', $line = ''){
466 467 468 469 470 471 472 473 474 475 476
	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;
477 478 479
}

function mkdirs($strPath, $mode = '0755'){
pedro_morgan's avatar
pedro_morgan committed
480
	if(isset($strPath) && $strPath != ''){
481 482 483 484 485 486 487 488 489 490 491 492 493 494
		//* 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;
495 496
}

497
function rfsel($file, $file2) {
498 499 500
	clearstatcache();
	if(is_file($file)) return rf($file);
	else return rf($file2);
501 502
}

503
function rf($file){
504
	clearstatcache();
tbrehm's avatar
tbrehm committed
505
	if(is_file($file)) {
506
		if(!$fp = fopen($file, 'rb')){
tbrehm's avatar
tbrehm committed
507 508 509 510 511
			ilog('WARNING: could not open file '.$file);
		}
		return filesize($file) > 0 ? fread($fp, filesize($file)) : '';
	} else {
		return '';
512
	}
513 514 515
}

function wf($file, $content){
516
	mkdirs(dirname($file));
517
	if(!$fp = fopen($file, 'wb')){
518 519 520 521
		ilog('WARNING: could not open file '.$file);
	}
	fwrite($fp, $content);
	fclose($fp);
522 523 524
}

function af($file, $content){
525
	mkdirs(dirname($file));
526
	if(!$fp = fopen($file, 'ab')){
527 528
		ilog('WARNING: could not open file '.$file);
	}
529
	fwrite($fp, $content);
530
	fclose($fp);
531 532 533
}

function aftsl($file, $content){
534
	if(!$fp = fopen($file, 'ab')){
535 536
		ilog('WARNING: could not open file '.$file);
	}
537
	fwrite($fp, $content);
538
	fclose($fp);
539 540 541
}

function unix_nl($input){
542 543 544
	$output = str_replace("\r\n", "\n", $input);
	$output = str_replace("\r", "\n", $output);
	return $output;
545 546 547
}

function remove_blank_lines($input, $file = 1){
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
	//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;
	}
570 571 572
}

function no_comments($file, $comment = '#'){
573 574 575 576 577 578 579
	$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){
580
					$new_lines[] = substr($line, 0, $pos);
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
				}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 '';
	}
596 597 598
}

function comment_out($file, $string){
599 600 601 602 603 604 605 606 607 608
	$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);
609 610 611
}

function is_word($string, $text, $params = ''){
612 613 614 615 616 617 618 619 620
	//* params: i ??
	return preg_match("/\b$string\b/$params", $text);
	/*
	if(preg_match("/\b$string\b/$params", $text)) {
		return true;
	} else {
		return false;
	}
	*/
621 622 623
}

function grep($content, $string, $params = ''){
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659
	// 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);
660
		if(substr($ret_val, -1) != "\n") $ret_val .= "\n";
661 662 663 664 665
		$find = NULL;
		return $ret_val;
	} else {
		return false;
	}
666 667 668
}

function edit_xinetd_conf($service){
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
	$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);
699 700
}

701 702
//* Converts a ini string to array
function ini_to_array($ini) {
703
	$config = array();
704 705 706
	$ini = str_replace("\r\n", "\n", $ini);
	$lines = explode("\n", $ini);
	foreach($lines as $line) {
707
		$line = trim($line);
708 709 710 711 712
		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]);
713
				if(!isset($config[$section])) $config[$section] = array();
714 715 716 717 718 719
				$config[$section][$item] = trim($matches[2]);
			}
		}
	}
	return $config;
}
720 721


722
//* Converts a config array to a string
tbrehm's avatar
tbrehm committed
723
function array_to_ini($config_array = '') {
724 725 726 727 728 729
	if($config_array == '') $config_array = $this->config;
	$content = '';
	foreach($config_array as $section => $data) {
		$content .= "[$section]\n";
		foreach($data as $item => $value) {
			if($item != ''){
730 731
				$content .= "$item=$value\n";
			}
732 733 734 735 736 737
		}
		$content .= "\n";
	}
	return $content;
}

738
function is_user($user){
739 740 741 742 743 744 745 746 747 748 749 750 751
	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;
752 753 754
}

function is_group($group){
755 756 757 758 759 760 761 762 763 764 765 766 767
	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;
768 769
}

770
function replaceLine($filename, $search_pattern, $new_line, $strict = 0, $append = 1) {
tbrehm's avatar
tbrehm committed
771
	if($lines = @file($filename)) {
tbrehm's avatar
tbrehm committed
772 773 774 775
		$out = '';
		$found = 0;
		foreach($lines as $line) {
			if($strict == 0) {
776
				if(stristr($line, $search_pattern)) {
tbrehm's avatar
tbrehm committed
777 778 779 780 781 782 783 784 785 786 787 788 789
					$out .= $new_line."\n";
					$found = 1;
				} else {
					$out .= $line;
				}
			} else {
				if(trim($line) == $search_pattern) {
					$out .= $new_line."\n";
					$found = 1;
				} else {
					$out .= $line;
				}
			}
790 791 792 793 794
			if (!$found) {
				if (trim($line) == $new_line) {
					$found = 1;
				}
			}
tbrehm's avatar
tbrehm committed
795 796
		}
		if($found == 0) {
797
			//* add \n if the last line does not end with \n or \r
798
			if(substr($out, -1) != "\n" && substr($out, -1) != "\r") $out .= "\n";
799
			//* add the new line at the end of the file
tbrehm's avatar
tbrehm committed
800
			if($append == 1) $out .= $new_line."\n";
tbrehm's avatar
tbrehm committed
801
		}
802
		file_put_contents($filename, $out);
tbrehm's avatar
tbrehm committed
803
	}
tbrehm's avatar
tbrehm committed
804
}
805

806
function removeLine($filename, $search_pattern, $strict = 0) {
tbrehm's avatar
tbrehm committed
807
	if($lines = @file($filename)) {
tbrehm's avatar
tbrehm committed
808 809 810
		$out = '';
		foreach($lines as $line) {
			if($strict == 0) {
811
				if(!stristr($line, $search_pattern)) {
tbrehm's avatar
tbrehm committed
812 813 814 815 816 817 818 819
					$out .= $line;
				}
			} else {
				if(!trim($line) == $search_pattern) {
					$out .= $line;
				}
			}
		}
820
		file_put_contents($filename, $out);
tbrehm's avatar
tbrehm committed
821
	}
tbrehm's avatar
tbrehm committed
822 823
}

Marius Cramer's avatar
Marius Cramer committed
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
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
841
function is_installed($appname) {
842 843
	exec('which '.escapeshellcmd($appname).' 2> /dev/null', $out, $returncode);
	if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) {
tbrehm's avatar
tbrehm committed
844 845 846 847 848 849
		return true;
	} else {
		return false;
	}
}

850 851 852 853 854 855
/*
* Get the port number of the ISPConfig controlpanel vhost
*/

function get_ispconfig_port_number() {
	global $conf;
856 857 858 859 860 861 862
	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,})\>/';
	}
863

864 865
	if(is_file($ispconfig_vhost_file)) {
		$tmp = file_get_contents($ispconfig_vhost_file);
866
		preg_match($regex, $tmp, $matches);
867
		$port_number = @intval($matches[1]);
868 869 870 871 872 873 874 875
		if($port_number > 0) {
			return $port_number;
		} else {
			return '8080';
		}
	}
}

876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
/*
* 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';
		}
	}
}

902 903 904 905 906 907 908 909 910 911
/*
* 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);
912
		if(stristr($tmp, 'SSLCertificateFile')) {
913 914 915 916 917 918 919
			return true;
		} else {
			return false;
		}
	}
}

920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941
/*
* Is anonymization enabled in ispconfig.conf file
*/

function get_logging_state() {
	global $conf;
	$ispconfig_conf_file = $conf['apache']['vhost_conf_dir'].'/ispconfig.conf';

	if(is_file($ispconfig_conf_file)) {
		$tmp = file_get_contents($ispconfig_conf_file);
		if(stristr($tmp, '/usr/local/ispconfig/server/scripts/vlogger -p -s access.log')) {
			return 'anon';
		} elseif(stristr($tmp, '/usr/local/ispconfig/server/scripts/vlogger -s access.log')) {
			return 'yes';
		} else {
			return 'no';
		}
	} else {
		return 'yes';
	}
}

942 943 944 945 946 947
/**
 Function to find the hash file for timezone detection
 (c) 2012 Marius Cramer, pixcept KG, m.cramer@pixcept.de
 */


948
function find_hash_file($hash, $dir, $basedir = '') {
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976
	$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
 */
977
function get_system_timezone() {
978 979 980 981 982 983 984 985 986
	$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);
987
		$timezone = str_replace('..', '', $timezone);
988 989 990 991 992 993 994 995 996 997
		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
998 999
	
	if(substr($timezone, 0, 1) === '/') $timezone = substr($timezone, 1);
1000 1001

	return $timezone;
1002 1003
}

1004
function getapacheversion($get_minor = false) {
1005 1006 1007 1008 1009 1010
	global $app;
	
	$cmd = '';
	if(is_installed('apache2ctl')) $cmd = 'apache2ctl -v';
	elseif(is_installed('apachectl')) $cmd = 'apachectl -v';
	else {
1011
		ilog("Could not check apache version, apachectl not found.");
1012
		return '2.4';
1013 1014 1015 1016
	}
	
	exec($cmd, $output, $return_var);
	if($return_var != 0 || !$output[0]) {
1017
		ilog("Could not check apache version, apachectl did not return any data.");
1018
		return '2.4';
1019 1020 1021 1022 1023
	}
	
	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 {
1024
		ilog("Could not check apache version, did not find version string in apachectl output.");
1025
		return '2.4';
1026
	}
1027
}
1028

1029 1030 1031 1032 1033 1034 1035
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 {
1036
		ilog("Could not check apache modules, apachectl not found.");
1037 1038 1039
		return array();
	}
	
1040
	exec($cmd . ' 2>/dev/null', $output, $return_var);
1041
	if($return_var != 0 || !$output[0]) {
1042
		ilog("Could not check apache modules, apachectl did not return any data.");
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
		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;
}
1055

root's avatar
root committed
1056 1057
function tRNG(){
	global $conf;
root's avatar
root committed
1058 1059
	$path='/dev/random';$test='/tmp/ispconfig.tRNG';$time=2;$warn=8192;
	echo "Testing $time seconds throughput of $path ... ";
root's avatar
root committed
1060 1061
	exec("cat $path > $test & PID=\$!; sleep $time; kill \$PID");
	if(($result=filesize($test)) < $warn) {
root's avatar
root committed
1062
		echo "$result bytes\n[WARN] these services may fail: {$conf['tRNG']}minimum recommended: $warn\n";
root's avatar
root committed
1063
	}else echo "$result bytes OK\n";
root's avatar
root committed
1064 1065
	unlink($test);
}
1066
?>