#!/usr/local/bin/perl
# view_log_progress.cgi
# Returns progressive output for some system log

require './logviewer-lib.pl';
&ReadParse();
&foreign_require("proc", "proc-lib.pl");

# Send headers
print "Content-Type: text/plain\n\n";

# Follow and reverse are mutually exclusive
my @systemctl_cmds;
{
	local $config{'reverse'} = 0;
	@systemctl_cmds = &get_systemctl_cmds(1);
}

# System log to follow
my ($log) = grep { $_->{'id'} eq $in{'idx'} } @systemctl_cmds;
if (!&can_edit_log($log) ||
	!$log->{'cmd'} ||
	$log->{'cmd'} !~ /^journalctl/) {
	print $text{'save_ecannot3'};
	exit;
	}

# Disable output buffering
$| = 1;

# No lines for real time logs
$log->{'cmd'} =~ s/\s+\-\-lines\s+\d+//;

# Show real time logs
$log->{'cmd'} .= " --follow";

# Add filter to the command if present
my $filter = $in{'filter'} ? quotemeta($in{'filter'}) : "";
my $use_regex = $in{'regex'} ? 1 : 0;
my $readcmd = $log->{'cmd'};
if ($filter) {
	my $grep_flag = $use_regex ? "-E" : "-F";
	$readcmd .= " | grep --line-buffered -a $grep_flag -- $filter";
	}

# Open a pipe to the journalctl command
my $pid = open(my $fh, '-|', $readcmd);
if (!defined($pid)) {
	print &text('save_ecannot4', $readcmd).": $!";
	exit;
	}

# Read and output the log
while (my $line = <$fh>) {
	print $line;
	}

# Clean up when done
close($fh);
