139 lines
4.2 KiB
Bash
139 lines
4.2 KiB
Bash
#!/bin/bash
|
|
# =============================================================================
|
|
# Script: noct_sftp_copy.sh
|
|
# Author: Kristian Sundet
|
|
# Cron example (runs daily at 02:00 as root):
|
|
# 0 2 * * * /usr/local/bin/noct_sftp_copy.sh
|
|
# =============================================================================
|
|
|
|
# --- Configuration -----------------------------------------------------------
|
|
|
|
# Owner to assign to all copied files (change as needed)
|
|
TARGET_USER="tyquant"
|
|
|
|
# Source directory containing all CSV files
|
|
SRC_DIR="/app/smbctyuat/NoctSFTP"
|
|
|
|
# Map each CSV glob pattern to its destination directory
|
|
# Format: ["glob_pattern"]="destination/path"
|
|
declare -A FILE_DEST_MAP=(
|
|
["noct_fxdcf*.csv"]="/app/tyquant/deploy/kxinstall/delta-data/fileStore/fileUpload/noctData/dailyCashFlow"
|
|
["noct_evrFxRate*.csv"]="/app/tyquant/deploy/kxinstall/delta-data/fileStore/fileUpload/noctData/EVRFxRate"
|
|
["noct_fxtv*.csv"]="/app/tyquant/deploy/kxinstall/delta-data/fileStore/fileUpload/noctData/transactionView"
|
|
)
|
|
|
|
# Log file location and retention (days)
|
|
LOG_FILE="/var/log/noct_sftp_copy.log"
|
|
LOG_RETAIN_DAYS=30
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# --- Logging -----------------------------------------------------------------
|
|
|
|
# Ensure the log directory exists
|
|
mkdir -p "$(dirname "$LOG_FILE")"
|
|
|
|
# All stdout and stderr from this point on goes only to the log file (silent to cron)
|
|
exec >> "$LOG_FILE" 2>&1
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
|
}
|
|
|
|
# Rotate out log entries older than LOG_RETAIN_DAYS
|
|
rotate_log() {
|
|
local tmp cutoff
|
|
tmp=$(mktemp)
|
|
cutoff=$(date -d "$LOG_RETAIN_DAYS days ago" '+%Y-%m-%d')
|
|
grep -v "^\[" "$LOG_FILE" > "$tmp" || true
|
|
grep "^\[" "$LOG_FILE" | awk -v cutoff="[$cutoff" '$1 >= cutoff' >> "$tmp" || true
|
|
mv "$tmp" "$LOG_FILE"
|
|
}
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
log "===== START noct_sftp_copy ============================================"
|
|
|
|
# Prune old log entries
|
|
rotate_log
|
|
|
|
# Check that the script is run as root (required for chown)
|
|
if [[ $EUID -ne 0 ]]; then
|
|
log "ERROR: Script must be run as root (or with sudo) to change file ownership."
|
|
log "===== END noct_sftp_copy [FAILED] ==================================="
|
|
exit 1
|
|
fi
|
|
|
|
# Verify the target user exists
|
|
if ! id "$TARGET_USER" &>/dev/null; then
|
|
log "ERROR: User '$TARGET_USER' does not exist."
|
|
log "===== END noct_sftp_copy [FAILED] ==================================="
|
|
exit 1
|
|
fi
|
|
|
|
# Verify the source directory exists
|
|
if [[ ! -d "$SRC_DIR" ]]; then
|
|
log "ERROR: Source directory not found: $SRC_DIR"
|
|
log "===== END noct_sftp_copy [FAILED] ==================================="
|
|
exit 1
|
|
fi
|
|
|
|
# --- Helper ------------------------------------------------------------------
|
|
|
|
copy_and_chown() {
|
|
local src="$1"
|
|
local dest_dir="$2"
|
|
local owner="$3"
|
|
local filename
|
|
filename=$(basename "$src")
|
|
|
|
if ! mkdir -p "$dest_dir"; then
|
|
log "ERROR: Could not create directory: $dest_dir"
|
|
return 1
|
|
fi
|
|
|
|
if ! cp "$src" "$dest_dir/"; then
|
|
log "ERROR: Failed to copy '$filename' to '$dest_dir'"
|
|
return 1
|
|
fi
|
|
|
|
if ! chown "$owner" "$dest_dir/$filename"; then
|
|
log "ERROR: Failed to change ownership of '$dest_dir/$filename'"
|
|
return 1
|
|
fi
|
|
|
|
log "OK: '$filename' -> '$dest_dir/' (owner: $owner)"
|
|
}
|
|
|
|
# --- Main --------------------------------------------------------------------
|
|
|
|
ERRORS=0
|
|
|
|
for pattern in "${!FILE_DEST_MAP[@]}"; do
|
|
dest_dir="${FILE_DEST_MAP[$pattern]}"
|
|
|
|
# Expand the glob pattern to find all matching files
|
|
matches=( "$SRC_DIR"/$pattern )
|
|
|
|
# Check if the glob returned any real matches
|
|
if [[ ! -f "${matches[0]}" ]]; then
|
|
log "ERROR: No file found matching pattern '$pattern' in '$SRC_DIR'"
|
|
(( ERRORS++ ))
|
|
continue
|
|
fi
|
|
|
|
log "INFO: Found ${#matches[@]} file(s) matching pattern '$pattern'"
|
|
|
|
# Copy all matching files to the destination
|
|
for src_file in "${matches[@]}"; do
|
|
copy_and_chown "$src_file" "$dest_dir" "$TARGET_USER" || (( ERRORS++ ))
|
|
done
|
|
done
|
|
|
|
if [[ $ERRORS -eq 0 ]]; then
|
|
log "===== END noct_sftp_copy [SUCCESS] =================================="
|
|
exit 0
|
|
else
|
|
log "===== END noct_sftp_copy [FAILED] ($ERRORS error(s)) ================"
|
|
exit 1
|
|
fi |