a script to mirror IPS repositories
Olaf Bohlen
2016-10-31 d95b511bc3564cdd2ef7bd67dafa3056d8cc6741
working version, still missing certificate auth
1 files modified
140 ■■■■ changed files
pkg5mirror.ksh 140 ●●●● patch | view | raw | blame | history
pkg5mirror.ksh
@@ -5,44 +5,152 @@
# it handles automatic zfs cloning, so we can update our local copies without
# disrupting our own package service
repofs="/var...pkg/hipster"
publisher=""
smfid=""
snaptag=@pkg5mirror-$(date +"%Y-%m-%d_%H-%M-%S")
log_msg() {
    # log messages to a file for later review, also write to stdout
    typeset my_tstamp
    typeset my_logfile
    typeset my_level
    typeset my_msg
    my_level="$1"
    my_msg="$2"
    my_tstamp=$(date "+%b %e %H:%M:%S")
    my_logfile=/var/log/pkg5mirror.log
    printf "%s %s %s: %s\n" "${my_tstamp}" "$(uname -n)" "${my_level}" "${my_msg}" >>"${my_logfile}"
}
http_proxy=http://btchttp.btc-ag.com:8080
https_proxy=http://btchttp.btc-ag.com:8080
export http_proxy https_proxy
## main ##
typeset repofs
typeset publisher
typeset smfid
typeset snaptag
typeset cmd_out
typeset pkgrecvout
typeset pkgorigin
typeset counter
publisher=$1
pkgorigin=$2
smfid=svc:/application/pkg/server:${publisher}
svcs -- ${smfid} >/dev/null 2>&1
if [ $? -gt 0 ]; then
    log_msg ERROR "service ${smfid} unknown"
    exit 1
fi
repofs=$(/usr/sbin/svccfg -s ${smfid} listprop pkg/inst_root | nawk '{print $3}')
repods=$(df -k ${repofs} | nawk '$0~/\//  { print $1 }')
snaptag=@pkg5mirror-$(date +"%Y-%m-%d_%H-%M-%S")
pkgrecvout=/tmp/pkgrecv.out
counter=0
log_msg INFO "starting pkg5mirror for ${publisher}"
# find old snapshots and destroy them
for snap in $(zfs list -t snapshot -r ${repofs} -H -o name | egrep "${snaptag}"); do
    zfs destroy ${snap}
for snap in $(/usr/sbin/zfs list -t snapshot -H -o name -r ${repods} | egrep "@pkg5mirror-"); do
    log_msg INFO "deleting old snapshot ${snap}"
    cmd_out=$( /usr/sbin/zfs destroy ${snap} 2>&1 )
    if [ $? -gt 0 ]; then
    log_msg ERROR "zfs destroy ${snap} has returned an error: ${cmd_out}"
    fi
done
# now snapshot original repofs
zfs snapshot ${repofs}${snaptag}
log_msg INFO "creating snapshot ${repods}${snaptag}"
cmd_out=$( /usr/sbin/zfs snapshot ${repods}${snaptag} 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "zfs snapshot ${repods}${snaptag} returned an error: ${cmd_out}"
    exit 1
fi
# now clone our snap
zfs clone ${repofs}${snaptag} ${repofs}-clone
log_msg INFO "cloning zfs ${repods}${snaptag} to ${repods}-clone"
cmd_out=$( /usr/sbin/zfs clone ${repods}${snaptag} ${repods}-clone 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "zfs clone ${repods}${snaptag} ${repods}-clone returned an error: ${cmd_out}"
    exit 1
fi
# at this point we will receive updates to the repository
pkgrecv -p ${publisher} -s ${pkgorigin} -d file://${repofs}-clone --clone
log_msg INFO "now starting pkgrecv --clone for ${publisher}"
pkgrecv -p ${publisher} -s ${pkgorigin} -d file://${repofs}-clone --clone >${pkgrecvout} 2>&1
if [ $? -gt 0 ]; then
    log_msg ERROR "pkgrecv -p ${publisher} -s ${pkgorigin} -d file://${repofs}-clone --clone returned an error"
    exit 1
fi
# now refresh the cloned and updated repo
pkgrepo refresh -s file://${repofs}-clone
log_msg INFO "refreshing file://${repofs}-clone"
cmd_out=$( pkgrepo refresh -s file://${repofs}-clone 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "pkgrepo refresh -s file://${repofs}-clone returned an error: ${cmd_out}"
    exit 1
fi
# promote the clone, so we can delete the original fs
zfs promote ${repofs}-clone
log_msg INFO "promoting ${repods}-clone"
cmd_out=$( /usr/sbin/zfs promote ${repods}-clone 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "zfs promote ${repods}-clone returned an error: ${cmd_out}"
    exit 1
fi
# now stop pkg instance
svcadm disable pkg/server:foo
log_msg INFO "disabling ${smfid}"
cmd_out=$( sudo /usr/sbin/svcadm disable ${smfid} 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "unable to disable ${smfid}: ${cmd_out}"
    exit 1
fi
# wait till service is stopped
while svcs pkg/server:foo; do
    sleep 1
while [ x$(svcs -H -o state ${smfid} 2>/dev/null) != xdisabled ] ; do
    if [ ${counter} -lt 8 ]; then
    sleep $(( 2**${counter} ))
    else
    log_msg ERROR "unable to stop ${smfid} within 255seconds, exiting"
    exit 1
    fi
    counter=$(( ${counter} + 1 ))
done
# delete our origin fs
log_msg INFO "deleting origin ds ${repods}"
cmd_out=$( /usr/sbin/zfs destroy ${repods} 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "zfs destroy of origin ds failed: ${cmd_out}"
    exit 1
fi
# now rename our clone to original fs
zfs rename ${repofs}-clone ${repofs}
log_msg INFO "renaming clone to origin fs"
cmd_out=$( /usr/sbin/zfs rename ${repods}-clone ${repods} 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "zfs rename failed: ${cmd_out}"
    exit 1
fi
# now stop pkg instance
svcadm enable pkg/server:foo
cmd_out=$( sudo /usr/sbin/svcadm enable ${smfid} 2>&1 )
if [ $? -gt 0 ]; then
    log_msg ERROR "unable to enable ${smfid}: ${cmd_out}"
    exit 1
fi
# write finish notice
log_msg INFO "job complete"