diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Diff.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Diff.pm index d50ccedd5..3c7a1be7d 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Diff.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Diff.pm @@ -11,9 +11,12 @@ sub diff { my @res; my @keys = ( [ keys %{ $conf[0] } ], [ keys %{ $conf[1] } ] ); while ( my $key = shift @{ $keys[0] } ) { - - # TODO - next if ( $key eq 'applicationList' ); + if ( $key eq 'applicationList' ) { + my @tmp = $self->appListDiff( $conf[0]->{$key}, $conf[1]->{$key} ); + for ( my $i = 0 ; $i < @tmp ; $i++ ) { + $res[$i]->{$key} = $tmp[$i] if ( $tmp[$i] ); + } + } if ( ref $conf[0]->{$key} eq 'HASH' ) { if ( ref $conf[1]->{$key} ) { my @tmp = $self->diff( $conf[0]->{$key}, $conf[1]->{$key}, 1 ); @@ -40,8 +43,6 @@ sub diff { $keys[1] = [ grep { $_ ne $key } @{ $keys[1] } ]; } while ( my $key = shift @{ $keys[1] } ) { - - # TODO next if ( $key eq 'applicationList' ); if ( ( @@ -58,4 +59,94 @@ sub diff { return @res; } +sub appListDiff { + my ( $self, @conf ) = @_; + my @res; + my @keys = ( [ sort keys %{ $conf[0] } ], [ sort keys %{ $conf[1] } ] ); + my @catname = ( + [ map { $conf[0]->{$_}->{catname} } sort keys %{ $conf[0] } ], + [ map { $conf[1]->{$_}->{catname} } sort keys %{ $conf[1] } ] + ); + while ( my $key = shift @{ $keys[0] } ) { + my $cat = shift @{ $catname[0] }; + + # Checking for categories + if ( defined $cat ) { + my $found = undef; + my ( @newK, @newC ); + for ( my $i = 0 ; $i < @{ $keys[1] } ; $i++ ) { + if ( $catname[0]->[$i] eq $cat ) { + $found = $i; + } + else { + push @newK, $keys[1]->[$i]; + push @newC, $catname[1]->[$i]; + } + } + + # Same category found, checking for subnodes + if ( defined $found ) { + my @tmp = $self->appListDiff( $conf[0]->{$key}, + $conf[1]->{ $keys[1]->[$found] } ); + for ( my $i = 0 ; $i < @tmp ; $i++ ) { + $res[$i]->{$cat} = $tmp[$i] if ( $tmp[$i] ); + } + + $keys[1] = \@newK; + $catname[1] = \@newC; + } + + # Category doesn't exists in new conf + else { + $res[0]->{$cat} = $conf[0]->{$key}; + } + } + + # Checking for applications + else { + my $name = $conf[0]->{$key}->{options}->{name}; + + # Searching for the same name in new conf + my $found = undef; + my ( @newK, @newC ); + for ( my $i = 0 ; $i < @{ $keys[1] } ; $i++ ) { + if ( $conf[1]->{ $keys[1]->[$i] }->{options}->{name} eq $name ) + { + # Same name found, checking for diff in options + my $diff = 0; + foreach my $k ( + keys %{ $conf[1]->{ $keys[1]->[$i] }->{options} } ) + { + unless ( + $conf[1]->{ $keys[1]->[$i] }->{options}->{$k} eq + $conf[0]->{$key}->{options}->{$k} ) + { + $res[0]->{$name}->{options}->{$k} = + $conf[0]->{$key}->{options}->{$k}; + $res[1]->{$name}->{options}->{$k} = + $conf[1]->{$key}->{options}->{$k}; + } + } + $found = $i unless ($diff); + } + else { + push @newK, $keys[1]->[$i]; + push @newC, $catname[1]->[$i]; + } + } + if ( defined $found ) { + $keys[1] = \@newK; + $catname[1] = \@newC; + } + + # Not found + else { + $res[0]->{$name} = $conf[0]->{$key}; + } + } + } + + # TODO: storing all remaining keys in $keys[1] +} + 1;