.local/bin/print_codes (view raw)
1#!/bin/sh
2
3# Copyright (c) 2021, la-ninpre
4#
5# Permission to use, copy, modify, and/or distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17
18# small script to create page with qr-coded recovery tokens for otp
19# uses: qrencode, imagemagick(convert, montage)
20#
21# file with codes should be in following format:
22# - recovery codes should be on separate lines
23# - every line beginning with # is ignored
24
25QRENCODE_ERR_CORR_LEVEL=H
26CODES_KEEP_PNG=0
27CODES_MAKE_PDF=0
28
29usage() {
30 echo "create qr-coded recovery tokens for easy printing"
31 echo
32 echo "USAGE:"
33 echo " $0 [OPTIONS] <text-file>"
34 echo
35 echo "OPTIONS:"
36 echo " -k keep png files with qrcodes"
37 echo " -l {L,M,Q,H}"
38 echo " set qrencode error correction level"
39 echo " -p produce pdf instead of image"
40 echo " -h print this help message"
41 echo
42}
43
44while getopts kl:ph arg
45do
46 case "$arg" in
47 k) CODES_KEEP_PNG=1
48 ;;
49 l) case $OPTARG in
50 [lL]) QRENCODE_ERR_CORR_LEVEL=L ;;
51 [mM]) QRENCODE_ERR_CORR_LEVEL=M ;;
52 [qQ]) QRENCODE_ERR_CORR_LEVEL=Q ;;
53 [hH]) QRENCODE_ERR_CORR_LEVEL=H ;;
54 *) echo "error correction level should be one of L, M, Q or H"
55 exit 1 ;;
56 esac
57 ;;
58 p) CODES_MAKE_PDF=1
59 ;;
60 h|*) usage && exit 1
61 ;;
62 esac
63done
64
65shift $((OPTIND - 1))
66
67[ $# -ne 1 ] && usage && exit 1
68
69CODES_FILE="$1"
70CODES_BASENAME="${CODES_FILE%%.*}"
71CODES_EXT="${CODES_FILE##*.}"
72CODES_DIR="$PWD/${CODES_BASENAME}_${CODES_EXT}_dir"
73CODES_DATE="$(date +'%Y-%m-%d %H:%M')"
74CODES_OUTPUT="${CODES_BASENAME}_qrcodes"
75CODES_OUT_IMG="${CODES_OUTPUT}.png"
76CODES_OUT_PDF="${CODES_OUTPUT}.pdf"
77
78rm -f "$CODES_OUT_IMG" "$CODES_OUT_PDF"
79[ -d "$CODES_DIR" ] && rm -rf "$CODES_DIR"
80mkdir "$CODES_DIR"
81
82sed -e '/^#.*/ d' -e '/^\s*$/ d' < "$CODES_FILE" \
83 | xargs -I{} \
84 qrencode -l "$QRENCODE_ERR_CORR_LEVEL" -t png -d 150 \
85 -o "$CODES_DIR/{}-code.png" {}
86
87montage -title "\n$CODES_FILE\n$CODES_DATE" \
88 "$CODES_DIR/*-code.png" -page a4 -geometry 128x128\> "$CODES_OUT_IMG"
89
90[ "$CODES_MAKE_PDF" -ne 0 ] && {
91 convert \( -size 1240x1754 xc: \) "$CODES_OUT_IMG" \
92 -composite "$CODES_OUT_PDF"
93 [ "$CODES_KEEP_PNG" -eq 0 ] && rm -f "$CODES_OUT_IMG"
94 }
95
96[ "$CODES_KEEP_PNG" -eq 0 ] && rm -rf "$CODES_DIR" || exit 0
97