#!/usr/pkg/bin/bash # Copyright (c) 2026 snake_case_nemo # SPDX-License-Identifier: BSD-2-Clause # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #### GLOBAL VARS ############################################################### ROOT_DIR=/sdf/arpa/ns/s/scnemo LOG_DIR=${ROOT_DIR}/gopher/logs MAIN=${LOG_DIR}/main_access.log PHLOG=${LOG_DIR}/phlog_access.log ANSIPHLOG=${LOG_DIR}/ansi_phlog_access.log SEARCHLOG=${LOG_DIR}/search_access.log PROGLOG=${LOG_DIR}/programming.log GOPHER_AI=${LOG_DIR}/gopher_ai.log ALL_LOGFILES="$PROGLOG $SEARCHLOG $ANSIPHLOG $PHLOG $GOPHER_AI $MAIN" TMP_FILE=${ROOT_DIR}/tempfile declare -i MAX_SIZE=1024 declare -i KEEP_LINES=21 declare -i TAIL=5 program=$(basename $0) PUBLIC_LOG=${ROOT_DIR}/gopher/public.log SEPA_CHAR="—" # Em Dash TAB="\t" RED="\e[31m" GREEN="\e[32m" CYAN="\e[36m" YELLOW="\e[33m" BOLD="\e[1m" UNDERLINE="\e[4m" RESET="\e[0m" #### FUNCTIONS ################################################################# usage() { echo -e "usage: ${BOLD}$program${RESET} [options]" echo "" echo -e "${TAB}${BOLD}-n${RESET}${TAB}${TAB}no color codes" echo -e "${TAB}${BOLD}-c${RESET}${TAB}${TAB}clear logs" echo -e "${TAB}${BOLD}-p${RESET}${TAB}${TAB}print logs" echo -e "${TAB}${BOLD}-r${RESET}${TAB}${TAB}rotate logs" echo -e "${TAB}${BOLD}-s${RESET}${TAB}${TAB}print size of logs" echo -e "${TAB}${BOLD}-l${RESET}${TAB}${TAB}lock logs" echo -e "${TAB}${BOLD}-u${RESET}${TAB}${TAB}unlock logs" echo -e "${TAB}${BOLD}-w${RESET}${TAB}${TAB}write output of -p to\n\ ${TAB}${TAB}${TAB}PUBLIC_LOG" echo -e "${TAB}${BOLD}-h${RESET}${TAB}${TAB}show help" } no_colors() { TAB=" " SEPA_CHAR="-" RED="" GREEN="" CYAN="" YELLOW="" BOLD="" UNDERLINE="" RESET="" } write_logs_to_phlog() { print_logs > $PUBLIC_LOG chmod 644 $PUBLIC_LOG } print_logs() { _print_display_header _print_entries $ALL_LOGFILES } _print_entries() { for file in "$@"; do fname=$(basename $file) size=$(du -h $file | awk '{print $1}') count=$(wc -l $file | awk '{print $1}') ifsbak=$IFS IFS=$'\n' for e in $(tail -n $TAIL $file); do echo -ne $BOLD printf "%-29s " $fname echo -ne $CYAN printf "%4s " $size echo -ne $YELLOW printf "%5s " $count echo -ne $RESET printf "%34s" $e [[ ! -z $fname ]] && { fname=""; count=""; size=""; } echo "" done echo -ne $BOLD for i in $(seq 1 75); do echo -n $SEPA_CHAR; done echo -e $RESET IFS=$ifsbak done } _print_display_header() { echo -ne $BOLD printf "%-29s %4s %5s %34s" "File" "Size" "Count" "Latest entries" echo for i in $(seq 1 75); do echo -n $SEPA_CHAR; done echo -e $RESET } clear_logs() { echo -ne "${BOLD}Do you really want to clear the logs? [y/N] ${RESET}" read answer if [[ $answer == "y" ]]; then echo "Clearing logs" for f in $ALL_LOGFILES; do echo -n > $f echo "logfile $f cleared" done echo "Done" else echo "Not clearing logs ..." fi } size_check() { local root_dir=gopher/logs local size local path local path_head="File" local size_head="Size" echo -ne "${BOLD}" printf "%-34s " $path_head printf "%13s" $size_head echo -e "${RESET}" for f in $ALL_LOGFILES; do path="${root_dir}/$(basename $f)" size="$(du -h $f | awk '{print $1}')" printf "%-34s" $path echo -ne $YELLOW printf "%13s" $size echo -ne $RESET echo "" done } rotate_logs() { local size for f in $ALL_LOGFILES; do size=$(du -k $f | awk '{print $1}') if [ $size -gt $MAX_SIZE ]; then tail -n $KEEP_LINES $f > $TMP_FILE mv $TMP_FILE $f fi done echo -e "${BOLD}Logs rotated at $(date)" } lock() { for f in $ALL_LOGFILES; do chmod 000 $f echo "locked $f" done } unlock() { for f in $ALL_LOGFILES; do chmod 770 $f echo "unlocked $f" done } #### MAIN ###################################################################### while getopts ncprsluwh opt; do case "$opt" in n) no_colors ;; c) clear_logs ;; p) print_logs ;; r) rotate_logs ;; s) size_check ;; l) lock ;; u) unlock ;; w) write_logs_to_phlog ;; h) usage ;; *) usage ;; esac done [ -z $1 ] && usage exit 0