#!/usr/bin/php4 -q
#
# Copyright 2005 Emiliano 'AlberT' Gabrielli 
# AlberT@SuperAlberT.it - http://www.SuperAlberT.it
#
# This program is released under the GNU GPL version 2
# The program is released AS IS
<?php
error_reporting
(E_ALL);

#define('DEBUG', FALSE);

function p_debug($str)
{
    if (!
defined('DEBUG') || DEBUG!==TRUE) {
        return 
FALSE;
    }
    echo 
"DEBUG: $str\n";

    return 
TRUE;
}

function 
p_error($str)
{
    echo 
"ERROR: $str\n";

    return 
TRUE;
}

function 
phelp()
{
    echo <<<EOT

Uso: invocare lo script da command line.
     
{$_SERVER['argv'][0]} users_file <separatore>

Sono accettati i seguenti argomenti, eventuali ulteriori argomenti sono ignorati:
users_file    il primo argomento, obbligatorio, indica il file da cui recuperare 
              la lista degli utenti
separatore    il secondo, opzionale, il separatore di campo usato nel file utenti
             per delimitare le diverse informazioni. Se non specificato viene 
              utilizzato il ':'
group         terzo argomento, opzionale, il gruppo predefinito da assegnare alla
              totalità degli utenti presenti nel file

EOT;
}

function 
create_user($u) {
    return 
create_system_user($u) || 
           
save_to_file($u);
    
}

function 
p_udata($udata) {
    echo 
implode(':',$udata), "\n"
    return 
TRUE;
}

function 
create_system_user($data) {
    
$cmd        '';
    
$cmd_out    = array();
    
$cmd_status NULL;
    
    if (!
array_key_exists('pwd'$data)) {
        
p_error("Il campo 'pwd' non è presente nei dati utente.");
        return 
FALSE;
    }
    
$encpwd crypt($data['pwd']);
    
extract($data);
    
create_system_group($group);
    foreach (
explode(','$groups) as $k => $g) {
        
create_system_group($g);
    }
    
$cmd 'useradd '.
           
"-g $group ".
           (empty(
$groups) ? '' "-G $groups ").
           
"-c \"$gecos\" ".
           
"-d /home/$user ".
           
'-m '.
           
"-p '$encpwd' ".
           
$user;

    
exec($cmd$cmd_out$cmd_status);
    
    if (!
is_dir("/home/$user")) {
        
mkdir("/home/$user");
    }
    
chown("/home/$user"$user);
    
chgrp("/home/$user"$group);
    
exec("chmod -R 700 /home/$user");
    
    return (bool)
$cmd_status;
}

function 
create_system_group($group) {
    
$groups file('/etc/group');
    foreach (
$groups as $k => $g) {
        list(
$g) = explode(':'$g);
        
$gps[] = $g;
    }
    
    if (!
in_array($group$gps)) {
        
p_debug("Il gruppo '$group' non esiste\n");
        return 
exec("addgroup $group"$cmd_out$cmd_status);
    }
    return 
TRUE;
}

function 
get_rnd_pwd($len=8) {
    
$charset 'abcdefghijklmnopqrstuvwxyz0123456789';
    
$pwd '';
    
srand((double)microtime()*1234567);
    
    for (
$i=0$i<$len; ++$i) {
        
$pwd .= $charset{rand(0,strlen($charset)-1)};
    }
    
    return 
$pwd;
 }

/************************************************************************/

if ( !array_key_exists('argv'$_SERVER) ||
     
$_SERVER['argc']<) {
        
phelp();
        exit;
}
$ufile $_SERVER['argv'][1];
if (!
is_readable($ufile)) {
    exit(
"Il file degli utenti fornito ($ufile) non è leggibile.\n\n");
}
p_debug("Uso '$ufile' come file degli utenti.");

$users file($ufile);
$fsep  = !empty($_SERVER['argv'][2]) ? $_SERVER['argv'][2] : ':';  
if ( 
FALSE===strpos(implode(''$users), $fsep) ) {
    
p_debug("Attenzione!!!\n\tIl file fornito non contiene il separatore '$fsep'. ".
           
'Continuo comunque...');
}    
$group = !empty($_SERVER['argv'][3]) ? $_SERVER['argv'][3] : 'users';

foreach (
$users as $k=>$u) {
    @list(
$u$gecos$g) = explode($fseptrim($u));
    
    
$udata = array('user'  => strtolower($u),
                   
'group' => $group,
                   
'groups'=> strtolower($g),
               
'pwd'   => get_rnd_pwd(),
               
'gecos' => $gecos,
               );
    
create_user($udata);
    
p_udata($udata);
}

?>