2003-06-21 12:35:30 +04:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
Copyright ( C ) 2003 Andrew Bartlett ( abartlet @ samba . org )
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA . */
# include "includes.h"
# include "../utils/net.h"
/***********************************************************
Helper function for net_idmap_dump . Dump one entry .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int net_idmap_dump_one_entry ( TDB_CONTEXT * tdb ,
TDB_DATA key ,
TDB_DATA data ,
void * unused )
{
if ( strcmp ( key . dptr , " USER HWM " ) = = 0 ) {
printf ( " USER HWM %d \n " , IVAL ( data . dptr , 0 ) ) ;
return 0 ;
}
if ( strcmp ( key . dptr , " GROUP HWM " ) = = 0 ) {
printf ( " GROUP HWM %d \n " , IVAL ( data . dptr , 0 ) ) ;
return 0 ;
}
if ( strncmp ( key . dptr , " S- " , 2 ) ! = 0 )
return 0 ;
printf ( " %s %s \n " , data . dptr , key . dptr ) ;
return 0 ;
}
/***********************************************************
Dump the current idmap
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int net_idmap_dump ( int argc , const char * * argv )
{
TDB_CONTEXT * idmap_tdb ;
if ( argc ! = 1 )
return net_help_idmap ( argc , argv ) ;
idmap_tdb = tdb_open_log ( argv [ 0 ] , 0 , TDB_DEFAULT , O_RDONLY , 0 ) ;
if ( idmap_tdb = = NULL ) {
d_printf ( " Could not open idmap: %s \n " , argv [ 0 ] ) ;
return - 1 ;
}
tdb_traverse ( idmap_tdb , net_idmap_dump_one_entry , NULL ) ;
tdb_close ( idmap_tdb ) ;
return 0 ;
}
/***********************************************************
Write entries from stdin to current local idmap
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int net_idmap_restore ( int argc , const char * * argv )
{
2003-06-28 00:55:48 +04:00
if ( ! idmap_init ( lp_idmap_backend ( ) ) ) {
2003-06-21 12:35:30 +04:00
d_printf ( " Could not init idmap \n " ) ;
return - 1 ;
}
while ( ! feof ( stdin ) ) {
fstring line , sid_string ;
int len ;
unid_t id ;
int type = ID_EMPTY ;
DOM_SID sid ;
if ( fgets ( line , sizeof ( line ) - 1 , stdin ) = = NULL )
break ;
len = strlen ( line ) ;
if ( ( len > 0 ) & & ( line [ len - 1 ] = = ' \n ' ) )
line [ len - 1 ] = ' \0 ' ;
2003-07-22 08:31:20 +04:00
/* Yuck - this is broken for sizeof(gid_t) != sizeof(int) */
2003-06-21 12:35:30 +04:00
if ( sscanf ( line , " GID %d %s " , & id . gid , sid_string ) = = 2 ) {
type = ID_GROUPID ;
}
2003-07-22 08:31:20 +04:00
/* Yuck - this is broken for sizeof(uid_t) != sizeof(int) */
2003-06-21 12:35:30 +04:00
if ( sscanf ( line , " UID %d %s " , & id . uid , sid_string ) = = 2 ) {
type = ID_USERID ;
}
if ( type = = ID_EMPTY ) {
d_printf ( " ignoring invalid line [%s] \n " , line ) ;
continue ;
}
if ( ! string_to_sid ( & sid , sid_string ) ) {
d_printf ( " ignoring invalid sid [%s] \n " , sid_string ) ;
continue ;
}
if ( ! NT_STATUS_IS_OK ( idmap_set_mapping ( & sid , id , type ) ) ) {
d_printf ( " Could not set mapping of %s %d to sid %s \n " ,
( type = = ID_GROUPID ) ? " GID " : " UID " ,
( type = = ID_GROUPID ) ? id . gid : id . uid ,
sid_string_static ( & sid ) ) ;
continue ;
}
}
idmap_close ( ) ;
return 0 ;
}
int net_help_idmap ( int argc , const char * * argv )
{
d_printf ( " net idmap dump filename " \
" \n Dump current id mapping \n " ) ;
d_printf ( " net idmap restore " \
" \n Restore entries from stdin to current local idmap \n " ) ;
return - 1 ;
}
/***********************************************************
Look at the current idmap
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int net_idmap ( int argc , const char * * argv )
{
struct functable func [ ] = {
{ " dump " , net_idmap_dump } ,
{ " restore " , net_idmap_restore } ,
{ " help " , net_help_idmap } ,
{ NULL , NULL }
} ;
return net_run_function ( argc , argv , func , net_help_idmap ) ;
}