Bonjour.

Dès que l'on utilise des entités, la gestion des logiciels devient
rapidement très fastidieuse, puisque les logiciels sont automatiquement
rattachés à la même entité que leur machine, et on obtient énormément de
duplication. Il faut manuellement transférer ces logiciels à l'entité
racine, leur attribuer une visibilité aux sous-entités, et les
fusionner. Ce qui est ingérable sur un parc: j'en suis à 5400 logiciels
recensés, dont 2/3 de duplicats.

Je viens de regarder comment corriger automatiquement le problème, en
manipulant directement la base de données. A priori, le problème se
traite de la façon suivante:

1) transfert à l'entité racine pour tous les logiciels:
passer le champ fk_entities à 0 partout dans la table glpi_software

2) activation de la visibilité aux sous-entités pour tous les logiciels:
passer le champ recursive à 1 partout dans la table glpi_software

3) fusion automatique des doublons
Un poil plus complexe, puisqu'il faut mettre à jour les autres tables
pointant vers la table glpi_software, qui semblent limitées à
glpi_softwarelicenses et glpi_softwareversions d'après mes observations

pour chaque entrée de la table glpi_software:
- pour chaque entrée de la table glpi_software avec le même nom et un
identifiant différent
 - passer le champ deleted à 1
 - passer le champ commentaire à 'Logiciel mis dans la corbeille'
 - mettre à jour la table glpi_softwareversions
 - mettre à jour la table glpi_softwarelicenses

Est-ce que ca parait raisonnable, ou j'ai manqué quelque chose ?

En cadeau, une première implémentation en Perl (je n'ai testé que la
détection des doublons, pas les modifications).
-- 
BOFH excuse #342:

HTTPD Error 4004 : very old Intel cpu - insufficient processing power
#!/usr/bin/perl

use strict;
use DBI;

my %config;
my $config_file = '/etc/glpi/config_db.php';

open (my $fh, '<', $config_file) or die "Can't open $config_file: $!";
while (my $line = <$fh>) {
    next unless $line =~ /var \s \$(\w+) \s* = \s '([^']+)';/x;
    $config{$1} = $2;
}
close $fh;

my $dbh = DBI->connect(
    "DBI:mysql:database=glpi;host=localhost",
    $config{dbuser},
    $config{dbpassword}
);

# ensure all software belong to root entity
$dbh->do("update glpi_software set fk_entities=0 where fk_entities<>0");
# ensure all software are visible to sub-entities
$dbh->do("update glpi_software set recursive=1 where recursive<>1");

# check each software entry
my $select_all   = $dbh->prepare("select id,name from glpi_software");
my $select_dupes = $dbh->prepare(
    "select id,name from glpi_software where name=? and ID<>?"
);
my $update_licenses = $dbh->prepare(
    "update glpi_softwarelicenses set sID=? where sID=?"
);
my $update_versions = $dbh->prepare(
    "update glpi_softwareversions set sID=? where sID=?"
);
my $update_software = $dbh->prepare(
    "update glpi_software set " .
    "deleted=1 comments='Logiciel mis dans la corbeille après regroupement' " .
    "where ID=?"
);

$select_all->execute();
while (my $software = $select_all->fetchrow_hashref()) {
    $select_dupes->execute($software->{name}, $software->{id});
    while (my $dupe = $select_dupes->fetchrow_hashref()) {
        print
            "$dupe->{name} ($dupe->{id}) is a duplicate of " .
            "$software->{name} ($software->{id}))\n";
        $update_licenses->execute($software->{id}, $dupe->{id});
        $update_versions->execute($software->{id}, $dupe->{id});
        $update_software->execute($dupe->{id});
    }
}

$dbh->disconnect();

sub merge {
}
_______________________________________________
Glpi-user mailing list
[email protected]
https://mail.gna.org/listinfo/glpi-user

Reply via email to