#!/usr/bin/perl
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Modified 2022 by Matthew Saunders Brown <matthewsaundersbrown@gmail.com>
# to work with vhost-stack https://git.stack-source.com/msb/vhost-stack
#
#
# This script will take a combined Web server access
# log file and break its contents into separate files.
# It assumes that the first field of each line is the
# virtual host identity (put there by "%v"), and that
# the logfiles should be named that+".log" in the current
# directory.
#
# The combined log file is read from stdin. Records read
# will be appended to any existing log files.
#
# use strict;
use warnings;

my %log_file = ();

# read all files from /srv/www
opendir(DIR, "/srv/www") or die "couldn't open /srv/www/ to get list of virtualhosts: $!\n";
my @dir = readdir DIR;
closedir DIR;

# create virtualhosts array from /srv/www listing
my %virtualhosts = ();
foreach $virtualhost (@dir) {
  if ($virtualhost ne "." && $virtualhost ne ".." && $virtualhost ne "html") {
    if (-d "/srv/www/$virtualhost") {
      $virtualhosts{ $virtualhost } = $virtualhost;
    }
  }
}

# set spool dir for temporary apache files
$spool_dir="/var/spool/apache2";

# creatre spool dir if it doesn't already exist
if (!-d "$spool_dir") {
  system("mkdir $spool_dir");
}

# remove any previous files from spool dir
system("/usr/bin/find $spool_dir -type f -name '*.log' -exec rm {} +");

while (my $log_line = <STDIN>) {
    #
    # Get the first token from the log record; it's the
    # identity of the virtual host to which the record
    # applies.
    #
    my ($vhost) = split (/\s/, $log_line);
    #
    # Normalize the virtual host name to all lowercase.
    # If it's blank, the request was handled by the default
    # server, so supply a default name.  This shouldn't
    # happen, but caution rocks.
    #
    $vhost = lc ($vhost) || "access";
    #
    # Strip of leading www.
    #
    $vhost =~ s/^www\.//;
    #
    # Strip of the trailing port number
    #
    $vhost =~ s/\:.*//;
    #
    # if the vhost contains a "/" or "\", it is illegal so just use
    # the default log to avoid any security issues due if it is interprted
    # as a directory separator.
    if ($vhost =~ m#[/\\]#) { $vhost = "access" }
    #
    # If the log file for this virtual host isn't opened
    # yet, do it now.
    #
    if (exists($virtualhosts{$vhost})) {
      if (! $log_file{$vhost}) {
          open $log_file{$vhost}, ">>$spool_dir/${vhost}.log"
              or die ("Can't open $spool_dir/${vhost}.log");
      }
      #
      # Strip off the first token (which may be null in the
      # case of the default server), and write the edited
      # record to the current log file.
      #
      $log_line =~ s/^\S*\s+//;
      print {$log_file{$vhost}} $log_line;
    }
}
exit 0;