Послуга NoDeny - це запис у таблиці users_services, яка наділяє обліковий запис клієнта певними характеристиками, наприклад, дозволяє доступ в інтернет.
Поле tags зберігає через кому теги, що вказують на характер дії послуги, наприклад, стандартні:
Показати всіх клієнтів, у яких підключено послугу, яка дає доступ в інтернет
SELECT uid FROM users_services WHERE tags LIKE '%, inet, %';
На один обліковий запис можна активувати кілька різних послуг, наприклад, клієнт може замовити послугу «доступ до інтернету 2 Мбіт/сек», а через час «підвищення швидкості в 2 рази на 1 день». Ці послуги можуть співіснувати разом, при цьому перша матиме теги inet та speed, а друга лише speed.
У таблиці users_services зберігаються персональні клієнта властивості послуги, а загальні у таблиці services. Зв'язок полем service_id. У свою чергу, в таблиці services поле module посилається на модуль, який обробляє даний тип послуг.
Персональні властивості послуги: час старту послуги, час закінчення послуги, теги, id послуги, яка буде підключена після закінчення поточного та id платежу, в якому відбувається списання грошей за послугу.
Послуга то, можливо «вічної», тобто. не мати часу закінчення, доки адміністратор не видалить її. Послуга може бути безкоштовною, тобто id платежу = 0. Послуга може мати автоподовження, тобто. id послуги, яка буде встановлена після завершення поточної = 0.
Загальні властивості послуги задаються у таблиці services: ім'я, опис, групи клієнтів, які можуть замовити послугу, вартість. Також у закодованому вигляді містяться параметри специфічні для конкретного модуля послуг. Оскільки неможливо передбачити всі можливі властивості для всіх послуг, специфічні параметри зберігаються у вигляді perl-дампа в полі param.
Поле module посилається на файл, який обробляє послугу. Приклад такого файлу:
файл /usr/local/nodeny/services/test.pm
#!/usr/bin/perl package services::test; use strict; sub description { return 'Послуга нічого не робить, просто знімає гроші'; } sub tunes { return []; } sub set_service { my(undef, %p) = @_; my $service_new = $p{service_new}; my $actions = $p{actions}; $actions->{pay} = { cash => 0 - $service_new->{price}, comment => $service_new->{description}, category=> 100, discount=>$service_new->{discount}, }; } 1;
Модуль послуги повинен мати такі підпрограми:
У прикладі підпрограма tunes повертає посилання на порожній масив, тобто додаткових полів немає. set_service вказує зробити лише одну дію: платіж з категорією 100.
Підпрограма set_service має повернути список дій, які будуть виконані при підключенні послуги:
$actions->{sql}{1} = [ 'INSERT INTO tbl SET field=?', 'xxx' ];
$actions->{pay} = { cash => 10, comment => 'Поповнення рахунку на 10$', category=> 2, };
$actions->{set_service} = { period => 60*60, mode => 0, tags => ',x-tag,', };
Тут у масиві @$fields зберігаються ті специфічні параметри, про які було сказано вище: термін дії, що входить і вихідна швидкість. У описі полів ключ type вказує тип поля за класом Data, наприклад, 1 - ціле позитивне число. Значення value буде запропоновано адміністратору під час створення послуги.
Метод set_service повинен повернути хеш – список дій, які виконає модуль services при підключенні послуги. У прикладі:
Будь-яка з дій необов'язкова, проте формат конкретних дій є суворим.