Код:
Клиент: вер. 5.2 сборка 1229 от 30.03.2015 16:30:37
os: Windows 7; java: Java HotSpot(TM) Client VM, v.1.8.0_45
ВНИМАНИЕ: Спецификация версии 1.8 не рекомендуется
Сервер: вер. 5.2 сборка 1625 от 30.04.2015 17:59:55
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_26
inet вер. 5.2 сборка 1370 от 30.04.2015 18:00:03
Окружение:
Клиент:
os: Windows 7 x86, 6.1
java: Java HotSpot(TM) Client VM, v.1.8.0_45
jre home: C:\Program Files (x86)\Java\jre1.8.0_45
Сервер:
os: Linux amd64, 3.2.0-4-amd64
java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_26
jre home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre
user story:
Схема с авторизацией по интерфейсу (используется title интерфейса в Calling-Station-Id).
Инженер-подключенец хочет подключить клиента, открывает список интерфейсов устройства (Модули - Inet - Устройства и ресурсы - правкой клавишей на устройстве - "интерфейсы").
В списке интерфейсов не видит нужного и добавляет его руками.
Жмёт "перечитать конфигурацию на серверах".
Заводит сервис Inet на договоре, проверяет авторизацию - "логин не найден".
Начинаем разбираться:
Код:
radius 07-17/10:52:13 INFO [rdsLstnr-p-9-t-7] InetNas - Search serv on deviceId=33; interfaceId=45
radius 07-17/10:51:19 INFO [rdsLstnr-p-9-t-6] InetRadiusProcessor - [username=user1234] InetServ not found.
radius 07-17/10:51:19 INFO [rdsLstnr-p-9-t-6] InetRadiusProcessor - Return code=1
radius 07-17/10:51:19 INFO [rdsLstnr-p-9-t-6] InetRadiusProcessor - RESPONSE_BEFORE_POSTPROCESS:
Packet type: Access-Reject
...
Но! Инженер только что завёл интерфейс с другим id!=45 и тем же title.
При этом в списке интерфейсов я не вижу интерфейса с id=45.
Удаляю сервис, удаляю вновь заведённый дублриованный интерфейс - всё равно в списке не вижу интерфейса с id=45.
Делаю
Код:
select * from inv_device_port_28 where deviceId=33;
- вижу id=45 c нужным title:
Код:
...
| 33 | 44 | 798**** | 1 | 0 | |
| 33 | 45 | 791**** | 1 | 0 | |
| 33 | 47 | 791**** | 1 | 0 | |
| 33 | 48 | 791**** | 1 | 0 | |
...
(звёздочки специально поставил)
Захожу на договор, пытаюсь снова создать сервис - в выборе интерфейса вижу id=45
Т.о. какой-то косяк в построении списка для устройства.
Лезу в код - вижу баг:
ru.bitel.oss.systems.inventory.resource.server.bean.DevicePortDao.list(int deviceId, int status, boolean title, boolean indexList, boolean subscription)
Код:
PreparedStatement ps = listImplPS(
this.tableName + ".deviceId, " + this.tableName + ".port, " + this.tableName + ".status, " + this.tableName + ".ipCategoryId, s.subscriberId, s.subscriberTitle",
"LEFT JOIN inv_device_port_subscription_" + this.mid + " as s ON s.deviceId=" + this.tableName + ".deviceId AND s.port=" + this.tableName + ".port",
this.tableName + ".deviceId=? AND (? OR " + this.tableName + ".status=?)" +
" AND (s.dateFrom IS NULL OR s.dateFrom<=?) AND (s.dateTo IS NULL OR s.dateTo>=?)", "port", 0, 0);
ps.setInt(1, deviceId);
ps.setBoolean(2, status < 0);
ps.setInt(3, status);
В этом селекте join-ится таблица подписок на порт, но условия на даты подписки прописаны не в условии join-а, а во where, поэтому:
1. Если подписок не было - всё ок.
2. Если есть подписка с открытой датой - всё ок.
3. Если были подписки, но все они с date1!=null и date2!=null - интерфейс не будет показан в списке.
Проверил простым кодом в BGBS - так и есть:
Код:
DevicePortDao dao = new DevicePortDao(con, 28);
for(DeviceInterface iface : dao.list(33, 1, true, true, true)){
print(iface.getPort());
}
out:
Код:
GENERATE_TIME: 17.07.15 11:28:28
EXECUTION_STOP_TIME: 17.07.15 11:28:28
PROCESS_TIME: 71
OUT:
0
1
2
3
4
6
7
8
9
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
36
37
38
39
40
41
42
43
44
47
48
- id=45 нет в списке.
Но! Это только один очевидный баг.
Второй - баг или фича: почему модуль Inet даёт завести второй интерфейс с одинаковым Title?
Может быть сделать проверку на это? Хотя бы опциональную (вдруг кому нужно одинаковые title, хотя не представляю, зачем).