Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Bind ¶
Bind - одна запись привязки клиента к порту устройства (или просто к IP/MAC для источников без устройства/порта, например smart). ID - уникальный ключ записи у внешнего источника: по нему приходят точечные обновления через Redis (см. BindEvent), не затрагивающие остальные записи.
type BindEvent ¶
type BindEvent struct {
DBType string `json:"db_type"`
Action string `json:"action"`
Object BindEventObject `json:"object"`
}
BindEvent - точечное изменение одной записи в bind-источнике (см. Config.Binds), приходит через Redis pub/sub в дополнение к периодическому полному reload по HTTP. В отличие от reload, применяется без перезагрузки всего источника - патчит по месту только запись с данным id, остальные записи не затрагиваются.
Формат сообщения (JSON) задан внешней системой:
{"db_type":"binds","action":"delete","object":{"id":123}}
{"db_type":"binds","action":"add","object":{"id":123,"ip":16909060,"mac":"AABBCCDDEEFF","device_mac":"AABBCCDDEEFF","port":44}}
{"db_type":"binds","action":"update","object":{"id":123,"ip":16909060,"mac":"AABBCCDDEEFF","device_mac":"AABBCCDDEEFF","port":44}}
db_type должен совпадать с одним из ключей Config.Binds (например "clients"/"smart", или один ключ "binds", если у источника только одно имя). device_mac/port опциональны - их отсутствие/пустое значение означает запись без привязки к устройству/порту (как у "smart" в HTTP-источнике). "add" и "update" оба означают upsert по object.id: если запись с таким id уже есть - заменяется целиком, если нет - создаётся.
type BindEventObject ¶
type Config ¶
type Config struct {
DevicesURL string `yaml:"devices_url"`
Binds map[string]string `yaml:"binds"`
RefreshInterval time.Duration `yaml:"refresh_interval"`
Timeout time.Duration `yaml:"timeout"`
Redis RedisConfig `yaml:"redis"`
}
Config - параметры загрузки внешней базы устройств и привязок. Используется только скриптами (lua), api про этот пакет не знает. devices_url обязателен, binds - произвольный набор именованных источников (например clients/smart), доступных из lua через db:getBind(name, ...). Redis - опционально: точечные обновления записей binds по ID между полными reload'ами (см. BindEvent). Если Redis.Addr не задан - подписка не запускается.
type RedisConfig ¶
type RedisConfig struct {
Addr string `yaml:"addr"`
Password string `yaml:"password"`
DB int `yaml:"db"`
Channel string `yaml:"channel"` // канал pub/sub, в который внешняя система публикует BindEvent (JSON)
}
RedisConfig - подписка на точечные обновления binds через Redis pub/sub (см. BindEvent), в дополнение к периодическому полному reload по HTTP. Полностью опциональна: если Addr не задан, подписка не запускается и Store работает как раньше, только на периодическом reload.
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
Store - потокобезопасное хранилище с периодическим обновлением из HTTP-источников. Чтение (Get*) не блокируется обновлением - снапшот подменяется атомарно целиком. Дополнительно binds могут точечно патчиться по ID через Redis pub/sub (см. ApplyBindEvent) - это мутирует конкретный *bindIndex на месте (под его mu), не трогая остальную часть snapshot и не требуя полного reload.
func New ¶
New синхронно загружает базу при старте (fail-fast), поднимает (если настроено) подписку на точечные обновления binds через Redis и запускает фоновое полное обновление по HTTP.
func (*Store) ApplyBindEvent ¶
ApplyBindEvent применяет точечное изменение (см. BindEvent), не затрагивая остальные записи и не запуская полный reload. Если в этот момент выполняется reload() (от начала HTTP-запроса к источнику до фактической подмены снапшота) - событие не применяется сразу, а откладывается (см. Store.pendingLive) и накатывается на актуальный снапшот сразу после reload (см. finishReload) - иначе оно применилось бы к снапшоту, который через мгновение целиком заменят, и было бы потеряно. Вне окна reload применяется немедленно, как и раньше.
func (*Store) Close ¶
func (s *Store) Close()
Close останавливает фоновое обновление и подписку на Redis (если была поднята)
func (*Store) GetBind ¶
GetBind ищет привязки в именованном источнике dbName (см. Config.Binds). mac - мак-адрес клиента, deviceMac/port - опциональные уточнения. mac тоже может быть пустым, если заданы deviceMac+port - тогда ищутся все привязки на этом порту устройства независимо от мак-адреса клиента (порт, отданный под общий пул). Возвращает все совпадения - пустой слайс, если ничего не найдено (в т.ч. если такого dbName нет вовсе)
func (*Store) GetBindByID ¶
GetBindByID ищет одну запись по её уникальному ID в именованном источнике dbName. Используется в основном для проверки результата точечных обновлений (см. ApplyBindEvent).