Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
/**
* Description of class
*
* @author croydon
*/
class ISPConfigBaseOS {
private $ispc_config = false;
private static $os_data = null;
/**
* @return array
* @throws ISPConfigOSException
*/
public static function getOSVersion() {
if(self::$os_data === null) {
if(file_exists('/etc/os-release')) {
$os = ISPConfigFunctions::ini_read('/etc/os-release');
if(!isset($os['ID']) && isset($os['NAME'])) {
$os['ID'] = strtolower(preg_replace('/^(\S*)\s*.*?$/', '$1', $os['NAME']));
}
if(!isset($os['ID']) || !$os['ID']) {
throw new ISPConfigOSException('Detection of OS failed.');
}
if($os['ID'] !== 'debian' && $os['ID'] !== 'ubuntu') {
throw new ISPConfigOSException($os['ID'] . ' is not a supported distribution.');
}
if(!isset($os['VERSION_ID']) && isset($os['VERSION'])) {
$os['VERSION_ID'] = preg_replace('/^([0-9\.]+)(\s.*?)?$/', '$1', $os['VERSION']);
}
if(!isset($os['VERSION_ID']) || !$os['VERSION_ID']) {
throw new ISPConfigOSException('Could not detect version of distribution ' . $os['ID']);
}
if($os['ID'] === 'debian') {
if(!in_array($os['VERSION_ID'], array('9', '10'))) {
throw new ISPConfigOSException('Version ' . $os['VERSION_ID'] . ' is not supported for ' . $os['ID']);
}
} elseif($os['ID'] === 'ubuntu') {
if(!in_array($os['VERSION_ID'], array('18.04'))) {
throw new ISPConfigOSException('Version ' . $os['VERSION_ID'] . ' is not supported for ' . $os['ID']);
}
} else {
// cannot be reached, but just to be on the safe side ...
throw new ISPConfigOSException($os['ID'] . ' is not a supported distribution.');
}
self::$os_data = array(
'ID' => $os['ID'],
'VERSION' => $os['VERSION_ID'],
'NAME' => (isset($os['PRETTY_NAME']) ? $os['PRETTY_NAME'] : ucfirst($os['ID']) . ' ' . (isset($os['VERSION']) ? $os['VERSION'] : $os['VERSION_ID']))
);
throw new ISPConfigOSException('Unknown or unsupported OS.');
}
return self::$os_data;
}
/**
* @return ISPConfigBaseOS
* @throws Exception
*/
public static function getOSInstance() {
try {
$os = self::getOSVersion();
$class_name = 'ISPConfig' . ucfirst($os['ID']) . $os['VERSION'] . 'OS';
if(!is_file(LIB_DIR . '/os/class.' . $class_name . '.inc.php')) {
$class_name = 'ISPConfig' . ucfirst($os['ID']) . 'OS';
}
return new $class_name;
} catch(Exception $ex) {
throw $ex;
}
}
public function __construct() {
}
public function exec($cmd, $returncodes_ok = array(), $tries = 1, $retry_codes = null) {
$result = false;
while($result === false && $tries > 0) {
$return_var = 0;
$output = array();
exec($cmd, $output, $return_var);
ISPConfigLog::debug('CMD: ' . $cmd . ' returned code ' . $return_var);
if($return_var === 0 || (!empty($returncodes_ok) && is_array($returncodes_ok) && in_array($return_var, $returncodes_ok, true))) {
$result = implode("\n", $output);
} elseif(is_array($retry_codes) && !empty($retry_codes) && !in_array($return_var, $retry_codes)) {
break;
}
$tries--;
}
return $result;
}
public function passthru($cmd, $returncodes_ok = array(), $tries = 1, $retry_codes = null) {
$result = false;
while($result === false && $tries > 0) {
$return_var = 0;
passthru($cmd, $return_var);
ISPConfigLog::debug('CMD: ' . $cmd . ' returned code ' . $return_var);
if($return_var === 0 || (!empty($returncodes_ok) && is_array($returncodes_ok) && in_array($return_var, $returncodes_ok, true))) {
$result = true;
} elseif(is_array($retry_codes) && !empty($retry_codes) && !in_array($return_var, $retry_codes)) {
break;
}
$tries--;
}
return $result;
}
protected function addLines($file, $entries, $add_if_existing = false) {
if(!is_array($entries)) {
$entries = array($entries);
}
$content = '';
if(is_file($file)) {
$content = file_get_contents($file);
}
foreach($entries as $line) {
if($add_if_existing === true || !preg_match('/^' . preg_quote($line) . '$/m', $content)) {
$content .= "\n" . $line . "\n";
}
}
protected function uncommentLines($file, $entries, $commenter = '#') {
return $this->commentUncommentLines($file, $entries, true, $commenter);
protected function commentLines($file, $entries, $commenter = '#') {
return $this->commentUncommentLines($file, $entries, false, $commenter);
private function commentUncommentLines($file, $entries, $uncomment = false, $commenter = '#') {
if(!is_array($entries)) {
throw new ISPConfigOSException('Invalid entries array provided.');
if(!is_file($file)) {
throw new ISPConfigOSException('File ' . $file . ' does not exist.');
$active_entry = false;
$lines = explode("\n", $content);
$new_lines = array();
for($l = 0; $l < count($lines); $l++) {
$line = $lines[$l];
if($active_entry) {
if(!isset($active_entry['last_line']) || !$active_entry['last_line']) {
$active_entry = false;
} elseif(preg_match($active_entry['last_line'], $line)) {
$active_entry = false;
if(!isset($active_entry['skip_last_line']) || !$active_entry['skip_last_line']) {
if($uncomment === true) {
$line = preg_replace('/^(\s*)' . preg_quote($commenter, '/') . '+[ \t]*/', '$1', $line);
} else {
$line = $commenter . $line;
}
}
} elseif(isset($active_entry['search']) && $active_entry['search']) {
if(!is_array($active_entry['search'])) {
$active_entry['search'] = array($active_entry['search']);
}
for($i = 0; $i < count($active_entry['search']); $i++) {
if(preg_match($active_entry['search'][$i], $line)) {
if($uncomment === true) {
$line = preg_replace('/^(\s*)' . preg_quote($commenter, '/') . '+[ \t]*/', '$1', $line);
}
break;
}
}
}
}
// not possible using "else" here because last line of active entry might be first of new
if(!$active_entry) {
for($i = 0; $i < count($entries); $i++) {
$entry = $entries[$i];
if(!isset($entry['first_line'])) {
throw new ISPConfigOSException('Invalid entry (no last or first line).');
}
if(preg_match($entry['first_line'], $line)) {
if($uncomment === true) {
$line = preg_replace('/^(\s*)' . preg_quote($commenter, '/') . '+[ \t]*/', '$1', $line);
}
$active_entry = $entry;
break;
}
}
if($active_entry && isset($active_entry['add_lines'])) {
$add = $active_entry['add_lines'];
if(!is_array($add)) {
$add = array($add);
}
$line .= "\n" . implode("\n", $add);
}
}
$new_lines[] = $line;
}
$content = implode("\n", $new_lines);
unset($new_lines);
unset($lines);
copy($file, $file . '~' . strftime('%Y%m%d%H%M%S', time()));
file_put_contents($file, $content);
return true;
}
/**
* @param string $file
* @param array $replacements
* @param boolean $add_if_missing
* @param string $add_to_section
* @return boolean
* @throws ISPConfigOSException
*/
protected function replaceContents($file, $replacements, $add_if_missing = false, $add_to_section = null) {
if(!is_array($replacements)) {
throw new ISPConfigOSException('Invalid replacement array provided.');
}
$content = '';
$matches = array();
if(is_file($file) == false) {
file_put_contents($file, '');
}
foreach($replacements as $search => $replace) {
$if_not = false;
if(is_array($replace)) {
$if_not = $replace['ifnot'];
$replace = $replace['replace'];
}
$need_to_add = false;
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
if($add_if_missing == true && !preg_match($search, $content)) {
$need_to_add = true;
} else {
if($if_not) {
if(preg_match($search, $content, $matches)) {
if(strpos($matches[0], $if_not) !== false) {
// dont add!
continue;
}
}
}
$content = preg_replace($search, $replace, $content);
}
} else {
if($add_if_missing == true && !strpos($content, $search)) {
$need_to_add = true;
} else {
$content = str_replace($search, $replace, $content);
}
}
if($need_to_add === true) {
if($add_to_section) {
$section_found = false;
$lines = explode("\n", $content);
$new_lines = array();
$in_section = false;
for($l = 0; $l < count($lines); $l++) {
$line = $lines[$l];
if(preg_match('/^\[([^\]]+)?\]/', $line, $matches)) {
if($matches[1] == $add_to_section) {
$in_section = true;
$section_found = true;
} elseif($in_section === true) {
$new_lines[] = "\n" . $replace . "\n";
$in_section = false;
}
}
$new_lines[] = $line;
}
$content = implode("\n", $new_lines);
unset($lines);
unset($new_lines);
if($section_found === false) {
$content .= "\n\n" . '[' . $add_to_section . ']' . "\n" . $replace . "\n";
}
} else {
$content .= "\n" . $replace;
}
}
}
copy($file, $file . '~' . strftime('%Y%m%d%H%M%S', time()));
file_put_contents($file, $content);
return true;
}
if(is_string($packages)) {
$packages = array($packages);
}
$cmd = str_replace('<PACKAGES>', implode(' ', $packages), $cmd);
return $cmd;
}
protected function updatePackageList() {
$cmd = $this->getUpdateCommand('prepare');
return $this->exec($cmd, null, 3, array('100'));
}
protected function installPackages($packages) {
$cmd = $this->getInstallCommand($packages);
return $this->exec($cmd, null, 3);//, array('100'));
}
protected function restartService($service_name) {
$cmd = $this->getRestartServiceCommand($service_name);
return $this->exec($cmd);
}
protected function startService($service_name) {
$cmd = $this->getRestartServiceCommand($service_name, 'start');
return $this->exec($cmd);
}
protected function stopService($service_name) {
$cmd = $this->getRestartServiceCommand($service_name, 'stop');
return $this->exec($cmd);
}
protected function isServiceRunning($service_name) {
$cmd = $this->getRestartServiceCommand($service_name, 'status');
$result = $this->exec($cmd);
if($result === false) {
return false;
} else {
return true;
}
}
protected function getSystemPHPVersion() {
return '7.3';
}
protected function afterPackageInstall($section = '') {
}
protected function beforePackageInstall($section = '') {
}
public function getPackageVersion($package) {
}
public function getPackageAlias($package) {
}
public function getUpdateCommand($mode = 'update') {
}
public function getUpdatePackageRegex() {
}
public function getInstallPackageRegex($mode = '') {
}
public function getRestartServiceCommand($service, $command = 'restart') {
}