Настройка маршрутизаторов Juniper с помощью PHP NETCONF

Я использую библиотеку PHP для NETCONF: https://github.com/Juniper/netconf-php . До сих пор мне удавалось получить части конфигурации, которые мне нужны для моих сценариев, но недавней проблемой остается загрузка новых конфигураций в маршрутизатор. Журналы на моем роутере:

Nov 27 14:34:48  router.nl sshd[78164]: subsystem request for netconf by user user
Nov 27 14:34:48  router.nl mgd[78168]: UI_CMDLINE_READ_LINE: User 'x', command 'xml-mode netconf need-trailer '
Nov 27 14:34:48  router.nl file[78167]: UI_LOGIN_EVENT: User 'x' login, class 'j-super-user' [78167], ssh-connection 'x.x.x.x 46796 x.x.x.x 22', client-mode 'netconf'
Nov 27 14:34:48  router.nl file[78167]: UI_NETCONF_CMD: User 'x' used NETCONF client to run command 'lock cannot reconstruct arguments'
Nov 27 14:34:48  router.nl file[78167]: UI_NETCONF_CMD: User 'x' used NETCONF client to run command 'edit-config cannot reconstruct arguments default-operation=merge cannot reconstruct arguments'
Nov 27 14:34:48  router.nl file[78167]: UI_NETCONF_CMD: User 'x' used NETCONF client to run command 'unlock cannot reconstruct arguments'
Nov 27 14:34:48  router.nl file[78167]: UI_NETCONF_CMD: User 'x' used NETCONF client to run command 'close-session'

Он продолжает жаловаться на то, что не может реконструировать аргументы. Это скрипт, который я пытаюсь заставить работать:

require_once '../app/include/netconf/Device.php';

$deviceParams = [
    'hostname'  => 'x.x.x.x',
    'username'  => 'x',
    'password'  => 'password',
    'port'      => 22
    ];

$this->device = new Device($deviceParams);
$this->connectRouter();

$islocked = $this->device->lock_config();

$command = '<system><services><ftp/></services></system>';

if($islocked) {              
    $this->device->load_xml_configuration($command, 'merge');
}

$this->device->unlock_config();

$this->device->close();

Я настроил traceoqptions под деревом netconf { ssh {, и это один из выходных данных (все в порядке):

Nov 30 10:41:57 [86546] Incoming:
<rpc><edit-config><target><candidate/></target><default-operation>merge</default-operation><config><configuration><system><services><ftp></ftp></services></system></configuration></config></edit-config></rpc>]]>]]>


Nov 30 10:41:57 [86546] Outgoing: <rpc-reply     xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/12.3R8/junos">
Nov 30 10:41:57 [86546] Outgoing: <ok/>
Nov 30 10:41:57 [86546] Outgoing: </rpc-reply>
Nov 30 10:41:57 [86546] Outgoing: ]]>]]>
Nov 30 10:41:57 [86546] Incoming: <rpc><close-session/></rpc>]]>]]>

person Beeelze    schedule 27.11.2015    source источник


Ответы (2)


Первые журналы, которые я показал в своем OP, ничего не говорят, но сообщают мне, что что-то пошло не так. Однако параметры трассировки сообщили мне важную информацию после того, как я попытался заблокировать/разблокировать конфигурацию:

Nov 30 12:06:43 [86767] Outgoing: <rpc-error>
Nov 30 12:06:43 [86767] Outgoing: <error-type>protocol</error-type>
Nov 30 12:06:43 [86767] Outgoing: <error-tag>operation-failed</error-tag>
Nov 30 12:06:43 [86767] Outgoing: <error-severity>error</error-severity>
Nov 30 12:06:43 [86767] Outgoing: <error-message>
Nov 30 12:06:43 [86767] Outgoing: configuration database modified
Nov 30 12:06:43 [86767] Outgoing: </error-message>
Nov 30 12:06:43 [86767] Outgoing: </rpc-error>
Nov 30 12:06:43 [86767] Outgoing: </rpc-reply>
Nov 30 12:06:43 [86767] Outgoing: ]]>]]>

Быстрый поиск по «базе данных конфигурации изменен» показывает, что все еще были незафиксированные изменения ( http://www.juniper.net/documentation/en_US/junos13.3/topics/topic-map/junos-script-automation-service-template-automation.html , нижняя страница):

Problem

You see the following message when creating, updating, or deleting a service on a device through a NETCONF session:

<output>
    configuration database modified
</output>

The configuration has previously uncommitted changes, and the service script cannot commit the service configuration changes.

Просто набрав «commit» в режиме конфигурации, ошибка исчезла. Я надеюсь, что помог/помогу другим в будущем.

person Beeelze    schedule 30.11.2015

Не уверен насчет netconf в PHP (все еще погружаюсь), но в Python вы всегда должны использовать «настроить частный»:

junos_dev.open()
with Config(junos_dev, mode='private') as cu:
  cu.load(some_string, format='set')
  #print cu.diff()
  cu.commit()
junos_dev.close()

И теперь я также нашел соответствующую функцию здесь: /** *Этот метод следует вызывать, чтобы операции загрузки выполнялись в «приватном» режиме. *@param mode * Режим открытия конфигурации. * Допустимые режимы: "частный" */ публичная функция open_configuration($mode)

person Milan Zapletal    schedule 14.07.2016
comment
Спасибо за вашу версию Python. Я не уверен, как это будет работать, но, поскольку я сейчас изучаю Python, мне это может понадобиться в один прекрасный день :-) - person Beeelze; 15.07.2016