• Home (current)
  • वर्तमान निदेशक => /bin/
  • सूचना एवं अपलोड
    Info Server
Indian Cyber Force
Folders रचयन्तु सञ्चिकां रचयन्तु RansomWeb लॉगआउट
Current File : //bin/fixproc
#!/usr/bin/perl
# 
# fixproc [-min n] [-max n] [-check | -kill | -restart | -exist | -fix] proc ...
# 
# fixproc exit code:
# 	0	ok
# 	1	check failed
# 	2	cannot restart
# 	3	cannot kill
# 	4	fix failed	if fix is defined as kill or restart, then
# 				cannot kill or cannot restart is return instead
# 	10	fixproc error
# 
#
# Fixes a process named "proc" by performing the specified action.  The
# actions can be check, kill, restart, exist, or fix.  The action is specified
# on the command line or is read from a default database, which describes
# the default action to take for each process.  The database format and
# the meaning of each action are described below.
# 
# database format
# ---------------
# 
# name	foo			required
# cmd	/a/b/name args		required
# min	number			optional, defaults to 1
# max	number			optional, defaults to 1
# 
# check	{null, exist, shell}	optional, defaults to exist if not defined
# [shell command		shell commands needed only if check=shell
#  ...
#  shell command
#  end_shell]			keyword end_shell marks end of shell commands
# fix	{kill, restart, shell}	required
# [shell command			shell commands needed only if fix=shell
#  ...
#  shell command
#  end_shell]			keyword end_shell marks end of shell commands
# 
# Blank lines and lines beginning with "#" are ignored.
# 
#
# Example:
# 
# name	test1
# cmd	nice /home/kong/z/test1 > /dev/null &
# max	2
# fix	shell
# 	xterm&
# 	nice /home/kong/z/test1 > /dev/null &
# 	end_shell
# 
# 
# actions
# -------
# There are 5 possible actions:  kill, restart, fix, exist, check.  Fix is
# defined to be the kill action, the restart action, or a series of shell
# commands.  Check is optionally defined in the database.  If check is not
# defined, it defaults to exist.
# 
# If the action is specified on the cmd line, it is executed regardless of
# check.  The commands executed for each action type is as follow:
# 
#   switch action:
# 	kill:
# 	  kill process, wait 5 seconds, kill -9 if still exist
# 	  if still exist
# 	    return "cannot kill"
# 	  else
# 	    return "ok"
# 
# 	restart:	
# 	  execute kill
# 	  if kill returned "cannot kill"
# 	    return "cannot kill"
# 	  restart by issuing cmd to shell
# 	  if check defined
# 	    execute check
# 	    if check succeeds
# 	      return "ok"
# 	    else
# 	      return "cannot restart"
# 
# 	fix:
# 	  if fix=kill
# 	    execute kill
# 	  else if fix=restart
# 	    execute restart
# 	  else
# 	    execute shell commands
# 	    execute check
# 
# 	check:
# 	  if check defined as null
# 	    return "fixproc error"
# 	  else
# 	    execute check
# 	    if check succeeds
# 	      return (execute exist)
# 	    return "check failed"
# 
# 	exist:
# 	  if proc exists in ps && (min <= num. of processes <= max)
# 	    return "ok"
# 	  else
# 	    return "check failed"
# 
# 
# If the action is not specified on the cmd line, the default action is the
# fix action defined in the database.  Fix is only executed if check fails:
# 
# 	if fix defined
# 	  if check is not defined as null
# 	    execute check
# 	    if check succeeds
# 	      return "ok"
# 	  execute action defined for fix  
# 	else
# 	  return "fixproc error"
# 
# 
# If proc is not specified on the command line, return "fixproc error." 
# Multiple proc's can be defined on the cmd line.   When an error occurs
# when multiple proc's are specified, the first error encountered halts the
# script.
# 
# For check shell scripts, any non-zero exit code means the check has failed.
#
#
# Timothy Kong		3/1995

use File::Temp qw(tempfile);

$database_file = '/local/etc/fixproc.conf';

$debug = 0;			# specify debug level using -dN
				# currently defined: -d1

$no_error = 0;
$check_failed_error = 1;
$cannot_restart_error = 2;
$cannot_kill_error = 3;
$cannot_fix_error = 4;
$fixproc_error = 10;

$min = 1;
$max = 1;
$cmd_line_action = '';
%min = ();
%max = ();
%cmd = ();
%check = ();
%fix = ();
$shell_lines = ();
@proc_list = ();

$shell_header = "#!/bin/sh\n";
$shell_end_marker = 'shell_end_marker';

&read_args();
&read_database();
# &dump_database();		# debug only

# change the default min. and max. number of processes allowed
if ($min != 1)
  {
    for $name ( keys (%min) )
      {
	$min{$name} = $min;
      }
  }
if ($max != 1)
  {
    for $name ( keys (%max) )
      {
	$max{$name} = $max;
      }
  }
    
# work on one process at a time
for $proc ( @proc_list )
  {
    $error_code = &work_on_proc ($proc);

############# uncomment next line when fully working ############
#    exit $error_code if ($error_code);

    die "error_code = $error_code\n" if ($error_code);
  }


# create an executable shell script file
sub create_sh_script
{
  local ($file) = pop (@_);
  local ($fh) = pop (@_);
  local ($i) = pop (@_);

  printf (STDERR "create_sh_script\n") if ($debug > 0);

  $! = $fixproc_error;
  while ( $shell_lines[$i] ne $shell_end_marker )
    {
      printf ($fh "%s", $shell_lines[$i]);
      $i++;
    }
  close ($fh);
  chmod 0755, $file;
}


sub do_fix
{
  local ($proc) = pop(@_);

  printf (STDERR "do_fix\n") if ($debug > 0);

  if ($fix{$proc} eq '')
    {
      $! = $fixproc_error;
      die "$0: internal error 4\n";
    }
  if ($fix{$proc} eq 'kill')
    {
      return &do_kill ($proc);
    }
  elsif ($fix{$proc} eq 'restart')
    {
      return &do_restart ($proc);
    }
  else
    {
      # it must be "shell", so execute the shell script defined in database
      local ($tmpfh, $tmpfile) = tempfile("fix_XXXXXXXX", DIR => "/tmp");

      &create_sh_script ($fix{$proc}, $tmpfh, $tmpfile);

      	# return code is number divided by 256
      $error_code = (system "$tmpfile") / 256;
      unlink($tmpfile);
      return ($fix_failed_error) if ($error_code != 0);
        # sleep needed here?
      return &do_exist ($proc);
    }
}


sub do_check
{
  local ($proc) = pop(@_);

  printf (STDERR "do_check\n") if ($debug > 0);

  if ($check{$proc} eq '')
    {
      $! = $fixproc_error;
      die "$0: internal error 2\n";
    }

  if ($check{$proc} ne 'exist')
    {
      # if not "exist", then it must be "shell", so execute the shell script
      # defined in database

      local ($tmpfh, $tmpfile) = tempfile("check_XXXXXXXX", DIR => "/tmp");

      &create_sh_script ($fix{$proc}, $tmpfh, $tmpfile);

      	# return code is number divided by 256
      $error_code = (system "$tmpfile") / 256;
      unlink($tmpfile);
      return ($check_failed_error) if ($error_code != 0);

      # check passed, continue
    }
  return &do_exist ($proc);
}


sub do_exist
{
  local ($proc) = pop(@_);

  printf (STDERR "do_exist\n") if ($debug > 0);

  # do ps, check to see if min <= no. of processes <= max
  $! = $fixproc_error;
  open (COMMAND, "/bin/ps -e | /bin/grep $proc | /bin/wc -l |")
    || die "$0: can't run ps-grep-wc command\n";
  $proc_count = <COMMAND>;
  if (($proc_count < $min{$proc}) || ($proc_count > $max{$proc}))
    {
      return $check_failed_error;
    }
  return $no_error;
}


sub do_kill
{
  local ($proc) = pop(@_);
  local ($second_kill_needed);

  printf (STDERR "do_kill\n") if ($debug > 0);

  # first try kill
  $! = $fixproc_error;
  open (COMMAND, "/bin/ps -e | /bin/grep $proc |")
    || die "$0: can't run ps-grep-awk command\n";
  while (<COMMAND>)
    {
      # match the first field of ps -e
      $! = $fixproc_error;
      /^\s*(\d+)\s/ || die "$0: can't match ps -e output\n";
      system "kill $1";
    }

  # if process still exist, try kill -9
  sleep 2;
  $! = $fixproc_error;
  open (COMMAND, "/bin/ps -e | /bin/grep $proc |")
    || die "$0: can't run ps-grep-awk command\n";
  $second_kill_needed = 0;
  while (<COMMAND>)
    {
      # match the first field of ps -e
      $! = $fixproc_error;
      /^\s*(\d+)\s/ || die "$0: can't match ps -e output\n";
      system "kill -9 $1";
      $second_kill_needed = 1;
    }
  return ($no_error) if ($second_kill_needed == 0);

  # see if kill -9 worked
  sleep 2;
  $! = $fixproc_error;
  open (COMMAND, "/bin/ps -e | /bin/grep $proc |")
    || die "$0: can't run ps-grep-awk command\n";
  while (<COMMAND>)
    {				# a process still exist, return error
      return $cannot_kill_error;
    }
  return $no_error;		# good, all dead
}


sub do_restart
{
  local ($proc) = pop(@_);
  local ($error_code);

  printf (STDERR "do_restart\n") if ($debug > 0);

  $error_code = &do_kill ($proc);
  return $error_code if ($error_code != $no_error);
  die "$0: internal error 3\n" if ($cmd{$proc} eq '');
  system "$cmd{$proc}";
  # sleep needed here?
  if ($check{$proc} ne 'null')
    {
      return $no_error if (&do_check($proc) == $no_error);
      return $cannot_restart_error;
    }
}


sub work_on_proc
{
  local ($proc) = pop(@_);
  local ($error_code);

  printf (STDERR "work_on_proc\n") if ($debug > 0);

  if ($cmd_line_action eq '')
    {
      # perform action from database

      if ($check{$proc} ne 'null')
	{
	  $error_code = &do_check ($proc);
	  if ($error_code != $check_failed_error)
	    {
	      return $error_code;
	    }
	}
      return &do_fix ($proc);
    }
  else
    {
      # perform action from command line

      $error_code = $no_error;
      if ($cmd_line_action eq 'kill')
	{
	  $error_code = &do_kill ($proc);
	}
      elsif ($cmd_line_action eq 'restart')
	{
	  $error_code = &do_restart ($proc);
	}
      elsif ($cmd_line_action eq 'fix')
	{
	  $error_code = &do_fix ($proc);
	}
      elsif ($cmd_line_action eq 'check')
	{
	  if ( $check{$proc} eq 'null' )
	    {
	      exit $fixproc_error;
	    }
	  $error_code = &do_check ($proc);
	}
      elsif ($cmd_line_action eq 'exist')
	{
	  $error_code = &do_exist ($proc);
	}
      else
	{
	  $! = $fixproc_error;
	  die "$0: internal error 1\n";
	}
    }
}


sub dump_database
{
  local ($name);

  for $name (keys(%cmd))
    {
      printf ("name\t%s\n", $name);
      printf ("cmd\t%s\n", $cmd{$name});
      printf ("min\t%s\n", $min{$name});
      printf ("max\t%s\n", $max{$name});
      if ( $check{$name} =~ /[0-9]+/ )
	{
	  printf ("check\tshell\n");
	  $i = $check{$name};
	  while ( $shell_lines[$i] ne $shell_end_marker )
	    {
	      printf ("%s", $shell_lines[$i]);
	      $i++;
	    }
	}
      else
	{
	  printf ("check\t%s\n", $check{$name});
	}
      if ( $fix{$name} =~ /[0-9]+/ )
	{
	  printf ("fix\tshell\n");
	  $i = $fix{$name};
	  while ( $shell_lines[$i] ne $shell_end_marker )
	    {
	      printf ("%s", $shell_lines[$i]);
	      $i++;
	    }
	}
      else
	{
	  printf ("fix\t%s\n", $fix{$name});
	}
      printf ("\n");
    }
}


sub read_database
{
  local ($in_check_shell_lines) = 0;
  local ($in_fix_shell_lines) = 0;
  local ($name) = '';
  local ($str1);
  local ($str2);

  $! = $fixproc_error;
  open (DB, $database_file) || die 'cannot open database file $database_file\n';
  while (<DB>)
    {
      if ((! /\S/) || (/^[ \t]*#.*$/))
	{
		# ignore blank lines or lines beginning with "#"
	}
      elsif ($in_check_shell_lines)
	{
	  if ( /^\s*end_shell\s*$/ )
	    {
	      $in_check_shell_lines = 0;
	      push (@shell_lines, $shell_end_marker);
	    }
	  else
	    {
	      push (@shell_lines, $_);
	    }
	}
      elsif ($in_fix_shell_lines)
	{
	  if ( /^\s*end_shell\s*$/ )
	    {
	      $in_fix_shell_lines = 0;
	      push (@shell_lines, $shell_end_marker);
	    }
	  else
	    {
	      push (@shell_lines, $_);
	    }
	}
      else
	{
	  if ( ! /^\s*(\S+)\s+(\S.*)\s*$/ )
	    {
	      $! = $fixproc_error;
	      die "$0: syntax error in database\n$_";
	    }
	  $str1 = $1;
	  $str2 = $2;
	  if ($str1 eq 'name')
	    {
	      &finish_db_entry($name);
	      $name = $str2;
	    }
	  elsif ($str1 eq 'cmd')
	    {
	      $! = $fixproc_error;
	      die "$0: cmd specified before name in database\n$_\n"
	        if ($name eq '');
	      die "$0: cmd specified multiple times for $name in database\n"
		if ($cmd{$name} ne '');
	      $cmd{$name} = $str2;
	    }
	  elsif ($str1 eq 'min')
	    {
	      $! = $fixproc_error;
	      die "$0: min specified before name in database\n$_\n"
	        if ($name eq '');
	      die "$0: min specified multiple times in database\n$_\n"
		if ($min{$name} ne '');
	      die "$0: non-numeric min value in database\n$_\n"
		if ( ! ($str2 =~ /[0-9]+/ ));
	      $min{$name} = $str2;
	    }
	  elsif ($str1 eq 'max')
	    {
	      $! = $fixproc_error;
	      die "$0: max specified before name in database\n$_\n"
	        if ($name eq '');
	      die "$0: max specified multiple times in database\n$_\n"
		if ($max{$name} ne '');
	      die "$0: non-numeric max value in database\n$_\n"
		if ( ! ($str2 =~ /[0-9]+/ ));
	      $max{$name} = $str2;
	    }
	  elsif ($str1 eq 'check')
	    {
	      $! = $fixproc_error;
	      die "$0: check specified before name in database\n$_\n"
	        if ($name eq '');
	      die "$0: check specified multiple times in database\n$_\n"
		if ($check{$name} ne '');
	      if ( $str2 eq 'shell' )
		{
		  # if $check{$name} is a number, it is a pointer into
		  # $shell_lines[] where the shell commands are kept
		  $shell_lines[$#shell_lines+1] = $shell_header;
		  $check{$name} = $#shell_lines;
		  $in_check_shell_lines = 1;
		}
	      else
		{
		  $check{$name} = $str2;
		}
	    }
	  elsif ($str1 eq 'fix')
	    {
	      $! = $fixproc_error;
	      die "$0: fix specified before name in database\n$_\n"
	        if ($name eq '');
	      die "$0: fix specified multiple times in database\n$_\n"
		if ($fix{$name} ne '');
	      if ( $str2 eq 'shell' )
		{
		  # if $fix{$name} is a number, it is a pointer into
		  # $shell_lines[] where the shell commands are kept
		  $shell_lines[$#shell_lines+1] = $shell_header;
		  $fix{$name} = $#shell_lines;
		  $in_fix_shell_lines = 1;
		}
	      else
		{
		  $fix{$name} = $str2;
		}
	    }
	}
    }
  &finish_db_entry($name);
}


sub finish_db_entry
{
  local ($name) = pop(@_);

  if ($name ne '')
    {
      $! = $fixproc_error;
      die "$0: fix not defined for $name in database\n"
	if ($fix{$name} eq '');
      die "$0: cmd not defined for $name in database\n"
	if ($cmd{$name} eq '');
      $check{$name} = 'exist' if ($check{$name} eq '');
      $max{$name} = 1 if ($max{$name} eq '');
      $min{$name} = 1 if ($min{$name} eq '');
    }
}


sub read_args
{
  local ($i) = 0;
  local ($arg);
  local ($action_arg_count) = 0;

  while ( $i <= $#ARGV )
    {
      $arg = $ARGV[$i];
      if (($arg eq '-min') || ($arg eq '-max'))
	{
	  if (($i == $#ARGV - 1) || ($ARGV[$i+1] =~ /\D/))  # \D is non-numeric
	    {
	      $! = $fixproc_error;
	      die "$0: numeric arg missing after -min or -max\n";
	    }
	  if ($arg eq '-min')
	    {
	      $min = $ARGV[$i+1];
	    }
	  else
	    {
	      $max = $ARGV[$i+1];
	    }
	  $i += 2;
	}
      elsif ($arg eq '-kill')
	{
	  $cmd_line_action = 'kill';
	  $action_arg_count++;
	  $i++;
	}
      elsif ($arg eq '-check')
	{
	  $cmd_line_action = 'check';
	  $action_arg_count++;
	  $i++;
	}
      elsif ($arg eq '-restart')
	{
	  $cmd_line_action = 'restart';
	  $action_arg_count++;
	  $i++;
	}
      elsif ($arg eq '-exist')
	{
	  $cmd_line_action = 'exist';
	  $action_arg_count++;
	  $i++;
	}
      elsif ($arg eq '-fix')
	{
	  $cmd_line_action = 'fix';
	  $action_arg_count++;
	  $i++;
	}
      elsif ($arg =~ /-d(\d)$/)
	{
	  $debug = $1;
	  $i++;
	}
      elsif ($arg =~ /^-/)
	{
	  $! = $fixproc_error;
	  die "$0: unknown switch $arg\n";
	}
      else
	{
	  push (@proc_list, $arg);
	  $i++;
	}
    }
    $! = $fixproc_error;
    die "$0: no process specified\n" if ($#proc_list == -1);
    die "$0: more than one action specified\n" if ($action_arg_count > 1);
  }

Frontend Submission – Verilere bak
Menu
  • Top 10

Verilere bak

Follow us
  • facebook
  • twitter
Search
Login
Create
Menu

Verilere bak

Login

You are here:

  1. Home
  2. Frontend Submission

Frontend Submission

  • Story

    Mix text with images and embeds

  • Image

    JPG, PNG or GIF

  • Audio

    MP3 or SoundCloud embed, MixCloud, etc.

  • Video

    MP4 or YouTube embed, Vimeo, Dailymotion, etc.

  • Gallery

    A collection of images

  • Embed

    Facebook post, Twitter status, etc.

  • Link

    External site's link

  • Open list

    Everyone can submit new list items and vote up for the best submission

  • Ranked list

    Everyone can vote up for the best list item

  • Classic list

    A list-based article

  • Meme

    Create a funny pic

  • Trivia quiz

    What do you know about ...?

  • Personality quiz

    What type of person are you?

  • Poll

    One or multiple questions about a subject or person

  • Versus

    A poll where each question has two competing answers

  • Hot or Not

    A poll where each question has two opposite answers

Bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

  • facebook
  • twitter

© 2017 bring the pixel. Remember to change this

  • Home
  • Contact us
Back to Top
Close
  • Top 10
  • Home
  • Animals
  • Funny
  • WOW
  • WTF
  • Features
  • facebook
  • twitter
Create

Log In

Sign In

Forgot password?

Forgot password?

Enter your account data and we will send you a link to reset your password.

Back to Login

Your password reset link appears to be invalid or expired.

Log in

Privacy Policy

Accept

Add to Collection

  • Public collection title

  • Private collection title

No Collections

Here you'll find all collections you've created before.

Close
of

Processing files…

Hey Friend!
Before You Go…

Get the best viral stories straight into your inbox before everyone else!

Don't worry, we don't spam

Close

Newsletter

Don’t miss out on new posts!

Don't worry, we don't spam

Close