Замена radius-атрибутов при авторизации

Материал из BiTel WiKi

Перейти к: навигация, поиск

Для некоторых NAS при RADIUS аутентификации С IOS 12.3 не распознается атрибут

cisco-avpair=ip:sub-qos-policy-in=; cisco-avpair=ip:sub-qos-policy-out=;

Скрипт заменяет атрибуты на:

lcp:interface-config#1=service-policy input  и lcp:interface-config#2=service-policy output.

Событие "radius аутентификация".

Версия для 5.1

import bitel.billing.server.radius.*;
import ru.bitel.bgbilling.kernel.network.radius.*;
 
request = event.getRequest();
response = event.getResponse();
 
List attributesToRemove = new ArrayList();
List attributesToAdd = new ArrayList();
 
//Чтобы следующий if сработал, нужно, чтобы NAS слал свой ip в атрибуте с № 32 : NAS-Identifier
if (request.getStringAttribute(-1,32,null)!=null){
if ( 
 request.getStringAttribute(-1,32,"").equals("010.010.002.001") ||
 request.getStringAttribute(-1,32,"").equals("010.010.002.002") ||
 request.getStringAttribute(-1,32,"").equals("010.010.002.003")
) 
{
	int i = 1;
 
 
	// [1] cisco-avpair
	list = response.getAttributes(Vendors.CISCO,CiscoVendor.Cisco_AVPair);
 
	if (list != null)
	{
		for (it = list.iterator(); it.hasNext();) 
		{
			ra = (RadiusAttribute.RadiusAttributeString)it.next();
 
			s = ra.getValue();
 
			if (s.indexOf("ip:sub-qos-policy-in=") >= 0)
			{
				print (s.replaceFirst("ip:sub-qos-policy-in=","lcp:interface-config#" + i + "=service-policy input "));
				//С версии 5.1 мы не можем сделать следующую строчку, т.е. заменить содержимое атрибута:
				//ra.setStringValue(s.replaceFirst("ip:sub-qos-policy-in=","lcp:interface-config#" + i + "=service-policy input "));
				//Поэтому удаляем старый атрибут и добавляем новый.
				//Сделать это прямо в цикле мы не можем, поэтому запоминаем текущий элемент
				attributesToRemove.add(ra);
				RadiusAttribute.RadiusAttributeString ra_new = new RadiusAttribute.RadiusAttributeString(Vendors.CISCO,1,s.replaceFirst("ip:sub-qos-policy-in=","lcp:interface-config#" + i + "=service-policy input "));
				attributesToAdd.add(ra_new);
			}
 
			if (s.indexOf("ip:sub-qos-policy-out=") >= 0)
			{
				print (s.replaceFirst("ip:sub-qos-policy-out=","lcp:interface-config#" + i +"=service-policy output "));
				//С версии 5.1 мы не можем сделать следующую строчку, т.е. заменить содержимое атрибута:
				//ra.setStringValue(s.replaceFirst("ip:sub-qos-policy-out=","lcp:interface-config#" + i +"=service-policy output "));
				//Поэтому удаляем старый атрибут и добавляяем новый.
				//Сделать это прямо в цикле мы не можем, поэтому запоминаем текущий элемент
				attributesToRemove.add(ra);
				RadiusAttribute.RadiusAttributeString ra_new = new RadiusAttribute.RadiusAttributeString(Vendors.CISCO,1,s.replaceFirst("ip:sub-qos-policy-out=","lcp:interface-config#" + i +"=service-policy output "));
				attributesToAdd.add(ra_new);
			}
 
			if (s.indexOf("ip:sub-qos-policy-in=BW-ISG-IN") >= 0){
				attributesToRemove.add(ra);
			}
			if (s.indexOf("ip:sub-qos-policy-out=BW-ISG") >= 0){
				attributesToRemove.add(ra);
			}
 
			i++;
		}
 
		//Удаляем ненужные атрибуты из списка
		for(it = attributesToRemove.iterator(); it.hasNext();){
			list.remove(it.next());
		}
 
		//Добавляем новые атрибуты из списка
		for(it = attributesToAdd.iterator(); it.hasNext();){
			list.add(it.next());
		}
	}
}
}

Версия для 4.6 и 5.0

import bitel.billing.server.contract.bean.*;
import java.util.*;
import bitel.billing.server.util.*;
import bitel.billing.server.radius.*;
import java.sql.*;
import java.util.*;
import bitel.billing.common.CommonTimeUtils;
import bitel.billing.server.util.Utils;
import bitel.billing.server.card.bean.*;
 
request = event.getRequest();
response = event.getResponse();
 
if (request.hasAttribute(32) && request.getStringAttribute(32).equals("010.010.002.001"))
{
	list = response.getVendorAttributes(Vendors.CISCO, 1);
	if (list != null)
	{
		int i = 1;
		for (it = list.iterator(); it.hasNext();) 
		{
			ra = (RadiusVendorAttribute)it.next();
			s = ra.getStringValue();
 
			if (s.indexOf("ip:sub-qos-policy-in=") >= 0)
			{
				print (s.replaceFirst("ip:sub-qos-policy-in=","lcp:interface-config#" + i + "=service-policy input "));
				ra.setStringValue(s.replaceFirst("ip:sub-qos-policy-in=","lcp:interface-config#" + i + "=service-policy input "));
			}	
 
			if (s.indexOf("ip:sub-qos-policy-out=") >= 0)
			{
				print (s.replaceFirst("ip:sub-qos-policy-out=","lcp:interface-config#" + i +"=service-policy output "));
				ra.setStringValue(s.replaceFirst("ip:sub-qos-policy-out=","lcp:interface-config#" + i +"=service-policy output "));
			}
 
			i++;
		}
	}
}

ps. Не забываем делать ./radius.sh flush_script_cache после изменения скрипта

Личные инструменты