#!/usr/bin/perl -w

=head1 NAME
    
    dbconfig-role - определение "роли" сервера в конфигурации БД Директа

=head1 DESCRIPTION

    Параметры: 

    -c, --db-config /etc/yandex-direct/db-config.json
    конфиг коннектов, котоырый хотим смотреть
    По умолчанию -- Директовый /etc/yandex-direct/db-config.json

    --host <hostname>
    по умолчанию -- имя текущей машины

    -i, --instance <ppc:1|ppcdict|ppclog|...>
    инстанс, роль в котором надо показать. 
    По умолчанию показываются все роли во всех инстансах

    Примеры:

    > ./dbconfig-role -host ppcmaster01e.yandex.ru            
    ppcprofile.host
    ppcfiles.host

    > ./dbconfig-role -host ppcmaster01e.yandex.ru -i ppcfiles
    ppcfiles.host

    > ./dbconfig-role -host  ppcheavy01f.yandex.ru
    ppc:1:mod.host
    ppc:1:heavy.host

    > ./dbconfig-role -host ppcheavy01f.yandex.ru -i rbac
    none

=head1 TODO 

    Скрипт -- черновой прототип, код скопирован из dbconfig-monitor.
    Перед продакшен-использованием подумать: 
     * не заиспользовать ли весь DBTools? 
     * в dbconfig-monitor использовать тот же модуль для работы с конфигом, что и здесь
     * воозможно, вытащить из DBTools логику работы с конфигом в отдельный пакет, использвоать его
     * возможность указывать другой конфиг (==> для Геоконтекста, Модерации)
     * юнит-тесты

=head1 FUNCTIONS

=cut

use strict;
use DBConfigExplorer;
use Getopt::Long;
use Data::Dumper;


use utf8;
use open ':std' => ':utf8';

my $TARGET = '/etc/yandex-direct/db-config.json';
my $hostname = `hostname -f` || die "cant't perform hostname -f, stop";
chomp $hostname;
my $instance = '';
my $show_my_role = '';
my $show_master = '';

run() unless caller();

sub run
{
    GetOptions(
        "help" => sub {system("podselect -section NAME -section DESCRIPTION $0 | pod2text-utf8 >&2"); exit 0;},
        "host=s" => \$hostname,
        "i|instance=s" => \$instance,
        "show-my-role" => \$show_my_role,
        "show-master" => \$show_master,
        "c|db-config=s" => \$TARGET,
    ) || die "can't parse options, stop";

    die if $show_my_role && $show_master;
    $show_my_role = 1 if !$show_my_role && !$show_master;

    my $dbconf = DBConfigExplorer::load_config($TARGET);
    my $props = DBConfigExplorer::list_properties($dbconf);
    #print STDERR Dumper($props);

    if ( $show_master ){
        die "missing --instance" unless $instance;
        my $master = $props->{"$instance.host"} || $props->{"$instance.host.0"} || die "can't find master for instance '$instance', stop";
        print $master."\n";
    } elsif ( $show_my_role ){
        my @roles;
        for my $prop ( keys %$props ){
            next unless $prop =~ /\.host(?:\.[0-9]+)?$/;
            next unless $props->{$prop} eq $hostname;
            my $role = {};
            push @roles, $role;
            $role->{str} = $prop;
            $role->{num} = $1 if $prop =~ /\.([0-9]+)/;
            $prop =~ s/\.host.*$//;
            if ( $prop =~ /^([^:]+(?::[0-9]+)?):(.*)$/ && $2 !~ /^[0-9]+$/ ) {
                $role->{instance} = $1;
                $role->{slave} = $2;
            } else {
                $role->{instance} = $prop;
                $role->{slave} = '';
            }
            if ( $role->{slave} ){ 
                $role->{str} = "slave:$role->{slave}";
            } elsif ( defined $role->{num} && $role->{num} > 0 ){
                $role->{num}++;
                $role->{str} = "master:$role->{num}";
            } else {
                $role->{str} = "master";
            }

            $role->{str} = "$role->{instance} $role->{str}" unless $instance;
        }
        
        if ( $instance ){
            @roles =  grep { $_->{instance} eq $instance } @roles;
        } 

        if (@roles == 0){
            print "none\n";
        } else {
            print join "\n", (map {$_->{str}} @roles), "";
        }
    } else {
        die;
    }

    exit; 
}


