Замена radius-атрибутов при авторизации
Материал из BiTel WiKi
(Различия между версиями)
(→Версия для 5.1) |
|||
(6 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | <p>- | + | <p>Для некоторых NAS при RADIUS аутентификации |
+ | С IOS 12.3 не распознается атрибут <source lang="ini">cisco-avpair=ip:sub-qos-policy-in=; cisco-avpair=ip:sub-qos-policy-out=;</source> | ||
+ | Скрипт заменяет атрибуты на: | ||
+ | <source lang="ini"> | ||
+ | lcp:interface-config#1=service-policy input и lcp:interface-config#2=service-policy output. | ||
+ | </source> | ||
+ | </p> | ||
Событие "radius аутентификация". | Событие "radius аутентификация". | ||
+ | |||
+ | == Версия для 5.1 == | ||
+ | |||
+ | <source lang="java"> | ||
+ | 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()); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == Версия для 4.6 и 5.0 == | ||
<source lang="java"> | <source lang="java"> | ||
Строка 45: | Строка 135: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | ps. Не забываем делать '''./radius.sh flush_script_cache''' после изменения скрипта |
Текущая версия на 08:04, 10 ноября 2010
Для некоторых 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 после изменения скрипта