-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathrfc-reader
executable file
·192 lines (164 loc) · 5.65 KB
/
rfc-reader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#!/bin/bash
# vim:set ts=2 sw=4 noexpandtab:
# <cesar@pissedoffadmins.com> 2013
# todo :
set -e
set -o pipefail
clear
NAME=$(basename $0)
version()
{
local VER="0.50"
cat <<EOL
${NAME} version ${VER}
Copyright (C) 2013 cesar@pissedoffadmins.com
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it.
EOL
}
descrip()
{
cat <<EOL
This is a simple script that will show you either the
name / subject of an RFC, let you read an RFC, or let you
search for an RFC.
EOL
}
usage()
{
cat <<EOL
Usage: ${NAME} <name (-n)|read (-r)|search (-s)> <####> <bcp|fyi|ien|std|rfc>
${NAME} <latest>
Usage examples:
${NAME} name 3334 rfc # displays RFC #3334 name
ex: 3334 Policy-Based Accounting. T. Zseby, S. Zander, C. Carle. October
2002. (Format: TXT=103014 bytes) (Status: EXPERIMENTAL)
${NAME} search <term> rfc # Displays index of matches with RFC #'s
ex: ${NAME} search transport rfc
0905 ISO Transport Protocol specification ISO DP 8073. ISO. April
1984. (Format: TXT=249214 bytes) (Obsoletes RFC0892) (Status:
UNKNOWN)
0939 Executive summary of the NRC report on transport protocols for
Department of Defense data networks. National Research Council.
February 1985. (Format: TXT=42345 bytes) (Status: UNKNOWN)
${NAME} read 38 fyi # read fyi #38
${NAME} latest # shows list of latest rfc's
EOL
}
# temp file and trap statement - trap for clean end
case "$(uname 2>/dev/null)" in
'Linux') TMP_FILE=$(mktemp --tmpdir rfc.$$.XXXXXXXXXX) ;;
'Darwin') TMP_FILE=$(mktemp rfc.$$.XXXXXXXXXX) ;;
esac
trap "rm -rf ${TMP_FILE}" 0 1 2 3 9 15
# changing order for function handling
OPTION=$1
NUM=$2
TYPE=$3
# check if $1 != "search" || -s
case "${OPTION}" in
'search'|'-s') ;;
'latest'|'-l') ;;
'name'|'-n'|'read'|'-r')
# check if $# -ge 2 && $2 is an integer
[ $# -ge 2 ] || { version; descrip; usage; exit 1; }
[ ${NUM} -ne 0 -o ${NUM} -eq 0 2>/dev/null ] ||
{ version; descrip; usage; exit 1; }
# prepend zeros to make id number <####>
FN=`printf "%04d" ${NUM} | xargs`
;;
*) version; descrip; usage; exit 1 ;;
esac
# set $3 to either rfc (default if empty), bcp, fyi, ien, & std
case "${TYPE}" in
'bcp'|'BCP') ADDRESS="http://www.rfc-editor.org/rfc/bcp/bcp" ;;
'fyi'|'FYI') ADDRESS="http://www.rfc-editor.org/rfc/fyi/fyi" ;;
'ien'|'IEN') ADDRESS="http://www.rfc-editor.org/rfc/ien/ien" ;;
'std'|'STD') ADDRESS="http://www.rfc-editor.org/rfc/std/std" ;;
*) ADDRESS="http://www.rfc-editor.org/rfc/rfc" ;;
esac
# emulator / viewer settings and checks
if [ ${OPTION} != name ]; then
printf -- "%s\n" "Here are the terminals available, choose one:"
TM=0
[[ -n $(command -v xterm) ]] && { echo xterm; TM=$((TM+1)); }
[[ -n $(command -v mrxvt) ]] && { echo mrxvt; TM=$((TM+1)); }
[[ -n $(command -v urxvt) ]] && { echo urxvt; TM=$((TM+1)); }
if [ ${TM} -eq 0 ]; then
printf -- "Error: Terminal not found \n\n"; usage; exit 1
else
printf "%s" "Enter Term and press [ENTER]: "
read TERM
TERM=`echo ${TERM} | tr '[:upper:]' '[:lower:]'`
fi
case "${TERM}" in
'xterm') EM=$(which xterm 2>/dev/null)
EM_ST="+sb -fg green -bg black -bd green -geometry 75x59 -title"
;;
'mrxvt') EM=$(which mrxvt 2>/dev/null)
EM_ST="-bl -hb -aht -fg green -bg black -bd green -g 75x59 -title"
;;
'urxvt') EM=$(which urxvt 2>/dev/null)
EM_ST="-fg green -bg black -bd green -g 75x59 -T"
;;
*) printf -- "Error: Terminal \"${TERM}\" not found \n\n"; usage; exit 1
esac
EM_TITLE="${NAME} - rfc${FN}.txt"
PAGER=`which less`
fi
# logging function
# output is format : date option num type term # as set in all the option cases
LOGD()
{
LOGFILE=/tmp/$0
printf "%-14s %-8s %-5s %-4s %-4s\n" `date "+%Y%m%d_%H%M"` \
"[${1}]" "${2}" "${3}" "${4}" >> ${LOGFILE}
}
# the gooey nougat of the script
case "${OPTION}" in
'latest'|'-l')
printf -- "%s\n" "Downloading latest rfc list"
curl -f -s http://www.rfc-editor.org/rfc/rfc-index-latest.txt | \
awk '{line++;print}; /\f/ {for (i=line;i<=80;i++) print ""; line=0}' | \
sed '/\f/d' > "${TMP_FILE}"
LOGD latest - - ${TERM}
printf -- "%s\n" "Showing latest rfc's"
${EM} ${EM_ST} "${EM_TITLE}" -e ${PAGER} "${TMP_FILE}"
;;
'name'|'-n')
case "${FN}" in
[0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9][0-9][0-9])
curl -s ${ADDRESS}-index.txt | \
awk '/^'${FN}'/ {do_print=1} do_print==1 {print} NF==0 {do_print=0}'
LOGD name ${NUM} ${TYPE} -
;;
*) printf -- "Error: unknown parameter '%s'\n" "$2"; usage; exit 1 ;;
esac
;;
'read'|'-r')
if [ -z $(wget -q --spider ${ADDRESS}${NUM}.txt || echo $?) ]; then
printf -- "%s\n" "Downloading ${FN}"
curl -f -s ${ADDRESS}${NUM}.txt | \
awk '{line++;print}; /\f/ {for (i=line;i<=58;i++) print "";line=0}' | \
sed '/\f/d' > "${TMP_FILE}"
LOGD read ${NUM} ${TYPE} ${TERM}
printf -- "%s\n" "Showing ${FN}"
${EM} ${EM_ST} "${EM_TITLE}" -e ${PAGER} "${TMP_FILE}"
else
printf -- "%s\n" "File does not exist or is not TXT. Check RFC # : ${FN}"
usage
fi
;;
'search'|'-s')
F=`echo ${NUM} | head -c 1`
FU=`echo ${F} | tr -s '[:lower:]' '[:upper:]'`
FL=`echo ${F} | tr -s '[:upper:]' '[:lower:]'`
CW=`echo ${NUM} | cut -c2-`
curl -s ${ADDRESS}-index.txt | \
awk 'BEGIN{FS="\n";RS="";ORS="\n\n"}/'[${FU}${FL}]${CW}'/' >"${TMP_FILE}"
LOGD search ${NUM} - -
printf -- "%s\n" "Showing search for '${FL}${CW}'"
${EM} ${EM_ST} "${EM_TITLE}" -e ${PAGER} "${TMP_FILE}"
;;
*) printf -- "\n"; usage; exit 1 ;;
esac