• [^] # Re: Tu peux le créer toi même ....

    Posté par (site web personnel) . En réponse au journal un "LanFileSearch" pour Linux ?. Évalué à 9.

    Je me dis même qu'avec le script ce serait mieux ...
    C'est basé sur la commande smbclient
    Bonne chance !

    #!/usr/bin/perl -w

    # Script de recherche de partages sur le rézo
    # Largement inspiré du script de gluck pour windows.
    # (C) Nicolas Deslandes Octobre 2002

    use DBI;
    use locale;

    sub AnaMachine;
    sub AddPartage;

    $mainserver = "JABBA"; # Nom du controleur de domaine
    $cptlog = "-U kekya\%[ldWemvldS\\!] -N";

    my $dbh = DBI->connect("DBI:mysql:rezo:yoda", "user", "mdp")
    or die "Impossible de se connecter à la base de données";

    open MACHINES,"smbclient -L $mainserver $cptlog|";
    my $started = 0; # On ne commence pas tout de suite à lire les lignes
    my $firstemptyline = 1;
    while()
    {
    # On saute les premières lignes inutiles
    next unless ($started or /Server.*Comment/);
    if (!$started)
    {
    $started = 1;
    next;
    }
    next if /-{9}\s+-{7}/; # On saute la ligne de soulignement

    # Si la ligne est vide, on arrête
    last if (/^$/);

    if(/\W+(.+?)\ {4,}/) {AnaMachine(1ドル);}
    }
    close MACHINES;
    exit;

    sub AnaMachine
    {
    my $machine = shift;

    # On regarde si la mise à jour de la machine est nécessaire
    # remplacement des apostrophes pour SQL
    (my $machineSQL = $machine) =~ s/'/''/g;

    my $dateMAJ = $dbh->selectrow_array("SELECT date FROM PartagesMAJ WHERE machine='$machineSQL'");

    #construction de la date courante
    my @temp = localtime();
    my $date = $temp[5] + 1900;
    $date .= '-'.($temp[4]+1).'-'.($temp[3]);
    $date =~ s/-(\d)-/-01ドル-/;
    $date =~ s/-(\d)$/-01ドル/;

    # Si la dateMAJ est définie, on la compare à la date courante,
    # sinon, on poursuit l'analyse de la machine
    if( defined $dateMAJ)
    {
    $dateMAJ =~ s/ 00:00:00$//;
    if($dateMAJ eq $date)
    {
    # Cas où on n'a rien à faire : on n'affiche rien à l'écran
    return;
    }
    }

    print "Mise à jour de $machine...";
    # On commence par regarder si la machine est online
    my $machineSH = $machine;
    $machineSH =~ s/!/\\!/g;
    $machineSH =~ s/'/\\'/g; # Ne semble pas marcher

    if(`smbclient -L $machineSH $cptlog | grep Connection` =~ /failed/)
    {
    #mettre à jour '$partageMAJ'
    print " offline; on essaiera plus tard\n";
    $dbh->do("UPDATE PartagesMAJ SET upState='0' WHERE machine='$machineSQL'");
    return;
    }
    else
    {
    #mettre à jour 'partageMAJ'
    print "\n";
    # On commence par effacer les entrées de la base liées à cette machine
    unless($dbh->do("DELETE FROM Partages WHERE machine='$machineSQL'"))
    {
    print "Impossible de supprimer les entrées de la base de données pour $machine\n";
    return;
    }

    open(LIST,"smbclient -L \"$machine\" $cptlog|");
    my $started = 0;
    my $ip = 0;
    while()
    {
    #print "Ligne : $_";
    if (/Got a positive name query response from (.*?)\s/) {
    $ip = 1ドル;
    # IP incorrecte : loopback; on passe à la machine suivante
    next if $ip eq "127.0.0.1";
    }
    # On atteint d'abord les "----"
    next unless $started or /-{9}\s+-/;
    if (!$started)
    {
    $started = 1;
    next;
    }

    # Si on rencontre une ligne vide, on sort
    last if /^$/;

    if(/\s+(.+?)\s+Disk/)
    {
    # Si le nom du partage finit par '$', on passe au suivant
    next if 1ドル =~ /\$$/;

    # Sinon, on ajoute le partage à la base de données
    AddPartage($machine,1ドル);
    }
    }
    close(LIST);
    # $machine a été analysée; on met à jour PartagesMAJ;
    # Modification de la date : on supprime tous les caractères non numériques
    $date =~ s/\D//g;

    unless(($dbh->do("UPDATE PartagesMAJ SET date=$date, upState='1', ip='$ip' WHERE machine='$machineSQL'") eq 1)
    or ($dbh->do("INSERT INTO PartagesMAJ VALUES ('$machineSQL', '$date', '$ip', '1')") eq 1) )
    {
    print "Erreur recontrée durant la mise à jour de la date de $machine\n";
    return;
    }
    }

    sub AddPartage
    {
    my $machine = shift;
    my $partage = shift;

    (my $machineSQL = $machine) =~ s/'/''/g;
    (my $partageSQL = $partage) =~ s/'/''/g;

    my $currep = "\\\\";

    open(LISTFICH, "(echo recurse && echo ls) | smbclient \"//$machine/$partage\" $cptlog|");
    while()
    {
    next unless (/^\ {2}(.+?)\s+([DAHRS]*)\s+(\d+)\s*[a-zA-Z]{3}\s[a-zA-Z]{3}/ or /^(\\.+)$/);
    next if((defined 2ドル) and (2ドル =~ /[DH]/) ); # si on détecte un attribut répertoire ou caché, on passe à la ligne suivante
    # (les réperoires sont détectés grâce à 3ドル)

    if(!defined 3ドル)
    {
    # Répertoire détecté : On met à jour le répertoire courant
    next if 1ドル =~ /^\.{1,2}/; # On saute les répertoire '.' et '..'
    $currep = 1ドル;
    # On modifie un peu ce qu'on a obtenu
    $currep .= '\\';
    $currep =~ s/\\/\\\\/g;
    $currep =~ s/'/''/g;
    }
    else
    {
    # Fichier
    my $nomfichcomplet = 1ドル;
    my $taille = 3ドル;
    my $nomf;
    my $extf; if ($nomfichcomplet =~ /(.+)\.(.+)/)
    {
    $nomf=1ドル;
    $extf=2ドル;
    }
    else
    {
    $nomf=$nomfichcomplet;
    $extf="";
    }

    $nomf =~ s/'/''/g;
    $extf =~ s/'/''/g;

    unless($dbh->do("INSERT INTO Partages VALUES "
    ."('$machineSQL','$partageSQL','$currep','$nomf','$extf',$taille)"))
    {
    print "Impossible d'insérer le fichier \\\\$machine\\$partage$currep\\$nomf.$extf : $taille;\n";
    }
    }
    }
    close LISTFICH;
    }
    }