[rancid] Rancid-missed cmds

Erica James jameserica156 at yahoo.com
Tue Sep 17 10:52:50 UTC 2013


 
/home/eserica/rancid/bin/hulogin -t 90 -c"display version ; display current-configuration" 10.3.4.5
 
runs neatly. Actually,
It logs in, to the enable mode, then runs "display version" gives the output of the command, afterwards runs "display current-configuration" and gives the output of the command as well. thereafter logs out, 
 
[eserica at netflow bin]$ /home/eserica/rancid/bin/hulogin -t 90 -c "display version ; display current-configuration" 10.3.4.5
10.3.4.5
spawn telnet 10.3.4.5
Trying 10.3.4.5...
Connected to 10.3.4.5 (10.3.4.5).
Escape character is '^]'.
>>User name:xxx
>>User password:

  Huawei Integrated Access SoftwareMA5600T.
 
<<output omitted>>
 
MA5600T>enable
MA5600T#
 
<<output omitted>>
 
MA5600T#display version
 
<<output omitted>>
 
MA5600T# display current-configuration
  
<<output omitted>>
 
#
return
MA5600T#quit
  Check whether system data has been changed. Please save data before logout. 
Are you sure to log out? (y/n)[n]:y
MA5600T#
  Configuration console exit, please retry to log on
Connection closed by foreign host.
[eserica at netflow bin]$ 

 
  

________________________________
  From: Alan McKinnon <alan.mckinnon at gmail.com>
To: Erica James <jameserica156 at yahoo.com> 
Sent: Tuesday, September 17, 2013 1:22 PM
Subject: Re: [rancid] Rancid-missed cmds
  

Yes, that is much better now. The commands we need to run to debug now
run properly. If you run

/home/eserica/rancid/bin/hulogin -t 90 -c"display version ; display
current-configuration" 10.3.4.5

from the command line, do you get sensible output on the screen? What's
the exit code from running that command?

I need to establish if hulogin is doing the right thing or not before we
dig into the rancid parser




On 17/09/2013 12:11, Erica James wrote:
> Hello,
> Alan, thank you.
>  
> I can see something better now.
>  
> [eserica at netflow bin]$ /home/eserica/rancid/bin/h3crancid -d 10.3.4.5
> executing /home/eserica/rancid/bin/hulogin -t 90 -c"display version ;
> display current-configuration" 10.3.4.5
> executing /home/eserica/rancid/bin/hulogin -t 90 -c"display version ;
> display current-configuration" 10.3.4.5
> 10.3.4.5: missed cmd(s): display current-configuration,display version
> 10.3.4.5: missed cmd(s): display current-configuration,display version
> 10.3.4.5: End of run not found
> 10.3.4.5: End of run not found
> #
> 
> *From:* Alan McKinnon <alan.mckinnon at gmail.com>
> *To:* Erica James <jameserica156 at yahoo.com>
> *Cc:* rancid shrubbery <rancid-discuss at shrubbery.net>
> *Sent:* Tuesday, September 17, 2013 11:19 AM
> *Subject:* Re: [rancid] Rancid-missed cmds
> 
> Ah, I see it now. The PATH is set in rancid.conf correctly so it is
> available when run from cron.
> 
> You now need to add it to *your* path so it's available when you run the
> command on the cli. Add it in your .bashrc or .profile as appropriate,
> then log out, log in and run the test commands again. If rancid also
> runs as a different user yu should add the same to that users
> environment too.
> 
> These steps won't affect how rancid runs on a cron schedule, it will
> only affect cli commands so our debugging efforts work
> 
> 
> On 17/09/2013 08:08, Erica James wrote:
>> Hello.
>> I have checked in rancid's PATH.
>> this is a portion of the rancid.conf file.
>> BASEDIR=/home/eserica/rancid/var/rancid; export BASEDIR
>>
> PATH=/home/eserica/rancid/bin:/usr/bin:.:/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin;
>> export PATH
>>
>> 
>>
>> *From:* Alan McKinnon <alan.mckinnon at gmail.com
> <mailto:alan.mckinnon at gmail.com>>
>> *To:* Erica James <jameserica156 at yahoo.com
> <mailto:jameserica156 at yahoo.com>>
>> *Cc:* rancid shrubbery <rancid-discuss at shrubbery.net
> <mailto:rancid-discuss at shrubbery.net>>
>> *Sent:* Monday, September 16, 2013 10:37 PM
>> *Subject:* Re: [rancid] Rancid-missed cmds
>>
>> On 16/09/2013 16:32, Erica James wrote:
>>> Alan,
>>>
>>> Thank you . Please see the below,
>>>
>>> 1. Can telnet to device and authenticate manually
>>>
>>> 2. /home/eserica/rancid/bin/hulogin -d 10.3.4.5 logs in successfully,
>>> and enables properly. Prompt is correct as well
>>>
>>> 3. /home/eserica/rancid/bin/hulogin -t 90 -c"display
>>> current-configuration ; display version" 10.3.4.5 runs cleanly. commands
>>> are run neatly. automatic login and logout
>>> 4.[eserica at netflow <mailto:eserica at netflow> <mailto:eserica at netflow
> <mailto:eserica at netflow>> logs]$
>> /home/eserica/rancid/bin/h3crancid -d 10.3.4.5
>>> executing hulogin -t 90 -c"display version ; display
>>> current-configuration" 10.3.4.5
>>> executing hulogin -t 90 -c"display version ; display
>>> current-configuration" 10.3.4.5
>>> sh: hulogin: command not found
>>
>>      ^^^^^^^^^^^^^^^^^^^^^^^^^^
>>
>> You almost certainly do not have "/home/eserica/rancid/bin/" in rancid's
>> PATH. It is set in $RANCID_DIR/etc/rancid.conf.
>>
>> As to why this happened, it is very likely an installation failure.
>>
>> Did you install all of rancid to /home/eserica/rancid, or is that just a
>> convenient place to put rancid scripts you are testing?
>>
>>
>> The rancid build system works almost perfectly every time. It uses
>> autotools and is designed to install the entire package to
>> /usr/local/rancid/ by default and for the scripts to be run by user
>> "rancid". As with all Unix apps it is sensitive to ownership and
>> permission errors
>>
>> The errors you are getting indicate a faulty install, possibly trying to
>> do itmanually.
>>
>>
>>
>>
>>> 10.3.4.5: missed cmd(s): display current-configuration,display version
>>> 10.3.4.5: missed cmd(s): display current-configuration,display version
>>> 10.3.4.5: End of run not found
>>> 10.3.4.5: End of run not found
>>> The router.db
>>> 10.3.4.5:huawei:up
>>>
>>> The rancid-fe
>>>    'huawei'            => 'h3crancid',
>>>
>>> Don't understand why am getting such an output  from
>>> /home/eserica/rancid/bin/h3crancid -d 10.3.4.5
>>> Any comments on the above?
>>>
>>> Still the same logs.
>>>
>>> Eserica
>>>
>>>
>>> *From:* Alan McKinnon <alan.mckinnon at gmail.com
> <mailto:alan.mckinnon at gmail.com>
>> <mailto:alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>>>
>>> *To:* rancid shrubbery <rancid-discuss at shrubbery.net
> <mailto:rancid-discuss at shrubbery.net>
>> <mailto:rancid-discuss at shrubbery.net
> <mailto:rancid-discuss at shrubbery.net>>>
>>> *Sent:* Monday, September 16, 2013 4:33 PM
>>> *Subject:* Re: [rancid] Rancid-missed cmds
>>>
>>> The approach to fixing this is always the same, at this point nothing
>>> rancid is outputting helps debug in the slightest - all it says is that
>>> something went wrong, but we already know that.
>>>
>>> Do the following:
>>>
>>> 1. telnet to device and check you can auth manually
>>> 2. "hulogin <device>" and check it logs in and enables properly, and
>>> that the prompt etc on the screen is correct
>>> 3. run "hulogin -t 90 -c"display current-configuration,display version"
>>> <device>" and check that the commands do actually run correctly
>>> 4. run "hurancid -d <device>" - this dumps a *complete* log in the
>>> current directory containing more info than the regular log you quoted
>>> and often reveals the problem (but not always).
>>>
>>>
>>> But first a few prior steps need to be verified:
>>>
>>> - the command in #3 I pasted from your log output, and that has comma
>>> separators. Your device might need semicolons, I have no idea as I don;t
>>> know that vendors stuff
>>> - the relevant line in router.db must contain the appropriate type
>>> string in field 3
>>> - you will have had to edit rancid-fe and add a line for huawei to a
>>> perl hash. Without this, rancid-run doesn't know what parser script to
>>> call and it cannot work.
>>> - the device you have must be supported by the script you are using;
>>> just because Huawei made it is no guarantee it works similarly to
>>> anything else they might have made.
>>>
>>>
>>> If all of that checks out, then we need to look into the running perl
>>> itself.
>>>
>>> I believe we've been over most of this before, I don't recall getting a
>>> definitive answer. You really do need to go through all these steps as
>>> given, nothing else is going to get to the root of your problem.
>>>
>>>
>>>
>>> On 16/09/2013 15:11, Erica James wrote:
>>>> Hello
>>>> I have a problem with rancid parsing script. Logs show missed cmd(s).
>>>> Trying to get all of the configs.
>>>> 10.3.4.5: missed cmd(s): display current-configuration,display version
>>>> 10.3.4.5: End of run not found
>>>> #
>>>> All routers sucessfully completed.
>>>> cvs diff: Diffing .
>>>> cvs diff: Diffing configs
>>>> cvs commit: Examining .
>>>> cvs commit: Examining configs
>>>>
>>>> The script is for Huawei. The problem now seems to be that rancid is not
>>>> collecting configs.
>>>> Anyone with an idea on what to do?
>>>>
>>>> Below is the rancid-script
>>>>
>>>> #! /usr/bin/perl
>>>> ##
>>>> ## $Id$
>>>> ##
>>>> ## rancid 2.3.8
>>>> ##
>>>> ## Copyright (C) 1997-2004 by Terrapin Communications, Inc.
>>>> ## All rights reserved.
>>>> ##
>>>> ## This software may be freely copied, modified and redistributed
>>>> ## without fee for non-commerical purposes provided that this license
>>>> ## remains intact and unmodified with any RANCID distribution.
>>>> ##
>>>> ## There is no warranty or other guarantee of fitness of this software.
>>>> ## It is provided solely "as is".  The author(s) disclaim(s) all
>>>> ## responsibility and liability with respect to this software's usage
>>>> ## or its effect upon hardware, computer systems, other software, or
>>>> ## anything else.
>>>> ##
>>>> ## Except where noted otherwise, rancid was written by and is
>>> maintained by
>>>> ## Henry Kilmer, John Heasley, Andrew Partan, Pete Whiting, and Austin
>>>> Schutz.
>>>> ##
>>>> #
>>>> # hurancid - Interface to Huawei devices
>>>> #
>>>> #  RANCID - Really Awesome New Cisco confIg Differ
>>>> #
>>>> # usage: rancid [-d] [-l] [-f filename | $host]
>>>> #
>>>> use Getopt::Std;
>>>> getopts('dfl');
>>>> $log = $opt_l;
>>>> $debug = $opt_d;
>>>> $file = $opt_f;
>>>> $host = $ARGV[0];
>>>> $clean_run = 0;
>>>> $found_end = 0;
>>>> $timeo = 90;                    # hulogin timeout in seconds
>>>>
>>>> my(%filter_pwds);              # password filtering mode
>>>> # This routine is used to print out the router configuration
>>>> sub ProcessHistory {
>>>>    my($new_hist_tag,$new_command,$command_string, at string)=(@_);
>>>> if((($new_hist_tag ne $hist_tag) || ($new_command ne $command))
>>>>        && defined %history) {
>>>>        print eval "$command \%history";
>>>>        undef %history;
>>>>    }
>>>>    if (($new_hist_tag) && ($new_command) && ($command_string)) {
>>>>        if ($history{$command_string}) {
>>>>            $history{$command_string} =
>>>> "mailto:$history%7B$command_string%7D at string <mailto:7D at string>
> <mailto:7D at string <mailto:7D at string>>
>> <mailto:7D at string <mailto:7D at string> <mailto:7D at string
> <mailto:7D at string>>>";
>>>>        } else {
>>>>            $history{$command_string} = "@string";
>>>>        }
>>>>    } elsif (($new_hist_tag) && ($new_command)) {
>>>>        $history{++$#history} = "@string";
>>>>    } else {
>>>>        print "@string";
>>>>    }
>>>>    $hist_tag = $new_hist_tag;
>>>>    $command = $new_command;
>>>>    1;
>>>> }
>>>>
>>>> sub numerically { $a <=> $b; }
>>>>
>>>> # This is a sort routing that will sort numerically on the
>>>> # keys of a hash as if it were a normal array.
>>>> sub keynsort {
>>>>    local(%lines)=@_;
>>>>    local($i) = 0;
>>>>    local(@sorted_lines);
>>>>    foreach $key (sort numerically keys(%lines)) {
>>>>        $sorted_lines[$i] = $lines{$key};
>>>>        $i++;
>>>>    }
>>>>    @sorted_lines;
>>>> }
>>>>
>>>> # This is a sort routing that will sort on the
>>>> # keys of a hash as if it were a normal array.
>>>> sub keysort {
>>>>    local(%lines)=@_;
>>>>    local($i) = 0;
>>>>    local(@sorted_lines);
>>>>    foreach $key (sort keys(%lines)) {
>>>>        $sorted_lines[$i] = $lines{$key};
>>>>        $i++;
>>>>    }
>>>>    @sorted_lines;
>>>> }
>>>>
>>>> # This is a sort routing that will sort on the
>>>> # values of a hash as if it were a normal array.
>>>> sub valsort{
>>>>    local(%lines)=@_;
>>>>    local($i) = 0;
>>>>    local(@sorted_lines);
>>>>    foreach $key (sort values %lines) {
>>>>        $sorted_lines[$i] = $key;
>>>>        $i++;
>>>>    }
>>>>    @sorted_lines;
>>>> }
>>>>
>>>> # This is a numerical sort routing (ascending).
>>>> sub numsort {
>>>>    local(%lines)=@_;
>>>>    local($i) = 0;
>>>>    local(@sorted_lines);
>>>>    foreach $num (sort {$a <=> $b} keys %lines) {
>>>>        $sorted_lines[$i] = $lines{$num};
>>>>        $i++;
>>>>    }
>>>>    @sorted_lines;
>>>> }
>>>>
>>>> # This is a sort routine that will sort on the
>>>> # ip address when the ip address is anywhere in
>>>> # the strings.
>>>> sub ipsort {
>>>>    local(%lines)=@_;
>>>>    local($i) = 0;
>>>>    local(@sorted_lines);
>>>>    foreach $addr (sort sortbyipaddr keys %lines) {
>>>>        $sorted_lines[$i] = $lines{$addr};
>>>>        $i++;
>>>>    }
>>>>    @sorted_lines;
>>>> }
>>>>
>>>> # These two routines will sort based upon IP addresses
>>>> sub ipaddrval {
>>>>    my(@a) = ($_[0] =~ m#^(\d+)\.(\d+)\.(\d+)\.(\d+)$#);
>>>>    $a[3]+256*($a[2]+256*($a[1]+256*$a[0]));
>>>> }
>>>> sub sortbyipaddr {
>>>>    &ipaddrval($a) <=> &ipaddrval($b);
>>>> }
>>>>
>>>>
>>>> # This routine processes a "show configuration"
>>>> # This routine processes a "show configuration"
>>>> sub WriteTerm {
>>>>    print STDERR "    In WriteTerm: $_" if ($debug);
>>>>    #my($lineauto) = 0;
>>>>
>>>>    while (<INPUT>) {
>>>> #print STDERR "History $_\n";
>>>>
>>>>        tr/\015//d;
>>>>        last if(/^$prompt/);
>>>>        next if (/^(\s*|\s*$cmd\s*)$/);
>>>>        return(1) if (/^\s*\^\s*$/);
>>>>        return(1) if (/Line has invalid autocommand /);
>>>>        return(1) if (/(Invalid (input|command) detected|Type help or
>> )/i);
>>>>        return(-1) if (/command authorization failed/i);
>>>>        # the pager can not be disabled per-session on the PIX
>>>>        if (/^(<-+ More -+>)/) {
>>>>            my($len) = length($1);
>>>>            s/^$1\s{$len}//;
>>>>        }
>>>>  
>>>>        /^/ && next;
>>>>        ProcessHistory("COMMENTS","keysort","B1","# $_") && next;
>>>>    }
>>>>
>>>>        # end of config...is a comment.
>>>>        if (/^return/i) {
>>>> $found_end = 1;
>>>>            return(1);
>>>>        }
>>>>
>>>>        return(0);
>>>> }
>>>>
>>>> # This routine copies everything with precefing "#"
>>>> sub CopyComment {
>>>>    print STDERR "    In CopyComment: $_" if ($debug);
>>>>
>>>>    while (<INPUT>) {
>>>>        tr/\015//d;
>>>>        last if (/^$prompt/);
>>>>
>>>>        ProcessHistory("","","","# $_");
>>>>        # end of config
>>>>    }
>>>>    return(0);
>>>> }
>>>>
>>>> # filter out "uptime" lines
>>>> sub FilterUptime {
>>>>    print STDERR "    In FilterUptime: $_" if ($debug);
>>>>
>>>>    while (<INPUT>) {
>>>>        tr/\015//d;
>>>>        last if (/^$prompt/);
>>>> #nmeongeza
>>>>        next if (/^(\s*|\s*$cmd\s*)$/);
>>>>        return(-1) if (/command authorization failed/i);
>>>>        /^VERSION\=>(\s+.*)$/ &&
>>>> ProcessHistory("COMMENTS","keysort","C1","\#\n# Version: $1\n")
>>>> && next;
>>>>        /^PATCH\=>(\s+.*)$/ &&
>>>> ProcessHistory("COMMENTS","keysort","C2","\# Patch: $1\n")
>>>> && next;
>>>>
>>>>        /^PRODUCT\=>(\s+.*)$/ &&
>>>> ProcessHistory("COMMENTS","keysort","C3","\# Version: $1\n")
>>>> && next;
>>>> }
>>>> return(0);
>>>> }
>>>>
>>>>
>>>> # dummy function
>>>> sub DoNothing {print STDOUT;}
>>>>
>>>> # Main
>>>> @commandtable = (
>>>>        {'display version'                      => 'FilterUptime'},
>>>>        {'display patch-information'            => 'CopyComment'},
>>>>        {'display device'                        => 'CopyComment'},
>>>>        {'display device pic-status'            => 'CopyComment'},
>>>>        {'display current-configuration'        => 'WriteTerm'},
>>>> );
>>>>
>>>> # Use an array to preserve the order of the commands and a hash for
>>> mapping
>>>> # commands to the subroutine and track commands that have been
> completed.
>>>> @commands = map(keys(%$_), @commandtable);
>>>> %commands = map(%$_, @commandtable);
>>>>
>>>> $huaw_cmds=join(";", at commands);
>>>> $cmds_regexp=join("|", at commands);
>>>>
>>>> open(OUTPUT,">$host.new") || die "Can't open $host.new for writing:
>> $!\n";
>>>> select(OUTPUT);
>>>> # make OUTPUT unbuffered if debugging
>>>> if ($debug) { $| = 1; }
>>>>
>>>> if ($file) {
>>>>    print STDERR "opening file $host\n" if ($debug);
>>>>    print STDOUT "opening file $host\n" if ($log);
>>>>    open(INPUT,"<$host") || die "open failed for $host: $!\n";
>>>> } else {
>>>>    print STDERR "executing hulogin -t $timeo -c\"$huaw_cmds\" $host\n"
>>>> if ($debug);
>>>>    print STDOUT "executing hulogin -t $timeo -c\"$huaw_cmds\" $host\n"
>>>> if ($debug);
>>>>    if (defined($ENV{NOPIPE}) && $ENV{NOPIPE} =~ /^YES/i) {
>>>>        system "hulogin -t $timeo -c \"$huaw_cmds\" $host </dev/null >
>>>> $host.raw" || die "hulogin failed for $host: $!\n";
>>>>        open(INPUT, "< $host.raw") || die "hulogin failed for $host:
>> $!\n";
>>>>    } else {
>>>>        open(INPUT,"hulogin -t $timeo -c \"$huaw_cmds\" $host </dev/null
>>>> |") || die "hulogin failed for $host: $!\n";
>>>>    }
>>>> }
>>>>
>>>> # determine password filtering mode
>>>> if ($ENV{"FILTER_PWDS"} =~ /no/i) {
>>>>        $filter_pwds = 0;
>>>> } elsif ($ENV{"FILTER_PWDS"} =~ /all/i) {
>>>>        $filter_pwds = 2;
>>>> } else {
>>>>        $filter_pwds = 1;
>>>> }
>>>>
>>>> ProcessHistory("","","","#RANCID-CONTENT-TYPE: Huawei\n#\n");
>>>> ProcessHistory("COMMENTS","keysort","B0","#\n");
>>>> ProcessHistory("COMMENTS","keysort","F0","#\n");
>>>> ProcessHistory("COMMENTS","keysort","G0","#\n");
>>>> TOP: while(<INPUT>) {
>>>>    tr/\015//d;
>>>>
>>>> #print STDERR ("CMD: $_\n");
>>>>
>>>>    if (/\>\s?quit.*$/) {
>>>>        $clean_run=1;
>>>>        last;
>>>>    }
>>>>
>>>>    if (/^Error:/) {
>>>>        print STDOUT ("$host hulogin error: $_");
>>>>        print STDERR ("$host hulogin error: $_") if ($debug);
>>>>        $clean_run=0;
>>>>        last;
>>>> }
>>>>
>>>>    while (/\>\007*\s*($cmds_regexp)\s*$/) {
>>>>        $cmd = $1;
>>>>
>>>>        if (!defined($prompt)) {
>>>>            $prompt = ($_ =~ /^([^>]+\>)/)[0];
>>>>            $prompt =~ s/([][}{)(file://])///$1/g;
>>>>            print STDERR ("PROMPT MATCH: $prompt\n") if ($debug);
>>>>        }
>>>>        print STDERR ("HIT COMMAND:$_") if ($debug);
>>>>        if (! defined($commands{$cmd})) {
>>>>            print STDERR "$host: found unexpected command - \"$cmd\"\n";
>>>>            $clean_run = 0;
>>>>            last TOP;
>>>>        }
>>>>        $rval = &{$commands{$cmd}};
>>>>        delete($commands{$cmd});
>>>>        if ($rval == -1) {
>>>>            $clean_run = 0;
>>>>            last TOP;
>>>>        }
>>>>    }
>>>> }
>>>> print STDOUT "Done $logincmd: $_\n" if ($log);
>>>> # Flush History
>>>> ProcessHistory("","","","");
>>>> # Cleanup
>>>> close(INPUT);
>>>> close(OUTPUT);
>>>>
>>>> if (defined($ENV{NOPIPE})) {
>>>>    #unlink("$host.raw") if (! $debug);
>>>> }
>>>> # check for completeness
>>>> if (scalar(%commands) || !$clean_run || !$found_end) {
>>>>    if (scalar(%commands)) {
>>>>        printf(STDOUT "$host: missed cmd(s): %s\n", join(',',
>>>> keys(%commands)));
>>>>        printf(STDERR "$host: missed cmd(s): %s\n", join(',',
>>>> keys(%commands))) if ($debug);
>>>>    }
>>>>    if (!$clean_run || !$found_end) {
>>>>        print STDOUT "$host: End of run not found\n";
>>>>        print STDERR "$host: End of run not found\n" if ($debug);
>>>>        system("/usr/bin/tail -1 $host.new");
>>>>    }
>>>>    #unlink "$host.new" if (! $debug);
>>>> }
>>>>
>>>>
>>>
>>>
>>> --
>>> Alan McKinnon
>>> alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>
> <mailto:alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>>
>> <mailto:alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>
> <mailto:alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>>>
>>>
>>> _______________________________________________
>>> Rancid-discuss mailing list
>>> Rancid-discuss at shrubbery.net <mailto:Rancid-discuss at shrubbery.net>
> <mailto:Rancid-discuss at shrubbery.net <mailto:Rancid-discuss at shrubbery.net>>
>> <mailto:Rancid-discuss at shrubbery.net
> <mailto:Rancid-discuss at shrubbery.net>
> <mailto:Rancid-discuss at shrubbery.net <mailto:Rancid-discuss at shrubbery.net>>>
>>> http://www.shrubbery.net/mailman/listinfo/rancid-discuss
>>>
>>>
>>
>>
>> --
>> Alan McKinnon
>> alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>
> <mailto:alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>>
>>
>>
>>
> 
> 
> -- 
> Alan McKinnon
> alan.mckinnon at gmail.com <mailto:alan.mckinnon at gmail.com>
> 
> 
> 


-- 
Alan McKinnon
alan.mckinnon at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.shrubbery.net/pipermail/rancid-discuss/attachments/20130917/6e9f14bd/attachment.html>


More information about the Rancid-discuss mailing list