Патчинг файлов
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.web.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']