#!/bin/ash ################## # Remote logging # ################## # # Usage: slxlog [-e | --echo] "logtype" "Human readable string" ["file name which's contents should be sent too"] # -e or --echo will echo message to stdout too # export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin" [ $# -eq 0 ] && exit 0 . /opt/openslx/config [ -z "$SLX_REMOTE_LOG" ] && exit 3 USER=$(whoami) LOGCHECK="/tmp/remote_log_check-$USER" NOW=$(date +%s) ECHO= DELFILE= SYNC= while [ $# -gt 0 ]; do case "$1" in -e|--echo) ECHO=yes ;; -d|--delete) DELFILE=yes ;; -s|--sync) SYNC=yes ;; *) break ;; esac shift done if [ "${ECHO}" == "yes" ]; then echo "$@" fi TYPE="$1" # Simple spamcheck. Not very tamper-proof, but if you'd want to spam the server # you could do it anyways. This is to protect from accidental loops calling this. if [ -r "$LOGCHECK" ]; then # Allow max 150 messages in total LINES=$( < "$LOGCHECK" wc -l) [ "$LINES" -gt "150" ] && exit 1 # Allow max 5 of same type messages in 30 seconds LINES=$(grep -c "$TYPE" "$LOGCHECK") if [ "$LINES" -ge "5" ]; then LAST=$(grep "$TYPE" "$LOGCHECK" | tail -n 5 | head -n 1 | awk '{print $1}') if [ -n "$LAST" ]; then DIFF="$(( NOW - LAST ))" [ "$DIFF" -lt "30" ] && exit 2 fi fi fi echo "$NOW $TYPE" >> "$LOGCHECK" chmod 0600 "$LOGCHECK" 2>/dev/null if [ $# -lt 2 ]; then MSG="Missing text for $*" else MSG="$2" fi MSG="[$USER] $MSG" if [ $# -gt 2 ]; then EXTRA="$3" fi . /opt/openslx/bin/slx-tools if is_debug; then CURLLOG="/tmp/slxlog.$USER" else CURLLOG="/dev/null" fi UUID= if [ -s /etc/system-uuid ]; then UUID=$(cat /etc/system-uuid) fi submitlog () { if [ -n "$EXTRA" ] && [ -r "$EXTRA" ] && [ -s "$EXTRA" ] && [ "$(stat -c %s "$EXTRA")" -lt "10000" ]; then # valid file attachment curl --data-urlencode "uuid=$UUID" --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc@$EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 elif [ -z "$EXTRA" ]; then # no attachment curl --data-urlencode "uuid=$UUID" --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 elif [ -s "$EXTRA" ]; then # attachment file to big (more than 10k) curl --data-urlencode "uuid=$UUID" --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc=Attachment too large: $EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 else # empty attachment file (or missing) curl --data-urlencode "uuid=$UUID" --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc=Attachment missing/empty: $EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 fi [ -n "$DELFILE" ] && [ -n "$EXTRA" ] && rm -f -- "$EXTRA" } if [ -z "$SYNC" ]; then submitlog & exit 0 fi submitlog