October 20th, 2009

gul

JUNOScripting

На языках программирования, у которых цикл делается только через рекурсию, мне приходилось писать (lisp, exim acl).
Но вот с языком, у которого невозможно изменять значения переменных, встретился впервые. 8-() Непонятно, собственно, почему они называются "переменные". Вспоминается анекдот "а дустом не пробовали?"
Ладно бы я не понимал, как оно внутри работает. Но ведь в своё время достаточно много писал на асме - там есть и переменные, и условные/безусловные переходы, и многое другое, чего вдруг не оказалось в языке "высокого уровня". Я, конечно, знаю термины "алгоритмический" и "функциональный" язык, но всё равно вывернуть свои мозги так, чтобы применять рекурсию вместо цикла было естественно, мне напряжно. А значение переменной почему-то иногда хочется изменить.
Но ничего, освоил SLAX (Stylesheet Language Alternative Syntax) и написал скрипт, который был нужен.

Неприятно удивила низкая эффективность. Я почему-то ожидал, что если скрипты работают через junos api, то у них со скоростью должно быть всё нормально, по аналогии с embedded perl и другими встраиваемыми скриптовыми языками. Нифига - запрос конфигурации выполняется примерно полминуты (как и "show configuration"). Коммит и того больше. Вот не понимаю я, что нужно делать, чтобы текстовый файл размером два мегабайта на современном процессоре парсить целую минуту? Мне и секунду-то на эту задачу трудно представить. И заплатки с dynamic-db - я бы понял, если бы там был двухгиговый файл, а не двухмеговый.

Другие хохмочки, конечно, тоже доставляют. Например, арифметические выражения есть, а деления нет (или я не нашёл, как). Ну тут ладно, вместо деления на два можно умножить на 0.5. Но почему же printf("%d", 6000000000*0.5) возвращает "3e+09", который, естественно, парсером конфига не воспринимается?

Конечно, идеология change/commit в JunOS гораздо удобнее, чем в Cisco IOS. Но почему же нельзя закоммитить только изменения, а не весь конфиг? Или залочить только один из уровней иерархии конфига, а не его весь? Это ведь не rocket science. А как без этого скрипт может надёжно менять конфиг (скажем, апдейтить префикс-листы или что-то по событиям)? Ведь вдруг в это время кто-то что-то конфигурирует? А в результате получается система, которая "как правило, работает корректно", "глючит нечасто" и т.п. :-( Про "configure private" знаю - это хороший способ откатить чьи-то изменения и не заметить этого.

То, что у других всё ещё хуже, утешает, но не сильно. :)

P.S. А вообще, junoscripts - мощная штука, я пропёрся.