Патчинг файлов: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
м (Защищена страница «Патчинг файлов» ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только ад…)
Немає опису редагування
 
(Не показано одну проміжну версію цього користувача)
Рядок 2: Рядок 2:


Окончание имени файла не имеет значения. Рекомендуется называть также как тот файл, который будет патчится данным. При этом, если файл находится вне папки web, то в имени файла необходимо указать путь относительно корня NoDeny, заменяя слеши на точки.
Окончание имени файла не имеет значения. Рекомендуется называть также как тот файл, который будет патчится данным. При этом, если файл находится вне папки web, то в имени файла необходимо указать путь относительно корня NoDeny, заменяя слеши на точки.
<br>


Например
Например
Рядок 7: Рядок 9:
create.test.pl              : подразумевается, что будет создан файл web/_test.pl
create.test.pl              : подразумевается, что будет создан файл web/_test.pl
create.kernel.test.txt      : kernel/_test.txt
create.kernel.test.txt      : kernel/_test.txt
patch.web.lang.EN.pl       : web/lang/_EN.pl
patch.lang.EN.pl           : web/lang/_EN.pl
</pre>
</pre>



Поточна версія на 06:58, 19 вересня 2020

install.pl -x проходит по всем подпапкам /usr/local/nodeny/modules и находит файлы, начинающиеся с patch или create. Если файл начинается с patch - считается, что в нем находятся патчи для существующих файлов. Если с create - создание нового файла.

Окончание имени файла не имеет значения. Рекомендуется называть также как тот файл, который будет патчится данным. При этом, если файл находится вне папки web, то в имени файла необходимо указать путь относительно корня NoDeny, заменяя слеши на точки.


Например

create.test.pl              : подразумевается, что будет создан файл web/_test.pl
create.kernel.test.txt      : kernel/_test.txt
patch.lang.EN.pl            : web/lang/_EN.pl

Обратите внимание, что имена результирующих файлов всегда начинаются с подчеркивания. Исходные файлы никогда не изменяются! Файлы с подчеркиваниями в начале имени называются фантомами. Механизм работы заключается в том, что если NoDeny находит фантом - загружается он, иначе загружается оригинал.

Такая схема не приводит к конфликтам при обновлении - обновляются оригиналы, после чего на них накладываются патчи и записываются в фантомы.

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

Существует 2 метода модификации файлов: через хуки и через замены. Хук - специальная метка в файле, начинающаяся с фрагмента #<HOOK>. Далее идет имя хука. Патч представляет собой указание заменить хук на такой-то фрагмент кода.

При обновлении системы, положение хука может изменится, но это не повлияет на патч т.к. он применяется не по местоположению, а по имени хука.

Если же в целевом файле в нужном месте нет хука - придется воспользоваться методом замены. Это не рекомендованный способ (лучше обратитесь к автору с просьбой создать нужные хуки).


Формат патча

#<ACTION> file=>'web/lang/RU.pl',hook=>'end'
$test_test = {
    msg => 'Yes!!!'
};

Строка, начинающаяся с #<ACTION>, указывает на начало патча. В этой строке должен присутствовать параметр file - имя файла, который будет модифицироваться. Если применяется метод хуков, то в параметре hook указывается имя хука.

В данном примере в файле /usr/local/nodeny/web/lang/RU.pl будет найдет хук end и в его позицию будет вставлен фрагмент начиная со 2й строки примера.


Пример метода замен

#<ACTION> file=>'web/lang/RU.pl',replace=>''
$test_test = {
    msg => 'Yes!!!'
};
#<REPLACE>
$test_test = {
    msg => 'No!!!'
};

По данному примеру будет найден фрагмент до #<REPLACE> и заменен на фрагмент после #<REPLACE>. Если фрагмент не будет найден либо же будет найдено более чем одно совпадение - установка модулей прервется.


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

Применение патча после патчей модуля dhcp

#<ACTION> file=>'web/ajUserIpList.pl',hook=>'show_mac',after=>'dhcp'
    push @mac_lines, 'Hello';

В данном примере, если модуль dhcp существует, то будут применены сначала его патчи к файлу web/ajUserIpList.pl, а затем текущий патч. В противном случае просто будет применен текущий.

Обязательное требование существования модуля xxx

#<ACTION> file=>'web/yyy.pl',hook=>'zzz',require=>'xxx'
    Show 'ok';

В параметре require или after можно указывать несколько модулей в таком виде:

require=>['module1', 'module2']