kleines Problem mit Perl-Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

kleines Problem mit Perl-Script

Beitrag von skar » 27.01.2005 16:55:16

Also, ich habe ein kleines Problem mit nem kleinen Script. Mldonkey lädt eine Datei runter, und ruft sobald er fertig ist, dieses Script auf. Allerdings meldet er mir dann immer folgenden Fehler:

mv: Aufruf von stat für ,,/home/mldonkey/incoming/irgendeinedatei" nicht möglich: Datei oder Verzeichnis nicht gefunden

Das script sieht folgendermassen aus und soll die dateien den endungen entsprechend in die einzelnden Verzeichnisse verschieben.
Was mache ich falsch? Ich finde partout den Fehler einfach nicht.

Code: Alles auswählen

#!/usr/bin/perl
use strict;
use File::Basename;

# file_completed_cmd interface
my ($hash, $size, $file) = @ARGV;
exit if !$hash || !$size || !$file;

my $incoming='/home/mldonkey/incoming';
my $minfreekb=1024;

# Define extensions here !!!

my %dispatch = (
# video
   '.avi .mpg .mpeg .wmv .divx .asf' => '/home/mldonkey/share/videos',
# image
   '.iso .bin .cue' => '/home/mldonkey/share/images/',
# soft
   '.sh .exe .gz .bz2 .tar .tgz .rpm .deb' => '/home/mldonkey/share/software/',
# audio
   '.mp3 .wma .ogg .mod .xm' => '/home/mldonkey/share/musik/',
# bilder
   '.jpg .bmp .gif .tif .JPG .BMP .GIF .TIF' => '/home/mldonkey/share/bilder/',
);

my $sizekb=($size+1023)/1024;
my $requiredkb=$sizekb+$minfreekb;

sub enough_space {
    my ($dir) = @_;
    my $dirfreekb = -1;
    if(open(DF, "df -k $dir|")) {
      my $headers = <DF>;
      my $line = <DF>; chomp $line;
      close DF;
      $dirfreekb = ( split(/[ \t]+/, $line) )[3] if defined $line;
    }
    $dirfreekb >= $requiredkb;
}

sub move_if_ok {
    my ($file, $dir) = @_;
    enough_space($dir) && system ('mv', $file, $dir) == 0
}

my $ext = (fileparse($file, '\.[^.]+$'))[2];
while(my ($exts, $extdir) = each %dispatch) {
  my @exts = split / +/, $exts;
  if((grep { $_ eq $ext } @exts) > 0) {
    move_if_ok($incoming.$file, $extdir) && last
  }
}

Danke schonmal für eure Hilfe!

skar

edit bert: code tags eingefügt....
edit skar: danke bert :)
Zuletzt geändert von skar am 28.01.2005 13:35:49, insgesamt 1-mal geändert.
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

Benutzeravatar
Jens-Uwe
Beiträge: 219
Registriert: 23.04.2003 10:27:13
Wohnort: Karlsruhe
Kontaktdaten:

Beitrag von Jens-Uwe » 27.01.2005 18:56:26

hallo,

OHNE(!) mir das skript anzuschauen, welche version von mldonkey benutzt du?

Code: Alles auswählen

dpkg -l mldonkey-server
denn die unstable version hatte/hat einen bug ([Mldonkey-bugs] [bugs #9002] A successfull download restarts again), der die downloads neu startet, obwohl er erfolgreich war. damit sind die daten dann futsch.

hth, jens-uwe

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 27.01.2005 20:54:01

Denn bug kenne ich. Habe mir selber ein paket gebaut.

2.5.16u mit der Version ist auch alles ok, er speichert die Daten auch, nur verarbeitet er eben dieses script nicht korrekt. Er ruft das skript auf, das skript meldet ihm, daß es die Datei nicht finden kann, also speichert mldonkey es ganz normal im Incoming-Ordner.

Noch jemand rat?

skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

mastermind_the_real_one
Beiträge: 644
Registriert: 16.12.2003 15:44:51

Beitrag von mastermind_the_real_one » 27.01.2005 21:23:09

skar hat geschrieben:Er ruft das skript auf, das skript meldet ihm, daß es die Datei nicht finden kann, also speichert mldonkey es ganz normal im Incoming-Ordner.
Bist Du Dir mit der Reihenfolge (oben) sicher? Bei der C-GUI funktioniert das so:

- Download wird vom core completed
- Download wird vom core nach incoming verschoben
- Script wird von der GUI aufgerufen

Sollte das auch für mldonkey zutreffen, dann kann dein Script die Datei nicht mehr finden, da sie bereits vorher in incoming landet.

Alternativlösungen falls das mit der Reihenfolge beim mldonkey wirklich so wie von mir erwähnt ist:

1. Script so anpassen, dass es in incoming nachschaut und dann verschiebt

oder

2. per Cronjob ein Script einmal täglich/stündlich/wie_auch_immmer in incoming nachschauen lassen und dann verschieben.

Ich würde zu 1. tendieren, da das Script bei dieser Variante nur dann aufgerufen wird, wenn auch wirklich eine Datei fertig ist.

greetz
mastermind

geier369
Beiträge: 32
Registriert: 01.09.2004 07:49:17

Beitrag von geier369 » 27.01.2005 22:56:02

Hi,

du hast im Code $incoming.$file
fehlt da eventuell ein / am Ende von incoming??
also my $incoming='/home/mldonkey/incoming/';

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 28.01.2005 00:51:49

@mastermind sage mal, ich glaube ich kenne dich aus einem kleinen edonkey-forum, betreiber ist diesel, kann das sein?

Also, anders als die C-GUI completed er die Datei, ordnet der Temp Datei einen Namen zu, übergibt die Tempdatei + Name an das script und dieses verschiebt es dann nach belieben.


@geier369
nein, daran lag es nicht. trotzdem danke für den tip.


noch jemand rat?

thx
skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

mastermind_the_real_one
Beiträge: 644
Registriert: 16.12.2003 15:44:51

Beitrag von mastermind_the_real_one » 28.01.2005 01:44:39

Yep,
lag mir vorhin auch schon auf der Zunge. Den Nick skar trifft man nicht allzuoft. ;-) Hatte allerdings keine Zeit mehr etwas dazu zu schreiben.

Zum Prob: Ich hab mldonkey schon ewig nicht genutzt und Perl kann ich auch nicht. Werd Dir da wohl nicht wirklich weiterhelfen können. Wenn das so abläuft wie Du schreibst, dann muss der Fehler irgendwo im Script sein.

Der Befehl mv findet laut Fehlermeldung die Datei nicht. Kann er ja auch nicht, da er laut Fehlermeldung in incoming nachschaut wo ja noch nichts ist. Du musst also irgendwoher das Tempfile bekommen, damit Du es entsprechend verschieben kannst.

Vielleicht hilfts ja als Denkanstoß, ansonsten musst Du wohl auf nen Perlprofi warten.

greetz
mastermind

geier369
Beiträge: 32
Registriert: 01.09.2004 07:49:17

Beitrag von geier369 » 28.01.2005 09:10:04

hi,

das Verzeichnis incoming existiert aber schon, oder?
mv würde das nicht anlegen.

sonst ist wohl so wie mastermind_the_real_one schreibt,
die Dateien die du verschieben willst werden nicht gefunden

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 28.01.2005 13:26:38

@mastermind 2 leute, 2 gedanken. Schön mal wieder einen alten bekannten zu treffen. Also, du hast recht. Mldonkey hat die Datei noch nicht im Incoming-Ordner gespeichert, also kann er sie auch noch nicht verschieben. also muß ich in das script noch einen commit befehl einbauen, der per telnet/netcat an mldonkey übergeben wird.

@geier369

danke, zumindest weiß ich jetzt wo der fehler liegt.
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 02.02.2005 03:33:15

also, vieleicht kann mir hier ja mal jemand folgenden kleien befehl in perl übersetzen, damit ich ihn in das obige script einbauen kann:

Code: Alles auswählen

echo -e "commit\nq"|nc localhost 4000

ich habe leider absolut keine ahnung von perl und leider auch momentna nichtt wirklich die Zeit, mich da reinzufuxen.

thx
skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

dojo
Beiträge: 249
Registriert: 03.11.2004 10:30:21

Beitrag von dojo » 02.02.2005 08:04:30

probier es mal mit

Code: Alles auswählen

exec 'echo commit\nq | nc localhost 4000';
Gruss

Sunnemer

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 02.02.2005 22:18:42

wenn perl nach dem Kommando weiterlaufen soll:

Code: Alles auswählen

system('echo -e "commit\nq"|nc localhost 4000');

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 02.02.2005 23:17:37

@gms danke, durch deinen tip funzt das script jetzt so wie es soll!
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

Antworten