Продолжим тему
Дано:
Одна сеть, в которой, с использованием РРРоЕ, предоставляют услуги оператор А и оператор В, обоих операторов обслуживает один БГБ (почему так и откуда взялся оператор В - лучше даже не спрашивайте).
Пользователи оператора А создаются по шаблону foo${N4} и выходят в инет из VLAN 100-110.
Пользователи оператора В создаются по шаблону bar${N4} и выходят в инет из VLAN 200-205.
Все пользователи имеют алиасы == номеру договора (алиас создается при создании договора).
Задача:
Т.к. пользователи каждого из операторов имеют свои тарифы, условия приема денег и т.д. и т.п. необходимо сделать так чтобы пользователи оператора А не могли выходить в инет из VLAN-ов оператора В и наоборот.
Решение:
Решение предложенное выше ув. Victor (за что ему огромное человеческое СПАСИБО!) хотя и имеет право на жизнь, меня не устроило прежде всего тем что необходимо править массу договоров, а мне хотелось, для упрощения администрирования, вносить изменения ровно в одном месте и я сделал это так:
Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.script.event.*;
import java.util.*;
// события RADIUS-аутентификации (после аутентификации, перед отправкой ответа):
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
errorCode = event.getErrorCode();
request = event.getRequest();
response = event.getResponse();
// логин пользователя из User-Name (attribute 1, string)
login = request.getStringAttribute(RadiusStandartAttributes.User_Name);
// VLAN из NAS-Port-Id (attribute 87, string)
// выглядит как: NAS-Port-Id=1/0/0/VLAN_ID
portId = request.getStringAttribute(87).split("/");
try {
vlan = Integer.parseInt(portId[3]);
} catch (NumberFormatException e) {
print(e.toString());
}
// массив регекспов алиасов
String[] loginArr = {
"^foo[0-9]{4}$",
"^bar[0-9]{4}$"
};
// массив разрешенных для этих алиасов VLAN-ов
int[][] vlanArr = {
{100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110},
{200, 201, 202, 203, 204, 205}
};
// проверка пользователя регекспом
loginArrIdx = -1;
for (i = 0; i < loginArr.length; i++) {
if (login.matches(loginArr[i])) {
loginArrIdx = i;
break;
}
}
if (loginArrIdx == -1) {
response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
print("\nЛогин '" + login + "' не разрешен для входа!");
return;
}
// проверка VLAN из которого пришел пользователь
vlanArrIdx = -1;
for (i = 0; i < vlanArr[loginArrIdx].length; i++) {
if (vlan == vlanArr[loginArrIdx][i]) {
vlanArrIdx = i;
break;
}
}
if (vlanArrIdx == -1) {
response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
print("\nVLAN '" + vlan + "' не разрешен для логина '" + login + "'\nРазрешенные VLAN: " + Arrays.toString(vlanArr[loginArrIdx]));
return;
}
// статистика при нулевом балансе
if (errorCode == 4) {
// код для обработки 691-й ошибки
}
Т.е. есть 2 взаимосвязанных массива: один - с регекспами алиасов, второй - с VLAN-ами для каждого регекспа.
Если алиас попадает под регексп - проверяем есть ли VLAN из которого он пришел в списке разрешенных, если есть - пускаем, если нет - даем отлуп. Если алиас не попадает под регексп - даем отлуп.
Все это работает, но меня терзают смутные сомнения что все можно реализовать как то ... э-э-э ... попроще ... изящнее, что ли ... подскажите, пожалуйста, можно ли упростить алгоритм?
P.S. Правильно ли я понимаю, что конструкцию:
Код:
try {
vlan = Integer.parseInt(portId[3]);
} catch (NumberFormatException e) {
print(e.toString());
}
в биншелле можно привести к виду:
Код:
try {
vlan = Integer.parseInt(portId[3]);
} catch (e) {
print(e.toString());
}
или не правильно?
P.P.S. Есть ли какой нибудь метод которым можно было бы сообщить в монитор сессий о том что пользователя отбило именно скриптом?