Так. Сначала отмазки. Железки у меня нету и какой функционал она умеет - я не знаю, как она умеет - тоже не знаю) У меня есть интересный модуль, назвал его remote - он сделал для универсального (на сколько это возможно) управлением каким-либо устройством. Проверяли мне его на циске, говорят работает отлично.
Возможно этот модуль подойдет и для джунипера, достаточно написать правильный конфиг и часть, которая общается с железкой.
К циске модуль коннектится по ssh. Вот например, используется такой конфиг:
Префиксы для наших acl:
acl_in_prefix => 'ACL-IN-',
acl_out_prefix => 'ACL-OUT-'
Acl для конкретной услуге:
in => '{{settings.acl_in_prefix}}{{user.service_id}}',
out => '{{settings.acl_out_prefix}}{{user.service_id}}'
Команды, которые выполняются после успешного логина (сперва запустится enable с паролем, затем configure terminal):
{ method => 'enable', param => $hw_connection{enable_password} },
'configure terminal'
Команда для получения списка ACL и IP в них:
show_alcs => 'do sh ip access-lists'
Команда, которая добавляет IP в заданный ACL. Параметры:
# acl : имя ACL
# is_in_acl : установлен, если это ACL для входящего трафика
# ip : IP
# user : данные абонента, например {{user.serrvice_id}}, {{user.speed_in1}}
# settings : текущие настройки, например {{settings.acl_in_prefix}}, {{settings.connection.pass}}
ip access-list extended {{acl}}
{% if is_in_acl %}
permit ip any host {{ip}}
{% else %}
permit ip host {{ip}} any
{% endif %}
Удаление IP из ACL:
ip access-list extended {{acl}}
{% if is_in_acl %}
no permit ip any host {{ip}}
{% else %}
no permit ip host {{ip}} any
{% endif %}
Конфигурирование скорости:
class-map match-all CM-IN-{{service.service_id}}
match access-group name {{settings.acl_in_prefix}}{{service.service_id}}
{% if service.speed_in.1 %}
policy-map PM-IN-1
class CM-IN-{{service.service_id}}
police {{service.speed_in.1}} 10000 exceed-action drop
{% endif %}
{% if service.speed_in.2 %}
policy-map PM-IN-2
class CM-IN-{{service.service_id}}
police {{service.speed_in.2}} 10000 exceed-action drop
{% endif %}
class-map match-all CM-OUT-{{service.service_id}}
match access-group name {{settings.acl_in_prefix}}{{service.service_id}}
{% if service.speed_out.1 %}
policy-map PM-OUT-1
class CM-OUT-{{service.service_id}}
police {{service.speed_out.1}} 10000 exceed-action drop
{% endif %}
{% if service.speed_out.2 %}
policy-map PM-OUT-2
class CM-OUT-{{service.service_id}}
police {{service.speed_out.2}} 10000 exceed-action drop
{% endif %}
Функция, которая извлекает acl из ответа циски:
return $s =~ /Extended IP access list +([^\n]+)$/ ? $1 : '';
Видно, что команды задаются шаблонами. Если это подойдет - давайте развивать этот модуль. Кстати, если для циски нужен - обращайтесь тоже