Патчинг файлов

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку

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']