--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

А помогите, пожалуйста, по одному скритпу на Perl (вроде бы)...

Нужен совет (поиск решения проблемы. не для купли-продажи)
308
23
С друзьями на NN.RU
В социальных сетях
Поделиться
Всем доброго времени суток!
Есть сервер с CentOS, на нём среди прочего крутится прога под названием Rancid (оф.сайт, если что: www.shrubbery.net/rancid/): вкратце - сбор/сравнение конфигов с сетевых устройств. "Из коробки" в наборе есть скрипты к разному оборудованию. Чего нет - можно, типа, запилить самому: взять любой как шаблон и поправить его под свои нужды - набор определённых блоков - общий, базовый, так сказать, а всё остальное - меняется в зависимости от хотелок или особенностей оборудования.
Сам я в языках программирования не шибко силён, но если в начале скрипта указана строка
#! /usr/bin/perl
То, видимо, он на Перле и написан, да?..
В общем, нашёл скрипты для определённого вендора, посмотрел, кое-что подправил, запускаю: логинится на железе, отправляет команду, парсит её вывод, пишет в файл. Открываю файл, а там...ну, не совсем то, что я хотел бы видеть... Пробовал по-разному изменять скрипт - фигу: плюс/минус одно и тоже на выходе. Посему, прошу помощи у Общественности... Как это.... А, повангуйте по скрипту, пожалуйста!..
ЗЫ. Нормального форума у Rancid не существует: все обсуждения - кусочно-обрывочно разбросаны по интернетам...
Вот, что выводится в консоль в "нормальном" случае:
нажмите, чтобы увидеть спрятанный текст
configure
#--------------------------------------------------------
echo "ip"
#--------------------------------------------------------
ip
vlan-bind 906 layer3-itf 0
exit
vrf 1 name routed
mode router
network-itf 906
arp-policy trusted
unnumbered
exit
exit
shub
vrf 0 name defaultVRF slow-path-mode
routing-option
exit
exit
vrf 1 name routed fast-path-mode:ena-user-user-com
routing-option
exit
exit
arp
cache-retry-time 10
exit
exit
exit
#--------------------------------------------------------
leg:isadmin>#

Вот, что пишет в файл Rancid:
нажмите, чтобы увидеть спрятанный текст
configure
#------------------------------------------------------------------------------------------------------------------------------
echo "ip"
#------------------------------------------------------------------------------------------------------------------------------
-\|/-\|/-\|/-\| ip
vlan-bind 906 layer3-itf 0
-\|/-\|/-\|/-\|/-\|/ exit
vrf 1 name routed
mode router
-\|/-\  network-itf 906
arp-policy trusted
unnumbered
-\|/-\|/  exit
-\|/ exit
shub
vrf 0 name defaultVRF slow-path-mode
routing-option
exit
-\  exit
vrf 1 name routed fast-path-mode:ena-user-user-com
routing-option
exit
exit
arp
cache-retry-time 10
exit
exit
exit
#------------------------------------------------------------------------
!leg:isadmin>#logoutConnection closed by foreign host.


Скрипты брал отсюда: github.com/buraglio/alurancid
perl script.pl > Rancid.tmp; rm Rancid; mv Rancid{.tmp,}
нажмите, чтобы увидеть спрятанный текст
> Rancid.tmp; rm Rancid; mv Rancid{.tmp,}

Эмм.. Не понял, если честно... Какой-то файл из "времянок" мешает?
Ну в консоли у вас нормально выводится говорите? Так редиректните вывод скрипта в консоли в файл.

perl alurancid > Rancid.tmp; rm Rancid; mv Rancid{.tmp,}

вот так, чтобы без рекламы.
ДимС
10.10.2019
Чудесный костыль...
это не костыль, а workaround
ДимС
10.10.2019
Вы уже большой мальчик, можете называть вещи своими именами: х.й - х.ем, а не писюном, костыль - костылём, а не workaround. Dixi.
Warwar
10.10.2019
Ебардей Мигалкин писал(а)
Ну в консоли у вас нормально выводится говорите?

вангую, консоль имелась ввиду свича или роутера... я хз, что там конкретно у ТС...
в консоли свитча perl? нихера не понятно
Нет-нет - я, вероятно, не сосем корректно выразился: под "консолью" имел ввиду установившуюся telnet-сессию между сервером, где стоит Rancid и мониторируемым оборудованием. Т.е. скрипт rancid-run считывает данные (IP-адреса/хостнеймы) из файла router.db в созданном репозитории (где будут храниться файлы с конфигами), далее - запускает скрипт alurancid. Тот, в свою очередь, запускает скрипт поднятия сессии - alulogin, устанавливает с его помощью соединение с хостом, бросает в "консоль" записанные в себе (alurancid) команды, парсит их вывод, пишет вывод в файл.
Вот как-то так...
При работе скрипта с сервера запускается telnet-соединение к маршрутизатору (вот это я имел ввиду под словом "консоль"), после залогинивания в "консоль" бросается команда и скрипт сразу же начинает парсить вывод этой команды и писать в файл. По окончании вывода (дожидается определённого символа/строки) скрипт закрывает подключение.
Запускаю скрипт вот так:
/var/rancid/bin/alurancid -d ***.***.***.*** (IP оборудования)
В директории, где лежит скрипт, появляется файлик с записанными данными.
Пробовал на оборудовании другого вендора с другими командами (что скрип отправляет в "консоль") - вывод и запись в файл - корректные.
Так что, тут уже эта идея, полагаю, реализована авторами. Вопрос в другом: пишутся ещё какие-то "левые" данные...
Warwar
10.10.2019
Такое ощущение, что где-то стоит UTF и русская консоль...
попробуйте перед запуском скрипта изменить локаль консоли на LANG=C
похоже на крутящийся значок ожидания... попробуйте запустить этот скрипт напрямую из консоли
если будет вращающая звёздочка из символов -\|/- значит это оно
Ха! Разобрался, что скрипт пишет в файл!
В общем, после отправки команды маршрутизатор начинает выводить её раезультат. Железка иногда подтупливает и в результате в окне консоли на некоторое время появляется "вентилятор": \-/-\-/.... Вот их как раз-таки скрипт и пишет в файл во время парсинга! Фак!...
И снова взываю к понимающеи Perl: что добавить в скрипт, чтобы он отбрасывал этот "вентилятор"?
Кусок конфига, отвечающий за парсинг:
нажмите, чтобы увидеть спрятанный текст
# This routine parses "info configure ip"
sub InConIP {
print STDERR " In InConIP: $_" if ($debug);

while (<INPUT>) {
tr/\015//d;
last if(/^$prompt/);
next if (/^(\s*|\s*$cmd\s*)$/);
next if (/^s+\^$/);
# next if (/^# configure/);
next if (/^$/); # drop empty lines


# added by leres
#next if (/^# (Generated|Finished)/);
#next if (/^$/); # drop empty lines
return(1) if /Line has invalid autocommand /;
return(1) if /(Invalid input detected|Type help or )/;
if (/^$prompt/) {
ProcessHistory("","","","!$_");
$found_end++;
last;
}
# catch all output
ProcessHistory("","","","$_");
}
return(0);
}
Warwar
11.10.2019
попробуйте загуглить, как отключить этот вентилятор на стороне свича, так по-любому будет проще
997
12.10.2019
после строк кода
Anatoly A. Stupakov писал(а)
while () {
tr/\015//d;

можно попробовать добавить что-то типа:
s/(\W\S\S)1D//gs;

- хз, может поможет. *pardon*
997 писал(а)
s/(\W\S\S)1D//gs;

Мужик, это было ох@#$но! В файл всё записалось безо всякой белиберды!
Исправил в скрипте команду, чтоб вывел и спарсил весь конфиг железки: не поленился - пролистал весь файл с выводом - всё чисто!
С меня плюшки/пончики! :)
997
14.10.2019
Вот и ладушки.
Warwar
14.10.2019
регулярка подошла, да...
он сменит локаль и всё это может перестать работать...
плюс, как бы не засосалось что-то лишнее из конфига, можно и не заметить...
короче, я за то, что бы искать, как это отключить... в смысле не вырезать из уже принятой информации, а попытаться сделать так, что бы кто это выводит - это не выводил...
997
15.10.2019
Ниже читай. У меня с моей локалью этот пропеллер в конфиг не попадает, даже при его наличии - нефиг и париться с отключением.
Warwar
15.10.2019
а вот этого я вообще не понял...
как так... символы есть, но они не читаются?..
Warwar
15.10.2019
проверил, у меня тоже съелись
более того, даже если сделать тупо cat, то эти символы не отображаются
а вот если вывод вашего же скрипта ниже перенаправить в файл, то в файле снова всё есть...
997
15.10.2019
В общем, я такого мнения придерживаюсь: с проблемами надо бороться по мере их проявления. У человека на данный момент задача решена - и нефиг голову забивать копанием вглубь - так и без работы не долго остаться.
997
12.10.2019
я со своей локалью даже глюка не могу отловить.
1. тупо скопипастил твой дамп с пропеллерами в файл test.txt
2. накидал заготовку кода (ну, думал, сейчас хоть вспомню перлы из перловки!):
нажмите, чтобы увидеть спрятанный текст

#!/usr/bin/perl

use strict;
use warnings;

my $filename = 'test.txt';
open(FH, '<', $filename) or die $!;

while (<FH>){
print $_;
}

close (FH);

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

configure
#------------------------------------------------------------------------------------------------------------------------------
echo "ip"
#------------------------------------------------------------------------------------------------------------------------------
ip
vlan-bind 906 layer3-itf 0
exit
vrf 1 name routed
mode router
network-itf 906
arp-policy trusted
unnumbered
exit
exit
shub
vrf 0 name defaultVRF slow-path-mode
routing-option
exit
exit
vrf 1 name routed fast-path-mode:ena-user-user-com
routing-option
exit
exit
arp
cache-retry-time 10
exit
exit
exit
#------------------------------------------------------------------------
!leg:isadmin>#logoutConnection closed by foreign host.
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем