Vip

<<< Назад

Постобработка файлов после обновления Majordomo

После очередного обновления Majordomo слетают собственные изменения в файлах.
Простой метод повторения изменений в файлах после их перезаписи очередным обновлением Majordomo.

Например, я ввёл собственные языковые переменные

'GENERAL_ROOM_BALCONY' => 'Балкон',
'GENERAL_ROOM_KIDSROOM' => 'Детская'
в файлах локализаций:

  • /var/www/html/languages/default.php
  • /var/www/html/languages/ru.php
  • /var/www/html/languages/ua.php
    После обновления Majordomo эти значения перезатираются.

Для автоматического изменения языковых файлов после обновления я добавил метод firmwareUpdated в класс Computer. Изменил свойство LatestUpdateTimestamp таким образом, что бы при изменении вызывался новосозданный метод.

После этого в объекте MyComputer добавил в метод firmwareUpdated следующий код:

$filename = "/var/www/html/languages/default.php";
$str_old = "    'GENERAL_ROOM_TOILET' => 'Toilet',";
$str_new = "    'GENERAL_ROOM_TOILET' => 'Toilet',\n    'GENERAL_ROOM_BALCONY' => 'Balcony',\n    'GENERAL_ROOM_KIDSROOM' => 'Kidsroom',";

$res_array = replace_in_file_with_check($filename, $str_old, $str_new);

$filename = "/var/www/html/languages/ru.php";
$str_old = "    'GENERAL_ROOM_TOILET' => 'Туалет',";
$str_new = "    'GENERAL_ROOM_TOILET' => 'Туалет',\n    'GENERAL_ROOM_BALCONY' => 'Балкон',\n    'GENERAL_ROOM_KIDSROOM' => 'Детская',";

$res_array = replace_in_file_with_check($filename, $str_old, $str_new);

$filename = "/var/www/html/languages/ua.php";
$str_old = "    'GENERAL_ROOM_TOILET' => 'Туалет',";
$str_new = "    'GENERAL_ROOM_TOILET' => 'Туалет',\n    'GENERAL_ROOM_BALCONY' => 'Балкон',\n    'GENERAL_ROOM_KIDSROOM' => 'Дитяча',";

$res_array = replace_in_file_with_check($filename, $str_old, $str_new);

При этом две пользователские функции, которые используются в коде можно объявить тут же, либо вынести в отдельный файл с пользовательскими функциями:

/**

  • Replace text in file with check for previous replacement
  • @param $FilePath fullpath to the file
  • @param $OldText text to be changed if not already changed
  • @param $NewText text for change if not already changed
  • @return array $Result ('status', 'message', 'check')
    */

function replace_in_file_with_check($FilePath, $OldText, $NewText)
{
$Result = array('status' => 'error', 'message' => '', 'check' => '');
$fileexists = file_exists($FilePath);
if ($fileexists) {
$file = file_get_contents($FilePath);
$strpos = strpos($file, $NewText);
if($strpos) { //проверка на наличие заменяемой строки
$Result['status'] = $res['status'];
$Result['message'] = $res['message'];
$Result['check'] = "Файл $FilePath существует. Он уже обновлён.";
} else {
$res = replace_in_file($FilePath, $OldText, $NewText);
$Result['status'] = $res['status'];
$Result['message'] = $res['message'];
$Result['check'] = "Файл $FilePath существует. Он ещё не обновлён. Обновляем.";
}
} else {
//Файл $FilePath не существует
$Result['status'] = 'error';
$Result['message'] = $res['message'];
$Result['check'] = "Файл $FilePath не существует";
}
return $Result;
}

/**

  • Replace text in file without check for previous replacement
  • @param $FilePath fullpath to the file
  • @param $OldText text to be changed
  • @param $NewText text for change
  • @return array $Result ('status', 'message')
    */

function replace_in_file($FilePath, $OldText, $NewText)
{
$Result = array('status' => 'error', 'message' => '');
if(file_exists($FilePath)===TRUE)
{
if(is_writeable($FilePath))
{
try
{
$FileContent = file_get_contents($FilePath);
$FileContent = str_replace($OldText, $NewText, $FileContent);
if(file_put_contents($FilePath, $FileContent) > 0)
{
$Result["status"] = 'success';
}
else
{
$Result["message"] = 'Error while writing file';
}
}
catch(Exception $e)
{
$Result["message"] = 'Error : '.$e;
}
}
else
{
$Result["message"] = 'File '.$FilePath.' is not writable !';
}
}
else
{
$Result["message"] = 'File '.$FilePath.' does not exist !';
}
return $Result;
}

В результате,
после обновления Majordomo вызывается метод firmwareUpdated и добавляет необходимые изменения в файлы локализаци.
Таким же способом можно выполнять изменения и в других файлах Majordomo.

Обсуждение (2) (1)

Kiev, Ukraine

На форуме: Vip