Frage

Ich versuche, ein IRC-Bot zu bauen, die mich in einem privaten Kanal erzählt über jede Commit-Nachricht, die ich möchte wissen. Aber ich habe Probleme zu bekommen pro

#!/bin/bash 
REPOS="$1" 
REV="$2" 
# call bot with arguments reposname, revison and commit message in one string 
/usr/bin/perl /home/user/repo/svn_irc_bot.pl "$REPOS" "$REV" 
# all checks passed, so allow the commit 
exit 0

Dann der aufgerufene Perl-Skript:

#!/usr/bin/perl -w
# see http://www.javalinux.it/wordpress/2009/10/15/writing-an-irc-bot-for-svn-commit-notification/
# see http://oreilly.com/pub/h/1964
use strict;
# We will use a raw socket to connect to the IRC server.
use IO::Socket;
my $repos = $ARGV[0];
my $rev = $ARGV[1];
my $commit = `/usr/bin/svnlook log $repos`;
my $user = `whoami`;
# The server to connect to and our details.
my $server = "irc.server.com";
my $nick = "bot2";
my $login = "bot2";
# The channel which the bot will join.
# my $channel = "#channel";
# Connect to the IRC server.
my $sock = new IO::Socket::INET(PeerAddr => $server,
                                PeerPort => 6667,
                                Proto => 'tcp') or
                                die "Can't connect\n";
# Log on to the server.
print $sock "NICK $nick\r\n";
print $sock "USER $login 8 * :Perl IRC Hacks Robot\r\n";
# Read lines from the server until it tells us we have connected.
while (my $input = <$sock>) {
    # Check the numerical responses from the server.
    if ($input =~ /004/) {
        # We are now logged in.
        print $sock "PRIVMSG mynick : $user: $repos r$rev -- $commit\n";
        last;
    }
    elsif ($input =~ /433/) {
        die "Nickname is already in use.";
    }
}
sleep(5);
print $sock "QUIT bye... \n";
sleep(5);
close($sock);

Also, mein Bot stellt keine Verbindung, und kann mir ...

sprechen

Wenn ich den Shell-Skript manuell zu starten, nur ein Wort (die Zeichenfolge innerhalb $ user, nicht einmal der folgende Doppelpunkt) gesendet wird.

Wenn das Skript von SVN aufgerufen wird, durch eine beliebte zu begehen, scheint ist wie die $ user und $ begehen Strings leer sind, $ user und $ repos übertragen werden ...

Ich denke, dass etwas mit meinem Einsatz von whoami falsch ist und svnlook ... Aber ich kann es nicht herausgefunden. Vielleicht kann mir jemand einen Tip geben?

War es hilfreich?

Lösung

Der Grund, warum Sie nur „$ user“ ohne vorangestellten Doppelpunkt erhalten ist, weil Sie Ausgabe von whoami aufnimmst, und dass die Ausgabe enthält eine neue Zeile. Das Newline wird als das Ende der Zeichenfolge abgeschickt interpretiert. Versuchen Sie chomp $user, um loszuwerden, die Newline vor $user verwendet wird.

  

Wenn das Skript wird von SVN Trog aufgerufen   ein begehen, ist scheint, wie die $ user und   $ Begehen Strings leer sind, $ user und   $ Repos übertragen werden ...

Ich gehe davon aus, dass Sie SVN $user und $commit bedeuten durch leer sind, aber $rev und $repos übertragen werden, da das Sinn machen würde ...

Sie werden das gleiche Problem mit $commit von svnlook haben, sondern weil die Festschreiben am Ende Ihrer Nachricht kommt, werden Sie nur ein Problem haben, wenn Sie Ihre Nachricht Zeilenumbrüche in ihm hat. Zum Beispiel kann ein Newline, wenn die erste Zeile Ihrer Nachricht ist, werden Sie nichts sehen. Dafür würde ich empfehlen, alle der Zeilenumbrüche aus der Nachricht zu entfernen, wahrscheinlich mit y/\n//.

Als Haken ist zu $user leer von innen, das hängt davon ab, wie Sie SVN verwenden. Es ist durchaus möglich, dass whoami nicht in der Lage ist, den Benutzer-ID, zum Beispiel zu finden, wenn der Prozess des Haken läuft nicht mit jedem Login zugeordnet ist. Sie werden wahrscheinlich eine andere Methode der müssen die Benutzer in diesem Fall, wie die erste Zeile der Ausgabe von svnlook info zu bestimmen.

Andere Tipps

Sie verwenden nur statt des vollständigen Pfad zum Befehl whoami, aber es gibt keine Garantie dafür, dass, wenn das Skript von SVN aufgerufen wird, wird die $PATH env Variable die gleichen Verzeichnisse wie die enthalten Shell hat.

Eine andere Sache, die Sie überprüfen sollten, ist, dass die uid unter dem SVN das Skript ausführt Berechtigungen svnlook zu verwenden hat und das Repository zugreifen zu können.

Nicht sicher, ob Ihr Problem aus dieser kommt, aber es ist sicher ein guter Ort, um zu suchen.

Ich bin darüber nicht sicher, aber versuchen, zwei Dinge.

Zuerst die Berechtigungen der Dateien überprüfen Sie ausführen. Wenn sie nicht über Berechtigungen whoami laufen und svnlookup dann bist du ziemlich viel geschraubt. Zweitens nur geben qx (cmd) einen Schuss statt cmd.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top