#!/usr/bin/perl

=head1 DESCRIPTION

    для redis cluster
    превращает вывод redis-cli cluster slots в удобную таблицу 
    (распределение реплик по диапазонам ключей)

    В первом столбце у диапазона -- мастер

    ssh ppcback01f.yandex.ru redis-cli -p 6379 cluster slots | ./bin/direct-redis-slots

    ~~UNDER CONSTRUCTION~~

    TODO
     * вывод в json
     * находить аномалии и предлагать решения
     * переписать на python

=cut

use strict;
use warnings;

use YAML;

my $state = 1;
my $cur_slot = {};
my $node;
my @slots;
my $i=0;
while (my $l = <>){
    $i++;
    chomp $l;
    $state = 1 if $state == 3 && $l =~ /^[0-9]+$/;
    if ( $state == 1 ){
        $cur_slot = {};
        push @slots, $cur_slot;
        $cur_slot->{start} = $l;
        $state = 2;
    } elsif ( $state == 2 ) {
        $cur_slot->{end} = $l;
        $state = 3;
    } elsif ( $state == 3 ) {
        $node = {};
        push @{$cur_slot->{nodes}}, $node;
        $node->{ip} = $l;
        $state = 4;
    } elsif ( $state == 4 ) {
        $node->{port} = $l;
        $state = 5;
    } elsif ( $state == 5 ) {
        die "line $i: node id expected, '$l' found" unless $l =~ /^[0-9a-f]{40}$/;
        $node->{id} = $l;
        $state = 3;
    } else {
        die "line $i: unexpected state '$state', line '$l'\n";
    } 
}

my %hostname;
for my $sl ( @slots ){
    for my $n ( @{$sl->{nodes}} ){
        next if $hostname{$n->{ip}};
        $hostname{$n->{ip}} = `host $n->{ip}`;
        chomp($hostname{$n->{ip}});
        $hostname{$n->{ip}} =~ s/^.* //;
        $hostname{$n->{ip}} =~ s/\.$//;
    }
}

for my $sl ( sort { $a->{start} <=> $b->{end} } @slots ){
    print join "  ", sprintf("%11s", "$sl->{start}-$sl->{end}"), map { sprintf("%40s", $hostname{$_->{ip}}.":$_->{port}") } @{$sl->{nodes}} ;
    print "\n";
    print join "  ", (" " x 11), map { $_->{id} } @{$sl->{nodes}} ;
    print "\n";
    print "\n";
}

#print YAML::Dump(\@slots);
