Код:
package ru.xxx.inet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import bitel.billing.common.IPUtils;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScript;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetInterface;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetDeviceDao;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetDeviceTypeDao;
import ru.bitel.bgbilling.modules.inet.api.server.event.InetServChangingEvent;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;
/**
* <p>Генерирует логин и комментарий для сервисов модуля Inet и IPoE.</p>
* <p>Компилировать и запускать нужно из динамического кода клиента биллинга.
* Динамический код нужно привязать к событиям "Модуль Интернет => Изменяется сервис договора" и
* "Модуль IPoE => Изменяется сервис договора" на вкладке "Функции скриптов поведения".</p>
* @author "vkulakov <vkulakov@xxx.ru>"
*/
public class LoginGenerator extends EventScriptBase<InetServChangingEvent> implements EventScript<InetServChangingEvent> {
private Connection conn;
private int SUBNET_TYPE_ID = 4;
private int IPOE_MODULE_ID = 27;
private String IPOE_PASSWORD = "xxx";
@Override
public void onEvent(InetServChangingEvent event, Setup setup, ConnectionSet connectionSet) throws Exception {
conn = connectionSet.getConnection();
ContractManager cm = new ContractManager(conn);
Contract contract = cm.getContractById(event.getContractId());
InetServ service = event.getInetServ();
cm.recycle();
String login = service.getLogin();
if(event.getModuleId() != IPOE_MODULE_ID && service.getTypeId() != SUBNET_TYPE_ID && (login.isEmpty() || login.equals("999999"))) {
String prefix = contract.getTitle();
login = prefix;
PreparedStatement ps = connectionSet.getConnection().prepareStatement("SELECT id FROM inet_serv_" + event.getModuleId() + " WHERE login = ?");
for(int i = 0; true; i++, login = prefix + "_" + i) {
ps.setString(1, login);
ResultSet rs = ps.executeQuery();
if(!rs.first() || rs.getInt("id") == service.getId()) {
service.setLogin(login);
break;
}
}
return;
}
if(event.getModuleId() == IPOE_MODULE_ID) {
InetDeviceDao dd = new InetDeviceDao(conn, event.getModuleId());
InetDeviceTypeDao td = new InetDeviceTypeDao(conn, event.getModuleId());
InetDevice device = dd.get(service.getDeviceId());
InetDeviceType deviceType = td.get(device.getDeviceTypeId());
td.recycle();
dd.recycle();
InetInterface iface = null;
for(InetInterface i : deviceType.getInterfaceList()) {
if(i.getId() == service.getInterfaceId()) {
iface = i;
break;
}
}
StringBuilder sb = new StringBuilder("nas-port");
sb.append(":");
sb.append(device.getHost().split(":")[0]);
if(iface == null) {
event.setError("Не задан интерфейс для сервиса");
return;
}
sb.append(":");
sb.append(iface.getTitle());
List<String> identifiers = service.getIdentifierList();
if(identifiers == null || identifiers.isEmpty()) {
event.setError("Не заданы VLAN'ы для сервиса");
return;
}
if(identifiers.size() > 1) {
event.setError("Задано слишком много VLAN'ов для сервиса");
return;
}
sb.append("/");
sb.append(identifiers.get(0));
PreparedStatement ps = conn.prepareStatement(""
+ "SELECT"
+ " id"
+ " FROM"
+ " inet_serv_" + event.getModuleId()
+ " WHERE"
+ " deviceId = ? AND"
+ " interfaceId = ? AND"
+ " identifier = ?");
ps.setInt(1, service.getDeviceId());
ps.setInt(2, service.getInterfaceId());
ps.setString(3, identifiers.get(0));
ResultSet rs = ps.executeQuery();
if(rs.first() && rs.getInt("id") != service.getId()) {
event.setError("Сервис с такими VLAN'ами уже существует: " + contract.getTitle());
return;
}
String c = service.getComment();
StringBuilder comment;
if(Utils.isBlankString(c)) {
comment = new StringBuilder("");
} else {
comment = new StringBuilder(c.replaceAll("(?s)---.*?IP.*?Маска.*?Шлюз.*?DNS.*?---\\s*", "").trim());
}
int addressFrom = Utils.convertBytesToInt(service.getAddressFrom());
int addressTo = Utils.convertBytesToInt(service.getAddressTo());
if(addressTo - addressFrom < 3) {
event.setError("Задана слишком маленькая подсеть для сервиса");
return;
}
comment.append("\n---\n");
comment.append("IP: ");
if(addressTo - addressFrom == 3) {
comment.append(IPUtils.convertIpToString(addressFrom + 2));
} else {
comment.append(IPUtils.convertIpToString(addressFrom + 2));
comment.append(" - ");
comment.append(IPUtils.convertIpToString(addressTo - 1));
}
comment.append("\n");
comment.append("Маска: ");
comment.append(IPUtils.convertIpToString(~(addressFrom ^ addressTo)));
comment.append("\n");
comment.append("Шлюз: ");
comment.append(IPUtils.convertIpToString(addressFrom + 1));
comment.append("\n");
comment.append("DNS: ");
comment.append("x.x.x.x, x.x.x.x");
comment.append("\n");
comment.append("---");
comment.append("\n");
if(comment.length() > 250) {
event.setError("Задан слишком длинный комментарий для сервиса - " + comment.length());
return;
}
service.setLogin(sb.toString());
service.setPassword(IPOE_PASSWORD);
service.setComment(comment.toString());
return;
}
}
}