AC-Yenta
view release on metacpan or search on metacpan
lib/AC/Yenta.pm view on Meta::CPAN
=head2 Topological awareness
Yentas can take network topology into account when tranferring
data around to minimize long-distance transfers. You will need to
write a custom C<MySelf> class with a C<my_datacenter> function.
=head2 Multiple Network Interfaces / NAT
Yentas can take advantage of multiple network interfaces with
different IP addresses (eg. a private internal network + a public network),
or multiple addresses (eg. a private addresses and a public address)
and various NAT configurations.
You will need to write a custom C<MySelf> class and C<my_network_info>
function.
=head2 Network Information
By default, yentas obtain their primary IP address by calling
C<gethostbyname( hostname() )>. If this either does not work on your
systems, or isn't the value you want to use,
lib/AC/Yenta/IO/TCP/Client.pm view on Meta::CPAN
my $addr = shift;
my $port = shift;
# is addr + port => return
return ($addr, $port) unless ref $addr;
# addr is array of nat ip info (ACPIPPort)
_init() unless $inited;
my $public;
my $private;
for my $i ( @$addr ){
# skip unreachable networks
my $ok = AC::Yenta::NetMon::status_dom( $i->{natdom} );
next unless $ok == 200;
$public = $i unless $i->{natdom};
$private = $i if $i->{natdom} eq $natdom;
}
# prefer private addr if available (cheaper)
my $prefer = $private || $public;
return unless $prefer;
return ( inet_itoa($prefer->{ipv4}), ($prefer->{port} || $port) );
}
sub _init {
# determine my local NAT domain
my $nat = my_network_info();
lib/AC/Yenta/Kibitz/Status/Client.pm view on Meta::CPAN
my $class = shift;
my $addr = shift;
my $port = shift;
# is addr + port => return
return ($addr, $port) unless ref $addr;
# addr is array of nat ip info (ACPIPPort)
my $down;
my $public;
my $private;
for my $i ( @$addr ){
# usually, skip unreachable networks
my $ok = AC::Yenta::NetMon::status_dom( $i->{natdom} );
next unless defined $ok; # remote private network
if( $ok == 200 ){
if( $i->{natdom} ){
$private = $i;
}else{
$public = $i;
}
}else{
$down = $i;
}
}
my $prefer;
# make sure we use all networks once in a while
$prefer ||= $down unless int rand(20);
$prefer ||= $public unless int rand(20);
# prefer private addr if available (cheaper)
$prefer ||= $private || $public || $down;
return unless $prefer;
#print STDERR "using ", inet_itoa($prefer->{ipv4}), "\n";
return ( inet_itoa($prefer->{ipv4}), ($prefer->{port} || $port) );
}
sub start {
my $me = shift;
lib/AC/Yenta/MySelf.pm view on Meta::CPAN
sub my_datacenter {
my($domain) = hostname() =~ /^[\.]+\.(.*)/;
return $domain;
}
=head2 my_network_info
return information about the various networks this server has.
sub my_network_info {
my $public_ip = inet_ntoa(scalar gethostbyname(hostname()));
my $privat_ip = inet_ntoa(scalar gethostbyname('internal-' . hostname()));
return [
# use this IP for communication with servers this datacenter (same natdom)
{ ip => $privat_ip, natdom => my_datacenter() },
# otherwise use this IP
{ ip => $public_ip },
]
}
=head2 init
inialization function called at startup. typically used to lookup hostanmes, IP addresses,
and such and store them in variables to make the above functions faster.
my $HOSTNAME;
my $DOMAIN;
lib/AC/Yenta/NetMon.pm view on Meta::CPAN
my $STALE = 120;
my %lastok; # natdom => T
my %natdom; # ip => natdom
sub init {
my $natinfo = my_network_info();
for my $n ( @$natinfo ){
my $dom = $n->{natdom} || 'public';
$natdom{ $n->{ipa} } = $dom;
$lastok{ $dom } = $^T; # assume everything is working
}
}
sub update {
my $io = shift;
my $ip = inet_ntoa( (sockaddr_in(getsockname($io->{fd})))[1] );
my $dom = $natdom{ $ip } || 'public';
$lastok{$dom} = $^T;
}
sub status_dom {
my $dom = shift;
$dom ||= 'public';
return unless exists $lastok{$dom}; # not local
return ($lastok{$dom || 'public'} + $STALE < $^T) ? 0 : 200;
}
1;
lib/AC/Yenta/Stats.pm view on Meta::CPAN
return ("404 NOT FOUND\nThe requested url /$url was not found on this server.\nSo sorry.\n\n", 404, "Not Found");
}
sub http_load {
return sprintf("loadave: %0.4f\n\n", loadave());
}
sub http_status {
my $status = AC::Yenta::NetMon::status_dom('public');
return "status: OK\n\n" if $status == 200;
return("status: PROBLEM\n\n", 500, "Problem");
}
sub http_stats {
my $res;
for my $k (sort keys %STATS){
$res .= sprintf("%-24s%s\n", "$k:", $STATS{$k});
}
( run in 0.413 second using v1.01-cache-2.11-cpan-c6e0e5ac2a7 )