지난 글에는 단일 오펜스만 닫는 perl script를 작성하였는데

속도가 굉장히 느려서 perl의 ForkManager 모듈을 이용한 멀티 프로세스의 offense closure를 새로 코딩했습니다.

 

10 pid로 10 items 를 해결하는데 27초 걸립니다.

 

테스트 환경은 QRadar 7.4.2 2020.7.0.20201113144954 버젼 입니다.

 

use strict;
use warnings;
use Parallel::ForkManager;
my $truecount = 0;
my @offlist;
my @listcmd = "curl -S -X GET -u admin:password1! -k -H 'Range: items=0-9' -H 'Version: 15.0' -H 'Accept: application/json' 'https://<console_ip>/api/siem/offenses?fields=id&filter=status%20%3D%20%22OPEN%22'";
my $pm = Parallel::ForkManager->new(10);

$pm->run_on_start(
    sub {
        my ( $pid ) = @_; # $pid
        print "### START pid: $pid\n";
    }
);

$pm->run_on_finish(
    sub {    # must be declared before first 'start'
        my (
            $pid,
            $exit_code,
            $ident,
            $exit_signal,
            $core_dump,
            #$data,
        ) = @_; # $data exit return value
        print "## END pid: $pid\n";
        #$out{ $data->[0] } = $data->[1];
    }
);

while($truecount == 0){
	my $list = qx(@listcmd); #[{"id":85562},{"id":85561}] string
	$list =~ s/\{\[?"id":(\d+)\]?\}/$1/g;
	@offlist = split(/,/, $list); # create array
	
	foreach my $shfoff (@offlist)
	{
		$pm->start() and next; # start pid

		$shfoff =~ s/\[?(\d+)]?/$1/;
		my @closecmd = ("curl -S -X POST -u admin:password1! -k-H 'Version: 15.0' -H 'Accept: application/json' 'https://<console_ip>/api/siem/offenses/$shfoff?closing_reason_id=1&status=CLOSED'");
		system(@closecmd);

		$pm->finish(0); # stop pid
	};
	
	$pm->wait_all_children;
};

이전 스크립트 보다 훨씬 깔끔해졌습니다.

username : password 와 <console_ip>를 채워주면 되고

my $list와 $shfoff를 보면 알겠지만 단순한 id값만 뽑아내서 열려있는 모든 오펜스를 닫는 스크립트입니다.

그래서 원하는 오펜스만 자동으로 닫으시려면 @listcmd 의 filter를 바꾸고 정규표현식만 약간 바꿔주면 작동이 잘 될겁니다.

+ Recent posts