diff -Nur -x '*.orig' -x '*.rej' smeserver-zabbix-server-0.1/root/etc/e-smith/db/configuration/migrate/zabbix-server-database mezzanine_patched_smeserver-zabbix-server-0.1/root/etc/e-smith/db/configuration/migrate/zabbix-server-database --- smeserver-zabbix-server-0.1/root/etc/e-smith/db/configuration/migrate/zabbix-server-database 2009-02-02 21:01:58.000000000 +0100 +++ mezzanine_patched_smeserver-zabbix-server-0.1/root/etc/e-smith/db/configuration/migrate/zabbix-server-database 2009-02-11 09:40:44.000000000 +0100 @@ -1,11 +1,33 @@ { - use MIME::Base64 qw(encode_base64); + my $rec = $DB->get('zabbix-server') + || $DB->new_record('zabbix-server', {type => 'service'}); + my $pw = $rec->prop('DbPassword'); + if (not $pw or length($pw) < 57) + { + use MIME::Base64 qw(encode_base64); - my $rec = $DB->get('zabbix-server') || $DB->new_record('zabbix-server', {type => 'service'}); - - my $pw = $rec->prop('DbPassword'); - return "" if $pw; - - $rec->set_prop('DbPassword', sprintf("%15.0f", int( (1000000000000000) * rand() ))); -} + $pw = "not set due to error"; + if ( open( RANDOM, "/dev/urandom" ) ) + { + my $buf; + # 57 bytes is a full line of Base64 coding, and contains + # 456 bits of randomness - given a perfectly random /dev/random + if ( read( RANDOM, $buf, 57 ) != 57 ) + { + warn("Short read from /dev/random: $!"); + } + else + { + $pw = encode_base64($buf); + chomp $pw; + } + close RANDOM; + } + else + { + warn "Could not open /dev/urandom: $!"; + } + $rec->set_prop('DbPassword', $pw); + } +}