1#!/sbin/sh 2 3# -------------------------------------------------------------- 4# -- DNS cache save/load script 5# -- 6# -- Version 1.2 7# -- By Yuri Voinov (c) 2006, 2014 8# -------------------------------------------------------------- 9# 10# ident "@(#)unbound_cache.sh 1.2 14/10/30 YV" 11# 12 13############# 14# Variables # 15############# 16 17# Installation base dir 18CONF="/etc/opt/csw/unbound" 19BASE="/opt/csw" 20 21# Unbound binaries 22UC="$BASE/sbin/unbound-control" 23FNAME="unbound_cache.dmp" 24 25# OS utilities 26BASENAME=`which basename` 27CAT=`which cat` 28CUT=`which cut` 29ECHO=`which echo` 30EXPR=`which expr` 31GETOPT=`which getopt` 32ID=`which id` 33LS=`which ls` 34 35############### 36# Subroutines # 37############### 38 39usage_note () 40{ 41# Script usage note 42 $ECHO "Usage: `$BASENAME $0` [-s] or [-l] or [-r] or [-h] [filename]" 43 $ECHO . 44 $ECHO "l - Load - default mode. Warming up Unbound DNS cache from saved file. cache-ttl must be high value." 45 $ECHO "s - Save - save Unbound DNS cache contents to plain file with domain names." 46 $ECHO "r - Reload - reloadind new cache entries and refresh existing cache" 47 $ECHO "h - this screen." 48 $ECHO "filename - file to save/load dumped cache. If not specified, $CONF/$FNAME will be used instead." 49 $ECHO "Note: Run without any arguments will be in default mode." 50 $ECHO " Also, unbound-control must be configured." 51 exit 0 52} 53 54root_check () 55{ 56 if [ ! `$ID | $CUT -f1 -d" "` = "uid=0(root)" ]; then 57 $ECHO "ERROR: You must be super-user to run this script." 58 exit 1 59 fi 60} 61 62check_uc () 63{ 64 if [ ! -f "$UC" ]; then 65 $ECHO . 66 $ECHO "ERROR: $UC not found. Exiting..." 67 exit 1 68 fi 69} 70 71check_saved_file () 72{ 73 filename=$1 74 if [ ! -z "$filename" -a ! -f "$filename" ]; then 75 $ECHO . 76 $ECHO "ERROR: File $filename does not exists. Save it first." 77 exit 1 78 elif [ ! -f "$CONF/$FNAME" ]; then 79 $ECHO . 80 $ECHO "ERROR: File $CONF/$FNAME does not exists. Save it first." 81 exit 1 82 fi 83} 84 85save_cache () 86{ 87 # Save unbound cache 88 filename=$1 89 if [ -z "$filename" ]; then 90 $ECHO "Saving cache in $CONF/$FNAME..." 91 $UC dump_cache>$CONF/$FNAME 92 $LS -lh $CONF/$FNAME 93 else 94 $ECHO "Saving cache in $filename..." 95 $UC dump_cache>$filename 96 $LS -lh $filename 97 fi 98 $ECHO "ok" 99} 100 101load_cache () 102{ 103 # Load saved cache contents and warmup cache 104 filename=$1 105 if [ -z "$filename" ]; then 106 $ECHO "Loading cache from saved $CONF/$FNAME..." 107 $LS -lh $CONF/$FNAME 108 check_saved_file $filename 109 $CAT $CONF/$FNAME|$UC load_cache 110 else 111 $ECHO "Loading cache from saved $filename..." 112 $LS -lh $filename 113 check_saved_file $filename 114 $CAT $filename|$UC load_cache 115 fi 116} 117 118reload_cache () 119{ 120 # Reloading and refresh existing cache and saved dump 121 filename=$1 122 save_cache $filename 123 load_cache $filename 124} 125 126############## 127# Main block # 128############## 129 130# Root check 131root_check 132 133# Check unbound-control 134check_uc 135 136# Check command-line arguments 137if [ "x$*" = "x" ]; then 138 # If arguments list empty,load cache by default 139 load_cache 140else 141 arg_list=$* 142 # Parse command line 143 set -- `$GETOPT sSlLrRhH: $arg_list` || { 144 usage_note 1>&2 145 } 146 147 # Read arguments 148 for i in $arg_list 149 do 150 case $i in 151 -s | -S) save="1";; 152 -l | -L) save="0";; 153 -r | -R) save="2";; 154 -h | -H | \?) usage_note;; 155 *) shift 156 file=$1 157 break;; 158 esac 159 shift 160 done 161 162 # Remove trailing -- 163 shift `$EXPR $OPTIND - 1` 164fi 165 166if [ "$save" = "1" ]; then 167 save_cache $file 168elif [ "$save" = "0" ]; then 169 load_cache $file 170elif [ "$save" = "2" ]; then 171 reload_cache $file 172fi 173 174exit 0