The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;
use vars qw($VERSION);

$VERSION = '2.00';

use Getopt::Long;
use DBIx::PasswordIniFile;
use Config::IniFiles;

# Command line Arguments.
my($ini_file, $section, $key, $cipher);
GetOptions(
             'inifile|f=s' => \$ini_file,
             'section|s=s' => \$section,
             'key|k:s'     => \$key,
             'cipher|c:s'  => \$cipher
           );

die "!! $ini_file does not exist" if ! -e $ini_file;

my $cfg = new Config::IniFiles( -file => $ini_file ) || die $!;

# Guess 'pass' or 'password'  
# 'driver' param was mandatory with old content model for .ini file,
# and with new content model, this param does't exist.
# So, existence or not existence of this param determines content model.
#
my $param = ( $cfg->exists($section,'driver') 
           ? 'password' 
           : 'pass');
my $clear_passw = $cfg->val($section, $param);

my $ini = DBIx::PasswordIniFile->new( 
             -file => $ini_file, 
             -section => $section, 
             $key ? ( -key => $key ) : (),
             $cipher ? ( -cipher => $cipher ) : ()
         );

my $encrypt_passw = $ini->changePassword( $clear_passw );

print "Value of $param parameter changed to:\n$encrypt_passw\n"; 

__END__

=head1 NAME

encpassw.pl - Encrypts password in C<.ini> files

=head1 DESCRIPTION

Reads the value of a property C<password> in a configuration file ('a la'
C<.ini> style), and rewrites the value with the result of its encryption.

Style C<.ini> configuration files are those with a syntax compatible with
C<Config::IniFiles>, and briefly this means:

=over 4

=item *

Lines beginning with C<#> are comments and are ignored. Also, blank lines are
ignored. Use this for readability purposes.

=item *

A section name is a string (including whitespaces) between C<[> and C<]>.

=item *

Each section has one or more property/value pairs. Each property/value pair
is specified with the syntax

    property=value

One property/value pair per line.

=back

See L<Config::IniFiles> for detailed information about syntax.

=head1 SYNTAX

    perl encpassw.pl --inifile=<ini_file> 
                     --section=<section_name_of_ini_file_with_password_param>
                     [--key=<encryption_decryption_key> ]
                     [--cipher=<encryption_decryption_algorithm> ]

=head1 ARGUMENTS

=over 4

=item --inifile

Name or pathname of file whose password value have to be encrypted.
It doen't need to have C<.ini> in its name.

=item --section

Section name in C<inifile> where the C<password> property is.

=item --key

Encryption / Decryption key in clear form.
Use the same value with C<DBIx::PasswordIniFile>.

=item --cipher

Name of an installed cipher algoritm. Cipher algorithms live in namespace 
C<Crypt::>.

If not specified, default is C<Crypt::Blowfish>. It must be installed.

=back

=head1 COPYRIGHT

Copyright 2010-2020 Enrique Castilla.

This program is free software; you can redistribute it and/or modify it under
the same terms as Perl itself. 

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. 

=head1 AUTHOR

Enrique Castilla E<lt>L<mailto:ecastillacontreras@yahoo.es|ecastillacontreras@yahoo.es>E<gt>.