code styöe

This commit is contained in:
Marko Oldenburg 2019-03-28 16:40:30 +01:00
parent b0a134e779
commit 6556675b49

View File

@ -32,10 +32,12 @@ use FHEM::Meta;
##################################### #####################################
sub backup_Initialize($$) { sub backup_Initialize($$) {
my %hash = ( Fn => 'FHEM::backup::CommandBackup', my %hash = (
Hlp => ',create a backup of fhem configuration, state and modpath' ); Fn => 'FHEM::backup::CommandBackup',
Hlp => ',create a backup of fhem configuration, state and modpath'
);
$cmds{backup} = \%hash; $cmds{backup} = \%hash;
return FHEM::Meta::InitMod( __FILE__, \%hash ); return FHEM::Meta::InitMod( __FILE__, \%hash );
} }
@ -71,35 +73,36 @@ BEGIN {
my @pathname; my @pathname;
sub CommandBackup($$) { sub CommandBackup($$) {
my ($cl, $param) = @_; my ( $cl, $param ) = @_;
my $byUpdate = ($param && $param eq 'startedByUpdate'); my $byUpdate = ( $param && $param eq 'startedByUpdate' );
my $modpath = AttrVal('global', 'modpath', ''); my $modpath = AttrVal( 'global', 'modpath', '' );
my $configfile = AttrVal('global', 'configfile', ''); my $configfile = AttrVal( 'global', 'configfile', '' );
my $statefile = AttrVal('global', 'statefile', ''); my $statefile = AttrVal( 'global', 'statefile', '' );
my $logDir = AttrVal('global', 'logdir', 'none'); my $logDir = AttrVal( 'global', 'logdir', 'none' );
my $now = gettimeofday(); my $now = gettimeofday();
my @t = localtime($now); my @t = localtime($now);
$statefile = ResolveDateWildcards($statefile, @t); $statefile = ResolveDateWildcards( $statefile, @t );
# prevent duplicate entries in backup list for default config, forum #54826 # prevent duplicate entries in backup list for default config, forum #54826
$configfile = '' if ($configfile eq 'fhem.cfg' || configDBUsed()); $configfile = '' if ( $configfile eq 'fhem.cfg' || configDBUsed() );
$statefile = '' if ($statefile eq './log/fhem.save'); $statefile = '' if ( $statefile eq './log/fhem.save' );
my $msg; my $msg;
my $ret; my $ret;
Log(1, 'NOTE: make sure you have a database backup!') if(configDBUsed()); Log( 1, 'NOTE: make sure you have a database backup!' )
if ( configDBUsed() );
# set backupdir # set backupdir
my $backupdir; my $backupdir;
if (!defined($attr{global}{backupdir})) { if ( !defined( $attr{global}{backupdir} ) ) {
$backupdir = $modpath . '/backup'; $backupdir = $modpath . '/backup';
} }
else { else {
if ($attr{global}{backupdir} =~ m/^\/.*/) { if ( $attr{global}{backupdir} =~ m/^\/.*/ ) {
$backupdir = $attr{global}{backupdir}; $backupdir = $attr{global}{backupdir};
} }
elsif ($attr{global}{backupdir} =~ m/^\.+\/.*/) { elsif ( $attr{global}{backupdir} =~ m/^\.+\/.*/ ) {
$backupdir = $modpath . '/' . $attr{global}{backupdir}; $backupdir = $modpath . '/' . $attr{global}{backupdir};
} }
else { else {
@ -108,8 +111,8 @@ sub CommandBackup($$) {
} }
# create backupdir if not exists # create backupdir if not exists
if (!-d $backupdir) { if ( !-d $backupdir ) {
Log(4, 'backup create backupdir: ' . $backupdir); Log( 4, 'backup create backupdir: ' . $backupdir );
$ret = `(mkdir -p $backupdir) 2>&1`; $ret = `(mkdir -p $backupdir) 2>&1`;
if ($ret) { if ($ret) {
chomp($ret); chomp($ret);
@ -118,27 +121,28 @@ sub CommandBackup($$) {
} }
} }
if(configDBUsed()) { if ( configDBUsed() ) {
# add configDB configuration file # add configDB configuration file
push(@pathname, 'configDB.conf'); push( @pathname, 'configDB.conf' );
Log(4, 'backup include: \'configDB.conf\''); Log( 4, 'backup include: \'configDB.conf\'' );
} }
else { else {
# get pathnames to archiv # get pathnames to archiv
push(@pathname, $configfile) if($configfile); push( @pathname, $configfile ) if ($configfile);
Log(4, 'backup include: ' . $configfile); Log( 4, 'backup include: ' . $configfile );
$ret = parseConfig($configfile); $ret = parseConfig($configfile);
push(@pathname, $statefile) if($statefile); push( @pathname, $statefile ) if ($statefile);
Log(4, 'backup include: ' . $statefile); Log( 4, 'backup include: ' . $statefile );
} }
$ret = readModpath($modpath,$backupdir); $ret = readModpath( $modpath, $backupdir );
## add extra logdir path to backup ## add extra logdir path to backup
push(@pathname, $logDir) if($logDir ne 'none'); push( @pathname, $logDir ) if ( $logDir ne 'none' );
# create archiv # create archiv
$ret = createArchiv($backupdir, $cl, $byUpdate); $ret = createArchiv( $backupdir, $cl, $byUpdate );
@pathname = []; @pathname = [];
undef @pathname; undef @pathname;
@ -150,65 +154,75 @@ sub parseConfig($);
sub parseConfig($) { sub parseConfig($) {
my $configfile = shift; my $configfile = shift;
# we need default value to read included files # we need default value to read included files
$configfile = $configfile ? $configfile : 'fhem.cfg'; $configfile = $configfile ? $configfile : 'fhem.cfg';
my $fh; my $fh;
my $msg; my $msg;
my $ret; my $ret;
if (!open($fh,$configfile)) { if ( !open( $fh, $configfile ) ) {
$msg = 'Can\'t open ' . $configfile . ': ' . $!; $msg = 'Can\'t open ' . $configfile . ': ' . $!;
Log(1, 'backup ' . $msg); Log( 1, 'backup ' . $msg );
return $msg; return $msg;
} }
while (my $l = <$fh>) { while ( my $l = <$fh> ) {
$l =~ s/[\r\n]//g; $l =~ s/[\r\n]//g;
if ($l =~ m/^\s*include\s+(\S+)\s*.*$/) { if ( $l =~ m/^\s*include\s+(\S+)\s*.*$/ ) {
if (-e $1) { if ( -e $1 ) {
push @pathname, $1; push @pathname, $1;
Log(4, 'backup include: ' . $1); Log( 4, 'backup include: ' . $1 );
$ret = parseConfig($1); $ret = parseConfig($1);
} }
else { else {
Log(1, 'backup configfile: ' . $1 . ' does not exists! File not included.'); Log( 1,
'backup configfile: '
. $1
. ' does not exists! File not included.' );
} }
} }
} }
close $fh; close $fh;
return $ret; return $ret;
} }
sub readModpath($$) { sub readModpath($$) {
my ($modpath,$backupdir) = @_; my ( $modpath, $backupdir ) = @_;
my $msg; my $msg;
my $ret; my $ret;
if (!opendir(DH, $modpath)) { if ( !opendir( DH, $modpath ) ) {
$msg = 'Can\'t open $modpath: ' . $!; $msg = 'Can\'t open $modpath: ' . $!;
Log(1, 'backup ' . $msg); Log( 1, 'backup ' . $msg );
return $msg; return $msg;
} }
my @files = <$modpath/*>; my @files = <$modpath/*>;
foreach my $file (@files) { foreach my $file (@files) {
if ($file eq $backupdir && (-d $file || -l $file)) { if ( $file eq $backupdir && ( -d $file || -l $file ) ) {
Log(4, 'backup exclude: ' . $file); Log( 4, 'backup exclude: ' . $file );
} }
else { else {
Log(4, 'backup include: ' . $file); Log( 4, 'backup include: ' . $file );
push @pathname, $file; push @pathname, $file;
} }
} }
return $ret; return $ret;
} }
sub createArchiv($$$) { sub createArchiv($$$) {
my ($backupdir,$cl,$byUpdate) = @_; my ( $backupdir, $cl, $byUpdate ) = @_;
my $backupcmd = (!defined($attr{global}{backupcmd}) ? undef : $attr{global}{backupcmd}); my $backupcmd =
my $symlink = (!defined($attr{global}{backupsymlink}) ? 'no' : $attr{global}{backupsymlink}); ( !defined( $attr{global}{backupcmd} )
? undef
: $attr{global}{backupcmd} );
my $symlink =
( !defined( $attr{global}{backupsymlink} )
? 'no'
: $attr{global}{backupsymlink} );
my $tarOpts; my $tarOpts;
my $msg; my $msg;
my $ret; my $ret;
@ -219,49 +233,50 @@ sub createArchiv($$$) {
my $pathlist = join( '" "', @pathname ); my $pathlist = join( '" "', @pathname );
my $cmd=''; my $cmd = '';
if (!defined($backupcmd)) { if ( !defined($backupcmd) ) {
if (lc($symlink) eq 'no') { if ( lc($symlink) eq 'no' ) {
$tarOpts = 'cf'; $tarOpts = 'cf';
} }
else { else {
$tarOpts = 'chf'; $tarOpts = 'chf';
} }
# prevents tar's output of "Removing leading /" and return total bytes of # prevents tar's output of "Removing leading /" and return total bytes of
# archive # archive
# $cmd = "tar -$tarOpts - \"$pathlist\" |gzip > $backupdir/FHEM-$dateTime.tar.gz"; # $cmd = "tar -$tarOpts - \"$pathlist\" |gzip > $backupdir/FHEM-$dateTime.tar.gz";
$cmd = "tar $tarOpts $backupdir/FHEM-$dateTime.tar.gz \"$pathlist\""; $cmd = "tar $tarOpts $backupdir/FHEM-$dateTime.tar.gz \"$pathlist\"";
} }
else { else {
$cmd = $backupcmd . ' \"' . $pathlist . '\"'; $cmd = $backupcmd . ' \"' . $pathlist . '\"';
} }
Log(2, 'Backup with command: ' . $cmd); Log( 2, 'Backup with command: ' . $cmd );
if(!$fhemForked && !$byUpdate) { if ( !$fhemForked && !$byUpdate ) {
use Blocking; use Blocking;
our $BC_telnetDevice; our $BC_telnetDevice;
BC_searchTelnet('backup'); BC_searchTelnet('backup');
my $tp = $defs{$BC_telnetDevice}{PORT}; my $tp = $defs{$BC_telnetDevice}{PORT};
system("($cmd; echo Backup done;". system( "($cmd; echo Backup done;"
"$^X $0 localhost:$tp 'trigger global backup done')2>&1 &"); . "$^X $0 localhost:$tp 'trigger global backup done')2>&1 &" );
return "Started the backup in the background, watch the log for details"; return
"Started the backup in the background, watch the log for details";
} }
$ret = `($cmd) 2>&1`; $ret = `($cmd) 2>&1`;
if($ret) { if ($ret) {
chomp $ret; chomp $ret;
Log(1, 'backup ' . $ret); Log( 1, 'backup ' . $ret );
} }
if (!defined($backupcmd) && -e "$backupdir/FHEM-$dateTime.tar.gz") { if ( !defined($backupcmd) && -e "$backupdir/FHEM-$dateTime.tar.gz" ) {
my $size = -s "$backupdir/FHEM-$dateTime.tar.gz"; my $size = -s "$backupdir/FHEM-$dateTime.tar.gz";
$msg = "backup done: FHEM-$dateTime.tar.gz ($size Bytes)"; $msg = "backup done: FHEM-$dateTime.tar.gz ($size Bytes)";
DoTrigger('global', $msg); DoTrigger( 'global', $msg );
Log(1, $msg); Log( 1, $msg );
$ret .= "\n".$msg; $ret .= "\n" . $msg;
} }
return $ret; return $ret;