Table of Contents |
---|
Мануал по работе с фреймворком ABillS
Форматирование кода
- Для отступов не использовать табуляций, только двойные пробелы
Форматирование if else:
Code Block language perl if (expr) { ... } else { ... }
Однострочные или-выражения
Code Block | ||
---|---|---|
| ||
$result = ($total_users == 1) ? "Ok" : "Fail"; |
- Для удобства форматирования кода можно воспользоваться утилитой perltidy
https://support.abills.net.ua/perltidy.cgi
Переменные
Переменные указываются строчными буками
Code Block language perl $test, @devices, %switch
Объекты указываются с заглавной
Code Block language perl $Test = Test->new();
Массивы указываются в множественном числе
Code Block language perl my @devices = (); my @users = ();
Хеши в единственном
Code Block language perl %status_list = (); $status_list{disable}=1;
Общий шаблон функций
Code Block | ||
---|---|---|
| ||
#********************************************************** =head2 test_function($attr) - Test function Arguments: $attr - Extra attributes TEXT - Some text Returns: TRUE or FALSE Example: test_function({ TEXT => 'Some text' }); =cut #********************************************************** sub test_function { my ($attr) = @_; print "Hello world!"; return 1; } |
Рекомендации:
- Отделяйте шапки функций звёздочками (58 штук).
- Не игнорируйте создание комментариев перед началом функции.
- Называйте функции строчными буквами с разделением нижним подчёркиванием.
По умолчанию, в случае успешного выполнения функция должна возвращать 1, в случае ошибки - 0.
Минимизируйте использование глобальных переменных в функциях.
Дата обновления в шапке модуля
Дату обновления модуля следует указывать в шапке модуля (в начале файла) в формате YYYYMMDD.
Пример:
Code Block | ||
---|---|---|
| ||
=head1 Cdata C-data MODEL: epon FD1104SN ... DATE: 20190704 UPDATE: 20210324 =cut |
DATE - дата создания модуля
UPDATE - дата обновления модуля
Указывать дату правильно важно для коммерческих модулей, так как скрипт обновления update.sh ожидает увидеть дату в этом формате.
Можно ли использовать HTML в коде?
Ни в коем случае не используйте HTML в коде управляющей модели, вместо этого используйте объекты Abills::HTML или шаблоны.
Дополнительные модули
Загрузка дополнительных модулей Perl осуществляется командой
Code Block | ||
---|---|---|
| ||
load_pmodule('Simple::XML'); |
(Библиотека Misc.pm
)
С проверкой ошибок код выглядит так:
Code Block | ||
---|---|---|
| ||
my $loaded_imager_error = load_pmodule( "Imager", { RETURN => 1 } ); if ( $loaded_imager_error ) { print $loaded_imager_error; return 0; } |
Дополнительные модули с автоустановкой
Загрузка дополнительных модулей Perl с автоустановкой осуществляется командой
Code Block | ||
---|---|---|
| ||
load_perl_module('SQL::Translator'); |
(Библиотека PModules.pm
)
Поиск в полях
Для удобства поиска было разработано несколько разделителей.
Для цифровых полей
Разделитель запятая (,) обозначает AND.
Пример: искать значения поля 56 и 66
Code Block | ||
---|---|---|
| ||
56,66 |
Разделитель точка с запятой (;) обозначает OR.
Пример: искать значения поля 56 или 66
Code Block | ||
---|---|---|
| ||
56;66 |
Тестирование
Для тестирования системы существует каталог с тестами abills/t.
Code Block | ||
---|---|---|
| ||
make |
Жесткий тест работоспособности, никогда его не выполняйте на рабочей системе, чревато пропажей данных
Code Block | ||
---|---|---|
| ||
perl web.t brutal |
тестирование синтаксиса и стресс-тест веб-приложений
Warning |
---|
НЕ ИСПОЛЬЗОВАТЬ НА ПРОДАКШН СИСТЕМЕ |
Тест проверки авторизации и аккаунтинга
Code Block | ||
---|---|---|
| ||
t/Aaa.t |
Проверка DHCP авторизации используя приготовленный RAD PAIRS пакет dhcp.discover
Code Block | ||
---|---|---|
| ||
perl Aaa.t dhcp_test dhcp.discovery |
Тестирование абон. платы тарифного плана
Code Block | ||
---|---|---|
| ||
perl Tariffs.t FILENAME=tp_test1.tp |
FILENAME - файл с описанием тарифного плана и параметров абонента.
Для задания логина и пароля авторизации используется файл t/.test
Code Block | ||
---|---|---|
| ||
login:password |
В системе также есть специальный скрипт запуска выделенных тестов, которые хранятся в отдельных каталогах: Запуск тестов для модуля или папки
Создание демона
Code Block | ||
---|---|---|
| ||
use Abills::Base; use Abills::Server; my $ARGV = parse_arguments(\@ARGV); # Демонизация и ведение лога if (defined($ARGV->{'-d'})) { my $pid_file = daemonize(); #ведение лога #$Log->log_print('LOG_EMERG', '', "$prog_name Daemonize... $pid_file"); } # Остановка процесса elsif (defined($ARGV->{stop})) { stop_server(); exit; } # Проверка, не запущен ли уже elsif (make_pid() == 1) { exit; } # Таймаут между запусками 100 секунд my $UPDATE_TIME=100; while (1) { check_activity({ ALL => ($ARGV->{RECONFIG_PERIOD}) ? undef : $all }); sleep $UPDATE_TIME; |
Языковые маркеры
Сохраняются в глобальном хеше %lang
.
Пример:
Code Block | ||
---|---|---|
| ||
$lang{LANG_MARKER} = 'Языковой маркер'; |
Названия маркеров обязательно писать заглавными буквами.
Отображение в шаблонах:
Code Block | ||
---|---|---|
| ||
_{LANG_MARKER}_ |
Переменные внутри lang
Code Block | ||
---|---|---|
| ||
$lang{LANG_MARKER_WITH_VARS} = 'У абонента минус %DEPOSIT%'; |
И использовать функцию:
Code Block | ||
---|---|---|
| ||
use Abills::Base qw(vars2lang); vars2lang($lang{LANG_MARKER_WITH_VARS}, { DEPOSIT => '5' }); |
Но, конечно, вы можете использовать любой string с такой разметкой.
JSON тестирование
Для того, чтобы протестировать функцию:
- Создайте тест в /usr/abills/t
Подключите JSON.t
Code Block language perl require "./JSON.t";
Создайте JSON, заполнив его. API_KEY - ключ API текущего администратора
Code Block language perl my @test_list = ( { name => 'InfoFields', params => { qindex => 96, API_KEY => '1523615231263123', json => 1 }, result => '', valid_json => 1, schema => { } } );
Передайте данные в функцию json_test
Code Block language perl json_test( \@test_list, { TEST_NAME => 'info_fields_new test' });
Выполните ваш тест, запустив программу
Code Block language bash # prove -v <название теста>.t