====== Система патчингу ====== 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 методи модифікації файлів: через хуки та через заміни. Хук - спеціальна мітка у файлі, що починається з фрагмента #. Далі йде ім'я хука. Патч є вказівкою замінити хук на такий фрагмент коду. При оновленні системи, положення хука може зміниться, але це не вплине на патч. він застосовується не за місцем розташування, а на ім'я хука. Якщо ж у цільовому файлі у потрібному місці немає хука – доведеться скористатися методом заміни. Це не рекомендований спосіб (краще зверніться до автора із проханням створити потрібні хуки). \\ Формат патчу # file=>'web/lang/RU.pl',hook=>'end' $test_test = { msg => 'Yes!!!' }; Рядок, що починається з #, вказує на початок патчу. У цьому рядку повинен бути параметр file - ім'я файлу, який буде модифікуватися. Якщо застосовується метод хуків, то параметр hook вказує ім'я хука. У даному прикладі у файлі /usr/local/nodeny/web/lang/RU.pl знайде хук end і в його позицію буде вставлено фрагмент починаючи з 2-го рядка прикладу. \\ Приклад методу замін # file=>'web/lang/RU.pl',replace=>'' $test_test = { msg => 'Yes!!!' }; # $test_test = { msg => 'No!!!' }; За цим прикладом буде знайдено фрагмент до # і замінено фрагмент після #. Якщо фрагмент не буде знайдений або буде знайдено більше одного збігу - установка модулів перерветься. \\ ---- \\ У деяких випадках патчі потрібно накладати в певному порядку або ж не накладати якщо цільового файлу не існує (припустимо, поточний модуль вносить зміни до інших модулів, деякі з яких можуть бути не встановлені в даній системі). Застосування патча після патчів модуля dhcp # file=>'web/ajUserIpList.pl',hook=>'show_mac',after=>'dhcp' push @mac_lines, 'Hello'; У цьому прикладі, якщо модуль dhcp існує, то будуть застосовані спочатку його патчі до файлу web/ajUserIpList.pl, а потім поточний патч. В іншому випадку просто буде застосований поточний. Обов'язкова вимога існування модуля xxx # file=>'web/yyy.pl',hook=>'zzz',require=>'xxx' Show 'ok'; У параметрі require або after можна вказувати кілька модулів у такому вигляді: require=>['module1', 'module2']