2001-09-25 12:49:28 +00:00
/*
* Copyright ( C ) 2001 Sistina Software
*
* This LVM library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation ; either
* version 2 of the License , or ( at your option ) any later version .
*
* This LVM library 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
* Library General Public License for more details .
*
* You should have received a copy of the GNU Library General Public
* License along with this LVM library ; if not , write to the Free
* Software Foundation , Inc . , 59 Temple Place - Suite 330 , Boston ,
* MA 02111 - 1307 , USA
*
*/
2001-10-05 21:39:30 +00:00
# include "tools.h"
2001-09-25 12:49:28 +00:00
2001-10-08 18:44:22 +00:00
# include <ctype.h>
2001-09-25 12:49:28 +00:00
static int _autobackup = 1 ;
int autobackup_set ( )
{
2001-10-02 17:09:05 +00:00
return _autobackup ;
2001-09-25 12:49:28 +00:00
}
int init_autobackup ( )
{
2001-10-02 17:09:05 +00:00
char * lvm_autobackup ;
2001-09-25 12:49:28 +00:00
2001-10-04 22:53:37 +00:00
if ( arg_count ( autobackup_ARG ) ) {
2001-10-02 17:09:05 +00:00
_autobackup = strcmp ( arg_str_value ( autobackup_ARG , " y " ) , " n " ) ;
2001-10-04 22:53:37 +00:00
return 0 ;
}
_autobackup = 1 ; /* default */
lvm_autobackup = getenv ( " LVM_AUTOBACKUP " ) ;
if ( ! lvm_autobackup )
return 0 ;
2001-09-25 12:49:28 +00:00
2001-10-04 22:53:37 +00:00
log_print ( " using environment variable LVM_AUTOBACKUP "
" to set option A " ) ;
if ( ! strcasecmp ( lvm_autobackup , " no " ) )
_autobackup = 0 ;
else if ( strcasecmp ( lvm_autobackup , " yes " ) ) {
log_error ( " environment variable LVM_AUTOBACKUP has "
" invalid value \" %s \" ! " , lvm_autobackup ) ;
return - 1 ;
2001-09-25 12:49:28 +00:00
}
2001-10-02 17:09:05 +00:00
return 0 ;
2001-09-25 12:49:28 +00:00
}
2001-10-05 21:39:30 +00:00
int do_autobackup ( struct volume_group * vg )
2001-09-25 12:49:28 +00:00
{
2001-10-05 21:39:30 +00:00
/***************
2001-10-02 17:09:05 +00:00
log_verbose ( " Changing lvmtab " ) ;
2001-10-05 21:39:30 +00:00
if ( ( vg_cfgbackup ( vg_name , LVMTAB_DIR , vg ) ) ) {
2001-10-02 17:09:05 +00:00
log_error ( " \" %s \" writing \" %s \" " , lvm_error ( ret ) , LVMTAB ) ;
return LVM_E_VG_CFGBACKUP ;
}
2001-10-05 21:39:30 +00:00
* * * * * * * * * * * * * */
2001-09-25 12:49:28 +00:00
2001-10-02 17:09:05 +00:00
if ( ! autobackup_set ( ) ) {
log_print
2001-10-05 21:39:30 +00:00
( " WARNING: You don't have an automatic backup of %s " ,
vg - > name ) ;
2001-10-02 17:09:05 +00:00
return 0 ;
}
2001-09-25 12:49:28 +00:00
2001-10-05 21:39:30 +00:00
/***************
2001-10-02 17:09:05 +00:00
log_print ( " Creating automatic backup of volume group \" %s \" " , vg_name ) ;
2001-10-05 21:39:30 +00:00
if ( ( vg_cfgbackup ( vg_name , VG_BACKUP_DIR , vg ) ) ) {
2001-10-02 17:09:05 +00:00
log_error ( " \" %s \" writing VG backup of \" %s \" " , lvm_error ( ret ) ,
vg_name ) ;
return LVM_E_VG_CFGBACKUP ;
}
2001-10-05 21:39:30 +00:00
* * * * * * * * * * * * * * */
2001-09-25 12:49:28 +00:00
2001-10-02 17:09:05 +00:00
return 0 ;
2001-09-25 12:49:28 +00:00
}
2001-10-05 21:39:30 +00:00
int process_each_vg ( int argc , char * * argv ,
int ( * process_single ) ( const char * vg_name ) )
{
int opt = 0 ;
int ret_max = 0 ;
int ret = 0 ;
struct list_head * vgh ;
struct name_list * vgs_list ;
if ( argc ) {
log_verbose ( " Using volume group(s) on command line " ) ;
for ( ; opt < argc ; opt + + )
if ( ( ret = process_single ( argv [ opt ] ) ) > ret_max )
ret_max = ret ;
} else {
log_verbose ( " Finding all volume group(s) " ) ;
if ( ! ( vgs_list = ios - > get_vgs ( ios ) ) ) {
log_error ( " No volume groups found " ) ;
return ECMD_FAILED ;
}
list_for_each ( vgh , & vgs_list - > list ) {
ret =
process_single ( list_entry
( vgh , struct name_list , list ) - > name ) ;
if ( ret > ret_max )
ret_max = ret ;
}
}
return ret_max ;
}
2001-10-08 18:44:22 +00:00
int is_valid_chars ( char * n )
{
register char c ;
while ( ( c = * n + + ) )
if ( ! isalnum ( c ) & & c ! = ' . ' & & c ! = ' _ ' & & c ! = ' - ' & &
c ! = ' + ' )
return 0 ;
return 1 ;
}