diff --git a/LDP/guide/docbook/abs-guide/cdll b/LDP/guide/docbook/abs-guide/cdll new file mode 100644 index 00000000..96c1c0e1 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/cdll @@ -0,0 +1,723 @@ +############################################################################ +# +# cdll +# by Phil Braham +# +# ############################################ +# Latest version of this script available from +# http://freshmeat.net/projects/cd/ +# ############################################ +# +# .cd_new +# +# An enhancement of the Unix cd command +# +# There are unlimited stack entries and special entries. The stack +# entries keep the last cd_maxhistory +# directories that have been used. The special entries can be assigned +# to commonly used directories. +# +# The special entries may be pre-assigned by setting the environment +# variables CDSn or by using the -u or -U command. +# +# The following is a suggestion for the .profile file: +# +# . cdll # Set up the cd command +# alias cd='cd_new' # Replace te cd command +# cd -U # Upload pre-assigned entries for +# #+ the stact and special entries +# cd -D # Set non-default mode +# alias @="cd_new @" # Allow @ to be used to get history +# +# For help type: +# +# cd -h or +# cd -H +# +# +############################################################################ +# +# Version 1.2.1 +# +# Written by Phil Braham - Realtime Software Pty Ltd +# (realtime@mpx.com.au) +# Please send any suggestions or enhancements to the author (also at +# phil@braham.net) +# +############################################################################ + +cd_hm () +{ + ${PRINTF} "%s" "cd [dir] [0-9] [@[s|h] [-g [<dir>]] [-d] [-D] [-r<n>] [dir|0-9] [-R<n>] [<dir>|0-9] + [-s<n>] [-S<n>] [-u] [-U] [-f] [-F] [-h] [-H] [-v] + <dir> Go to directory + 0-n Goto previous directory (0 is previous, 1 is last but 1 etc) + n is up to max history (default is 50) + @ List history and special entries + @h List history entries + @s List special entries + -g [<dir>] Go to literal name (bypass special names) + This is to allow access to dirs called '0','1','-h' etc + -d Change default action - verbose. (See note) + -D Change default action - silent. (See note) + -s<n> Go to the special entry <n>* + -S<n> Go to the special entry <n> and replace it with the current dir* + -r<n> [<dir>] Go to directory <dir> and then put it on special entry <n>* + -R<n> [<dir>] Go to directory <dir> and put current dir on special entry <n>* + -a<n> Alternative suggested directory. See note below. + -f [<file>] File entries to <file>. + -u [<file>] Update entries from <file>. + If no filename supplied then default file (${CDPath}${2:-"$CDFile"}) is used + -F and -U are silent versions + -v Print version number + -h Help + -H Detailed help + + *The special entries (0 - 9) are held until log off, replaced by another entry + or updated with the -u command + + Alternative suggested directories: + If a directory is not found then CD will suggest any possibilities. These are + directories starting with the same letters and if any are found they are listed + prefixed with -a<n> where <n> is a number. + It's possible to go to the directory by entering cd -a<n> on the command line. + + The directory for -r<n> or -R<n> may be a number. For example: + $ cd -r3 4 Go to history entry 4 and put it on special entry 3 + $ cd -R3 4 Put current dir on the special entry 3 and go to history entry 4 + $ cd -s3 Go to special entry 3 + + Note that commands R,r,S and s may be used without a number and refer to 0: + $ cd -s Go to special entry 0 + $ cd -S Go to special entry 0 and make special entry 0 current dir + $ cd -r 1 Go to history entry 1 and put it on special entry 0 + $ cd -r Go to history entry 0 and put it on special entry 0 + " + if ${TEST} "$CD_MODE" = "PREV" + then + ${PRINTF} "$cd_mnset" + else + ${PRINTF} "$cd_mset" + fi +} + +cd_Hm () +{ + cd_hm + ${PRINTF} "%s" " + The previous directories (0-$cd_maxhistory) are stored in the + environment variables CD[0] - CD[$cd_maxhistory] + Similarly the special directories S0 - $cd_maxspecial are in + the environment variable CDS[0] - CDS[$cd_maxspecial] + and may be accessed from the command line + + The default pathname for the -f and -u commands is $CDPath + The default filename for the -f and -u commands is $CDFile + + Set the following environment variables: + CDL_PROMPTLEN - Set to the length of prompt you require. + Prompt string is set to the right characters of the + current directory. + If not set then prompt is left unchanged + CDL_PROMPT_PRE - Set to the string to prefix the prompt. + Default is: + non-root: \"\\[\\e[01;34m\\]\" (sets colour to blue). + root: \"\\[\\e[01;31m\\]\" (sets colour to red). + CDL_PROMPT_POST - Set to the string to suffix the prompt. + Default is: + non-root: \"\\[\\e[00m\\]$\" (resets colour and displays $). + root: \"\\[\\e[00m\\]#\" (resets colour and displays #). + CDPath - Set the default path for the -f & -u options. + Default is home directory + CDFile - Set the default filename for the -f & -u options. + Default is cdfile + +" + cd_version + +} + +cd_version () +{ + printf "Version: ${VERSION_MAJOR}.${VERSION_MINOR} Date: ${VERSION_DATE}\n" +} + +# +# Truncate right. +# +# params: +# p1 - string +# p2 - length to truncate to +# +# returns string in tcd +# +cd_right_trunc () +{ + local tlen=${2} + local plen=${#1} + local str="${1}" + local diff + local filler="<--" + if ${TEST} ${plen} -le ${tlen} + then + tcd="${str}" + else + let diff=${plen}-${tlen} + elen=3 + if ${TEST} ${diff} -le 2 + then + let elen=${diff} + fi + tlen=-${tlen} + let tlen=${tlen}+${elen} + tcd=${filler:0:elen}${str:tlen} + fi +} + +# +# Three versions of do history: +# cd_dohistory - packs history and specials side by side +# cd_dohistoryH - Shows only hstory +# cd_dohistoryS - Shows only specials +# +cd_dohistory () +{ + cd_getrc + ${PRINTF} "History:\n" + local -i count=${cd_histcount} + while ${TEST} ${count} -ge 0 + do + cd_right_trunc "${CD[count]}" ${cd_lchar} + ${PRINTF} "%2d %-${cd_lchar}.${cd_lchar}s " ${count} "${tcd}" + + cd_right_trunc "${CDS[count]}" ${cd_rchar} + ${PRINTF} "S%d %-${cd_rchar}.${cd_rchar}s\n" ${count} "${tcd}" + count=${count}-1 + done +} + +cd_dohistoryH () +{ + cd_getrc + ${PRINTF} "History:\n" + local -i count=${cd_maxhistory} + while ${TEST} ${count} -ge 0 + do + ${PRINTF} "${count} %-${cd_flchar}.${cd_flchar}s\n" ${CD[$count]} + count=${count}-1 + done +} + +cd_dohistoryS () +{ + cd_getrc + ${PRINTF} "Specials:\n" + local -i count=${cd_maxspecial} + while ${TEST} ${count} -ge 0 + do + ${PRINTF} "S${count} %-${cd_flchar}.${cd_flchar}s\n" ${CDS[$count]} + count=${count}-1 + done +} + +cd_getrc () +{ + cd_flchar=$(stty -a | awk -F \; '/rows/ { print $2 $3 }' | awk -F \ '{ print $4 }') + if ${TEST} ${cd_flchar} -ne 0 + then + cd_lchar=${cd_flchar}/2-5 + cd_rchar=${cd_flchar}/2-5 + cd_flchar=${cd_flchar}-5 + else + cd_flchar=${FLCHAR:=75} # cd_flchar is used for for the @s & @h history + cd_lchar=${LCHAR:=35} + cd_rchar=${RCHAR:=35} + fi +} + +cd_doselection () +{ + local -i nm=0 + cd_doflag="TRUE" + if ${TEST} "${CD_MODE}" = "PREV" + then + if ${TEST} -z "$cd_npwd" + then + cd_npwd=0 + fi + fi + tm=$(echo "${cd_npwd}" | cut -b 1) + if ${TEST} "${tm}" = "-" + then + pm=$(echo "${cd_npwd}" | cut -b 2) + nm=$(echo "${cd_npwd}" | cut -d $pm -f2) + case "${pm}" in + a) cd_npwd=${cd_sugg[$nm]} ;; + s) cd_npwd="${CDS[$nm]}" ;; + S) cd_npwd="${CDS[$nm]}" ; CDS[$nm]=`pwd` ;; + r) cd_npwd="$2" ; cd_specDir=$nm ; cd_doselection "$1" "$2";; + R) cd_npwd="$2" ; CDS[$nm]=`pwd` ; cd_doselection "$1" "$2";; + esac + fi + + if ${TEST} "${cd_npwd}" != "." -a "${cd_npwd}" != ".." -a "${cd_npwd}" -le ${cd_maxhistory} >>/dev/null 2>&1 + then + cd_npwd=${CD[$cd_npwd]} + else + case "$cd_npwd" in + @) cd_dohistory ; cd_doflag="FALSE" ;; + @h) cd_dohistoryH ; cd_doflag="FALSE" ;; + @s) cd_dohistoryS ; cd_doflag="FALSE" ;; + -h) cd_hm ; cd_doflag="FALSE" ;; + -H) cd_Hm ; cd_doflag="FALSE" ;; + -f) cd_fsave "SHOW" $2 ; cd_doflag="FALSE" ;; + -u) cd_upload "SHOW" $2 ; cd_doflag="FALSE" ;; + -F) cd_fsave "NOSHOW" $2 ; cd_doflag="FALSE" ;; + -U) cd_upload "NOSHOW" $2 ; cd_doflag="FALSE" ;; + -g) cd_npwd="$2" ;; + -d) cd_chdefm 1; cd_doflag="FALSE" ;; + -D) cd_chdefm 0; cd_doflag="FALSE" ;; + -r) cd_npwd="$2" ; cd_specDir=0 ; cd_doselection "$1" "$2";; + -R) cd_npwd="$2" ; CDS[0]=`pwd` ; cd_doselection "$1" "$2";; + -s) cd_npwd="${CDS[0]}" ;; + -S) cd_npwd="${CDS[0]}" ; CDS[0]=`pwd` ;; + -v) cd_version ; cd_doflag="FALSE";; + esac + fi +} + +cd_chdefm () +{ + if ${TEST} "${CD_MODE}" = "PREV" + then + CD_MODE="" + if ${TEST} $1 -eq 1 + then + ${PRINTF} "${cd_mset}" + fi + else + CD_MODE="PREV" + if ${TEST} $1 -eq 1 + then + ${PRINTF} "${cd_mnset}" + fi + fi +} + +cd_fsave () +{ + local sfile=${CDPath}${2:-"$CDFile"} + if ${TEST} "$1" = "SHOW" + then + ${PRINTF} "Saved to %s\n" $sfile + fi + ${RM} -f ${sfile} + local -i count=0 + while ${TEST} ${count} -le ${cd_maxhistory} + do + echo "CD[$count]=\"${CD[$count]}\"" >> ${sfile} + count=${count}+1 + done + count=0 + while ${TEST} ${count} -le ${cd_maxspecial} + do + echo "CDS[$count]=\"${CDS[$count]}\"" >> ${sfile} + count=${count}+1 + done +} + +cd_upload () +{ + local sfile=${CDPath}${2:-"$CDFile"} + if ${TEST} "${1}" = "SHOW" + then + ${PRINTF} "Loading from %s\n" ${sfile} + fi + . ${sfile} +} + +cd_new () +{ + local -i count + local -i choose=0 + + cd_npwd="${1}" + cd_specDir=-1 + cd_doselection "${1}" "${2}" + + if ${TEST} ${cd_doflag} = "TRUE" + then + if ${TEST} "${CD[0]}" != "`pwd`" + then + count=$cd_maxhistory + while ${TEST} $count -gt 0 + do + CD[$count]=${CD[$count-1]} + count=${count}-1 + done + CD[0]=`pwd` + fi + command cd "${cd_npwd}" 2>/dev/null + if ${TEST} $? -eq 1 + then + ${PRINTF} "Unknown dir: %s\n" "${cd_npwd}" + local -i ftflag=0 + for i in "${cd_npwd}"* + do + if ${TEST} -d "${i}" + then + if ${TEST} ${ftflag} -eq 0 + then + ${PRINTF} "Suggest:\n" + ftflag=1 + fi + ${PRINTF} "\t-a${choose} %s\n" "$i" + cd_sugg[$choose]="${i}" + choose=${choose}+1 + fi + done + fi + fi + + if ${TEST} ${cd_specDir} -ne -1 + then + CDS[${cd_specDir}]=`pwd` + fi + + if ${TEST} ! -z "${CDL_PROMPTLEN}" + then + cd_right_trunc "${PWD}" ${CDL_PROMPTLEN} + cd_rp=${CDL_PROMPT_PRE}${tcd}${CDL_PROMPT_POST} + export PS1="$(echo -ne ${cd_rp})" + fi +} +################################################################################# +# # +# Initialisation here # +# # +################################################################################# +# +VERSION_MAJOR="1" +VERSION_MINOR="2.1" +VERSION_DATE="24-MAY-2003" +# +alias cd=cd_new +# +# Set up commands +RM=/bin/rm +TEST=test +PRINTF=printf # Use builtin printf + +################################################################################# +# # +# Change this to modify the default pre- and post prompt strings. # +# These only come into effect if CDL_PROMPTLEN is set. # +# # +################################################################################# +if ${TEST} ${EUID} -eq 0 +then +# CDL_PROMPT_PRE=${CDL_PROMPT_PRE:="$HOSTNAME@"} + CDL_PROMPT_PRE=${CDL_PROMPT_PRE:="\\[\\e[01;31m\\]"} # Root is in red + CDL_PROMPT_POST=${CDL_PROMPT_POST:="\\[\\e[00m\\]#"} +else + CDL_PROMPT_PRE=${CDL_PROMPT_PRE:="\\[\\e[01;34m\\]"} # Users in blue + CDL_PROMPT_POST=${CDL_PROMPT_POST:="\\[\\e[00m\\]$"} +fi +################################################################################# +# +# cd_maxhistory defines the max number of history entries allowed. +typeset -i cd_maxhistory=50 + +################################################################################# +# +# cd_maxspecial defines the number of special entries. +typeset -i cd_maxspecial=9 +# +# +################################################################################# +# +# cd_histcount defines the number of entries displayed in the history command. +typeset -i cd_histcount=9 +# +################################################################################# +export CDPath=${HOME}/ +# Change these to use a different # +#+ default path and filename # +export CDFile=${CDFILE:=cdfile} # for the -u and -f commands # +# +################################################################################# + # +typeset -i cd_lchar cd_rchar cd_flchar + # This is the number of chars to allow for the # +cd_flchar=${FLCHAR:=75} #+ cd_flchar is used for for the @s & @h history # + +typeset -ax CD CDS +# +cd_mset="\n\tDefault mode is now set - entering cd with no parameters has the default action\n\tUse cd -d or -D for cd to go to previous directory with no parameters\n" +cd_mnset="\n\tNon-default mode is now set - entering cd with no parameters is the same as entering cd 0\n\tUse cd -d or -D to change default cd action\n" + +# ==================================================================== # + + + +: <<DOCUMENTATION + +Written by Phil Braham. Realtime Software Pty Ltd. +Released under GNU license. Free to use. Please pass any modifications +or comments to the author Phil Braham: + +realtime@mpx.com.au +=============================================================================== + +cdll is a replacement for cd and incorporates similar functionality to +the bash pushd and popd commands but is independent of them. + +This version of cdll has been tested on Linux using Bash. It will work +on most Linux versions but will probably not work on other shells without +modification. + +Introduction +============ + +cdll allows easy moving about between directories. When changing to a new +directory the current one is automatically put onto a stack. By default +50 entries are kept, but this is configurable. Special directories can be +kept for easy access - by default up to 10, but this is configurable. The +most recent stack entries and the special entries can be easily viewed. + +The directory stack and special entries can be saved to, and loaded from, +a file. This allows them to be set up on login, saved before logging out +or changed when moving project to project. + +In addition, cdll provides a flexible command prompt facility that allows, +for example, a directory name in colour that is truncated from the left +if it gets too long. + + +Setting up cdll +=============== + +Copy cdll to either your local home directory or a central directory +such as /usr/bin (this will require root access). + +Copy the file cdfile to your home directory. It will require read and +write access. This a default file that contains a directory stack and +special entries. + +To replace the cd command you must add commands to your login script. +The login script is one or more of: + + /etc/profile + ~/.bash_profile + ~/.bash_login + ~/.profile + ~/.bashrc + /etc/bash.bashrc.local + +To setup your login, ~/.bashrc is recommended, for global (and root) setup +add the commands to /etc/bash.bashrc.local + +To set up on login, add the command: + . <dir>/cdll +For example if cdll is in your local home directory: + . ~/cdll +If in /usr/bin then: + . /usr/bin/cdll + +If you want to use this instead of the buitin cd command then add: + alias cd='cd_new' +We would also recommend the following commands: + alias @='cd_new @' + cd -U + cd -D + +If you want to use cdll's prompt facilty then add the following: + CDL_PROMPTLEN=nn +Where nn is a number described below. Initially 99 would be suitable +number. + +Thus the script looks something like this: + + ###################################################################### + # CD Setup + ###################################################################### + CDL_PROMPTLEN=21 # Allow a prompt length of up to 21 characters + . /usr/bin/cdll # Initialise cdll + alias cd='cd_new' # Replace the built in cd command + alias @='cd_new @' # Allow @ at the prompt to display history + cd -U # Upload directories + cd -D # Set default action to non-posix + ###################################################################### + +The full meaning of these commands will become clear later. + +There are a couple of caveats. If another program changes the directory +without calling cdll, then the directory won't be put on the stack and +also if the prompt facility is used then this will not be updated. Two +programs that can do this are pushd and popd. To update the prompt and +stack simply enter: + + cd . + +Note that if the previous entry on the stack is the current directory +then the stack is not updated. + +Usage +===== +cd [dir] [0-9] [@[s|h] [-g <dir>] [-d] [-D] [-r<n>] [dir|0-9] [-R<n>] + [<dir>|0-9] [-s<n>] [-S<n>] [-u] [-U] [-f] [-F] [-h] [-H] [-v] + + <dir> Go to directory + 0-n Goto previous directory (0 is previous, 1 is last but 1, etc.) + n is up to max history (default is 50) + @ List history and special entries (Usually available as $ @) + @h List history entries + @s List special entries + -g [<dir>] Go to literal name (bypass special names) + This is to allow access to dirs called '0','1','-h' etc + -d Change default action - verbose. (See note) + -D Change default action - silent. (See note) + -s<n> Go to the special entry <n> + -S<n> Go to the special entry <n> and replace it with the current dir + -r<n> [<dir>] Go to directory <dir> and then put it on special entry <n> + -R<n> [<dir>] Go to directory <dir> and put current dir on special entry <n> + -a<n> Alternative suggested directory. See note below. + -f [<file>] File entries to <file>. + -u [<file>] Update entries from <file>. + If no filename supplied then default file (~/cdfile) is used + -F and -U are silent versions + -v Print version number + -h Help + -H Detailed help + + + +Examples +======== + +These examples assume non-default mode is set (that is, cd with no +parameters will go to the most recent stack directory), that aliases +have been set up for cd and @ as described above and that cd's prompt +facility is active and the prompt length is 21 characters. + + /home/phil$ @ # List the entries with the @ + History: # Output of the @ command + ..... # Skipped these entries for brevity + 1 /home/phil/ummdev S1 /home/phil/perl # Most recent two history entries + 0 /home/phil/perl/eg S0 /home/phil/umm/ummdev # and two special entries are shown + + /home/phil$ cd /home/phil/utils/Cdll # Now change directories + /home/phil/utils/Cdll$ @ # Prompt reflects the directory. + History: # New history + ..... + 1 /home/phil/perl/eg S1 /home/phil/perl # History entry 0 has moved to 1 + 0 /home/phil S0 /home/phil/umm/ummdev # and the most recent has entered + +To go to a history entry: + + /home/phil/utils/Cdll$ cd 1 # Go to history entry 1. + /home/phil/perl/eg$ # Current directory is now what was 1 + +To go to a special entry: + + /home/phil/perl/eg$ cd -s1 # Go to special entry 1 + /home/phil/umm/ummdev$ # Current directory is S1 + +To go to a directory called, for example, 1: + + /home/phil$ cd -g 1 # -g ignores the special meaning of 1 + /home/phil/1$ + +To put current directory on the special list as S1: + cd -r1 . # OR + cd -R1 . # These have the same effect if the directory is + #+ . (the current directory) + +To go to a directory and add it as a special + The directory for -r<n> or -R<n> may be a number. For example: + $ cd -r3 4 Go to history entry 4 and put it on special entry 3 + $ cd -R3 4 Put current dir on the special entry 3 and go to + history entry 4 + $ cd -s3 Go to special entry 3 + + Note that commands R,r,S and s may be used without a number and + refer to 0: + $ cd -s Go to special entry 0 + $ cd -S Go to special entry 0 and make special entry 0 + current dir + $ cd -r 1 Go to history entry 1 and put it on special entry 0 + $ cd -r Go to history entry 0 and put it on special entry 0 + + + Alternative suggested directories: + + If a directory is not found, then CD will suggest any + possibilities. These are directories starting with the same letters + and if any are found they are listed prefixed with -a<n> + where <n> is a number. It's possible to go to the directory + by entering cd -a<n> on the command line. + + Use cd -d or -D to change default cd action. cd -H will show + current action. + + The history entries (0-n) are stored in the environment variables + CD[0] - CD[n] + Similarly the special directories S0 - 9 are in the environment + variable CDS[0] - CDS[9] + and may be accessed from the command line, for example: + + ls -l ${CDS[3]} + cat ${CD[8]}/file.txt + + The default pathname for the -f and -u commands is ~ + The default filename for the -f and -u commands is cdfile + + +Configuration +============= + + The following environment variables can be set: + + CDL_PROMPTLEN - Set to the length of prompt you require. + Prompt string is set to the right characters of the current + directory. If not set, then prompt is left unchanged. Note + that this is the number of characters that the directory is + shortened to, not the total characters in the prompt. + + CDL_PROMPT_PRE - Set to the string to prefix the prompt. + Default is: + non-root: "\\[\\e[01;34m\\]" (sets colour to blue). + root: "\\[\\e[01;31m\\]" (sets colour to red). + + CDL_PROMPT_POST - Set to the string to suffix the prompt. + Default is: + non-root: "\\[\\e[00m\\]$" (resets colour and displays $). + root: "\\[\\e[00m\\]#" (resets colour and displays #). + + Note: + CDL_PROMPT_PRE & _POST only t + + CDPath - Set the default path for the -f & -u options. + Default is home directory + CDFile - Set the default filename for the -f & -u options. + Default is cdfile + + + There are three variables defined in the file cdll which control the + number of entries stored or displayed. They are in the section labeled + 'Initialisation here' towards the end of the file. + + cd_maxhistory - The number of history entries stored. + Default is 50. + cd_maxspecial - The number of special entries allowed. + Default is 9. + cd_histcount - The number of history and special entries + displayed. Default is 9. + + Note that cd_maxspecial should be >= cd_histcount to avoid displaying + special entries that can't be set. + + +Version: 1.2.1 Date: 24-MAY-2003 + +DOCUMENTATION diff --git a/LDP/guide/docbook/abs-guide/func-cmdlinearg.sh b/LDP/guide/docbook/abs-guide/func-cmdlinearg.sh new file mode 100644 index 00000000..cdc62d49 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/func-cmdlinearg.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# func-cmdlinearg.sh +# Call this script with a command-line argument, +#+ something like $0 arg1. + + +func () + +{ +echo "$1" +} + +echo "First call to function: no arg passed." +echo "See if command-line arg is seen." +func +# No! Command-line arg not seen. + +echo "============================================================" +echo +echo "Second call to function: command-line arg passed explicitly." +func $1 +# Now it's seen! + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/wgetter2.bash b/LDP/guide/docbook/abs-guide/wgetter2.bash new file mode 100644 index 00000000..97806b97 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/wgetter2.bash @@ -0,0 +1,462 @@ +#!/bin/bash +# wgetter2.bash + +# Author: Little Monster [monster@monstruum.co.uk] +# ==> Used in ABS Guide with permission of script author. +# ==> This script still needs debugging and fixups (exercise for reader). +# ==> It could also use some additional editing in the comments. + + +# This is wgetter2 -- +#+ a Bash script to make wget a bit more friendly, and save typing. + +# Carefully crafted by Little Monster. +# More or less complete on 02/02/2005. +# If you think this script can be improved, +#+ email me at: monster@monstruum.co.uk +# ==> and cc: to the author of the ABS Guide, please. +# This script is licenced under the GPL. +# You are free to copy, alter and re-use it, +#+ but please don't try to claim you wrote it. +# Log your changes here instead. + +# ======================================================================= +# changelog: + +# 02/02/2005. Minor additions by Little Monster. +# (See after # +++++++++++ ) +# 29/01/2005. Minor stylistic edits and cleanups by author of ABS Guide. +# Added exit error codes. +# 22/11/2004. Finished initial version of second version of wgetter: +# wgetter2 is born. +# 01/12/2004. Changed 'runn' function so it can be run 2 ways -- +# either ask for a file name or have one input on the CL. +# 01/12/2004. Made sensible handling of no URL's given. +# 01/12/2004. Made loop of main options, so you don't +# have to keep calling wgetter 2 all the time. +# Runs as a session instead. +# 01/12/2004. Added looping to 'runn' function. +# Simplified and improved. +# 01/12/2004. Added state to recursion setting. +# Enables re-use of previous value. +# 05/12/2004. Modified the file detection routine in the 'runn' function +# so it's not fooled by empty values, and is cleaner. +# 01/02/2004. Added cookie finding routine from later version (which +# isn't ready yet), so as not to have hard-coded paths. +# ======================================================================= + +# Error codes for abnormal exit. +E_USAGE=67 # Usage message, then quit. +E_NO_OPTS=68 # No command-line args entered. +E_NO_URLS=69 # No URLs passed to script. +E_NO_SAVEFILE=70 # No save filename passed to script. +E_USER_EXIT=71 # User decides to quit. + + +# Basic default wget command we want to use. +# This is the place to change it, if required. +# NB: if using a proxy, set http_proxy = yourproxy in .wgetrc. +# Otherwise delete --proxy=on, below. +# ==================================================================== +CommandA="wget -nc -c -t 5 --progress=bar --random-wait --proxy=on -r" +# ==================================================================== + + + +# -------------------------------------------------------------------- +# Set some other variables and explain them. + +pattern=" -A .jpg,.JPG,.jpeg,.JPEG,.gif,.GIF,.htm,.html,.shtml,.php" + # wget's option to only get certain types of file. + # comment out if not using +today=`date +%F` # Used for a filename. +home=$HOME # Set HOME to an internal variable. + # In case some other path is used, change it here. +depthDefault=3 # Set a sensible default recursion. +Depth=$depthDefault # Otherwise user feedback doesn't tie in properly. +RefA="" # Set blank referring page. +Flag="" # Default to not saving anything, + #+ or whatever else might be wanted in future. +lister="" # Used for passing a list of urls directly to wget. +Woptions="" # Used for passing wget some options for itself. +inFile="" # Used for the run function. +newFile="" # Used for the run function. +savePath="$home/w-save" +Config="$home/.wgetter2rc" + # This is where some variables can be stored, + #+ if permanently changed from within the script. +Cookie_List="$home/.cookielist" + # So we know where the cookies are kept . . . +cFlag="" # Part of the cookie file selection routine. + +# Define the options available. Easy to change letters here if needed. +# These are the optional options; you don't just wait to be asked. + +save=s # Save command instead of executing it. +cook=c # Change cookie file for this session. +help=h # Usage guide. +list=l # Pass wget the -i option and URL list. +runn=r # Run saved commands as an argument to the option. +inpu=i # Run saved commands interactively. +wopt=w # Allow to enter options to pass directly to wget. +# -------------------------------------------------------------------- + + +if [ -z "$1" ]; then # Make sure we get something for wget to eat. + echo "You must at least enter a URL or option!" + echo "-$help for usage." + exit $E_NO_OPTS +fi + + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# added added added added added added added added added added added added + +if [ ! -e "$Config" ]; then # See if configuration file exists. + echo "Creating configuration file, $Config" + echo "# This is the configuration file for wgetter2" > "$Config" + echo "# Your customised settings will be saved in this file" >> "$Config" +else + source $Config # Import variables we set outside the script. +fi + +if [ ! -e "$Cookie_List" ]; then + # Set up a list of cookie files, if there isn't one. + echo "Hunting for cookies . . ." + find -name cookies.txt >> $Cookie_List # Create the list of cookie files. +fi # Isolate this in its own 'if' statement, + #+ in case we got interrupted while searching. + +if [ -z "$cFlag" ]; then # If we haven't already done this . . . + echo # Make a nice space after the command prompt. + echo "Looks like you haven't set up your source of cookies yet." + n=0 # Make sure the counter doesn't contain random values. + while read; do + Cookies[$n]=$REPLY # Put the cookie files we found into an array. + echo "$n) ${Cookies[$n]}" # Create a menu. + n=$(( n + 1 )) # Increment the counter. + done < $Cookie_List # Feed the read statement. + echo "Enter the number of the cookie file you want to use." + echo "If you won't be using cookies, just press RETURN." + echo + echo "I won't be asking this again. Edit $Config" + echo "If you decide to change at a later date" + echo "or use the -${cook} option for per session changes." + read + if [ ! -z $REPLY ]; then # User didn't just press return. + Cookie=" --load-cookies ${Cookies[$REPLY]}" + # Set the variable here as well as in the config file. + + echo "Cookie=\" --load-cookies ${Cookies[$REPLY]}\"" >> $Config + fi + echo "cFlag=1" >> $Config # So we know not to ask again. +fi + +# end added section end added section end added section end added section end +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + +# Another variable. +# This one may or may not be subject to variation. +# A bit like the small print. +CookiesON=$Cookie +# echo "cookie file is $CookiesON" # For debugging. +# echo "home is ${home}" # For debugging. Got caught with this one! + + +wopts() +{ +echo "Enter options to pass to wget." +echo "It is assumed you know what you're doing." +echo +echo "You can pass their arguments here too." +# That is to say, everything passed here is passed to wget. + +read Wopts +# Read in the options to be passed to wget. + +Woptions=" $Wopts" +# Assign to another variable. +# Just for fun, or something . . . + +echo "passing options ${Wopts} to wget" +# Mainly for debugging. +# Is cute. + +return +} + + +save_func() +{ +echo "Settings will be saved." +if [ ! -d $savePath ]; then # See if directory exists. + mkdir $savePath # Create the directory to save things in + #+ if it isn't already there. +fi + +Flag=S +# Tell the final bit of code what to do. +# Set a flag since stuff is done in main. + +return +} + + +usage() # Tell them how it works. +{ + echo "Welcome to wgetter. This is a front end to wget." + echo "It will always run wget with these options:" + echo "$CommandA" + echo "and the pattern to match: $pattern (which you can change at the top of this script)." + echo "It will also ask you for recursion depth, and if you want to use a referring page." + echo "Wgetter accepts the following options:" + echo "" + echo "-$help : Display this help." + echo "-$save : Save the command to a file $savePath/wget-($today) instead of running it." + echo "-$runn : Run saved wget commands instead of starting a new one --" + echo "Enter filename as argument to this option." + echo "-$inpu : Run saved wget commands interactively --" + echo "The script will ask you for the filename." + echo "-$cook : Change the cookies file for this session." + echo "-$list : Tell wget to use URL's from a list instead of from the command line." + echo "-$wopt : Pass any other options direct to wget." + echo "" + echo "See the wget man page for additional options you can pass to wget." + echo "" + + exit $E_USAGE # End here. Don't process anything else. +} + + + +list_func() # Gives the user the option to use the -i option to wget, + #+ and a list of URLs. +{ +while [ 1 ]; do + echo "Enter the name of the file containing URL's (press q to change your mind)." + read urlfile + if [ ! -e $urlfile ] && [ $urlfile != q ]; then + # Look for a file, or the quit option. + echo "That file does not exist!" + elif [ $urlfile = q ]; then # Check quit option. + echo "Not using a URL list." + return + else + echo "Using $urlfile." + echo "If you gave me URL's on the command line, I'll use those first." + # Report wget standard behaviour to the user. + lister=" -i $urlfile" # This is what we will pass to wget. + return + fi +done +} + + +cookie_func() # Give the user the option to use a different cookie file. +{ +while [ 1 ]; do + echo "Change the cookies file. Press return if you don't want to change it." + read Cookies + # NB: this is not the same as Cookie, earlier. + # There is an 's' on the end. + # Bit like chocolate chips. + if [ -z $Cookies ]; then # Escape clause for wusses. + return + elif [ ! -e $Cookies ]; then + echo "File does not exist. Try again." # Keep 'em going . . . + else + CookiesON=" --load-cookies $Cookies" # File is good. Let's use it! + return + fi +done +} + + +run_func() +{ +if [ -z "$OPTARG" ]; then +# Test to see if we used the in-line option or the query one. + if [ ! -d "$savePath" ]; then # In case directory doesn't exist . . . + echo "$savePath does not appear to exist." + echo "Please supply path and filename of saved wget commands:" + read newFile + until [ -f "$newFile" ]; do # Keep going till we get something. + echo "Sorry, that file does not exist. Please try again." + # Try really hard to get something. + read newFile + done + +# ------------------------------------------------------------------------- +# if [ -z ( grep wget ${newfile} ) ]; then + # Assume they haven't got the right file and bail out. +# echo "Sorry, that file does not contain wget commands. Aborting." +# exit +# fi +# +# This is bogus code. +# It doesn't actually work. +# If anyone wants to fix it, feel free! +# ------------------------------------------------------------------------- + + filePath="${newFile}" + else + echo "Save path is $savePath" + echo "Please enter name of the file which you want to use." + echo "You have a choice of:" + ls $savePath # Give them a choice. + read inFile + until [ -f "$savePath/$inFile" ]; do # Keep going till we get something. + if [ ! -f "${savePath}/${inFile}" ]; then # If file doesn't exist. + echo "Sorry, that file does not exist. Please choose from:" + ls $savePath # If a mistake is made. + read inFile + fi + done + filePath="${savePath}/${inFile}" # Make one variable . . . + fi +else filePath="${savePath}/${OPTARG}" # Which can be many things . . . +fi + +if [ ! -f "$filePath" ]; then # If a bogus file got through. + echo "You did not specify a suitable file." + echo "Run this script with the -${save} option first." + echo "Aborting." + exit $E_NO_SAVEFILE +fi +echo "Using: $filePath" +while read; do + eval $REPLY + echo "Completed: $REPLY" +done < $filePath # Feed the actual file we are using into a 'while' loop. + +exit +} + + + +# Fish out any options we are using for the script. +# This is based on the demo in "Learning The Bash Shell" (O'Reilly). +while getopts ":$save$cook$help$list$runn:$inpu$wopt" opt +do + case $opt in + $save) save_func;; # Save some wgetter sessions for later. + $cook) cookie_func;; # Change cookie file. + $help) usage;; # Get help. + $list) list_func;; # Allow wget to use a list of URLs. + $runn) run_func;; # Useful if you are calling wgetter from, for example, + #+ a cron script. + $inpu) run_func;; # When you don't know what your files are named. + $wopt) wopts;; # Pass options directly to wget. + \?) echo "Not a valid option." + echo "Use -${wopt} if you want to pass options directly to wget," + echo "or -${help} for help";; # Catch anything else. + esac +done +shift $((OPTIND - 1)) # Do funky magic stuff with $#. + + +if [ -z "$1" ] && [ ! -z $lister ]; then + # We should be left with at least one URL + #+ on the command line, unless a list is + #+ being used -- catch empty CL's. + echo "No URL's given! You must enter them on the same line as wgetter2." + echo "E.g., wgetter2 http://somesite http://anothersite." + echo "Use $help option for more information." + exit $E_NO_URLS # Bail out, with appropriate error code. +fi + +URLS=" $@" +# Use this so that URL list can be changed if we stay in the option loop. + +while [ 1 ]; do + # This is where we ask for the most used options. + # (Mostly unchanged from version 1 of wgetter) + if [ -z $curDepth ]; then + Current="" + else Current=" Current value is $curDepth" + fi + echo "How deep should I go? (integer: Default is $depthDefault.$Current)" + read Depth # Recursion -- how far should we go? + inputB="" # Reset this to blank on each pass of the loop. + echo "Enter the name of the referring page (default is none)." + read inputB # Need this for some sites. + + echo "Do you want to have the output logged to the terminal" + echo "(y/n, default is yes)?" + read noHide # Otherwise wget will just log it to a file. + + case $noHide in # Now you see me, now you don't. + y|Y ) hide="";; + n|N ) hide=" -b";; + * ) hide="";; + esac + + if [ -z ${Depth} ]; then # User accepted either default or current depth, + #+ in which case Depth is now empty. + if [ -z ${curDepth} ]; then # See if a depth was set on a previous iteration. + Depth="$depthDefault" # Set the default recursion depth if nothing + #+ else to use. + else Depth="$curDepth" # Otherwise, set the one we used before. + fi + fi + Recurse=" -l $Depth" # Set how deep we want to go. + curDepth=$Depth # Remember setting for next time. + + if [ ! -z $inputB ]; then + RefA=" --referer=$inputB" # Option to use referring page. + fi + + WGETTER="${CommandA}${pattern}${hide}${RefA}${Recurse}${CookiesON}${lister}${Woptions}${URLS}" + # Just string the whole lot together . . . + # NB: no embedded spaces. + # They are in the individual elements so that if any are empty, + #+ we don't get an extra space. + + if [ -z "${CookiesON}" ] && [ "$cFlag" = "1" ] ; then + echo "Warning -- can't find cookie file" + # This should be changed, in case the user has opted to not use cookies. + fi + + if [ "$Flag" = "S" ]; then + echo "$WGETTER" >> $savePath/wget-${today} + # Create a unique filename for today, or append to it if it exists. + echo "$inputB" >> $savePath/site-list-${today} + # Make a list, so it's easy to refer back to, + #+ since the whole command is a bit confusing to look at. + echo "Command saved to the file $savePath/wget-${today}" + # Tell the user. + echo "Referring page URL saved to the file $savePath/site-list-${today}" + # Tell the user. + Saver=" with save option" + # Stick this somewhere, so it appears in the loop if set. + else + echo "*****************" + echo "*****Getting*****" + echo "*****************" + echo "" + echo "$WGETTER" + echo "" + echo "*****************" + eval "$WGETTER" + fi + + echo "" + echo "Starting over$Saver." + echo "If you want to stop, press q." + echo "Otherwise, enter some URL's:" + # Let them go again. Tell about save option being set. + + read + case $REPLY in # Need to change this to a 'trap' clause. + q|Q ) exit $E_USER_EXIT;; # Exercise for the reader? + * ) URLS=" $REPLY";; + esac + + echo "" +done + + +exit 0