Your IP : 3.145.17.171


Current Path : /opt/webdir/lib/
Upload File :
Current File : //opt/webdir/lib/Output.pm

# output information to log or screen
#
package Output;
use Moose;
use JSON;
use POSIX qw(strftime);
use Data::Dumper;

## attributes
# error|code - return value from utils
has 'error' => ( is => 'rw', isa => 'Int', default => 0 );

# text message about error or status
has 'message' => ( is => 'rw', isa => 'Str' );

# status - status of long-running operations
has 'status' => ( is => 'rw', isa => 'Str' );

# data - additional data in the message
# ex. configuration of pool servers
has 'data' => ( is => 'rw', isa => 'ArrayRef' );

# format - output format: json or plain(txt)
has 'format' => ( is => 'ro', isa => 'Str', default => 'plain' );

# path to log file
has 'logfile' =>
  ( is => 'rw', isa => 'Str', default => '/opt/webdir/logs/wrapper.log' );

has 'debug' => ( is => 'rw', isa => 'Int', default => 0 );

# print facts like ansible module
sub printAnsible {
    my $self      = shift;
    my $attribute = shift;    # print only attribute
    my $hiden     = shift;    # print hiden attribute
    my $status    = shift;    # finished|not_istalled|any

    my $data = $self->data;
    my $type = ($data->[0])? $data->[0]: "NOT_DEFINED";
    my $info = $data->[1];

    $attribute = "all" if ( !$attribute );
    if ( not defined $status ) { $status = 'any'; }
    if ( not defined $hiden )  { $hiden  = 1; }

    # final info in that hash
    my $print_info = {};
    $print_info->{'changed'} = 'true';
    $print_info->{'msg'} = $self->message if (defined $self->message);

    if ( $self->error > 0 ) {
        $print_info->{'changed'} = 'false';
        $print_info->{'failed'}  = 'true';
    }
    else {
        if ( $type =~ /^bxSite$/ ) {
            my $id = 0;

            # foreach found sites
            foreach my $site_name ( keys %$info ) {
                my $site_data = $info->{$site_name};

                # if we need only installed or not_itstalled sites info
                if (   $status !~ /^any$/
                    && $site_data->{'SiteStatus'} !~ /^$status$/ )
                {
                    next;
                }

                # create list of sitesnames
                $print_info->{'ansible_facts'}->{'bx_sites'}->[$id]
                  ->{'SiteName'} = $site_name;

                # if need only list of sites
                if ( $attribute =~ /^SiteNames$/ ) { next; }

                # process attributes
                foreach my $key ( keys %{ $info->{$site_name} } ) {
                    if ( $attribute !~ /^all$/ && $key !~ /^$attribute$/ ) {
                        next;
                    }
                    my $val = $info->{$site_name}->{$key};
                    if ( $hiden == 0 && $key =~ /password/i ) {
                        $val = "***************";
                    }
                    $print_info->{'ansible_facts'}->{'bx_sites'}->[$id]->{$key}
                      = $val;
                }
                $id++;
            }
        }
        elsif ( $type =~ /(updateHost|deleteHost)/ ) {
            my $changed = 'false';
            foreach my $k ( keys %{$info} ) {
                if ( $info->{$k} =~ /^(yes|true)$/i ) {
                    $changed = 'true';
                }
            }

            $print_info->{'changed'} = $changed;
            if ( $self->message ) {
                $print_info->{'msg'} = $self->message;
            }
        }
        elsif ( $type =~ /^(pool_interface_revert|pool_interfaces)$/ ) {
            foreach my $k ( keys %{$info} ) {
                $print_info->{'ansible_facts'}->{'bx_network'}->{$k} =
                  $info->{$k};
            }
        }
        elsif ( $type =~ /^testClusterConfig$/ ) {
            foreach my $k ( 'test_kernels', 'test_without_scale',
                'test_without_cluster' )
            {
                $print_info->{'ansible_facts'}->{$k} = $info->{$k};
            }
        }
    }
    print to_json( $print_info, pretty => 1 );
    exit $self->error;
}

# print message to stdout
sub print {
    my $self   = shift;
    my $format = shift;
    my $hiden  = shift;

    if ( !$format ) { $format = $self->format; }
    if ( !$hiden )  { $hiden  = 0; }

    #print Dumper($self);

    # JSON output
    if ( $format =~ /^json$/ ) {
        my $output_hash = {};
        if ( $self->error > 0 ) { $output_hash->{'error'}   = $self->error }
        if ( $self->message )   { $output_hash->{'message'} = $self->message }
        if ( $self->data ) {
            if ( $self->data->[0] =~ /^(hosts|bxDaemon)$/ ) {
                $output_hash->{'params'} = $self->data->[1];
                #if ( $self->data->[0] =~ /^bxDaemon$/ ){
                #    print Dumper($self->data->[1]);
                #}
            }
            elsif ( $self->data->[0] =~ /^bxSite$/ ) {
                my $info = $self->data->[1];
                if ( $hiden == 0 ) {
                    foreach my $site_name ( keys %{$info} ) {
                        foreach my $key ( keys %{ $info->{$site_name} } ) {
                            if ( $key =~ /password/i ) {
                                $info->{$site_name}->{$key} = "*************";
                            }
                        }
                    }
                }
                $output_hash->{'params'} = $info;
            }
            else {
                $output_hash->{'params'} =
                  { $self->data->[0] => $self->data->[1] };
            }
        }
        if ( $self->status ) { $output_hash->{'status'} = $self->status }

        my $json_text = to_json( $output_hash, pretty => 1 );
        print $json_text

          # plain|txt format
    }
    else {
# process additional data
# two types of structs:
# [type, values] or [type, {key => { opt => value, }, }
# ex.
# sshkey => [ sshkey, '/path/to/ssh/key' ]
# hosts  => [ hosts,  { vm => { ip => 1.1.1.1, roles => [mgmt, web, mysql ] } , vm2 => { ip => 1.2.2.2 } } ]
        if ( $self->data ) {
            my $data = $self->data;

            my $data_type = $data->[0];
            my $data_info = $data->[1];

            # host information
            if ( $data_type =~ /^hosts$/ ) {
                foreach my $h ( sort keys %$data_info ) {
                    my $roles = $data_info->{$h}->{'roles'};
                    my $ip    = $data_info->{$h}->{'ip'};
                    my $host_id =
                      ( $data_info->{$h}->{'host_id'} )
                      ? $data_info->{$h}->{'host_id'}
                      : '';
                    my $roles_out = '';
                    $roles_out .= join( ',', sort keys %$roles );
                    if ( $roles_out =~ /mysql/ ) {
                        my $mysql_type = $roles->{'mysql'}->{'type'};
                        my $mysql_id   = $roles->{'mysql'}->{'id'};
                        $roles_out =~
                          s/\bmysql\b/mysql_${mysql_type}_${mysql_id}/;
                    }

                    my $tr_options = "";
                    if ( $roles_out =~ /transformer/ ) {
                        my $tr_dir = $roles->{transformer}->{transformer_dir};
                        my $tr_site = $roles->{transformer}->{transformer_site};
                        $tr_options = "$tr_site;$tr_dir"
                    }
                    my $hostname =
                        ( $data_info->{$h}->{hostname} )
                        ? $data_info->{$h}->{hostname}
                        : $h;
                    print "host:$h:$ip:$roles_out:$host_id:$hostname:$tr_options\n";

                }

                # ssh key info
            }
            elsif ( $data_type =~ /^sshkey$/ ) {
                print "info:$data_type:$data_info\n";
            }
            elsif ( $data_type =~ /^monitor$/ ) {
                print "info:$data_type:",
                  $data_info->{'monitoring_server_netaddr'}, ":",
                  $data_info->{'monitoring_status'},         "\n";
            }
            elsif ( $data_type =~ /^bxDaemon$/ ) {

                #print Dumper( $data_info );
                foreach my $task_id ( grep {!/^task_name$/} sort keys %$data_info ) {
                    my $t = $data_info->{$task_id};

                    #print Dumper($t);
                    my $pid     = $t->{'pid'};
                    my $status  = $t->{'status'};
                    my $created = $t->{'created'};
                    $created = "" if ( not defined $created );
                    my $modified = $t->{'modified'};
                    $modified = "" if ( not defined $modified );
                    my $last_action = $t->{'last_action'};
                    $last_action = "" if ( not defined $last_action );
                    my $errors = $t->{'errors'};
                    $errors = "" if ( not defined $errors );
                    my $hosts_wirh_errors = "";

                    if ( defined $t->{'error_on_hosts'} ) {
                        $hosts_wirh_errors =
                          join( ',', @{ $t->{'error_on_hosts'} } );
                    }

                    print
"info:$data_type:$task_id:$pid:$created:$modified:$status:$errors:$hosts_wirh_errors:$last_action\n";
                }
            }
            elsif ( $data_type =~ /^bxMC$/ ) {

                #print Dumper($data_info);
                foreach my $srv_name ( sort keys %$data_info ) {
                    my $t = $data_info->{$srv_name};
                    my $mc_port =
                      ( $t->{'memcached_port'} ) ? $t->{'memcached_port'} : "";
                    my $mc_size =
                      ( $t->{'memcached_size'} ) ? $t->{'memcached_size'} : "";
                    my $ip = $t->{'ip'};
                    print "info:$data_type:$srv_name:$ip:$mc_port:$mc_size\n";
                }
            }
            elsif ( $data_type =~ /^bxSphinx$/ ) {
                foreach my $srv_name ( sort keys %$data_info ) {
                    my $t = $data_info->{$srv_name};
                    my $sphinx_general_port =
                      ( $t->{'sphinx_general_listen'} )
                      ? $t->{'sphinx_general_listen'}
                      : "";
                    my $sphinx_mysql_port =
                      ( $t->{'sphinx_mysqlproto_listen'} )
                      ? $t->{'sphinx_mysqlproto_listen'}
                      : "";
                    my $ip = $t->{'ip'};
                    print
"info:$data_type:$srv_name:$ip:$sphinx_general_port:$sphinx_mysql_port\n";
                }
            }
            elsif ( $data_type =~ /^bxSite$/ ) {
                foreach my $site_name ( sort keys %$data_info ) {
                    my $t = $data_info->{$site_name};
                    my $status =
                      ( $t->{'SiteStatus'} ) ? $t->{'SiteStatus'} : "";
                    my $server_name =
                      $t->{'ServerName'} ? $t->{'ServerName'} : "";
                    my $server_root =
                      $t->{'DocumentRoot'} ? $t->{'DocumentRoot'} : "";
                    my $site_charset =
                      $t->{'SiteCharset'} ? $t->{'SiteCharset'} : "";
                    my $type = $t->{'SiteInstall'} ? $t->{'SiteInstall'} : "";
                    my $db_type = $t->{'DBType'}     ? $t->{'DBType'}     : "";
                    my $db_host = $t->{'DBHost'}     ? $t->{'DBHost'}     : "";
                    my $db_name = $t->{'DBName'}     ? $t->{'DBName'}     : "";
                    my $db_user = $t->{'DBLogin'}    ? $t->{'DBLogin'}    : "";
                    my $db_pass = $t->{'DBPassword'} ? $t->{'DBPassword'} : "";
                    my $db_mycnf = $t->{'DBMyCnf'} ? $t->{'DBMyCnf'} : "";
                    my $db_pass_file = $t->{'DBPasswordFile'} ? $t->{'DBPasswordFile'} : "";
                    if ( ( $db_pass_file ne "" ) || ( $db_mycnf ne "" ) ){
                        $db_pass = "";
                    }
                    my $sh_conn =
                      $t->{'SphinxConnection'} ? $t->{'SphinxConnection'} : "";
                    my $sh_name =
                      $t->{'SphinxIndexName'} ? $t->{'SphinxIndexName'} : "";
                    my $email_addr =
                      $t->{'EmailAddress'} ? $t->{'EmailAddress'} : "";
                    my $email_acc =
                      $t->{'EmailAccount'} ? $t->{'EmailAccount'} : "";
                    my $email_host = $t->{'SMTPHost'} ? $t->{'SMTPHost'} : "";
                    my $email_port = $t->{'SMTPPort'} ? $t->{'SMTPPort'} : "";
                    my $email_user = $t->{'SMTPUser'} ? $t->{'SMTPUser'} : "";
                    my $email_pass =
                      $t->{'SMTPPassword'} ? $t->{'SMTPPassword'} : "";
                    my $email_tls = $t->{'SMTPTLS'}  ? $t->{'SMTPTLS'}  : "";
                    my $cron_task = $t->{'CronTask'} ? $t->{'CronTask'} : "";
                    my $cron_file = $t->{'CronFile'} ? $t->{'CronFile'} : "";
                    my $ssl_status = $t->{'HTTPS'} ? $t->{'HTTPS'} : "disable";
                    my $ssl_cert = $t->{'HTTPSCert'}  ? $t->{'HTTPSCert'}  : "";
                    my $ssl_priv = $t->{'HTTPSPriv'}  ? $t->{'HTTPSPriv'}  : "";
                    my $ssl_file = $t->{'HTTPSConf'}  ? $t->{'HTTPSConf'}  : "";
                    my $b_status = $t->{'BackupTask'} ? $t->{'BackupTask'} : "";
                    my $b_version =
                      $t->{'BackupVersion'} ? $t->{'BackupVersion'} : "";
                    my $b_folder =
                      $t->{'BackupFolder'} ? $t->{'BackupFolder'} : "";
                    my $b_min =
                      $t->{'BackupMinute'} ? $t->{'BackupMinute'} : "";
                    my $b_hour = $t->{'BackupHour'} ? $t->{'BackupHour'} : "";
                    my $b_day  = $t->{'BackupDay'}  ? $t->{'BackupDay'}  : "";
                    my $b_month =
                      $t->{'BackupMonth'} ? $t->{'BackupMonth'} : "";
                    my $b_weekday =
                      $t->{'BackupWeekDay'} ? $t->{'BackupWeekDay'} : "";
                    my $site_message = $t->{'message'} ? $t->{'message'} : "";
                    my $site_error   = $t->{'error'}   ? $t->{'error'}   : "";
                    my $module_cluster =
                        $t->{'module_cluster'}
                      ? $t->{'module_cluster'}
                      : "not_installed";
                    my $module_scale =
                        $t->{'module_scale'}
                      ? $t->{'module_scale'}
                      : "not_installed";

                    my $module_transformer = 
                        $t->{module_transformer}
                      ? $t->{module_transformer}
                      : "not_installed";

                    my $module_transformercontroller = 
                        $t->{module_transformercontroller}
                        ? $t->{module_transformercontroller}
                        : "not_installed";

                    my $module_main_version = 
                    $t->{module_main_version}
                    ? $t->{module_main_version}
                    : "";

                    my $upload_dir = ($t->{upload_dir})? $t->{upload_dir}: "";

                    # composite output
                    my $c_status =
                      ( $t->{'CompositeStatus'} =~ /^enable$/ ) ? "Y" : "N";
                    my $c_nginx_status =
                      ( $t->{'CompositeNginx'} =~ /^enable$/ ) ? "Y" : "N";
                    my $c_storage = $t->{'CompositeStorage'};
                    my $c_nginx_map =
                      ( $t->{'CompositeNginxMap'} )
                      ? $t->{'CompositeNginxMap'}
                      : "";
                    my $c_nginx_id =
                      ( $t->{'CompositeNginxID'} )
                      ? $t->{'CompositeNginxID'}
                      : "";
                    my $c_error =
                      ( $t->{'CompositeError'} ) ? $t->{'CompositeError'} : "";

                    # nginx and apache configs
                    my $config_string = "";
                    foreach my $ck (
                        'NginxHTTPConfig', 'NginxHTTPSConfig',
                        'NginxHTTPDir',    'NginxHTTPEDir',
                        'ApacheConf',      'DocumentRoot',
                        'phpSessionDir',   'phpUploadDir',
                        'proxy_ignore_client_abort',
                      )
                    {
                        $config_string .= ":";
                        $config_string .= ( $t->{$ck} ) ? $t->{$ck} : "";
                    }

                    $module_scale =
                      ( $module_scale =~ /^installed$/ ) ? 'Y' : 'N';
                    $module_cluster =
                      ( $module_cluster =~ /^installed$/ ) ? 'Y' : 'N';
                    $module_transformer =
                      ( $module_transformer =~ /^installed$/ ) ? 'Y' : 'N';

                    $module_transformercontroller =
                        ( $module_transformercontroller =~ /^installed$/ ) ? 'Y' : 'N';

                    my $ntlm1 =
                        $t->{'NTLM_bitrixvm_auth_support'}
                      ? $t->{'NTLM_bitrixvm_auth_support'}
                      : "N";
                    my $ntlm2 =
                      $t->{'NTLM_use_ntlm'} ? $t->{'NTLM_use_ntlm'} : "N";
                    my $ntlm_module =
                      $t->{'NTLM_module'} ? $t->{'NTLM_module'} : "N";

                    if ( $hiden == 0 ) {
                        $db_pass    = "*************";
                        $email_pass = $db_pass;
                    }

                    my $option_string = "";
                    foreach my $os (
                        "nginx_custom_settings", "nginx_bx_temp_files",
                        "dbconn_BX_TEMPORARY_FILES_DIRECTORY",
                    ){
                        $option_string .= ":";
                        $option_string .=( $t->{$os} )? $t->{$os} : "";
                    }

                    print
"$data_type:general:$site_name:$db_name:$type:$status:$server_name:$server_root:$site_charset:$module_scale:$module_cluster:$c_status:$c_nginx_status:$c_storage:$module_main_version:$module_transformer;$module_transformercontroller\n";
                    print 
"$data_type:db:$site_name:$db_name:$db_type:$db_host:$db_user:$db_pass:$db_pass_file:$db_mycnf\n";
                    print
"$data_type:search:$site_name:$db_name:$sh_conn:$sh_name\n";
                    print
"$data_type:email:$site_name:$db_name:$email_acc:$email_addr:$email_host:$email_port:$email_user:$email_pass:$email_tls\n";
                    print
"$data_type:cron:$site_name:$db_name:$cron_task:$cron_file\n";
                    print
"$data_type:https:$site_name:$db_name:$ssl_status:$ssl_cert:$ssl_priv:$ssl_file\n";
                    print
"$data_type:backup:$site_name:$db_name:$b_status:$b_version:$b_folder:$b_min:$b_hour:$b_day:$b_month:$b_weekday\n";
                    print
"$data_type:status:$site_name:$db_name:$status:'$site_error|$site_message'\n";
                    print
"$data_type:ntlm:$site_name:$db_name:$ntlm1:$ntlm2:$ntlm_module\n";
                    print "$data_type:modules:$module_cluster:$module_scale:$module_main_version\n";
                    print
"$data_type:composite:$site_name:$c_status:$c_storage:$c_nginx_status:$c_nginx_id:$c_nginx_map\n";
                    print 
"$data_type:directory:$site_name:$db_name:$server_root:$upload_dir\n";

                    if ( $c_error !~ /^$/ ) {
                        print
                          "$data_type:composite_error:$site_name:$c_error\n";
                    }
                    my $cron_status = "disabled";
                    my $cron_services =
                      join( ',', keys %{ $t->{'CronService'} } );
                    if ( $cron_services !~ /^$/ ) {
                        $cron_status = "enabled";
                    }
                    print
"$data_type:cron_services:$site_name:$db_name:$cron_status:$cron_services\n";
                    print "$data_type:configs:$site_name" . "$config_string\n";
                    print "$data_type:custom_options:$site_name" . "$option_string\n";

                    #print Dumper($data_info);
                }
            }
            elsif ( $data_type =~ /^bxSite::searchBackupForDB$/ ) {
                my $b_status  = $data_info->{'BackupTask'};
                my $b_version = $data_info->{'BackupVersion'};
                my $b_folder  = $data_info->{'BackupFolder'};
                my $b_min     = $data_info->{'BackupMinute'};
                my $b_hour    = $data_info->{'BackupHour'};
                my $b_day     = $data_info->{'BackupDay'};
                my $b_month   = $data_info->{'BackupMonth'};
                my $b_weekday = $data_info->{'BackupWeekDay'};
                print
"$data_type:backup:$b_status:$b_version:$b_folder:$b_min:$b_hour:$b_day:$b_month:$b_weekday\n";

            }
            elsif ( $data_type =~ /^site_certs$/ ){
                my $cnt = $data_info->{cnt};
                my $certs = $data_info->{certs};
                if ( $cnt == 0 ){
                    print "site_certs_count:0\n";
                }else{
                    print "site_certs_count:$cnt\n";
                    foreach my $cert_path ( keys %{$certs} ){
                        print "site_certs:$cert_path:".
                        join(',', @{$certs->{$cert_path}} ).
                        "\n";
                    }
                }
            }
            elsif ( $data_type =~ /^testClusterConfig$/ ) {
                my $kernels_sites    = "";
                my $no_scale_sites   = "";
                my $no_cluster_sites = "";
                my $status_message   = $data_info->{'test_kernels'};
                $status_message .= ':' . $data_info->{'test_without_cluster'};
                $status_message .= ':' . $data_info->{'test_without_scale'};

                if ( $data_info->{'test_kernels'} ) {
                    foreach my $s ( @{ $data_info->{'kernels'} } ) {
                        $kernels_sites .=
                          $s->{'SiteName'} . "=" . $s->{'DocumentRoot'} . ";";
                    }
                }
                if ( $data_info->{'test_without_cluster'} ) {
                    foreach my $s ( @{ $data_info->{'without_cluster'} } ) {
                        $no_cluster_sites .=
                          $s->{'SiteName'} . "=" . $s->{'DocumentRoot'} . ";";
                    }
                }
                if ( $data_info->{'test_without_scale'} ) {
                    foreach my $s ( @{ $data_info->{'without_scale'} } ) {
                        $no_scale_sites .=
                          $s->{'SiteName'} . "=" . $s->{'DocumentRoot'} . ";";
                    }
                }

                print "$data_type:general:$status_message\n";
                print "$data_type:kernels:$kernels_sites\n";
                print "$data_type:cluster:$no_cluster_sites\n";
                print "$data_type:scale:$no_scale_sites\n";

            }
            elsif ( $data_type =~ /^bxMysql$/ ) {
                foreach my $srv_name ( sort keys %$data_info ) {
                    my $t    = $data_info->{$srv_name};
                    my $type = ( $t->{'type'} )? $t->{'type'}: "";
                    my $id   = ( $t->{'id'} ) ? $t->{'id'}: "";
                    my $ip   = $t->{'ip'};
                    my $hostname = $t->{hostname};
                    print "info:$data_type:$srv_name:$ip:$id:$type:$hostname\n";
                }
            }
            elsif ( $data_type =~ /^(options\S+)$/ ) {
                my $options_type = $1;
                my $conf_status  = "";
                my $conf_options = "";
                foreach my $key ( sort keys %$data_info ) {
                    if ( $key =~ /^configure$/ ) {
                        $conf_status = $data_info->{$key};
                    }

                    if ( $key =~ /^options$/ ) {
                        $conf_options = join( ',', @{ $data_info->{$key} } );
                    }
                }
                print "info:$options_type:$conf_status:$conf_options\n";
            }
            elsif ( $data_type =~ /^bx_variables$/ ) {
                foreach my $srv_name ( keys %$data_info ) {
                    my $facts      = $data_info->{$srv_name};
                    my $bx_version = $facts->{'bx_version'};
                    my $bx_pwd     = $facts->{'bx_last_password_change'};
                    my $bx_uid     = $facts->{'bx_bitrix_uid'};
                    my $mysql_version =
                      ( $facts->{'mysql_version'} )
                      ? $facts->{'mysql_version'}
                      : 'not_installed';
                    my $php_version =
                      ( $facts->{'php_version'} )
                      ? $facts->{'php_version'}
                      : 'not_installed';

                    my $os_version =
                      ( $facts->{'os_version'} )
                      ? $facts->{'os_version'}
                      : 'unknown';


                    my $mysql_root_password = $facts->{'mysql_root_password'};
                    my $mysql_root_config   = $facts->{'mysql_root_config'};
                    my $mysql_service_status= $facts->{'mysql_service_status'};
                    my $mysql_package       = $facts->{'mysql_package'};

                    my $sphinx_version      = $facts->{'sphinx_version'};


                    my @addr = grep /addr_/, sort keys %$facts;
                    my $bx_addr = "";

                    foreach my $a (@addr) {
                        my $ip = $facts->{$a};
                        if ( $ip !~ /^none$/ ) {
                            my $int = $a;
                            $int =~ s/^addr_//;
                            $bx_addr .= "$int=$ip,";
                        }
                    }
                    $bx_addr =~ s/,$//;
                    printf "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n",
                    (
                      $data_type, $srv_name, $bx_version, $bx_pwd,
                      $bx_addr, $bx_uid, $mysql_version, $php_version,
                      $mysql_package, $mysql_root_password, 
                      $mysql_root_config, $mysql_service_status,
                      $os_version,$sphinx_version,

                    );
                }
            }
            elsif ( $data_type =~ /^dbs_list$/ ) {
                foreach my $srv_name ( keys %$data_info ) {
                    my $facts = $data_info->{$srv_name};
                    my $dbs = join( ',', @{ $facts->{'dbs_list'} } );
                    print "$data_type:$srv_name:$dbs\n";
                }
            }
            elsif ( $data_type =~ /^pool_interfaces$/ ) {
                foreach my $int ( keys %$data_info ) {
                    print "info:$data_type:$int:", $data_info->{$int}, "\n";
                }
            }
            elsif ( $data_type =~ /^pool_manager$/ ) {
                my $ident   = $data_info->{'ident'};
                my $int     = $data_info->{'interface'};
                my $netaddr = $data_info->{'netaddr'};
                my $type    = $data_info->{'type'};
                my $name    = $data_info->{'fqdn'};
                print "info:$data_type:$int:$netaddr:$ident:$type:$name\n";
            }
            elsif ( $data_type =~ /^pool_interface_revert$/ ) {
                my $int     = $data_info->{'interface'};
                my $netaddr = $data_info->{'netaddr'};
                print "info:$data_type:$int:$netaddr\n";
            }
            elsif ( $data_type =~ /^provider_options$/ ) {
                foreach my $provider_name ( sort keys %$data_info ) {
                    my $provider_status =
                      $data_info->{$provider_name}->{'status'};
                    my $provider_options =
                      $data_info->{$provider_name}->{'options'};
                    my $provider_print_options = "";
                    foreach my $opt_name ( sort keys %$provider_options ) {
                        if ( $provider_options->{$opt_name} == 1 ) {
                            $provider_print_options .= $opt_name . ",";
                        }
                    }
                    $provider_print_options =~ s/,$//;
                    print
"provider:options:$provider_name:$provider_status:$provider_print_options\n";
                }
            }
            elsif ( $data_type =~ /^provider_configs$/ ) {
                foreach my $provider_name ( sort keys %$data_info ) {
                    my $provider_configs =
                      $data_info->{$provider_name}->{'configurations'};
                    my $provider_status =
                      $data_info->{$provider_name}->{'status'};
                    foreach my $pc ( sort { $a->{'id'} <=> $b->{'id'} }
                        @$provider_configs )
                    {
                        my $id   = $pc->{'id'};
                        my $desc = $pc->{'descr'};
                        print
qq(provider:configs:$provider_name:$provider_status:$id:$desc\n);
                    }
                }
            }
            elsif ( $data_type =~ /^provider_order$/ ) {
                foreach my $provider_name ( sort keys %$data_info ) {
                    my $provider_task =
                      $data_info->{$provider_name}->{'task_id'};
                    print qq(provider:order:$provider_name:$provider_task);
                }
            }
            elsif ( $data_type =~ /^providers$/ ) {
                foreach my $provider_name ( sort keys %$data_info ) {
                    my $provider_status =
                      $data_info->{$provider_name}->{'status'};
                    if ($provider_status) {
                        print
                          "provider:status:$provider_name:$provider_status\n";
                    }
                    else {
                        print "provider:status:$provider_name:error\n";
                    }
                }
            }
            elsif ( $data_type =~ /^provider_order_list$/ ) {
                foreach my $provider_name ( sort keys %$data_info ) {
                    my $provider_data = $data_info->{$provider_name};
                    foreach my $task_id ( sort keys %$provider_data ) {
                        my $st    = $provider_data->{$task_id}->{'status'};
                        my $mtime = $provider_data->{$task_id}->{'mtime'};
                        my $error =
                          ( $provider_data->{$task_id}->{'error'} )
                          ? $provider_data->{$task_id}->{'error'}
                          : "";
                        my $msg =
                          ( $provider_data->{$task_id}->{'message'} )
                          ? $provider_data->{$task_id}->{'message'}
                          : "";
                        print
"provider:orders:$provider_name:$task_id:$st:$mtime:$error:$msg\n";
                    }
                }
            }
            elsif ( $data_type =~ /^NTLMStatus$/ ) {
                my $TimeOffset = $data_info->{'TimeOffset'};
                my $BindPath   = $data_info->{'BindPath'};
                my $LDAPServer = $data_info->{'LDAPServer'};
                my $Realm      = $data_info->{'Realm'};
                my $KDCServer  = $data_info->{'KDCServer'};
                my $LDAPPort   = $data_info->{'LDAPPort'};
                my $Status     = $data_info->{'Status'};

                print
"$data_type:$Status:$Realm:$LDAPServer:$LDAPPort:$BindPath:$KDCServer:$TimeOffset\n";
            }
            elsif ( $data_type =~ /^Pool::delete_pool$/ ) {
                my $warnings = $data_info->{'warnings'};
                my $w_cnt    = keys %$warnings;
                print "delete_pool:warnings:$w_cnt\n";
                if ($w_cnt) {
                    my $str = join( "\n",
                        map { "$_: $warnings->{$_}" } keys %$warnings );
                    print $str, "\n";
                }
            }

        }

        # process main info
        if ( $self->message ) { print "message:", $self->message, "\n" }
        if ( $self->status )  { print "status:",  $self->status,  "\n" }
        if ( $self->error )   { print "error:",   $self->error,   "\n" }
    }
    exit $self->error;
}

# print message to file
sub log_data {
    my $self    = shift;
    my $message = shift;

    # format of log message is:
    # [YYYY-MM-DD hh:mm:ss] PID Level MessageText
    my $lt    = strftime "%Y-%m-%d %H:%M:%S", localtime;
    my $pid   = $$;
    my $level = sprintf "CODE_%02d", $self->error;

    open( my $lh, ">>" . $self->logfile )
      or return [ 1, "Can't open file " . $self->logfile . ": $!" ];
    if ( $self->message ) {
        printf $lh "\[%s\] %d %s \"%s\"\n",
          ( $lt, $pid, $level, $self->message );
    }

    if ( $message && $self->debug ) {
        printf $lh "\[%s\] %d %s \"%s\"\n", ( $lt, $pid, $level, $message );
    }

    close $lh;

    return [ 0, 'message saved' ];
}

# return error number from object
sub is_error {
    my $self = shift;
    if ( $self->error > 0 ) {
        $self->log_data;
    }
    return $self->error;
}

# return data object if exist
sub get_data {
    my $self = shift;

    #print Dumper($self);

    my $data = $self->data;
    return $data;
}

# return message object if exist
sub get_message {
    my $self = shift;

    #print Dumper($self);

    my $data = $self->message;
    return $data;
}

1;