svc-pkg-mirror revision 2872
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#!/usr/bin/ksh -p
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
75c0816e8295e180f4bc7f10db3d0d880383bc1cMark Andrews# CDDL HEADER START
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# The contents of this file are subject to the terms of the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Common Development and Distribution License (the "License").
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# You may not use this file except in compliance with the License.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# or http://www.opensolaris.org/os/licensing.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# See the License for the specific language governing permissions
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# and limitations under the License.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# When distributing Covered Code, include this CDDL HEADER in each
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# If applicable, add the following below this CDDL HEADER, with the
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews# fields enclosed by brackets "[]" replaced with your own identifying
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# information: Portions Copyright [yyyy] [name of copyright owner]
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# CDDL HEADER END
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews# Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This is the method script for the svc:/application/pkg/mirror service
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# When called using the 'start' or 'stop' SMF method script, it adds
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# or removes a crontab entry for the user running the service, pkg5srv
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# by default.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# When called using the 'refresh' method, it runs pkgrecv(1) to update a
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# pkg(5) repository using configuration stored in the SMF instance.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# The following SMF properties are used to configure the service:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# config/repository the local pkg5 repository we update.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# config/ref_image the reference pkg5 image that contains
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# origin information that we should update
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# from.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# config/publishers a comma-separated list of the publishers
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# from ref_image that we pkgrecv from.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# config/crontab_period the first five fields of a crontab(4)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# entry, with the 3rd field allowing the
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews# special value 'random'.
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# config/debug a boolean, 'true' or 'false'; whether
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews# to log more output when debugging.
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews# Load SMF constants and functions
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews. /lib/svc/share/smf_include.sh
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein. /lib/svc/share/fs_include.sh
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein. /lib/svc/share/pkg5_include.sh
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinAWK=/usr/bin/awk
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinCAT=/usr/bin/cat
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsDATE=/usr/bin/date
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsGREP=/usr/bin/grep
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinPKG=/usr/bin/pkg
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinPKGRECV=/usr/bin/pkgrecv
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinPKGREPO=/usr/bin/pkgrepo
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinPYTHON=/usr/bin/python
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinRM=/usr/bin/rm
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinSED=/usr/bin/sed
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark AndrewsSORT=/usr/bin/sort
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinSVCCFG=/usr/sbin/svccfg
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinSVCPROP=/usr/bin/svcprop
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinWC=/usr/bin/wc
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinZFS=/usr/sbin/zfs
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob AusteinSVCNAME=svc:/application/pkg/mirror
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Since we deal with '*' values in crontab fields, we never want
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# globbing.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafssonset -o noglob
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
8e245ec21beee31a780de9b89ba1e8bb2b9f4c9aAndreas Gustafsson#
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson# Multiple instances of this service should not point at the
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# same local repository, since they could step on each other's toes
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# during updates, so we check for this before enabling the service.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Usage:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# check_duplicate_repos
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucefunction check_duplicate_repos {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ALL_REPOS=$($SVCPROP -p config/repository "$SVCNAME:*" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein | $AWK '{print $NF}' | $SORT | $WC -l)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein REPOS=$($SVCPROP -p config/repository "$SVCNAME:*" \
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews | $AWK '{print $NF}' | $SORT -u | $WC -l)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # if the unique list of repositories is not the same as the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # list of repositories, then we have duplicates.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$ALL_REPOS" != "$REPOS" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return 1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
8e245ec21beee31a780de9b89ba1e8bb2b9f4c9aAndreas Gustafsson return 0
575e532437cf7f203707765e21767db92fa1e480Mark Andrews}
8e245ec21beee31a780de9b89ba1e8bb2b9f4c9aAndreas Gustafsson
8e245ec21beee31a780de9b89ba1e8bb2b9f4c9aAndreas Gustafsson#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# In order that all instances don't hit the remote origins on the same
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# day, when configured with a 'config/crontab_period' containing a
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# special value 'random' in the 'day of the month' field of the crontab
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# schedule, we randomize the day, choosing a value from 1-28, storing
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# that to the service config instead. We then print the crontab period.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Usage:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# add_date_jitter
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucefunction add_date_jitter {
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce schedule=$($SVCPROP -p config/crontab_period $SMF_FMRI \
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce | $SED -e 's/\\//g')
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce #
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # Validate the cron_period property value, checking that we have
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # exactly 5 fields, and that 'random' only appears in the 3rd
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # field. We leave other validation up to cron(1).
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce #
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce echo "$schedule" | $AWK '
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce NF != 5 {
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce print "config/crontab_period property must contain 5 " \
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce "values.";
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce exit 1
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce }
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $1 == "random" || $2 == "random" || $4 == "random" || \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $5 == "random" {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein print "only field 3 can have the value random";
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein exit 1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }'
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? "invalid value for config/crontab_period." \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $SMF_FMRI exit
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein RAND=$(( ($RANDOM % 27) + 1 ))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein new_schedule=$(echo "$schedule" | $SED -e "s/random/$RAND/1")
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$new_schedule" != "$schedule" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # Save the schedule in the instance. Note that this
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # will not appear in the running instance until the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # refresh method has fired.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein new_schedule=$(echo $new_schedule| $SED -e 's/ /\\ /g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $SVCCFG -s $SMF_FMRI setprop \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein config/crontab_period = astring: \"$new_schedule\"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein print $new_schedule
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Add a crontab entry that does periodic pkgrecvs from a series of
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# remote pkg5 origins to a local repository. This is run as part of the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# SMF start method for this service. If the repository doesn't exist,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# we create it. We also attempt to create a zfs dataset if the parent
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# directory for the repository is the leaf of a zfs dataset.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction smf_schedule_updates {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_duplicate_repos
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? "Two or more instances of $SVCNAME contain the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinsame 'config/repository' value, which is not supported." $SMF_FMRI exit
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset -f schedule=$(add_date_jitter | $SED -e 's/\\//g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset repo=$($SVCPROP -p config/repository $SMF_FMRI)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein SAVED_IFS="$IFS"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein IFS=,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A publishers $($SVCPROP -p config/publishers $SMF_FMRI)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein IFS="$SAVED_IFS"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ ! -f $repo/pkg5.repository ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein repo_parent=$(dirname $repo)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein repo_base=$(basename $repo)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein readmnttab "$repo_parent" < /etc/mnttab
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$fstype" = "zfs" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # $special gets set by readmnttab in
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # /lib/svc/share/fs_include.sh
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein DS="$special/$repo_base"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $ZFS create $DS
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "unable to create zfs dataset $DS" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $SMF_FMRI degrade
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $PKGREPO create "$repo"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? "unable to create repository" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $SMF_FMRI degrade
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set_default_publisher "$repo" ${publishers[0]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein add_cronjob $SMF_FMRI "$schedule" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "/usr/sbin/svcadm refresh $SMF_FMRI"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Remove the crontab entry that was added by 'schedule_updates'. This is
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# run as part of the SMF stop method for this service.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction smf_unschedule_updates {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein remove_cronjob $SMF_FMRI \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "/usr/sbin/svcadm refresh $SMF_FMRI"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Checks whether the given repository has a publisher/prefix set,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# and if not, sets it to the given publisher.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Usage:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# set_default_publisher <path to repo> <publisher>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction set_default_publisher {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset repo="$1"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset pub=$2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein DEFAULT=$($PKGREPO -s "$repo" get -H publisher/prefix | \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $AWK '{print $NF}')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$DEFAULT" = '""' ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $PKGREPO -s "$repo" set publisher/prefix=$pub
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Intended to be called as part of a cron job firing, this calls
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# 'pkgrecv_from_origin' for each publisher configured in the SMF
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# instance.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Usage:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# update_repository <smf fmri>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction update_repository {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset SMF_FMRI=$1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset instance=$(echo $SMF_FMRI | $AWK -F: '{print $NF}')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset lockfile=/var/log/pkg/mirror/mirror.$instance.lock
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ -f $lockfile ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein pid=$(<$lockfile)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure 1 "A mirror operation was already running
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein under process $pid when the cron job fired. Remove $lockfile to
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein override, or check the SMF property 'config/crontab_period' to ensure
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein cron schedules don't overlap." $SMF_FMRI degrade
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return 1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # write our pid into the lock file
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo $$ > $lockfile
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? "unable to create lockfile" $SMF_FMRI degrade
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset repo=$($SVCPROP -p config/repository $SMF_FMRI \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein | $SED -e 's/\\//g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset cachedir=$($SVCPROP -p config/cache_dir $SMF_FMRI \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein | $SED -e 's/\\//g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset ref_image=$($SVCPROP -p config/ref_image $SMF_FMRI\
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein | $SED -e 's/\\//g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein SAVED_IFS="$IFS"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein IFS=,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A publishers $($SVCPROP -p config/publishers $SMF_FMRI)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein IFS="$SAVED_IFS"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ -z "$publishers" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "ERROR: no publishers found in 'config/publishers'"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return $SMF_EXIT_FATAL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A origins ""
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A ssl_keys ""
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A ssl_certs ""
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A http_proxies ""
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein set -A https_proxies ""
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # Gather the details we need to connect to the origins
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # we want to pkgrecv from.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews i=0
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while [ $i -lt ${#publishers[@]} ]; do
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein pub=${publishers[$i]}
cedb0bd0c1e3c461b7e479a16d3adfd5b150f1f4Mark Andrews sslkey=$($PKG -R $ref_image publisher $pub \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein | $GREP 'SSL Key:' \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews | $GREP -v None | $SED -e 's/.* //g')
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews sslcert=$($PKG -R $ref_image publisher $pub \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews | $GREP 'SSL Cert:' \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews | $GREP -v None | $SED -e 's/.* //g')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $PKG -R $ref_image publisher -F tsv > /tmp/pkg.mirror.$$
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein index=0
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # this function depends on the output of
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # 'pkg publisher -F tsv'. It really ought to use
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # 'pkg publisher -o' option when that's available.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while read publisher sticky syspub enabled ptype status \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein uri proxy ; do
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$pub" != "$publisher" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein continue
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ -z "$uri" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "WARNING: no URI \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinconfigured for publisher $pub"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein continue
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein origins[$index]=$uri
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo $uri | $GREP -q https://
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ $? -eq 0 ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ssl_keys[$index]=$sslkey
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ssl_certs[$index]=$sslcert
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ssl_keys[$index]=''
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ssl_certs[$index]=''
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$proxy" = "-" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein proxy=''
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein https_proxies[$index]=$proxy
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein http_proxy[$index]=$proxy
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein index=$(( $index + 1 ))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein done < /tmp/pkg.mirror.$$
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM /tmp/pkg.mirror.$$
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein i=$(( $i + 1 ))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein done
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # Iterate over all configured origins
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein i=0
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while [ $i -lt ${#origins[@]} ]; do
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein origin=${origins[$i]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein key=${ssl_keys[$i]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein cert=${ssl_certs[$i]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein http_proxy=${http_proxies[$i]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein https_proxy=${https_proxies[$i]}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein pkgrecv_from_origin "$repo" "$origin" "$key" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "$cert" $SMF_FMRI "$cachedir" "$http_proxy" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "$https_proxy"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein check_failure $? \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "unable to update repository $repo" $SMF_FMRI \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein degrade
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ $? -ne 0 ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM $lockfile
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return 1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews i=$(( $i + 1 ))
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein done
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein EXIT=$?
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM $lockfile
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return $EXIT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# When retrieving values from SMF, we can get the string '""'
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# (two quotes) returned. For our purposes, this is equivalent to the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# null string, so we normalize it to ''. This function reads from stdin.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction reduce_null_str {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while read value; do
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$value" = '""' ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo ''
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo $value
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein done
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Perform a pkgrecv from the given origin to the given repository.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# We assume that the repository exists.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Usage:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# pkgrecv_from_origin <repo> <origin> <key path> <cert path> <FMRI>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# <cache dir> <http_proxy> <https_proxy>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinfunction pkgrecv_from_origin {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset repo=$1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset origin=$2
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset key=$(echo $3 | reduce_null_str)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset cert=$(echo $4 | reduce_null_str)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset SMF_FMRI=$5
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset cachedir=$6
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset http_proxy=$(echo $7 | reduce_null_str)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset https_proxy=$(echo $8 | reduce_null_str)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset instance=$(echo $SMF_FMRI | $AWK -F: '{print $NF}')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset debug_flag=$($SVCPROP -p config/debug $SMF_FMRI)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset LOG=/var/log/pkg/mirror/mirror.$instance.log
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein export http_proxy=$http_proxy
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein export https_proxy=$https_proxy
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein TSTAMP=$($DATE +%Y%m%dT%H%M%SZ)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "$TSTAMP: $SMF_FMRI updates to $repo from $origin :" \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein >> $LOG
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ -n "$key" ] && [ -n "$cert" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein key="--key $key"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein cert="--cert $cert"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # show the command we're running
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$debug_flag" = "true" ] ; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo $PKGRECV -s $origin -c "$cachedir"/$instance \
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein -d "$repo" -m all-timestamps $key $cert '*'
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $PKGRECV -s $origin -c "$cachedir"/$instance -d "$repo" \
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews -m all-timestamps $key $cert '*' > $LOG.tmp 2>&1
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews EXIT=$?
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if [ "$debug_flag" = "true" ]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews $CAT $LOG.tmp >> $LOG
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews elif [ $EXIT -ne 0 ]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews #
7208386cd37a2092c70eddf80cf29519b16c4c80Mark Andrews # in the case of errors, getting the full pkgrecv output
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # can be helpful.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein #
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $CAT $LOG.tmp >> $LOG
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # otherwise, we only log messages containing pkg5 FMRIs
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $GREP 'pkg:/' $LOG.tmp >> $LOG
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # we only destroy the cache if a pkgrecv was successful
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM -rf "$cachedir"/$instance
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $PKGREPO -s "$repo" refresh
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM $LOG.tmp
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein return $EXIT
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# $1 start | stop | an FMRI containing configuration
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeincase "$1" in
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein'start')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein smf_schedule_updates
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ $? -eq 0 ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_OK
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "Problem mirroring repository for $SMF_FMRI"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_ERR_FATAL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ;;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein'stop')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein smf_unschedule_updates
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ $? -eq 0 ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_OK
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "Problem mirroring repository for $SMF_FMRI"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_ERR_FATAL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ;;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# A note on logging.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# The following log files are created while this service is running:
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# /var/log/pkg/mirror/mirror.<instance>.log
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This is the top-level log file for the service. This log
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# shows a summary of each pkgrecv, listing a timestamp and the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# packages that were received during that run of the cron job.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# /var/log/pkg/mirror/mirror.<instance>.run.<pid>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# This is a temporary log file, which should contain very little
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# output - it exists to capture all other output from the service
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# If 'config/debug' is set, then this file will also include the
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# full pkgrecv(1) command that is executed.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# /var/log/pkg/mirror/mirror.<instance>.log.tmp
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# Another temporary log file, which captures the complete output
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# of each pkgrecv command as it runs. At the end of the pkgrecv
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# process, we extract a summary and append it to
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# mirror.<instance>.log. If 'config/debug' is set, the contents
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# of this log are appended to mirror.<instance>.log. If any errors
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# were encountered while running pkgrecv, the contents of this log
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein# are appended to mirror.<instance>.log.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein'refresh')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset instance=$(echo $SMF_FMRI | $AWK -F: '{print $NF}')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset LOG=/var/log/pkg/mirror/mirror.$instance.log
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein typeset debug_flag=$($SVCPROP -p config/debug $SMF_FMRI)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # Most output should get captured by update_repository, but we
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # capture any remaining output.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein update_repository $SMF_FMRI > $LOG.run.$$ 2>&1
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein RET=$?
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ -s $LOG.run.$$ ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein cat $LOG.run.$$ >> $LOG
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ "$debug_flag" = "false" ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein $RM $LOG.run.$$
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if [ $RET -eq 0 ]; then
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_OK
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein else
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein echo "Mirror refresh failed: see $LOG for more detail."
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein # try to remove the cron job so we don't keep failing
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein smf_unschedule_updates
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein result=$SMF_EXIT_ERR_FATAL
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein fi
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ;;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinesac
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinexit $result
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein