Zentyal Forum, Linux Small Business Server

International => Spanish => Topic started by: capel on January 02, 2013, 06:24:49 pm

Title: Importar desde CSV, usuarios a grupos (Zentyal 3) [RESUELTO]
Post by: capel on January 02, 2013, 06:24:49 pm
Buenas tardes,

LLevo unas horas dandole vueltas al asunto y no saco nada en claro. Quiero que al mismo tiempo que crea el usuario lo añada a un grupo pero me quedo en la creación del usuario sin asignarlo...

Me baso en el script de ejemplo http://doc.zentyal.org/es/develop.html (http://doc.zentyal.org/es/develop.html) añadiendo lo siguiente:

    [...]
    chomp ($line);
    my $user;
    my ($username, $givenname, $surname, $password, $group) = split(',', $line);
    $user->{'user'} = $username;
    $user->{'givenname'} = $givenname;
    $user->{'surname'} = $surname;
    $user->{'password'} = $password;
    $user->{'ou'} = $group;      # Documentado como parámetro en UsersAndGroups::User.pm
    push (@users, $user);
    [...]


Gracias y un saludo.
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: rjechevers on January 11, 2013, 09:41:14 pm
Hola esta es  el script que tengo y funciona correctamente


#!/usr/bin/perl

use strict;
use warnings;

use EBox;
use EBox::UsersAndGroups::User;

EBox::init();

my @users = ();

open(my $USERS,"/tmp/users") or die "Error opening 'users' file: $!";
while(my $line = <$USERS>) {
   chomp ($line);
   my $user;
   my ($username,$givenname,$surname,$password, $group) = split(',',$line);
   $user->{'user'} = $username;
   $user->{'givenname'} = $givenname;
   $user->{'surname'} = $surname;
   $user->{'password'} = $password;
 push (@users, $user);
}
close($USERS);
foreach my $user (@users) {
    EBox::UsersAndGroups::User->create($user, 0);
}

1;

Nota

1 El Script debes ponerlo en /tmp y el archivo de datos
2 El formato del archivo es  usuario,nombre,apellido,clave,

Saludos desde Panamá  y espero que les sirva
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: capel on January 14, 2013, 04:55:36 pm
Gracias por aportación rjechevers pero lo que busco es asociar esos usuarios a un grupo concreto. Hasta donde veo en tu script el 5º campo que recoges del CSV es el del grupo pero luego no lo usas en ningún lado.

Pd1: tanto 'bulkusers' como 'users' ya los ejecutaba desde '/tmp/', es raro que aun habiéndolos creado con root no funcionen desde cualquier carpeta.

Gracias de todos modos. Un saludo.
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: capel on January 17, 2013, 11:48:35 am
Tengo que decir que es la primera vez que tengo que tocar perl y después de unas horas documentandome he llegado al siguiente script:

#!/usr/bin/perl

use strict;
use warnings;

use EBox;
use EBox::UsersAndGroups::User;
use EBox::UsersAndGroups;

EBox::init();

my @users;

open (my $USERS, 'users');

while (my $line = <$USERS>) {
    chomp ($line);
    my $user;
   
    my ($username, $givenname, $surname, $password, $grupo) = split(',', $line);
    $user->{'user'} = $username;
    $user->{'givenname'} = $givenname;
    $user->{'surname'} = $surname;
    $user->{'password'} = $password;   
    my $g= EBox::UsersAndGroups->group($grupo);  # instancia en $g el grupo pasado por el csv
   
    if (!(-d "/home/$username")) {   
      my $u= EBox::UsersAndGroups::User->create($user, 0);
      $u-> addGroup($g);     # añade el usuario a su grupo
   }                              
}
   
close ($USERS);

1;



El error que me devuelve es el siguiente:

Can't use string ("EBox::UsersAndGroups") as a HASH ref while "strict refs" in use at /usr/share/perl5/EBox/LdapModule.pm line 60.

Sin saber como solventarlo, ¿ideas?

Un saludo y gracias.
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: capel on January 17, 2013, 12:15:20 pm
Bueno he avanzado un poco más en el asunto, logro agregar un usuario a un grupo que no existe:

#!/usr/bin/perl

use strict;
use warnings;

use EBox;
use EBox::UsersAndGroups::User;
use EBox::UsersAndGroups;

EBox::init();

my @users;

open (my $USERS, 'users');

while (my $line = <$USERS>) {
    chomp ($line);
    my $user;
   
    my ($username, $givenname, $surname, $password, $grupo) = split(',', $line);
    $user->{'user'} = $username;
    $user->{'givenname'} = $givenname;
    $user->{'surname'} = $surname;
    $user->{'password'} = $password; 
    my $g= EBox::UsersAndGroups::Group->create($grupo, 0);
   
    if (!(-d "/home/$username")) {   
      my $u= EBox::UsersAndGroups::User->create($user, 0);
      $g->addMember($u);
   }                              
}
   
close ($USERS);

1;



Lo que intento y no consigo es "capturar" ese objeto grupo existente. GetObject, ::Group->name('$grupo'), ... nada me sirve.

Un saludo.
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: jsalamero on January 22, 2013, 12:04:47 pm
Hola capel,

prueba con:

        use EBox::Global;

        my $users = EBox::Global->modInstance('users');
        my $group = $users->group($groupname);
        $group->addMember($u)

Un saludo,
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3)
Post by: capel on January 22, 2013, 04:20:03 pm
Perfecto, funciona correctamente.

Dejo el script completo para que el resto pueda echar mano de él:


#!/usr/bin/perl

use strict;
use warnings;

use EBox;
use EBox::UsersAndGroups::User;
use EBox::Global;

EBox::init();

my $users = EBox::Global->modInstance('users');


my @users;

open (my $USERS, 'users');

while (my $line = <$USERS>) {
    chomp ($line);
    my $user;
   
    my ($username, $givenname, $surname, $password, $grupo) = split(',', $line);
    $user->{'user'} = $username;
    $user->{'givenname'} = $givenname;
    $user->{'surname'} = $surname;
    $user->{'password'} = $password;   
       
    my $u= EBox::UsersAndGroups::User->create($user, 0);
    my $group = $users->group($grupo);
    $group->addMember($u);                         
}
   
close ($USERS);

1;
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3) [RESUELTO]
Post by: jsalamero on January 25, 2013, 12:45:07 pm
Estupendo, ¡gracias por compartir esto!
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3) [RESUELTO]
Post by: fernando on March 01, 2013, 11:33:12 am
Buenos días,

    Buscando información sobre la importación de usuario he llegado hasta el foro y he visto el script que solucionaba mi problema, pero al intentar ejecutarlo me da un error. No entiendo de perl, pero comparando con otros scripts que aparecen en el mismo hilo creo que hay que modificar un par de cosas al final del script.

Actualmente pone:

........
  my $u= EBox::UsersAndGroups::User->create($user, 0);
    my $group = $users->group($grupo);
    $group->addMember($u)
   }                             
}
   
close ($USERS);

1;

Y creo que habría que añadir un ; después de $group->addMember($u).
Y creo que sobra un }

Creo que quedaría así

........
  my $u= EBox::UsersAndGroups::User->create($user, 0);
    my $group = $users->group($grupo);
    $group->addMember($u);
}
   
close ($USERS);

1;


Lo he probado con la modificación y parece que funciona, pero sería preferible que el usuario capel que el el creador del script, o alguien que entienda más que yo comprobara si el cambio es correcto o no.


Un saludo y gracias por el script, me ha venido muy bien.

Fernando.
Title: Re: Importar desde CSV, usuarios a grupos (Zentyal 3) [RESUELTO]
Post by: capel on March 04, 2013, 06:39:43 pm
Modificado, pequeño error al editar algo de código complementario que no venia a cuento para algo general.

Gracias por el detalle fernando, un saludo.