2025-07-11 17:04:27 -05:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2025-07-13 08:29:42 -05:00
|
|
|
#FCC Database Lookup Offline
|
2025-07-12 07:08:13 -05:00
|
|
|
#11JULY2025 km4ack
|
2025-07-26 12:06:32 -05:00
|
|
|
#26JULY2025 last edit
|
2025-07-13 08:29:42 -05:00
|
|
|
|
|
|
|
|
#script will download the FCC amateur database of call signs
|
|
|
|
|
#allowing to user to access the info offline
|
|
|
|
|
|
|
|
|
|
#Script can be automated using crontab to download the database
|
|
|
|
|
#Hint: 0 6 * * * /path/to/file/fcc download
|
|
|
|
|
|
2025-07-26 12:06:32 -05:00
|
|
|
#version 3 changes:
|
|
|
|
|
#add grid square lookup if data file available
|
2025-07-13 08:29:42 -05:00
|
|
|
#version 2 changes:
|
|
|
|
|
#add logging to mylog.txt
|
|
|
|
|
#add verbose option. usage: fcc <call sign> -v
|
|
|
|
|
#add logic if call not found
|
2025-07-11 17:04:27 -05:00
|
|
|
|
|
|
|
|
CALL=$1
|
|
|
|
|
dir=$HOME/.local/share/fcc_database/
|
|
|
|
|
dl=${dir}dl_date
|
|
|
|
|
AM=${dir}AM.dat
|
|
|
|
|
EN=${dir}EN.dat
|
2025-07-12 07:08:13 -05:00
|
|
|
today=$(date +%d-%b-%Y)
|
2025-07-13 08:29:42 -05:00
|
|
|
mylog=$HOME/Documents/mylog.txt
|
2025-07-26 12:06:32 -05:00
|
|
|
version=3.0
|
2025-07-13 08:29:42 -05:00
|
|
|
|
|
|
|
|
declare -u CALL=${CALL}
|
2025-07-11 17:04:27 -05:00
|
|
|
|
|
|
|
|
if [ -f ${dl} ]; then
|
|
|
|
|
source ${dl}
|
|
|
|
|
fi
|
|
|
|
|
|
2025-07-12 07:08:13 -05:00
|
|
|
PURGE(){
|
2025-07-13 08:29:42 -05:00
|
|
|
if [ -d ${dir}old ]; then
|
2025-07-12 07:08:13 -05:00
|
|
|
echo "purging old DB files"
|
|
|
|
|
rm -rf ${dir}old
|
|
|
|
|
echo "purge complete"
|
|
|
|
|
exit
|
|
|
|
|
else
|
|
|
|
|
echo "no old db files found"
|
|
|
|
|
exit
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-11 17:04:27 -05:00
|
|
|
DOWNLOAD(){
|
|
|
|
|
mkdir -p ${dir}
|
|
|
|
|
echo "downloading"
|
|
|
|
|
cd ${dir}
|
|
|
|
|
mkdir -p old
|
|
|
|
|
mv * ./old/
|
|
|
|
|
wget -U "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" https://data.fcc.gov/download/pub/uls/complete/l_amat.zip
|
|
|
|
|
echo "extracting contents from zip file"
|
|
|
|
|
unzip l_amat.zip
|
|
|
|
|
rm l_amat.zip
|
|
|
|
|
rm CO.dat counts HD.dat HS.dat LA.dat SC.dat SF.dat
|
|
|
|
|
echo last_download=${today} > ${dl}
|
2025-07-13 08:29:42 -05:00
|
|
|
echo `date` " FCC Download" >> ${mylog}
|
|
|
|
|
echo;echo
|
|
|
|
|
echo "usage:"
|
|
|
|
|
echo "fcc <call sign> #get data for <call sign>"
|
|
|
|
|
echo "fcc download #download latest database"
|
|
|
|
|
echo "fcc purge #purge old archives"
|
2025-07-11 17:04:27 -05:00
|
|
|
exit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OUTPUT(){
|
2025-07-13 08:29:42 -05:00
|
|
|
if [ -z "${en_result}" ] && [ -z "${am_result}" ]; then
|
|
|
|
|
clear;echo
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo "FCC Offline Database Tool v${version}"
|
|
|
|
|
echo "Database downloaded ${last_download}"
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo;echo "Call not found";echo
|
|
|
|
|
read -p "Call sign or q to quit: " CALL
|
|
|
|
|
|
|
|
|
|
if [ "${CALL}" = "q" ] || [ ${CALL} = "Q" ]; then
|
2025-07-26 12:06:32 -05:00
|
|
|
echo "Station QRT, 73!"
|
2025-07-13 08:29:42 -05:00
|
|
|
exit
|
|
|
|
|
fi
|
|
|
|
|
LOOKUP
|
|
|
|
|
else
|
|
|
|
|
clear;echo
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo "FCC Offline Database Tool v${version}"
|
|
|
|
|
echo "Database downloaded ${last_download}"
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo ${CALL}
|
|
|
|
|
echo "${name}"
|
|
|
|
|
echo "${full_class} class"
|
|
|
|
|
echo ${street}
|
|
|
|
|
echo "${city}, ${state} ${zip}"
|
2025-07-26 12:06:32 -05:00
|
|
|
if [ -n "${grid}" ]; then
|
|
|
|
|
echo "${grid}"
|
|
|
|
|
fi
|
2025-07-13 08:29:42 -05:00
|
|
|
if [ ${CALL} = "KM4ACK" ]; then
|
|
|
|
|
echo "https://www.youtube.com/@KM4ACK"
|
|
|
|
|
fi
|
|
|
|
|
echo
|
|
|
|
|
read -p "Call sign or (q)uit (v)erbose: " ans
|
|
|
|
|
|
|
|
|
|
if [ "${ans}" = "q" ] || [ ${ans} = "Q" ]; then
|
2025-07-26 12:06:32 -05:00
|
|
|
echo "Station QRT, 73!"
|
2025-07-13 08:29:42 -05:00
|
|
|
exit
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "${ans}" = "v" ] || [ ${ans} = "V" ]; then
|
|
|
|
|
VERBOSE
|
|
|
|
|
else
|
|
|
|
|
CALL=${ans}
|
|
|
|
|
fi
|
|
|
|
|
LOOKUP
|
2025-07-11 17:04:27 -05:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOOKUP(){
|
2025-07-12 12:15:07 -05:00
|
|
|
am_result=$(grep -iw ${CALL} ${AM} | tail -1)
|
2025-07-11 17:04:27 -05:00
|
|
|
en_result=$(grep -iw ${CALL} ${EN} | tail -1)
|
|
|
|
|
class=$(echo ${am_result} | awk -F "|" '{print $6}')
|
|
|
|
|
case ${class} in
|
|
|
|
|
T)
|
|
|
|
|
full_class=Technician;;
|
|
|
|
|
G)
|
|
|
|
|
full_class=General;;
|
|
|
|
|
E)
|
|
|
|
|
full_class=Extra;;
|
2025-07-12 07:08:13 -05:00
|
|
|
*)
|
|
|
|
|
full_class=unknown;;
|
2025-07-11 17:04:27 -05:00
|
|
|
esac
|
|
|
|
|
name=$(echo ${en_result} | awk -F "|" '{print $8}')
|
|
|
|
|
street=$(echo ${en_result} | awk -F "|" '{print $16}')
|
|
|
|
|
city=$(echo ${en_result} | awk -F "|" '{print $17}')
|
|
|
|
|
state=$(echo ${en_result} | awk -F "|" '{print $18}')
|
2025-07-26 12:06:32 -05:00
|
|
|
zip=$(echo ${en_result} | awk -F "|" '{print $19}' | cut -b1-5)
|
|
|
|
|
if [ -d $HOME/bin/grid-lookup ]; then
|
|
|
|
|
grid=$($HOME/bin/grid-lookup/grid-lookup ${zip})
|
|
|
|
|
fi
|
2025-07-11 17:04:27 -05:00
|
|
|
OUTPUT
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-13 08:29:42 -05:00
|
|
|
VERBOSE(){
|
|
|
|
|
clear;echo
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo "FCC Offline Database Tool v${version}"
|
|
|
|
|
echo "Database downloaded ${last_download}"
|
|
|
|
|
echo "-------------------------------"
|
|
|
|
|
echo "***VERBOSE RESULTS***"
|
|
|
|
|
echo "---------------------"
|
|
|
|
|
grep -iw ${CALL} ${AM}
|
|
|
|
|
echo "----------------------------------------"
|
|
|
|
|
grep -iw ${CALL} ${EN}
|
|
|
|
|
echo;echo "END OF RESULTS"
|
|
|
|
|
echo;read -n 1 -s -r -p "Press any key to continue"
|
|
|
|
|
LOOKUP
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-11 17:04:27 -05:00
|
|
|
if [ -z $1 ]; then
|
2025-07-12 07:08:13 -05:00
|
|
|
echo "usage:"
|
|
|
|
|
echo "fcc <call sign> #get data for <call sign>"
|
|
|
|
|
echo "fcc download #download latest database"
|
|
|
|
|
echo "fcc purge #purge old archives"
|
2025-07-11 17:04:27 -05:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ $1 = "download" ]; then
|
|
|
|
|
DOWNLOAD
|
|
|
|
|
fi
|
|
|
|
|
|
2025-07-12 07:08:13 -05:00
|
|
|
if [ $1 = "purge" ]; then
|
|
|
|
|
PURGE
|
|
|
|
|
fi
|
|
|
|
|
|
2025-07-13 08:29:42 -05:00
|
|
|
if [ -z $2 ]; then
|
|
|
|
|
echo "fetching data"
|
|
|
|
|
else
|
|
|
|
|
if [ $2 = "-v" ]; then
|
|
|
|
|
VERBOSE
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
2025-07-11 17:04:27 -05:00
|
|
|
if [ ! -d ${dir} ]; then
|
|
|
|
|
echo "ERROR::Database not found!"
|
2025-07-13 08:29:42 -05:00
|
|
|
echo "Download FCC database with:"
|
2025-07-11 17:04:27 -05:00
|
|
|
echo "fcc download"
|
2025-07-12 07:08:13 -05:00
|
|
|
exit 1
|
2025-07-11 17:04:27 -05:00
|
|
|
fi
|
|
|
|
|
LOOKUP
|