ДокументацияПрограммирование → Таблицы БД


admin - таблица администраторов
 id         : id администратора
 login      : логин администратора
 passwd     : зашифрованный пароль
 name       : имя
 post       : должность
 privil     : через запятую привилегии
 usr_grps   : через запятую id групп, к которым есть доступ
 tunes      : настройки
 ext        : пока не используется
 balance    : баланс

Привилегии задаются в виде списка чисел, разделенных запятыми. Каждое число указывает на то, что соответствующая ему привилегия включена. Список соответствий число=привилегия можно узнать из файла web/lang/RU_admin.pl.

Список привилегий и групп клиентов начинается и заканчивается запятыми.

Баланс - сумма всех платежей, которые оформил данный админ клиентам как «наличный платеж».

В настройках хранится список групп, к которым администратор желает работать в первую очередь.



auth_now - таблица текущих авторизаций

Структура:

 id         : автоинкрементное поле
 ip         : ip клиента в текстовом виде
 start      : timestamp начала авторизации
 last       : timestamp последнего подтверждения авторизации
 properties : дополнительные параметры

Модули авторизации устанавливают начало авторизации в start, после чего с каждым подтвержденным запросом авторизации модифицируют поле last текущим временем. Ядро NoDeny удаляет записи, у которых last не модифицировалось в последние xx секунд, т.е. удаляет записи «по таймауту».

properties хранит параметры авторизации, разделенные «;». Обязательный параметр mod - модуль, которым была осуществлена авторизация. «mod=dhcp;user=000cdbdff588» - мак клиента 00:0c:db:df:f5:88.



auth_log - лог авторизаций

Структура:

 id         : автоинкрементное поле
 uid        : id клиента
 ip         : ip клиента (unsigned int)
 start      : начало сессии (timestamp)
 end        : конец сессии (timestamp)
 properties : дополнительные параметры

Когда клиент перестает быть авторизованным, ядро удаляет запись из таблицы auth_now и создает запись в auth_log, при этом параметр properties копируется из auth_now в auth_log



ip_pool - пул ip адресов
 id         : уникальный id записи
 ip         : ip (unsigned int)
 type       : тип ip (статический, динамический, зарезервирован)
 realip     : флаг «реальный ip»
 release    : timestamp освобождения, если ip динамический
 uid        : id клиента
 tags       : теги

Если ip не привязан ни к какому клиенту, то uid = 0. Если ip статический, то он привязывается клиенту навсегда, вернее, до того момента, пока администратор не отвяжет его.

Динамический ip привязывается клиенту во время первой авторизации, после чего устанавливается поле release на пару минут в будущее. Каждое обновление авторизации отодвигает release в будущее. По окончанию авторизации, когда release станет большим текущего времени, поле uid устанавливается в 0.

Теги - текстовые метки через запятую.



nets - описание сетей
  id        : автоинкрементное поле
  preset    : не используется
  priority  : приоритет записи
  class     : номер направления
  net       : сеть в виде xx.xx.xx.xx/yy
  port      : порт (0 - любой)
  comment   : комментарий

NoDeny может классифицировать трафик на основе сетей и портов. Трафик может делиться на направления от 1 до 4 (поле class). Такое деление может использоваться для подсчета объема трафика в раные направления, либо же для организации разных скоростей в разные направления.



pays - таблица платежей и событий
 id         : уникальный id записи
 mid        : id клиента (см. таблицу users)
 cash       : денежная сумма, для всех нефинансовых записей = 0
 time       : timestamp формирования записи
 creator    : автор записи (админ/клиент/ядро)
 creator_id : id автора записи
 creator_ip : ip автора записи, для ядра = 0, что соответствует 0.0.0.0
 reason     : многофункциональное поле, хранит закодированные детали платежа/события
 comment    : обычно сообщение для клиента
 category   : категория платежа, более детально сообщает о внутреннем устройстве
              текущей записи.

Pay.pm по значению category декодирует поле reason.



services

Структура:

    service_id  : id услуги
    module      : модуль, который обрабатывает услугу
    category    : краткое описание модуля услуги
    title       : название услуги
    description : описание услуги
    grp_list    : через запятую группы клиентов, которые могут заказать услугу
    price       : стоимость услуги
    auto_renew  : автопродление услуги, да/нет
    no_renew    : блокировка автопродления, да/нет
    param       : дополнительные параметры

В таблице services описываются услуги, предоставляемые разными модулями.

Поле module хранит имя файла модуля без расширения pm в каталоге /usr/local/nodeny/services/.

Список групп в grp_list начинается и заканчивается запятыми для упрощения sql запросов.



traflost - таблица неучтенного трафика

traflost хранит данные о трафике, который не удалось классифицировать, что свидетельствует о неправильной настройке системы, например, пробросе трафика вне контроля NoDeny либо неправильной настройке NoDeny.

 time       : время среза в timestamp
 traf       : количество байт
 collector  : номер коллектора каким он указан в настройках
 ip1        : ip источника
 ip2        : ip приемника


users - таблица с основными данными клиентов
 id             : id учетной записи клиента
 name           : логин/учетное имя/серийный номер (назначение задается в настройках группы)
 passwd         : зашифрованный пароль
 grp            : id группы (см. табл. user_grp)
 contract       : договор
 contract_date  : timestamp заключения договора
 state          : состояние доступа вкл/выкл
 balance        : баланс
 limit_balance  : граница отключения
 block_if_limit : отключать ли запись при достижении границы отключения
 modify_time    : timestamp последней модификации записи
 fio            : ФИО
 discount       : % скидки
 cstate         : техническое состояние (настроить/ремонт/вирусы...)
 cstate_time    : timestamp последнего изменения поля cstate
 comment        : комментарий
 lstate         : нужна авторизация/всегда онлайн;


users_services - подключенные клиентам услуги

Структура:

 id         : уникальный id записи
 uid        : id учетной записи клиента
 pay_id     : id платежа в таблице pays
 service_id : ссылка на id услуги в таблице services
 tm_start   : timestamp подключения услуги
 tm_end     : timestamp, когда услуга должна завершиться
 next_service_id : после завершения услуги подключится эта услуга
 tags       : теги
 finish_count : сколько раз будет подключаться эта же услуга, после
                чего заменится на next_service_id

В таблице services описываются услуги в общем виде, в таблице users_services конкретно привязываются к клиентам.

Если услуга не создает запись в таблице платежей, то pay_id = 0.

После окончания действия услуги, запись удаляется и если поле next_service_id не равно 0, то создается новая запись, в которой поле service_id устанавливается равным next_service_id.

Теги - перечисленные через запятую ключевые слова, характеристики услуги. Например, слово inet сообщает, что услуга должна давать доступ в интернет. Модуль управления фаерволом сканирует услуги на наличие этого слова.

По умолчанию поле finish_count не существует - его создает модуль long_services.



v_auth_now - некоторые данные клиентов, авторизованных в данный момент

Структура:

    ip          : ip в текстовом виде
    id          : id клиента
    balance     : баланс
    state       : 'off' - доступ заблокирован, 'on' - включен
    limit_money : денежная граница отключения
    in1..in3    : входящий трафик
    out1..out4  : исходящий трафик

Если клиент не блокируется по лимиту (поле block_if_limit таблицы users не установлено), то limit_money в этой view = -9999.



v_ips - список ip, привязанных к клиентам в данный момент

Структура:

    uid         : id клиента
    ip          : ip в текстовом виде
    ipn         : ip в unsigned int
    type        : тип ip (статический/динамический)
    release     : timestamp освобождения ip, если он динамический
    tm_auth     : длительность авторизации, секунд
    start       : timestamp начала авторизации
    last        : timestamp последнего подтверждения авторизации
    properties  : параметры авторизации
    auth        : 1 - авторизован, 0 - нет

Данная view - это объединение таблиц ip_pool и auth_now. Содержит список всех ip, которые выделены клиентам. Если в данный момент ip не авторизован, то tm_auth, start, last и properties равны NULL.



websessions

Структура:

    ses     : сессия
    uid     : id клиента либо администратора
    role    : владелец сесии администратор или клиент
    trust   : 0 - безопасная сессия
    expire  : timestamp времени удаления записи

По умолчанию trust=1, что дает право админу выполнять любые действия. Админ может установить поле в 0, если работает не за доверенным компьютером, поэтому в случае если он отлучится от админки, никто не сможет навредить, поскольку важные действия будут заблокированы.

Если uid = 0, сессия считается служебной (вспомогательной), используется в модуле авторизации по логинуи паролю.



webses_data

Таблица предназначена для передачи данных не через адресную строку браузера, а через базу данных по ключу. Плюсы:

Наглядный пример в админке NoDeny: после сохранения данных, идет редирект, в параметре _unikey ссылка на блок данных, в котором сообщение «Изменения сохранены».

Структура:

    role    : кто создал запись (admin/user)
    aid     : id админа/юзера, создавшего запись
    unikey  : уникальный ключ данных
    module  : модуль для, которого предназначены данные
    data    : данные
    created : timestamp времени создания записи
    expire  : timestamp времени удаления записи

Уникальный ключ генерирует calls.pm когда создает запись. По этому ключу идет выборка данных модулем, для которого они предназначаются. Данные оформляются в виде perl-дампа, который создается Debug->dump($ref);

Формат данных может выбираться в каждом случае свой. Есть ситуация, когда он строго оговорен - это когда ключ unikey передается браузером в параметре _unikey. В этом случае админка берет данные не только из адресной строки, но и из ключа «-input» хеша расшифрованного дампа в поле data.

calls.pm следит за тем, чтобы данные были получены только тем модулем, для которого были созданы. В противном случае, была бы возможность подсунуть некорректные данные иному модулю.

В особых случаях, модуль должен проверять id администратора, если запрещено передавать текущие данные иному.



changes - история изменения данных
id          : автоинкрементное поле
tbl         : имя таблицы в которой произошло изменение
act         : тип изменения (создание/редактирование/удаление)
time        : timestamp
fid         : id ключевого поля
adm         : id администратора, осуществившего изменение
old_data    : хеш данных до изменения в виде perl-кода
new_data    : хеш данных после изменения в виде perl-кода

Например, tbl=services, act=delete, fid=26, adm=2 - означает, что администратор с id=2 удалил запись из таблицы services с service_id = 26.



cards - таблица карточек пополнения счета

Структура:

cid          : серийный номер карты
cod          : код активации
money        : номинал
tm_create    : время генерации карты
tm_end       : время окончания действия
tm_activate  : время активации
adm_create   : id админа, сгенерировавшего карту
alive        : состоянии карты
uid_activate : id клиента, активировавшего карту
adm_owner    : id администратора владельца карты
adm_move     : id администратора, на которого идет перемещение карты

Время активации tm_activate не равное нулю не гарантирует, что карта активирована. Следует читать так: если карта активирована, то tm_activate указывает на время ее активации.

Состояние карты определяется полем alive, которое может принимать значения:

good      : карта не активирована
bad       : карта заблокирована
stock     : карта на складе
activated : активирована

Карту можно активировать только в состоянии «good». Состояние «stock» (на складе) указывает на то, что карта пока еще не вошла в обращение. При генерации карт, им всем выставляется статус «на складе», что является элементом безопасности: предполагается, что администратор производит генерацию большого числа карт и все они отправляются в печать. При этом в реализацию они поступают партиями. Если будет замечена активация карты, которая числится на складе - это может свидетельствовать о том, что произошла утечка кодов пополнений.

В админке администратор может изменить состояние карт на любое при условии, что владельцем является он (поле adm_owner) и карта не находится в состоянии activated.

Поле adm_owner указывает на администратора, который последним физически получил карту пополнения в руки. NoDeny считает, что adm_owner владеет деньгами на сумму, равную номиналу карты. В самом деле, adm_owner либо физически хранит у себя карту пополнения, либо продал ее клиенту и получил за это деньги.

adm_move указывает на администратора, на которого adm_owner желает передать карту. При этом владельцем карты все равно является adm_owner. При подтверждении передачи, adm_move устанавливается в 0, а adm_owner - в id администратора, принявшему карту.

При отказе приема карты, NoDeny устанавливает поля так, как будто получатель отправляет их назад отправителю.



datasetup - описание полей дополнительных данных
id          : id поля
template    : номер шаблона
type        : тип поля
title       : имя поля в удобочитаемом виде
name        : имя поля в таблице data0
flags       : флаги
param       : параметры
comment     : комментарий

У клиентских учетных записей есть фиксированные (постоянные) поля данных и динамические (дополнительные). Дополнительные могут менятся под конкретную сеть, например, поле город/улица/дом/номер паспорта нужны не всем. Поэтому есть возможность создать только нужный набор. Сами дополнительные данные хранятся в таблице data0, имеющей строго те поля, которые описаны в datasetup. Если в data0 есть поля street, house, room, то в datasetup должны быть 3 записи, которые описывают характеристики каждого поля:

Тип: число, строка, да/нет, многострочное, выпадающий список, время и др., смотрите web/Data.pm.

param обычно содержит регулярное выражение для проверки валидности данных в поле. Для поля типа «выпадающий список» в param содержится ключ к типу данных в таблице dictionary.



dictionary - словарь, хранилище разнородных данных в виде ключ-значение
id    : автоинкрементное поле
type  : тип словаря
k     : ключ
v     : значение

Обычно словарь содержит выпадающие списки для данных клиента. В поле type хранится слово - имя словаря. Все строки с одинаковым type считаются входящими в этот словарь. Если значение поля v начинается с символа «~» - это признак того, что в поле хранится хеш в виде perl кода, т.е. несколько значений вместо одного. Например, так хранятся данные о точке топологии: k - номер точки топологии, v - хеш с наименованием точки, а также gps координатами и др.



Z - таблицы

Таблицы, начинающиеся с Z, хранят детализированную статистику трафика:

 uid        : id клиента
 time       : время среза в timestamp
 bytes      : количество байт
 direction  : направление трафика, 1 - к клиенту, 0 - от клиента
 class      : номер типа трафика (локальный/интернет/...)
 uip        : ip клиента (unsigned int)
 ip         : ip удаленной стороны (unsigned int)
 port       : порт удаленной стороны
 proto      : протокол

Поле uip хранит ip клиента в момент среза, т.е. если впоследствии у клиента будет иной, сохраняется возможность узнать какой был на момент среза.