svc-pkg-mirror revision 3018
290N/A# The contents of this file are subject to the terms of the 290N/A# Common Development and Distribution License (the "License"). 290N/A# You may not use this file except in compliance with the License. 290N/A# See the License for the specific language governing permissions 290N/A# and limitations under the License. 290N/A# When distributing Covered Code, include this CDDL HEADER in each 290N/A# If applicable, add the following below this CDDL HEADER, with the 290N/A# fields enclosed by brackets "[]" replaced with your own identifying 290N/A# information: Portions Copyright [yyyy] [name of copyright owner] 290N/A# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. 290N/A# When called using the 'start' or 'stop' SMF method script, it adds 290N/A# or removes a crontab entry for the user running the service, pkg5srv 290N/A# When called using the 'refresh' method, it runs pkgrecv(1) to update a 290N/A# pkg(5) repository using configuration stored in the SMF instance. 290N/A# The following SMF properties are used to configure the service: 290N/A# origin information that we should update 290N/A# from ref_image that we pkgrecv from. 290N/A# entry, with the 3rd field allowing the 290N/A# special value 'random'. 290N/A# to log more output when debugging. 290N/A# Load SMF constants and functions 290N/A# Since we deal with '*' values in crontab fields, we never want 290N/A# Multiple instances of this service should not point at the 290N/A# same local repository, since they could step on each other's toes 290N/A# during updates, so we check for this before enabling the service. 290N/A # if the unique list of repositories is not the same as the 290N/A # list of repositories, then we have duplicates. 290N/A# In order that all instances don't hit the remote origins on the same 290N/A# special value 'random' in the 'day of the month' field of the crontab 290N/A# schedule, we randomize the day, choosing a value from 1-28, storing 290N/A# that to the service config instead. We then print the crontab period. 290N/A # Validate the cron_period property value, checking that we have 290N/A # exactly 5 fields, and that 'random' only appears in the 3rd 290N/A # field. We leave other validation up to cron(1). 290N/A $1 == "random" || $2 == "random" || $4 == "random" || \ 290N/A print "only field 3 can have the value random"; 290N/A # Save the schedule in the instance. Note that this 290N/A # will not appear in the running instance until the 290N/A # refresh method has fired. 290N/A# Add a crontab entry that does periodic pkgrecvs from a series of 290N/A# remote pkg5 origins to a local repository. This is run as part of the 290N/A# SMF start method for this service. If the repository doesn't exist, 290N/A# we create it. We also attempt to create a zfs dataset if the parent 290N/A# directory for the repository is the leaf of a zfs dataset. 290N/A # $special gets set by readmnttab in 290N/A # We set canmount=noauto so that multiple bootable 290N/A # rpools can coexist on the same system. 290N/A# Remove the crontab entry that was added by 'schedule_updates'. This is 290N/A# run as part of the SMF stop method for this service. 290N/A# and if not, sets it to the given publisher. 290N/A# set_default_publisher <path to repo> <publisher> 290N/A# Intended to be called as part of a cron job firing, this calls 290N/A# 'pkgrecv_from_origin' for each publisher configured in the SMF 290N/A# update_repository <smf fmri> 290N/A # write our pid into the lock file 290N/A # Gather the details we need to connect to the origins 290N/A # we want to pkgrecv from. 290N/A while [ $i -lt ${#publishers[@]} ]; do # this function depends on the output of # 'pkg publisher -F tsv'. It really ought to use # 'pkg publisher -o' option when that's available. configured for publisher $pub" # Iterate over all configured origins while [ $i -lt ${#origins[@]} ]; do # When retrieving values from SMF, we can get the string '""' # (two quotes) returned. For our purposes, this is equivalent to the # null string, so we normalize it to ''. This function reads from stdin. # Perform a pkgrecv from the given origin to the given repository. # We assume that the repository exists. # pkgrecv_from_origin <repo> <origin> <key path> <cert path> <FMRI> # <cache dir> <http_proxy> <https_proxy> # show the command we're running # in the case of errors, getting the full pkgrecv output # otherwise, we only log messages containing pkg5 FMRIs # we only destroy the cache if a pkgrecv was successful # $1 start | stop | an FMRI containing configuration echo "Problem mirroring repository for $SMF_FMRI" echo "Problem mirroring repository for $SMF_FMRI" # The following log files are created while this service is running: # This is the top-level log file for the service. This log # shows a summary of each pkgrecv, listing a timestamp and the # packages that were received during that run of the cron job. # This is a temporary log file, which should contain very little # output - it exists to capture all other output from the service # If 'config/debug' is set, then this file will also include the # full pkgrecv(1) command that is executed. # Another temporary log file, which captures the complete output # of each pkgrecv command as it runs. At the end of the pkgrecv # process, we extract a summary and append it to # mirror.<instance>.log. If 'config/debug' is set, the contents # of this log are appended to mirror.<instance>.log. If any errors # were encountered while running pkgrecv, the contents of this log # are appended to mirror.<instance>.log. # Most output should get captured by update_repository, but we # capture any remaining output. echo "Mirror refresh failed: see $LOG for more detail." # try to remove the cron job so we don't keep failing