-
Notifications
You must be signed in to change notification settings - Fork 0
6 Development Guide
Mr-Method edited this page Aug 28, 2025
·
1 revision
Цей документ призначений для розробників, які хочують розширити функціональність або створити власні модулі вендорів.
Перед створенням нового модуля рекомендується вивчити структуру існуючих:
Доступні модулі вендорів:
-
_Zte.pm- ZTE C220/C300/C320 (EPON/GPON) -
_Zte_c6.pm- ZTE C600 (GPON/XG-PON) -
_Bdcom.pm- BDCOM P33xx/GP36xx (EPON/GPON) -
_Huawei_56.pm- Huawei MA56xx (GPON) -
_Stels11.pm,_Stels12.pm,_Stels16.pm- STELS/C-Data -
_Vsolution.pm- V-Solution V1600D8 (EPON)
Всі модулі мають однакову структуру:
# 1. Функція info() - повертає метадані
sub info {
return {
name => 'VendorName',
pon_types => { 'epon' => 'EPON', 'gpon' => 'GPON' }
};
}
# 2. Конструктор new()
sub new { ... }
# 3. Функція template() - SNMP OID схеми
sub template { ... }
# 4. Головна функція main() - точка входу для моніторингу
sub main { ... }
# 5. Приватні функції парсингу (з "_")
sub _parse_serial { ... }
sub _parse_status { ... }package nod::Pon::Zte;
use strict;
use Debug;
use Net::Telnet::Cisco;
# Метадані модуля
sub info {
return {
name => 'ZTE C3xx',
pon_types => {
'epon' => 'EPON',
'gpon' => 'GPON',
},
};
}
# SNMP OID шаблони
sub template {
my $attr = shift;
my %snmp = ();
# EPON OID'и
$snmp{epon}{monitor} = {
'ONU_SN' => { OID => '.1.3.6.1.4.1.3902.1015.1010.1.1.1.1.1.4', parser => \&_epon_serial },
...
};
# GPON OID'и
$snmp{gpon}{monitor} = {
'ONU_SN' => { OID => '.1.3.6.1.4.1.3902.1012.3.28.1.1.5', parser => \&_gpon_serial },
...
};
return $attr->{TYPE} ? $snmp{$attr->{TYPE}} : \%snmp;
}
# Головна функція моніторингу
sub main {
my $self = shift;
my $step = shift;
return $data unless $self->check_snmp();
$data->{olt} = $self->check_olt() if $self->{status} == 9;
$data->{llid_name} = $self->check_llid();
return $data unless $data->{llid_name};
$data->{onu_list} = $self->monitoring();
$data->{fdb} = $self->get_fdb() if ($self->{cfg}{telnet_fdb_force} || !($step%2));
return $data;
}Функція main() кожного модуля вендора повертає стандартизовану структуру даних у вигляді Perl hashref:
my $data = {
# Інформація про OLT (опціонально)
olt => {
name => 'OLT-01',
ip => '192.168.1.100',
model => 'C300',
firmware => 'v2.1.0',
uptime => '123456',
description => 'ZTE C300 Main OLT'
},
# Мапінг LLID до назв портів (обов'язково)
llid_name => {
'67174401' => '1/1/1',
'67174402' => '1/1/2',
'67174403' => '1/1/3',
# ... інші порти
},
# Список ONU з деталями (основні дані)
onu_list => {
'ZTEG12345678' => {
LLID => '67174401', # Внутрішній ID порту
NAME => '1/1/1', # Назва порту (з llid_name)
ONU_SN => 'ZTEG12345678', # Серійний номер
ONU_STATUS => '1', # Числовий статус
ONU_RX_POWER => '-23.45', # RX потужність в dBm
ONU_TX_POWER => '2.34', # TX потужність в dBm
},
'ZTEG87654321' => {
# ... дані іншої ONU
},
# ... інші ONU
},
# FDB таблиця (опціонально, якщо підтримується)
fdb => {
'67174401' => { # LLID порту
'100' => { # VLAN ID
'00:11:22:33:44:55' => '1/1/1', # MAC => назва порту
'00:AA:BB:CC:DD:EE' => '1/1/1',
# ... інші MAC адреси
},
'200' => {
# ... інші VLAN
}
},
# ... інші порти
}
};Кожен модуль має власну функцію парсингу статусів:
# Приклад для ZTE GPON
sub _gpon_status {
my ($self, $status) = @_;
my %status_map = (
0 => 'logging',
1 => 'LOS',
2 => 'Synchronization',
3 => 'Online',
4 => 'DyingGasp',
5 => 'Power_Off',
6 => 'Offline'
);
return $status_map{$status} || 'Unknown';
}
# Приклад для BDCOM
sub p_status {
my ($self, $status) = @_;
my %status_map = (
1 => 'Online',
2 => 'Offline',
3 => 'LOS'
);
return $status_map{$status} || 'Unknown';
}Мінімально необхідна структура для роботи ядра:
my $minimal_data = {
llid_name => {
'1001' => '1/1/1',
'1002' => '1/1/2'
},
onu_list => {
'VENDOR12345678' => {
LLID => '1001',
NAME => '1/1/1',
ONU_SN => 'VENDOR12345678',
ONU_STATUS => 'Online',
ONU_RX_POWER => '-25.5',
ONU_TX_POWER => '3.2'
}
}
};