403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /opt/webdir/lib/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /opt/webdir/lib/bxSphinx.pm
# manage sphinx instance
#
package bxSphinx;
use strict;
use warnings;
use Moose;
use File::Basename qw( dirname basename );
use File::Spec::Functions;
use Data::Dumper;
use DBI;
use Output;
use Pool;
use Host;
use bxDaemon;

# basic path for site
has 'config', is => 'ro', default => '/etc/ansible/group_vars/bitrix-sphinx.yml';
has 'group', is => 'ro', default => 'sphinx';
has 'debug', is => 'rw', default => '0';

# get default options from group
sub groupOptions {
  my $self = shift;

  my $message_p = (caller(0))[3];
  my $message_t = __PACKAGE__;

  my $config = $self->config;

  my $group_options = {
    sphinx_general_listen => 9312,
    sphinx_mysqlproto_listen => 9306,
  };

  if (! -f $config) {
    return Output->new(
      error => 0,
      data => [$message_t, $group_options]
    );
  }

  open(my $ch, $config) or
    return Output->new(
      error => 1,
      message => "$message_p: Cannot open $config: !"
    );

  while(<$ch>) {
    s/^\s+//; s/\s+$//;
    if (/^([^#:\s]+)\s*:\s*(\S+)$/) {
      my $key = $1;
      my $val = $2;
      $val =~ s/^['"]//;
      $val =~ s/['"]$//;
      if (grep /^$key$/, keys %$group_options) {
        $group_options->{$key} = $val;
      }
    }
  }
  close $ch;

  return Output->new(
    error => 0,
    data => [$message_t, $group_options]
  );
}

# get server options
sub serverOptions {
  my ( $self, $server_name ) = @_;

  my $message_p = (caller(0))[3];
  my $message_t = __PACKAGE__;

  # get default group options or options from config
  my $group = $self->group;
  my $get_group_options = $self->groupOptions();
  if ($get_group_options->is_error) {
    return $get_group_options;
  }
  my $server_options_info = $get_group_options->get_data;
  my $server_options = $server_options_info->[1];
  #print Dumper($server_options);

  # get all host info
  my $po = Pool->new();
  my $host_info = $po->get_ansible_data($server_name);
  if ( $host_info->is_error ) { return $host_info };
  my $host_data = $host_info->get_data;
  my $server_hash = $host_data->[1];

  # if requst by IP address => we get name
  if ( $server_name =~ /^[\.\d]+$/ ) {
    ( $server_name ) = keys %$server_hash;
  }

  # output only sphinx options
  if ( grep /^$group$/, keys %{$server_hash->{$server_name}->{'roles'}} ) {
    $server_options = $server_hash->{$server_name}->{'roles'}->{$group};
  } else {
    return Output->new(
      error => 1,
      message => "$message_p: $server_name not in the $group group",
    );
  }

  # add ip address or network to host info
  $server_options->{'ip'} = $server_hash->{$server_name}->{'ip'};

  return Output->new(
    error => 0,
    data => [$message_t, {$server_name => $server_options}]
  );
}

# get current mysql servers list
sub serverList {
  my $self = shift;

  my $message_p = (caller(0))[3];
  my $message_t = __PACKAGE__;
  my $group = $self->group;

  my $po = Pool->new();
  my $ansible_conf = $po->ansible_conf;
  my $hosts_file = $ansible_conf->{'hosts'};

  my @servers;
  my $section_name = 'bitrix-'.$group;
  my $section_found = 0;
  # parse config and found server list
  open ( my $hh, $hosts_file )
    or return Output->new(
      error => 1,
      message => "$message_p: Cannot open $hosts_file: $!"
    );

  while (<$hh>) {
    s/^\s+//; s/\s+$//;
    next if ( /^#/ );
    next if ( /^$/ );

    # section found
    if ( /^\[([^\]]+)\]$/ ) {
      my $s = $1;
      $section_found = 0;
      if ( $s =~ /^$section_name$/ ) {
        $section_found = 1;
      }
    }

    # host definition found
    if ( $section_found == 1 &&  /^([^\]\[\s]+)\s+(.+)$/ ){ push @servers, $1; };
  }
  close $hh;

  my $servers_cnt = @servers;
  if ($servers_cnt == 0) {
    return Output->new(
      error => 1,
      message => "$message_p: not found memcached servers",
    );
  }

  my $return_data;
  # get options for servers
  foreach my $srv ( @servers ) {
    my $get_srv = serverOptions($self, $srv);
    if ( $get_srv->is_error ){ return $get_srv; };
    my $get_srv_data = $get_srv->get_data;
    $return_data->{$srv} = $get_srv_data->[1]->{$srv};
  }

  return Output->new(
    error => 0,
    data => [$message_t, $return_data]
  );
}

# create sphinx service on the server
# input:
# hostname in pool - host ip address
# *password options mandatory, but can be defined inf config file
sub createSphinx {
  my ($self, $server_name, $dbname, $reindex) = @_;

  my $message_p = (caller(0))[3];
  my $message_t = __PACKAGE__;
  my $group = $self->group;

  ( $server_name ) or
    return Output->new(
      error => 1,
      message => "$message_p: server_name is is mandatory"
    );

  ( $dbname )
    or return Output->new(
      error => 1,
      message => "$message_p: dbname is madatory"
    );

  my $reindex_mark = 'N';
  if ( defined $reindex && $reindex == 1 ) {
    $reindex_mark = 'Y';
  }

  # test server in the pool
  my $host = Host->new( host =>$server_name );
  my $is_host_in_pool = $host->host_in_pool();
  if ($is_host_in_pool->is_error) {
    return Output->new(
      error => 1,
      message => "$message_p: $server_name not in the pool"
    );
  }

  # create ansible task options
  my $po  = Pool->new();
  my $ansData = $po->ansible_conf;
  my $cmd_play = $ansData->{'playbook'};
  my $cmd_conf = catfile($ansData->{'base'},"$group.yml");
  my $cmd_opts = {
    'manage_sphinx' => 'create',
    'manage_node' => $server_name,
    'manage_kernel' => $dbname,
    'manage_reindex' => $reindex_mark
  };

  # run as daemon in background
  my $dh = bxDaemon->new(
    debug => $self->debug,
    task_cmd => qq($cmd_play $cmd_conf)
  );
  my $created_process = $dh->startAnsibleProcess($group, $cmd_opts);

  return $created_process;
}

# remove sphinx service from server
# input:
# hostname in pool - host ip address
# *password options mandatory, but can be defined inf config file
sub removeSphinx {
  my ($self, $server_name, $dbname) = @_;

  my $message_p = (caller(0))[3];
  my $message_t = __PACKAGE__;
  my $group = $self->group;

  ( $server_name )
    or return Output->new(
      error => 1,
      message => "$message_p: server_name is is mandatory"
    );

  # test server in the pool
  my $host = Host->new( host =>$server_name );
  my $is_host_in_pool = $host->host_in_pool($group);
  if ($is_host_in_pool->is_error) {
    return Output->new(
      error => 1,
      message => "$message_p: $server_name not in the $group group"
    );
  }

  # create ansible task options
  my $po = Pool->new();
  my $ansData = $po->ansible_conf;
  my $cmd_play = $ansData->{'playbook'};
  my $cmd_conf = catfile($ansData->{'base'},"$group.yml");
  my $cmd_opts = {
    'manage_sphinx' => 'delete',
    'manage_node' => $server_name,
    'manage_kernel' => $dbname
  };

  # run as daemon in background
  my $dh = bxDaemon->new(
    'debug' => $self->debug,
    'task_cmd' => qq($cmd_play $cmd_conf)
  );
  my $created_process = $dh->startAnsibleProcess($group, $cmd_opts);

  return $created_process;
}

1;

Youez - 2016 - github.com/yon3zu
LinuXploit