## vim:ft=zsh ## put - make a file available via HTTP ## supports as many 'failover' hosts as an array can hold ## Usage: put ## Copyright © 2008 - 2010 by Daniel Friesel ## License: WTFPL typeset hostname ssh_name typeset -a hosts typeset target_dir server_prefix max_size typeset file remote_file illegal zmodload zsh/stat if [[ -z ${commands[curl]} ]]; then function curl {return 0} print -P "%B%F{yellow}curl not present, won't be able to check upload success%f%b" fi function put_aneurysm { hostname='aneurysm.derf0.net' ssh_name='aneurysm' target_dir='web/net.derf0.aneurysm/out/tmp' server_prefix='http://aneurysm.derf0.net/tmp/' max_size=700000 } function put_steel { hostname='steel.derf0.net' ssh_name='steel' target_dir='web/net.derf0.steel/out/tmp/' server_prefix='http://steel.derf0.net/tmp/' max_size=0 } function put_chaosdorf { hostname='frontend.chaosdorf.de' ssh_name='chaosdorf-web' target_dir='public_html/tmp/' server_prefix='http://www.chaosdorf.de/~derf/tmp/' max_size=0 } hosts=(aneurysm steel chaosdorf) while [[ ${1} == -* ]] { case ${1} in -|--) shift; break ;; *) if [[ -n ${functions[put_${1#-}]} ]]; then hosts=(${1#-}) else (( $(eval echo '$#'hosts_${1#-}) )) && eval hosts=\(\$hosts_${1#-}\) fi ;; esac shift } if [[ ! -e ${1} ]] { echo "${1}: No such file" >&2 return 1 } if [[ -d ${1} ]] { tar -C ${1:h} -cJf /tmp/${1:t}.tar.xz ${1:t} file=/tmp/${1:t}.tar.xz } else { file=${1} } while (( ${#hosts} )) { remote_file=${file:t} put_${hosts[1]} ping -c 1 ${hostname} &> /dev/null || ping6 -c 1 ${hostname} &> /dev/null if (( ? == 0 )) { if (( max_size > 0 && $(zstat +size ${file}) > max_size && ${#hosts} > 1 )) { shift hosts continue } if [[ ${remote_file} == ${~illegal} ]] { remote_file=${remote_file:r} } lftp -c "connect sftp://${ssh_name}; cd ${target_dir}; put ${file}"\ " -o ${remote_file}; chmod 644 ${remote_file}" if $(curl -fI ${server_prefix}${remote_file} &> /dev/null); then echo ${server_prefix}${remote_file} return 0 fi } shift hosts } return 1