#!/usr/bin/perl
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
#  
#  
# Licensed Materials - Property of IBM 
#  
# (C) COPYRIGHT International Business Machines Corp. 2000,2019 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
# sccsid = "@(#)29   1.32   src/rsct/rm/SensorRM/cli/bin/mksensor.perl, sensorcli, rsct_rady, rady2035a 11/12/15 16:37:24"

# Creates an RMC sensor

use strict;
use locale;
BEGIN
  {
	# this enables us to redirect where it looks for other RSCT files during development
	$::rsctroot = $ENV{'RSCT_ROOT'} || '/opt/rsct';
	$::rsctpm = "$::rsctroot/pm";
	$::rsctmsgmaps = "$::rsctroot/msgmaps";
  }

use lib $::rsctpm;
use Getopt::Long;
use CT_cli_utils qw(printIMsg printEMsg);
use Socket;
use CT_cli_input_utils qw(
    check_input_file
);
use MC_cli_utils qw(
     read_from_Stdin
);

$main::PROGNAME = 'mksensor';
$main::MSGCAT = 'sensorcli.cat';
$main::LSMSG = '/opt/rsct/bin/ctdspmsg';

# For the usage, see sensorcli.msg
#sub usage { printIMsg('IMsgMksensorUsage_new3');  exit (scalar(@_) ? $_[0] : 1); }
#sub usage { printIMsg('IMsgMksensorUsage_new4');  exit (scalar(@_) ? $_[0] : 1); }
sub usage { printIMsg('IMsgMksensorUsage_new5');  exit (scalar(@_) ? $_[0] : 1); }

Getopt::Long::Configure ("bundling", "no_auto_abbrev",
                         "no_ignore_case", "require_order",
                         "prefix_pattern=(--|-)");
                         
# Parse the cmd line args and check them
if(!GetOptions( 'h|help|version' ,
                'm' ,
                'v' ,
                'V',
                'c=s' ,
                'u=s',
                'i=s',
                'n=s',
                'N=s',
                'e=s', ))
{
    &usage;
}
if ($::opt_h) { &usage(0); }
if (scalar(@ARGV) < 2) { &usage; }

if(defined($::opt_n) && defined($::opt_N))
{
    &usage;
}
if ( ($::opt_m) && 
            ( defined($::opt_c) ||
              defined($::opt_e) ||
              defined($::opt_u) ) )
{
    &usage;
}
if ($::opt_V) { $::opt_v = 1; }

# determine the class to use
my $CLASSNAME = "IBM.Sensor";
my $CMDMOD = "Command";
if ($::opt_m) 
{ 
   $CLASSNAME = "IBM.MicroSensor"; 
   $CMDMOD = "ModuleName";
}

my $name = shift @ARGV;
   if (length($name) <= 0)
   {
       printEMsg('EMsgMksensorInvName');
       exit(1);
   }
my $sscmdmod = "";
my $ssparms  = "";
if ( ! $::opt_m )
{
   $sscmdmod = join(' ', @ARGV);
   if (length($sscmdmod) <= 0)
   {
       printEMsg('EMsgMksensorInvCommand');
       exit(1);
   }
}
else
{
   $sscmdmod = shift @ARGV;
   if (length($sscmdmod) <= 0)
   {
       printEMsg('EMsgMksensorInvModule');
       exit(1);
   }
   $ssparms  = join(' ', @ARGV);
}

my $username;
my $node_file_flag = 0;                           # node_file_flag =1         if -N was specified.
my $node_file_name = "";                          # node_file_name
my $node_file_from_stdin = 0;                     # node_file_from_stdin = 1  if -N '-' 

# set -api command delimiters
my $DELIMITERI = "tvitvitvi";
my $DELIMITERO = "tvotvotvo";

if (defined($::opt_c))
{
    $::opt_c= "${DELIMITERI}ControlFlags${DELIMITERI}$::opt_c";
}

if (defined($::opt_u))
{
    $username = $::opt_u;
    $::opt_u = "${DELIMITERI}UserName${DELIMITERI}\"$username\"";
}
if ( (!defined($::opt_u)) && (!$::opt_m) )
{
    # we use whoami instead of $USER or $LOGNAME so it will work with su
    #$username = `whoami`;
    # changed whoami to id by defect 149988
    $username = `PATH=/usr/xpg4/bin:/usr/bin id -un`;
    chop $username;
    $::opt_u = "${DELIMITERI}UserName${DELIMITERI}\"$username\"";
}


if (defined($::opt_m))  # Micro Sensor: def= 0, min= 1
{
    if (!defined($::opt_i)) 
    {
        $::opt_i= 0;
    }
    elsif ($::opt_i < 0)
    {
        printEMsg('EMsgMksensorInvInterval', $::opt_i);
        exit(1);
    }
}
else  # Sensor: def= 60, min= 10
{
    if (!defined($::opt_i))
    {
        $::opt_i= 60;
    }
    elsif ($::opt_i < 10 && $::opt_i != 0)
    {
        printEMsg('EMsgMksensorInvInterval', $::opt_i);
        exit(1);
    }
}

if (defined($::opt_n)||defined($::opt_N))
{
    if ($ENV{CT_MANAGEMENT_SCOPE}!=2 && $ENV{CT_MANAGEMENT_SCOPE}!=3)
    {
        $ENV{CT_MANAGEMENT_SCOPE}=4;
    }
}

if (defined($::opt_n))
{
    my @nodes = split(/[, ]+/,$::opt_n);    
    $::opt_n = qq/${DELIMITERI}NodeNameList${DELIMITERI}'/ . join("','", @nodes) . q/'/;
}

if (defined($::opt_N))
{
    $node_file_name = $::opt_N;
    $node_file_flag = 1;

    if ( $node_file_name eq "-" )
    {
        $node_file_from_stdin = 1;
    } else
    {
        if ( check_input_file($node_file_name) )
        {
            exit(1);
        }
    }
}
if (defined($::opt_e))
   {
    $::opt_e = "${DELIMITERI}ErrorExitValue${DELIMITERI}$::opt_e";
   }

# escape double quotes
$sscmdmod =~ s/"/\\"/sg;
# escape $ characters
$sscmdmod =~ s/\$/\\\$/sg;

# escape double quotes
$ssparms  =~ s/"/\\"/sg;
# escape $ characters
$ssparms  =~ s/\$/\\\$/sg;

if ( $ssparms ne "" )
{
  $ssparms = "${DELIMITERI}Arguments${DELIMITERI}\"$ssparms\"";
}

my $cmd="";

if($node_file_flag == 0)
{
    $cmd = qq(/usr/bin/mkrsrc-api -I $DELIMITERI -D $DELIMITERO ${CLASSNAME}${DELIMITERI}Name${DELIMITERI}"${name}"${DELIMITERI}${CMDMOD}${DELIMITERI}"${sscmdmod}"${DELIMITERI}RefreshInterval${DELIMITERI}$::opt_i$ssparms$::opt_u$::opt_c$::opt_n$::opt_e 2>&1);
}
else
{
    if($node_file_from_stdin != 0)
    {
        $node_file_name = read_from_Stdin();
    }
    $cmd = qq(/usr/bin/mkrsrc-api -I $DELIMITERI -D $DELIMITERO -N $node_file_name ${CLASSNAME}${DELIMITERI}Name${DELIMITERI}"${name}"${DELIMITERI}${CMDMOD}${DELIMITERI}"${sscmdmod}"${DELIMITERI}RefreshInterval${DELIMITERI}$::opt_i$ssparms$::opt_u$::opt_c$::opt_n$::opt_e 2>&1);
}
if ($::opt_v) { $main::PROGNAME = 'lssensor'; printIMsg('IMsgRmcCmd', $cmd); $main::PROGNAME = 'mksensor'; }

my @output = `$cmd`;
my $rc= $?;
# remove temp node file if from STDIN
if ($node_file_from_stdin != 0)
{
    unlink($node_file_name);
}

if ($rc)
{
    if ($rc & 255)
    {
        printEMsg('EMsgMksensorSignalError', "mkrsrc-api", $rc);   
    }
    else
    {
        $rc = $rc >> 8;
        if ($output[0] =~ /^ERROR.*/)
        {
            if (!$::opt_v) 
            { 
                $output[0] =~ s/^ERROR.*${DELIMITERO}//; 
            }
        }
        else
        {
            printEMsg('EMsgMksensorNonAPIError', "mkrsrc-api", $rc);
        }
        print @output;
    }
}

exit $rc;