Створення модулів послуг

Послуга 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 при підключенні послуги. У прикладі:

Будь-яка з дій необов'язкова, проте формат конкретних дій є суворим.