Package: rancid
Severity: normal
Version: 3.13-1
X-Debbugs-Cc: Tollef Fog Heen <tfh...@err.no>

I have a couple of routeros devices where rancid fails to work correctly
on them, since even though it logs in with +ct200w, routeros seems to
send a bunch of escapes.  The last couple of lines of the .raw file
reads like:

^M^M^M^[[9999B[admin@vormioox] > q^M[admin@vormioox] > q^[[Ku^M[admin@vormioox] 
> qu^[[Ki^M[admin@vormioox] > qui^[[Kt^M[admin@vormioox] > quit^[[K^M
^Minterrupted
^[7^[[;54r^[8Connection to vormioox.err.no closed.^M^M

rancid then outputs:
vormioox.err.no.raw: missed cmd(s): all commands
vormioox.err.no.raw: End of run not found
vormioox.err.no.raw: clean_run is false
vormioox.err.no.raw: found_end is false

Something like this seems to fix it for me, and ought not to break it
for anyone else.  (Diff might be slightly off; I had to hand-hack it,
but I can provide a clean one if necessary.)

# diff -u routeros.pm~ routeros.pm
--- routeros.pm~        2023-03-11 09:08:12.729340483 +0100
+++ routeros.pm 2023-03-12 05:24:30.074961827 +0100
 TOP: while (<$INPUT>) {
        tr/\015//d;
-       if (/[>#]\s*quit$/) {
+       if (/[>#]\s*quit(?:\x{1b}\[K)?/m) {
            $clean_run=1;
            last;
        }
@@ -98,7 +99,7 @@
            $clean_run = 0;
            last;
        }
-       while (/\s*($cmds_regexp)\s*$/) {
+       while (/\s*($cmds_regexp)\s*(?:\x{1b}\[K)?$/) {
            $cmd = $1;
            if (!defined($prompt)) {
                $prompt = "\] > ";  # crude but effective
@@ -167,7 +171,7 @@
     while (<$INPUT>) {
        tr/\015//d;
        last if (/$prompt/);
-       next if (/^(\s*|\s*$cmd\s*)$/);
+       next if (/^(\s*|\s*$cmd\s*)(?:\x{1b}\[K)?$/);
        return(1) if (/(bad command name )/);
        s/^\s+//g;

@@ -187,7 +191,7 @@
     while (<$INPUT>) {
        tr/\015//d;
        last if (/$prompt/);
-       next if (/^(\s*|\s*$cmd\s*)$/);
+       next if (/^(\s*|\s*$cmd\s*)(?:\x{1b}\[K)?$/);
        return(1) if (/(bad command name )/);
        s/^\s+//g;

@@ -204,8 +208,9 @@

     while (<$INPUT>) {
        tr/\015//d;
        if (/$prompt/) { $found_end=1; $clean_run=1; return 0};
-       next if(/^(\s*|\s*$cmd\s*)$/);
+       next if(/^(\s*|\s*$cmd\s*)(?:\x{1b}\[K)?$/);
        next if(/^#/);
        return(1) if /(bad command name )/;
        s/^\s+//g;

-- 
Tollef Fog Heen
UNIX is user friendly, it's just picky about who its friends are

Reply via email to