#!/bin/sh # # fetch_fio.sh # # Fio API account statements fetcher. # # ISC License # # Copyright 2023 Brmlab, z.s. # Jan Hrach # Dominik Pantůček # # Permission to use, copy, modify, and/or distribute this software # for any purpose with or without fee is hereby granted, provided # that the above copyright notice and this permission notice appear # in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE # AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # REST API endpoint APIURI=https://www.fio.cz/ib_api/rest # Configuration defaults - none CONFIG_FILE=/etc/hackerbase CFG_BANK_DIR= CFG_APIKEYS_FILE= ARG_BANK_DIR= ARG_APIKEYS_FILE= # Argument parsing while ! [ -z "$1" ] ; do case "$1" in -apikey) ARG_APIKEYS_FILE="$2" shift shift ;; -bankdir) ARG_BANK_DIR="$2" shift shift ;; -config) CONFIG_FILE="$2" shift shift ;; *) echo "Usage: $0 [-config file] [-apikey file] [-bankdir dir]" exit 1 ;; esac done # Configuration parsing - assumes "dumb" sed which cannot execute # multiple statements get_config_value() { if [ -z "$1" ] ; then echo "get_config_value() requires parameter name" exit 1 fi if [ -r "$CONFIG_FILE" ] ; then cat "$CONFIG_FILE" \ | sed 's/#.*//' \ | sed 's/^[ \t]*//' \ | grep "^$1" \ | sed 's/^[^ \t]*//' \ | sed 's/^[ \t]*//' \ | sed 's/[ \t]*$//' fi } CFG_BANK_DIR=`get_config_value bank-dir` CFG_APIKEYS_FILE=`get_config_value apikeys-file` # Configuration merging if [ -z "$ARG_BANK_DIR" ] ; then BANK_DIR="$CFG_BANK_DIR" else BANK_DIR="$ARG_BANK_DIR" fi if [ -z "$ARG_APIKEYS_FILE" ] ; then APIKEYS_FILE="$CFG_APIKEYS_FILE" else APIKEYS_FILE="$ARG_APIKEYS_FILE" fi # Storage for partial account statements BANK_DIR_PARTS="$BANK_DIR/parts" if ! [ -d "$BANK_DIR_PARTS" ] ; then mkdir -p "$BANK_DIR_PARTS" fi # # Very simple "logging" function (stdout should be redirected to log anyway) log() { echo `date '+%Y-%m-%d %H:%M:%S'` "$@" } # # Returns the file modification date in YYYY-MM-DD format get_file_date() { STAT=`stat -c %y "$1"` echo ${STAT%% *} } # # $1 - URI # $2 - output file download_file() { log "Downloading \"$1\" to \"$2\"" url="$1" fname="$2" tmpfname="$fname.tmp" oldfname="$fname.old" for i in `seq 1 3` ; do if wget -q "$url" -O "$tmpfname" ; then if [ -s "$tmpfname" ] ; then log Download OK cp "$fname" "$oldfname" mv "$tmpfname" "$fname" log Finished break else log Download successfull but empty or non-existing result. log Retrying in 5 s. fi else log Failed download, retrying in 5 s. sleep 5 fi done } # Current year (last in seq) CYEAR=`date +%Y` # Mark log "$0" ======== started ======== # Each line should contain account number and Fio API token as first # two non-whitespace strings. Third token is the starting year for # this account. The rest of each line is ignored. There must be no # leading whitespace. while read accnt ; do # Extract account number, Fio token and starting year ACCNO=${accnt%% *} accrest=${accnt#* } APIKEY=${accrest%% *} accrest2=${accrest#* } YEAR=${accrest2%% *} # Check starting year before attempting partial downloads if [ -z "$YEAR" ] ; then log "Missing start year for account $ACCNO" continue fi if [ "$YEAR" -gt "$CYEAR" ] ; then log "Start year for account $ACCNO in the future: $YEAR" continue fi if [ "$YEAR" -lt "2010" ] ; then log "Start year for account $ACCNO before Brmlab existence: $YEAR" continue fi # Log action for year in `seq $YEAR $CYEAR` ; do log "Processing account $ACCNO for $year" # Fetch CSV from bank CSVNAME="$BANK_DIR/$ACCNO.csv" #download_file "${APIURI}/periods/${APIKEY}/2015-01-01/2025-01-31/transactions.csv" "$CSVNAME" done done < "$APIKEYS_FILE" # Mark log "$0" finished