## vim:ft=zsh ## put - make a file available via HTTP ## supports as many 'failover' hosts as an array can hold ## Usage: put ## Copyright (C) 2008, 2009 by Daniel Friesel ## License: WTFPL typeset hostname typeset -a ssh_options hosts typeset target_dir server_prefix typeset file remote_file illegal typeset -i n_hosts n_ping n_curl 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_int { put_aneurysm hostname='aneurysm' } function put_aneurysm () { hostname='derf.homelinux.org' ssh_options=(-q) target_dir='public_html/tmp/' server_prefix='https://derf.homelinux.org/tmp/' } function put_becquerel () { hostname='becquerel.illdefined.org' ssh_options=(-q) target_dir='www/tmp/' server_prefix='http://static.illdefined.org/~derf/tmp/' } hosts=(aneurysm_int aneurysm becquerel) hosts_nossl=(becquerel) while [[ ${1} == -* ]] { case ${1} in -|--) shift; break ;; *) (( $(eval echo '$#'hosts_${1#-}) )) && eval hosts=\(\$hosts_${1#-}\) ;; esac shift } n_hosts=${#hosts} if [[ -f ${1} ]] { 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 [[ ${remote_file} == ${~illegal} ]] { remote_file=${remote_file:r} } scp ${ssh_options} ${file} ${hostname}:${target_dir}/${remote_file} ssh ${ssh_options} ${hostname} "chmod 644 ${target_dir}${remote_file}" if $(curl -fI ${server_prefix}${remote_file} &> /dev/null); then echo ${server_prefix}${remote_file} return 0 else (( n_curl++ )) fi } else { (( n_ping++ )) } shift hosts } echo "Tried uploading to ${n_hosts} hosts without success" >&2 ((n_ping)) && echo " - ${n_ping} hosts are unreachable" >&2 ((n_curl)) && echo " - ${n_curl} errors while uploading" >&2 return 1 } else { echo "${1}: No such file" return 1 }