From: Frank Brehm Date: Mon, 10 May 2010 23:12:08 +0000 (+0000) Subject: Weitergekommen X-Git-Url: https://git.uhu-banane.net/?a=commitdiff_plain;h=83e7ab25665e9609022f1b7a0720ea63427c98df;p=my-stuff%2Fperl.git Weitergekommen git-svn-id: http://svn.brehm-online.com/svn/my-stuff/Perl@58 ec8d2aa5-1599-4edb-8739-2b3a1bc399aa --- diff --git a/lib/FrBr/Common/MooseX/App.pm b/lib/FrBr/Common/MooseX/App.pm index 12522b6..04fd651 100644 --- a/lib/FrBr/Common/MooseX/App.pm +++ b/lib/FrBr/Common/MooseX/App.pm @@ -165,6 +165,30 @@ sub _build_exit_code { return 0; } +#------------------------- + +=head2 app_initialized + +Wurde die Anwendung initialisiert + +=cut + +has app_initialized => ( + is => 'rw', + isa => 'Bool', + traits => [ 'NoGetopt' ], + lazy => 1, + required => 1, + builder => '_build_app_initialized', + documentation => 'Wurde die Anwendung initialisiert?', +); + +#------ + +sub _build_app_initialized { + return 0; +} + #----------------------------------------- =head2 log4perl_cfg_file @@ -263,17 +287,6 @@ sub OK { 0 } sub ERROR { 1 } sub FATAL { 2 } -#--------------------------------------------------------------------------- - -before BUILD => sub { - - my $self = shift; - $self->_init_log(); - - $self->exit_code( OK() ); - -}; - #--------------------------------- =head2 BUILD() @@ -295,8 +308,49 @@ sub BUILD { # $self->debug( "Anwendungsobjekt vor der Db-Schema-Initialisierung: ", $self ); # } +} + +#--------------------------------------------------------------------------- + +before BUILD => sub { + + my $self = shift; + $self->_init_log(); + + $self->exit_code( OK() ); + +}; + +#--------------------------------- + +=head2 after BUILD ... + +=cut + +after 'BUILD' => sub { + + my $self = shift; + $self->init_app() unless $self->app_initialized; + + $self->debug( "Anwendungsobjekt: ", $self ) if $self->verbose >= 3; $self->debug( "Bereit zum Kampf - äh - was auch immer." ); +}; + +#--------------------------------- + +=head2 init_app( ) + +Initialisiert nach dem BUILD alles. + +=cut + +sub init_app { + + my $self = shift; + + $self->debug( "Initialisiere Anwendung ..." ); + $self->app_initialized(1); } #--------------------------------- diff --git a/lib/FrBr/Common/MooseX/FtpClient.pm b/lib/FrBr/Common/MooseX/FtpClient.pm deleted file mode 100644 index d473294..0000000 --- a/lib/FrBr/Common/MooseX/FtpClient.pm +++ /dev/null @@ -1,281 +0,0 @@ -package FrBr::Common::MooseX::FtpClient; - -# $Id$ -# $URL$ - -=head1 NAME - -FrBr::Common::MooseX::FtpClient; - -=head1 DESCRIPTION - -Rollen-Modul zum Einbinden eines FTP-Clients - -=cut - -#--------------------------------------------------------------------------- - -use Moose::Role; - -#use MooseX::Getopt::Meta::Attribute; -#use MooseX::Getopt::Meta::Attribute::NoGetopt; -use Moose::Util::TypeConstraints; -use Encode qw( decode_utf8 encode_utf8 ); -use Net::FTP; - -use utf8; - -use Carp (); - -with 'FrBr::Common::MooseX::App'; - -#--------------------------------------------------------------------------- - -# Versionitis - -my $Revis = <<'ENDE'; - $Revision$ -ENDE -$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s; - -use version; our $VERSION = qv("0.1"); $VERSION .= " r" . $Revis; - -############################################################################ - -=head1 TYPES - -Alle nur von dieser Rolle verwendeten Datentypen - -=over4 - -=item I - -=cut - -subtype 'Net::FTP' - => as 'Object' - => where { $_->isa('Net::FTP') } - => message { "Das übergebene Objekt muss vom Typ 'Net::FTP' sein" }; - -=back - -=head1 ATTRIBUTES - -Alle durch diese Rolle definierten Attribute - -=head2 ftp - -Das Net::FTP-Objekt als eigentlicher FTP-Client. - -=cut - -has 'ftp' => ( - is => 'ro', - isa => 'Net::FTP', - traits => [ 'NoGetopt' ], - lazy => 0, - clearer => '_clear_ftp', - predicate => 'has_ftp', - writer => '_set_ftp', - documentation => 'Das Net::FTP-Objekt als eigentlicher FTP-Client.', -); - -#-------------------- - -sub _set_ftp { - return $_[0]; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_connected - -Flag, ob der FTP-Client gerade mit dem Server verbunden ist. - -=cut - -has 'ftp_connected' => ( - is => 'ro', - isa => 'Bool', - lazy => 1, - traits => [ 'NoGetopt' ], - builder => '_build_ftp_connected', - writer => '_set_ftp_connected', - documentation => 'BOOL: Flag, ob der FTP-Client gerade mit dem Server verbunden ist.', -); - -#-------------------- - -sub _build_ftp_connected { - return 0; -} - -sub _set_ftp_connected { - return $_[0]; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_host - -Der Hostname oder die IP-Adresse des FTP-Servers - -=cut - -has 'ftp_host' => ( - is => 'rw', - isa => 'Str', - traits => [ 'Getopt' ], - lazy => 1, - required => 1, - builder => '_build_ftp_host', - documentation => 'String: der Hostname oder die IP-Adresse des FTP-Servers', - cmd_flag => 'ftp-host', - cmd_aliases => [ 'H', 'host' ], -); - -#-------------------- - -sub _build_ftp_host { - return 'localhost'; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_blocksize - -Die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet. - -=cut - -has 'ftp_blocksize' => ( - is => 'rw', - isa => 'Int', - traits => [ 'Getopt' ], - lazy => 1, - required => 1, - builder => '_build_ftp_blocksize', - documentation => 'Int: die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet (default: 10240).', - cmd_flag => 'ftp-blocksize', - cmd_aliases => [ 'blocksize' ], -); - -#-------------------- - -sub _build_ftp_blocksize { - return 10_240; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_port - -Die Portadresse des FTP-Servers. - -=cut - -has 'ftp_port' => ( - is => 'rw', - isa => 'Int', - traits => [ 'Getopt' ], - lazy => 1, - required => 1, - builder => '_build_ftp_port', - documentation => 'Int: die Portadresse des FTP-Servers (default: 21).', - cmd_flag => 'ftp-port', - cmd_aliases => [ 'port', 'P' ], -); - -#-------------------- - -sub _build_ftp_port { - return 21; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_timeout - -Der Timeout in Sekunden für FTP-Prozesse (default: 120) - -=cut - -has 'ftp_timeout' => ( - is => 'rw', - isa => 'Int', - traits => [ 'Getopt' ], - lazy => 1, - required => 1, - builder => '_build_ftp_timeout', - documentation => 'Int: der Timeout in Sekunden für FTP-Prozesse (default: 120).', - cmd_flag => 'ftp-timeout', - cmd_aliases => [ 'timeout', 'T' ], -); - -#-------------------- - -sub _build_ftp_timeout { - return 120; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_passive - -Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll. - -=cut - -has 'ftp_passive' => ( - is => 'rw', - isa => 'Bool', - lazy => 1, - required => 1, - traits => [ 'Getopt' ], - builder => '_build_ftp_passive', - documentation => 'BOOL: Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.', - cmd_flag => 'ftp-passive', - cmd_aliases => [ 'passive' ], -); - -#-------------------- - -sub _build_ftp_passive { - return 0; -} - -#--------------------------------------------------------------------------- - -=head2 ftp_hash_size - -Alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden, -wenn $self->ftp_show_hashes auf TRUE gesetzt ist (default: 1024). - -=cut - -has 'ftp_hash_size' => ( - is => 'rw', - isa => 'Int', - traits => [ 'Getopt' ], - lazy => 1, - required => 1, - builder => '_build_ftp_hash_size', - documentation => 'Int: alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden (default: 1024).', - cmd_flag => 'ftp-hash-size', - cmd_aliases => [ 'hash-size' ], -); - -#-------------------- - -sub _build_ftp_hash_size { - return 1024; -} - -#--------------------------------------------------------------------------- - -no Moose::Role; -1; - -__END__ - -# vim: noai: filetype=perl ts=4 sw=4 : expandtab diff --git a/lib/FrBr/Common/MooseX/Role/Config.pm b/lib/FrBr/Common/MooseX/Role/Config.pm index 8221688..016ff7c 100644 --- a/lib/FrBr/Common/MooseX/Role/Config.pm +++ b/lib/FrBr/Common/MooseX/Role/Config.pm @@ -37,6 +37,15 @@ use version; our $VERSION = qv("0.0.1"); ############################################################################ +=head1 Benötigte Funktionen + +=cut + +requires 'debug'; # im Moose-Objekt FrBr::Common::MooseX:App +requires 'init_app'; # im Moose-Objekt FrBr::Common::MooseX:App + +############################################################################ + =head1 Attribute Eigene Attribute @@ -85,6 +94,7 @@ has 'cfg_dir' => ( documentation => 'Verzeichnis der Konfigurationsdateien', writer => '_set_cfg_dir', coerce => 1, + metaclass => 'MooseX::Getopt::Meta::Attribute', cmd_flag => 'cfg-dir', cmd_aliases => 'cfgdir', ); @@ -267,6 +277,26 @@ sub BUILD { #--------------------------------------------------------------------------- +after 'init_app' => sub { + + my $self = shift; + + $self->read_config_file(); + $self->evaluate_config(); + + if ( $self->verbose >= 2 ) { + + my $tmp; + for my $f ( 'configuration_evaluated', 'configuration_read', 'cfg_stem', 'cfg_dir', 'config', 'default_config', 'used_cmd_params', ) { + $tmp = $self->$f(); + } + + } + +}; + +#--------------------------------------------------------------------------- + =head2 read_config_file( [$force] ) Liest die Konfiguration aus den Konfigurations-Dateien ein. diff --git a/lib/FrBr/Common/MooseX/Role/FtpClient.pm b/lib/FrBr/Common/MooseX/Role/FtpClient.pm new file mode 100644 index 0000000..b99cf56 --- /dev/null +++ b/lib/FrBr/Common/MooseX/Role/FtpClient.pm @@ -0,0 +1,589 @@ +package FrBr::Common::MooseX::Role::FtpClient; + +# $Id$ +# $URL$ + +=head1 NAME + +FrBr::Common::MooseX::Role::FtpClient; + +=head1 DESCRIPTION + +Rollen-Modul zum Einbinden eines FTP-Clients + +=cut + +#--------------------------------------------------------------------------- + +use Moose::Role; + +#use MooseX::Getopt::Meta::Attribute; +#use MooseX::Getopt::Meta::Attribute::NoGetopt; +use Moose::Util::TypeConstraints; +use Encode qw( decode_utf8 encode_utf8 ); +use Net::FTP; +use Net::Domain qw( domainname ); + +use utf8; + +use Carp qw( cluck ); + +#with 'FrBr::Common::MooseX::App'; + +#--------------------------------------------------------------------------- + +# Versionitis + +my $Revis = <<'ENDE'; + $Revision$ +ENDE +$Revis =~ s/^.*:\s*(\S+)\s*\$.*/$1/s; + +use version; our $VERSION = qv("0.2"); $VERSION .= " r" . $Revis; + +############################################################################ + +=head1 Benötigte Funktionen + +=cut + +requires 'debug'; # im Moose-Objekt FrBr::Common::MooseX:App +requires 'init_app'; # im Moose-Objekt FrBr::Common::MooseX:App +requires 'evaluate_config'; # in der Rolle FrBr::Common::MooseX::Role::Config + +############################################################################ + +=head1 TYPES + +Alle nur von dieser Rolle verwendeten Datentypen + +=over4 + +=item I + +=cut + +subtype 'Net::FTP' + => as 'Object' + => where { $_->isa('Net::FTP') } + => message { "Das übergebene Objekt muss vom Typ 'Net::FTP' sein" }; + +=back + +=head1 ATTRIBUTES + +Alle durch diese Rolle definierten Attribute + +=head2 ftp + +Das Net::FTP-Objekt als eigentlicher FTP-Client. + +=cut + +has 'ftp' => ( + is => 'ro', + isa => 'Net::FTP', + traits => [ 'NoGetopt' ], + lazy => 0, + clearer => '_clear_ftp', + predicate => 'has_ftp', + writer => '_set_ftp', + documentation => 'Das Net::FTP-Objekt als eigentlicher FTP-Client.', +); + +#-------------------- + +sub _set_ftp { + return $_[1]; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_connected + +Flag, ob der FTP-Client gerade mit dem Server verbunden ist. + +=cut + +has 'ftp_connected' => ( + is => 'ro', + isa => 'Bool', + lazy => 1, + traits => [ 'NoGetopt' ], + builder => '_build_ftp_connected', + writer => '_set_ftp_connected', + documentation => 'BOOL: Flag, ob der FTP-Client gerade mit dem Server verbunden ist.', +); + +#-------------------- + +sub _build_ftp_connected { + return 0; +} + +sub _set_ftp_connected { + return $_[1]; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_auto_login + +Flag, ob der sich der FTP-Client automatisch anmelden soll, nachdem er initialisiert wurde. + +=cut + +has 'ftp_auto_login' => ( + is => 'rw', + isa => 'Bool', + lazy => 1, + traits => [ 'NoGetopt' ], + builder => '_build_ftp_auto_login', + documentation => 'BOOL: Flag, ob sich der FTP-Client automatisch anmelden soll, nachdem er initialisiert wurde.', +); + +#-------------------- + +sub _build_ftp_auto_login { + return 0; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_host + +Der Hostname oder die IP-Adresse des FTP-Servers + +=cut + +has 'ftp_host' => ( + is => 'rw', + isa => 'Str', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_host', + documentation => 'String: der Hostname oder die IP-Adresse des FTP-Servers', + cmd_flag => 'ftp-host', + cmd_aliases => [ 'H', 'host' ], +); + +#-------------------- + +sub _build_ftp_host { + return 'localhost'; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_user + +Der FTP-Nutzername, default zu 'anonymous'. + +=cut + +has 'ftp_user' => ( + is => 'rw', + isa => 'Str', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_user', + documentation => 'String: Nutzername des FTP-Nutzers', + cmd_flag => 'ftp-user', + cmd_aliases => [ 'U', 'user' ], +); + +#-------------------- + +sub _build_ftp_user { + return 'anonymous'; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_password + +Das Passwort des FTP-Nutzers + +=cut + +has 'ftp_password' => ( + is => 'rw', + isa => 'Str', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_password', + documentation => 'String: Passort des FTP-Nutzers', + cmd_flag => 'ftp-password', + cmd_aliases => [ 'P', 'password' ], +); + +#-------------------- + +sub _build_ftp_password { + my $email = 'anonymous@' . domainname(); + return $email; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_blocksize + +Die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet. + +=cut + +has 'ftp_blocksize' => ( + is => 'rw', + isa => 'Int', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_blocksize', + documentation => 'Int: die Blockgröße in Bytes, die Net::FTP für den Datentransfer verwendet (default: 10240).', + cmd_flag => 'ftp-blocksize', + cmd_aliases => [ 'blocksize' ], +); + +#-------------------- + +sub _build_ftp_blocksize { + return 10_240; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_port + +Die Portadresse des FTP-Servers. + +=cut + +has 'ftp_port' => ( + is => 'rw', + isa => 'Int', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_port', + documentation => 'Int: die Portadresse des FTP-Servers (default: 21).', + cmd_flag => 'ftp-port', + cmd_aliases => [ 'port', 'P' ], +); + +#-------------------- + +sub _build_ftp_port { + return 21; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_timeout + +Der Timeout in Sekunden für FTP-Prozesse (default: 120) + +=cut + +has 'ftp_timeout' => ( + is => 'rw', + isa => 'Int', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_timeout', + documentation => 'Int: der Timeout in Sekunden für FTP-Prozesse (default: 120).', + cmd_flag => 'ftp-timeout', + cmd_aliases => [ 'timeout', 'T' ], +); + +#-------------------- + +sub _build_ftp_timeout { + return 120; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_passive + +Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll. + +=cut + +has 'ftp_passive' => ( + is => 'rw', + isa => 'Bool', + lazy => 1, + required => 1, + traits => [ 'Getopt' ], + builder => '_build_ftp_passive', + documentation => 'BOOL: Flag, dass der FTP-Client eine passive FTP-Verbindung zum Server aufbauen soll.', + cmd_flag => 'ftp-passive', + cmd_aliases => [ 'passive' ], +); + +#-------------------- + +sub _build_ftp_passive { + return 0; +} + +#--------------------------------------------------------------------------- + +=head2 ftp_hash_size + +Alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden, +wenn $self->ftp_show_hashes auf TRUE gesetzt ist (default: 1024). + +=cut + +has 'ftp_hash_size' => ( + is => 'rw', + isa => 'Int', + traits => [ 'Getopt' ], + lazy => 1, + required => 1, + builder => '_build_ftp_hash_size', + documentation => 'Int: alle wieviele Bytes soll während der Übertragung ein Hash-Zeichen (#) auf STDERR geschrieben werden (default: 1024).', + cmd_flag => 'ftp-hash-size', + cmd_aliases => [ 'hash-size' ], +); + +#-------------------- + +sub _build_ftp_hash_size { + return 1024; +} + +############################################################################ + +=head1 METHODS + +Methoden dieser Rolle + +=cut + +#--------------------------------------------------------------------------- + +after 'evaluate_config' => sub { + + my $self = shift; + + $self->debug( "Werte FTP-Konfigurationsdinge aus ..." ); + return unless $self->config and keys %{ $self->config }; + + my @ConfigKeys = qw( host user password blocksize port timeout passive hash_size auto_login ); + + for my $key ( keys %{ $self->config } ) { + + my $val = $self->config->{$key}; + + for my $p ( @ConfigKeys ) { + my $f = 'ftp_' . $p; + my $r = $p; + $r =~ s/_/\[_-\]\?/g; + $r = "^ftp[_\-]?$r\$"; + $self->debug( sprintf( "Regex 1: '%s'", $r ) ) if $self->verbose >= 2; + unless ( self->used_cmd_params->{$f} ) { + if ( $key =~ /$r/i ) { + $self->debug( sprintf( "Gefunden: \$self->config->{%s} -> '%s'", $key, $val ) ); + $self->$f($val); + } + } + } + + } + + for my $key ( keys %{ $self->config } ) { + if ( lc($key) eq 'ftp' and ref( $self->config->{$key} ) and ref( $self->config->{$key} ) eq 'HASH' ) { + for my $ftp_key ( keys %{ $self->config->{$key} } ) { + + my $val = $self->config->{$key}{$ftp_key}; + + for my $p ( @ConfigKeys ) { + + my $f = 'ftp_' . $p; + my $r = $p; + $r =~ s/_/\[_-\]\?/g; + $r = "^$r\$"; + $self->debug( sprintf( "Regex 2: '%s'", $r ) ) if $self->verbose >= 2; + + unless ( self->used_cmd_params->{$f} ) { + if ( $ftp_key =~ /$r/i ) { + $self->debug( sprintf( "Gefunden: \$self->config->{%s}{%s} -> '%s'", $key, $ftp_key, $val ) ); + $self->$f($val); + } + } + + } + + } + } + } + +}; + +#--------------------------------------------------------------------------- + +after 'init_app' => sub { + + my $self = shift; + + $self->debug( "Initialisiere ..." ); + if ( $self->verbose >= 2 ) { + + my $tmp; + for my $f ( 'ftp_connected', 'ftp_auto_login', 'ftp_host', 'ftp_user', 'ftp_password', 'ftp_blocksize', 'ftp_port', 'ftp_timeout', 'ftp_passive', 'ftp_hash_size' ) { + $tmp = $self->$f(); + } + + } + + $self->init_ftp(); + +}; + +#--------------------------------------------------------------------------- + +=head2 init_ftp( ) + +Initialisiert das Net::FTP-Objekt + +=cut + +sub init_ftp { + + my $self = shift; + + cluck( "Guck mal: " ) if $self->verbose >= 4; + $self->debug( "Initialisiere Net::FTP-Objekt ..." ); + + my $ftp_params = { + 'Host' => $self->ftp_host, + 'BlockSize' => $self->ftp_blocksize, + 'Port' => $self->ftp_port, + 'Timeout' => $self->ftp_timeout, + 'Debug' => ( $self->verbose >= 2 ? 1 : 0 ), + 'Passive' => $self->ftp_passive, + }; + $self->debug( "Initialisierungs-Parameter FTP: ", $ftp_params ) if $self->verbose >= 2; + + my $ftp = Net::FTP->new( %$ftp_params ); + unless ( $ftp ) { + my $err = $@ || $!; + $self->warn( "Fehler bei der Initialisierung des FTP-Objekts: " . $err ); + return undef; + } + + $self->_set_ftp($ftp); + + if ( $self->ftp_auto_login ) { + $self->login_ftp(); + } + + return $ftp; + +} + +#--------------------------------------------------------------------------- + +=head2 login_ftp( ) + +Anmeldung am FTP-Server + +=cut + +sub login_ftp { + + my $self = shift; + + unless ( $self->ftp ) { + my $auto_login = $self->ftp_auto_login; + $self->ftp_auto_login(0); + $self->init_ftp(); + $self->ftp_auto_login($auto_login); + } + + $self->debug( "Login am FTP-Server ..." ); + + unless ( $self->ftp ) { + $self->warn( "Kann mich nicht ohne FTP-Server anmelden: ", $! ); + cluck "Kann mich nicht ohne FTP-Server anmelden: " . $! . "\n" if $self->verbose; + return undef; + } + my $ftp = $self->ftp; + + if ( $ftp->login( $self->ftp_user, $self->ftp_password ) ) { + $self->debug( "FTP-Login erfolgreich." ); + $self->_set_ftp_connected(1); + return 1; + } + else { + $self->warn( sprintf( "FTP-Login misslungen: %s", $ftp->message ) ); + } + + return undef; + +} + +#--------------------------------------------------------------------------- + +=head2 logout_ftp( ) + +Abmeldung am FTP-Server + +=cut + +sub logout_ftp { + + my $self = shift; + + my $ftp = $self->ftp; + unless ( $ftp ) { + $self->debug( "Kein FTP-Objekt zum Abmelden da." ); + return; + } + + if ( $self->ftp_connected ) { + + $self->debug( "Abmeldung vom FTP-Server ..." ); + $ftp->quit; + $self->_set_ftp_connected(0); + + } + + $self->_clear_ftp(); + +} + +#--------------------------------------------------------------------------- + +=head2 DEMOLISH( ) + +Destruktor + +=cut + +sub DEMOLISH { + + my $self = shift; + + $self->debug( "Verschwinde ..." ); + if ( $self->ftp ) { + $self->debug( "Selbstzerstörung ..." ); + $self->logout_ftp; + } + +} + +#--------------------------------------------------------------------------- + +no Moose::Role; +1; + +__END__ + +# vim: noai: filetype=perl ts=4 sw=4 : expandtab