nagiosプラグインのモニタ道路状況RTTI戻り値(シミュレータ起動)

8792 ワード

まずperlの帖を書いて、節の後でcでもう一度書いて、その内容を置き換えます
#!/usr/bin/perl -w

require LWP::UserAgent;
use threads;
use threads::shared;
use warnings;
use strict;
use POSIX;
use Getopt::Long;
use Time::HiRes qw(time usleep);

my @cities;
my @lat_nl;	# north limit;
my @lat_sl;	# south limit;
my @long_el;	# east limit;
my @long_wl;	# west limit;

my $o_host="11x.x.x.x";
my $o_baseurl="/bmw/gateway/index.do";
my $o_port=80;

my $o_bbl = "boundingbox.csv";
my $o_output = "stress_test_output.csv";

my $o_tcars=5;
my $o_treqs=20;
my $o_interval=1.0;

my $o_timeout=15;
my $o_perf=undef;
my $o_warn=undef;
my $o_crit=undef;

my $magic=0.03089619;
my $magic_factor=1.5;

my $o_speed=600;
my $o_help="To_be_changed";

my $timediff=0;

my @time_table		:shared;
my @error_table		:shared;
my @length_table	:shared;
my @g_res_table		:shared;
#my @g_lat_table		:shared;
#my @g_lng_table		:shared;

sub exit_with_error{
	print $_[0];				# message
	if (defined($o_perf)){
		print "| 'timediff'=$timediff","s;$o_warn;$o_crit;0;30";
	}
	print "
"; exit($_[1]); } sub print_helpmessage() { print " Cennavi TPEG Loadtest tool. Version: 0.3 Usage: ./cennavi_stresstest [-H <host>] [-p <port>] [-t <timeout>] [-b <baseurl>] [-a <initial latitude>] [-n <initial longitude>] [-T <total number of cars> -R <total number of requests>] [-i <interval between requests from a car>] [-h] Options: -H, --hostname Hostname or IP address of the target host -p, --port TCP port of the target host -b, --base_url Base url used to query the target host. Has to start with a \"\/\". -f, --file The file that stores the coordination of the bounding boxes. Default to boundingbox.csv in the current folder. -T, --total_cars Total number of cars to emulate -R, --total_reqs Total number of requests to send. -I, --interval The interval between 2 requests for an individual car. -o, --output The file where detailed information will be logged. Default to stress_test_output.csv in the current folder. -h, --help Print this help message. Notes: - The coordination file has to be a well formatted csv file. - If the total number of requests cannot be divided by total number of cars, you may get slightly in-accurate information. This will be fixed in the future. - Requests generated from each individual car are sychronized. The next request will only be sent out after the previous one gets its response. If the previous request takes more than \"interval\" to finish, then the next request is sent out immediately. If the previous request takes less than \"interval\" to finish, then the script will hold the next request till the interval is reached. - For this version, we can emulate 10^6 cars in parallel at most. " } sub print_helpmessage_exit() { print_helpmessage(); exit(0); } sub rand_between { return int(rand($_[1] - $_[0])*0.2 + ($_[0]+$_[1])/2); } sub min_max_sum { my(@number_array) = @{$_[0]}; my $min = $number_array[0]; my $max = $number_array[0]; my $sum = 0; my $num=undef; foreach $num (@number_array) { if ($min > $num){ $min = $num;} if ($max < $num){ $max = $num;} $sum += $num; } return ($min, $max, $sum); } sub check_options { Getopt::Long::Configure("bundling"); GetOptions( 'H:s' => \$o_host, 'hostname:s' => \$o_host, 'p:i' => \$o_port, 'port:i' => \$o_port, # 'l:s' => \$o_login, 'login:s' => \$o_login, # 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd, 'F:s' => \$o_bbl, 'file:s' => \$o_bbl, 'f' => \$o_perf, 'perf' => \$o_perf, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout, 'b:s' => \$o_baseurl, 'base_url:s' => \$o_baseurl, 'w:i' => \$o_warn, 'warn:i' => \$o_warn, 'c:i' => \$o_crit, 'critical:i' => \$o_crit, 'h:s' => \$o_help, 'help:s' => \$o_help ); } ################################################################################ #################################### Main ###################################### ################################################################################ check_options(); if ($o_help ne "To_be_changed"){ print_helpmessage_exit(); } if($o_tcars > $o_treqs) { print "You ought to have more requests than cars
"; exit(0); } if($o_tcars >= 1000000 || $o_tcars<=0) { print "Sorry, that exceeds my capacity.
"; exit(127); } if ($o_baseurl =~ m/^\//){ } else{ $o_baseurl="/".$o_baseurl; } ############################################################################ # Read the location of the bounding boxes from the configuration file. ############################################################################ my $suc = open BOXFILE, "<", $o_bbl; if ($suc){ while(<BOXFILE>) { #chomp; #push @cities, $_; my $line = $_; #if ($line =~ //){ # file content validation, will be done in the future. my @rec=split /,/, $line; chomp @rec; push (@cities, $rec[0]); push (@lat_nl, floor($rec[1] * (2**32) /360)); push (@long_wl, ceil($rec[2] * (2**32) /360)); push (@lat_sl, ceil($rec[3] * (2**32) /360)); push (@long_el, floor($rec[4]* (2**32)/360)); } }else { die "Cannot open config file!
"; } close BOXFILE; my $drive_id=sprintf('%06s',int(rand()*1000)); $drive_id ="0000000000H".$drive_id; my $city_id=int(rand($#cities)); my $cur_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]); my $cur_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]); my $des_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]); my $cur_lng = rand_between($long_wl[$city_id], $long_el[$city_id]); my $des_lng = rand_between($long_wl[$city_id], $long_el[$city_id]); my $target_url="http://$o_host$o_baseurl?DriveID=$drive_id&Decoding_Feat=&Clat=$cur_lat&Dlat=$des_lat&TP_SID=&OP=gtm&Vers=1112.05.07.00&Guidance=KD&Velocity=0&TReq=&Clon=$cur_lng&Dlon=$des_lng&Bearing=&TP_Apps=TEC-TFP"; my $regex="\<TransportFrame .+\\>\\S*\<\/TransportFrame\>"; my $ua = LWP::UserAgent->new; $ua->timeout($o_timeout); $ua->env_proxy; my $content=undef; my $start_time=time(); my $response = $ua->get($target_url); my $end_time=time(); $timediff=$end_time - $start_time; $content=$response->decoded_content(); my $l_len = length($content); #print $target_url; #print "
"; #print $content; #print "
"; # if ($timediff<$o_timeout){ if ($response->is_success) { if($content =~ m/$regex/){ if ($timediff<=$o_warn) { exit_with_error("timediff: $timediff sec: OK",0); }else{ if ($timediff <= $o_crit) { exit_with_error("timediff: $timediff sec: WARNING",1); } } #OK; } else { exit_with_error("Unknown Content: $content : CRITICAL"."
DriveID: $drive_id
CityID: $city_id
$cur_lat
$cur_lng
$des_lat
$des_lng
", 2); } }else { exit_with_error("Server error: $response->status_line : CRITICAL",2); } } else{ exit_with_error("timediff: $timediff sec: CRITICAL",2); }