#!/bin/sh # Copyright (c) 2021, la-ninpre # # 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. # small script to create page with qr-coded recovery tokens for otp # uses: qrencode, imagemagick(convert, montage) # # file with codes should be in following format: # - recovery codes should be on separate lines # - every line beginning with # is ignored QRENCODE_ERR_CORR_LEVEL=H CODES_KEEP_PNG=0 CODES_MAKE_PDF=0 usage() { echo "create qr-coded recovery tokens for easy printing" echo echo "USAGE:" echo " $0 [OPTIONS] " echo echo "OPTIONS:" echo " -k keep png files with qrcodes" echo " -l {L,M,Q,H}" echo " set qrencode error correction level" echo " -p produce pdf instead of image" echo " -h print this help message" echo } while getopts kl:ph arg do case "$arg" in k) CODES_KEEP_PNG=1 ;; l) case $OPTARG in [lL]) QRENCODE_ERR_CORR_LEVEL=L ;; [mM]) QRENCODE_ERR_CORR_LEVEL=M ;; [qQ]) QRENCODE_ERR_CORR_LEVEL=Q ;; [hH]) QRENCODE_ERR_CORR_LEVEL=H ;; *) echo "error correction level should be one of L, M, Q or H" exit 1 ;; esac ;; p) CODES_MAKE_PDF=1 ;; h|*) usage && exit 1 ;; esac done shift $((OPTIND - 1)) [ $# -ne 1 ] && usage && exit 1 CODES_FILE="$1" CODES_BASENAME="${CODES_FILE%%.*}" CODES_EXT="${CODES_FILE##*.}" CODES_DIR="$PWD/${CODES_BASENAME}_${CODES_EXT}_dir" CODES_DATE="$(date +'%Y-%m-%d %H:%M')" CODES_OUTPUT="${CODES_BASENAME}_qrcodes" CODES_OUT_IMG="${CODES_OUTPUT}.png" CODES_OUT_PDF="${CODES_OUTPUT}.pdf" rm -f "$CODES_OUT_IMG" "$CODES_OUT_PDF" [ -d "$CODES_DIR" ] && rm -rf "$CODES_DIR" mkdir "$CODES_DIR" sed -e '/^#.*/ d' -e '/^\s*$/ d' < "$CODES_FILE" \ | xargs -I{} \ qrencode -l "$QRENCODE_ERR_CORR_LEVEL" -t png -d 150 \ -o "$CODES_DIR/{}-code.png" {} montage -title "\n$CODES_FILE\n$CODES_DATE" \ "$CODES_DIR/*-code.png" -page a4 -geometry 128x128\> "$CODES_OUT_IMG" [ "$CODES_MAKE_PDF" -ne 0 ] && { convert \( -size 1240x1754 xc: \) "$CODES_OUT_IMG" \ -composite "$CODES_OUT_PDF" [ "$CODES_KEEP_PNG" -eq 0 ] && rm -f "$CODES_OUT_IMG" } [ "$CODES_KEEP_PNG" -eq 0 ] && rm -rf "$CODES_DIR" || exit 0