15f385077SDag-Erling Smørgrav#!/bin/sh 25f385077SDag-Erling Smørgrav#- 35f385077SDag-Erling Smørgrav# Copyright (c) 2013 Dag-Erling Smørgrav 45f385077SDag-Erling Smørgrav# All rights reserved. 55f385077SDag-Erling Smørgrav# 65f385077SDag-Erling Smørgrav# Redistribution and use in source and binary forms, with or without 75f385077SDag-Erling Smørgrav# modification, are permitted provided that the following conditions 85f385077SDag-Erling Smørgrav# are met: 95f385077SDag-Erling Smørgrav# 1. Redistributions of source code must retain the above copyright 105f385077SDag-Erling Smørgrav# notice, this list of conditions and the following disclaimer. 115f385077SDag-Erling Smørgrav# 2. Redistributions in binary form must reproduce the above copyright 125f385077SDag-Erling Smørgrav# notice, this list of conditions and the following disclaimer in the 135f385077SDag-Erling Smørgrav# documentation and/or other materials provided with the distribution. 145f385077SDag-Erling Smørgrav# 155f385077SDag-Erling Smørgrav# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 165f385077SDag-Erling Smørgrav# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 175f385077SDag-Erling Smørgrav# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 185f385077SDag-Erling Smørgrav# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 195f385077SDag-Erling Smørgrav# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 205f385077SDag-Erling Smørgrav# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 215f385077SDag-Erling Smørgrav# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 225f385077SDag-Erling Smørgrav# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 235f385077SDag-Erling Smørgrav# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 245f385077SDag-Erling Smørgrav# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 255f385077SDag-Erling Smørgrav# SUCH DAMAGE. 265f385077SDag-Erling Smørgrav# 275f385077SDag-Erling Smørgrav# 285f385077SDag-Erling Smørgrav 295f385077SDag-Erling Smørgravset -e 305f385077SDag-Erling Smørgrav 315f385077SDag-Erling SmørgravUSERLAND_VERSION="@@REVISION@@-@@BRANCH@@" 325f385077SDag-Erling Smørgrav 335f385077SDag-Erling Smørgrav: ${ROOT:=} 345f385077SDag-Erling Smørgrav: ${LOADER_DIR:=$ROOT/boot} 355f385077SDag-Erling Smørgrav: ${LOADER_CONF_FILES:=$LOADER_DIR/defaults/loader.conf $LOADER_DIR/loader.conf $LOADER_DIR/loader.conf.local} 365f385077SDag-Erling SmørgravLOADER_RE1='^\([A-Z_a-z][0-9A-Z_a-z]*=[-./0-9A-Z_a-z]\{1,\}\).*$' 375f385077SDag-Erling SmørgravLOADER_RE2='^\([A-Z_a-z][0-9A-Z_a-z]*="[-./0-9A-Z_a-z]\{1,\}"\).*$' 38e98bb55fSDag-Erling SmørgravKERNEL_RE='^@@TYPE@@ \([-.0-9A-Za-z]\{1,\}\) .*$' 395f385077SDag-Erling Smørgrav 406fd07539SDag-Erling Smørgravprogname=${0##*/} 415f385077SDag-Erling Smørgrav 425f385077SDag-Erling Smørgrav# 435f385077SDag-Erling Smørgrav# Print an error message and exit. 445f385077SDag-Erling Smørgrav# 455f385077SDag-Erling Smørgraverror() { 465f385077SDag-Erling Smørgrav echo "$progname: $*" >&2 475f385077SDag-Erling Smørgrav exit 1 485f385077SDag-Erling Smørgrav} 495f385077SDag-Erling Smørgrav 505f385077SDag-Erling Smørgrav# 515f385077SDag-Erling Smørgrav# Try to get the name of the installed kernel from loader.conf and 525f385077SDag-Erling Smørgrav# return the full path. If loader.conf does not exist or we could not 535f385077SDag-Erling Smørgrav# read it, return the path to the default kernel. 545f385077SDag-Erling Smørgrav# 555f385077SDag-Erling Smørgravkernel_file() { 565f385077SDag-Erling Smørgrav eval $(sed -n "s/$LOADER_RE1/\\1;/p; s/$LOADER_RE2/\\1;/p" \ 575f385077SDag-Erling Smørgrav $LOADER_CONF_FILES 2>/dev/null) 585f385077SDag-Erling Smørgrav echo "$LOADER_DIR/${kernel:-kernel}/${bootfile:-kernel}" 595f385077SDag-Erling Smørgrav} 605f385077SDag-Erling Smørgrav 615f385077SDag-Erling Smørgrav# 625f385077SDag-Erling Smørgrav# Extract the kernel version from the installed kernel. 635f385077SDag-Erling Smørgrav# 645f385077SDag-Erling Smørgravkernel_version() { 655f385077SDag-Erling Smørgrav kernfile=$(kernel_file) 665f385077SDag-Erling Smørgrav if [ ! -f "$kernfile" -o ! -r "$kernfile" ] ; then 675f385077SDag-Erling Smørgrav error "unable to locate kernel" 685f385077SDag-Erling Smørgrav fi 69e98bb55fSDag-Erling Smørgrav what -qs "$kernfile" | sed -n "s/$KERNEL_RE/\\1/p" 705f385077SDag-Erling Smørgrav} 715f385077SDag-Erling Smørgrav 725f385077SDag-Erling Smørgrav# 736fd07539SDag-Erling Smørgrav# Print the version of the currently running kernel. 746fd07539SDag-Erling Smørgrav# 756fd07539SDag-Erling Smørgravrunning_version() { 766fd07539SDag-Erling Smørgrav sysctl -n kern.osrelease 776fd07539SDag-Erling Smørgrav} 786fd07539SDag-Erling Smørgrav 796fd07539SDag-Erling Smørgrav# 805f385077SDag-Erling Smørgrav# Print the hardcoded userland version. 815f385077SDag-Erling Smørgrav# 825f385077SDag-Erling Smørgravuserland_version() { 835f385077SDag-Erling Smørgrav echo $USERLAND_VERSION 845f385077SDag-Erling Smørgrav} 855f385077SDag-Erling Smørgrav 865f385077SDag-Erling Smørgrav# 87*f54b18fcSFaraz Vahedi# Print the hardcoded userland version of a jail. 88*f54b18fcSFaraz Vahedi# 89*f54b18fcSFaraz Vahedijail_version() { 90*f54b18fcSFaraz Vahedi for i in $jail; do 91*f54b18fcSFaraz Vahedi jexec -- $i freebsd-version 92*f54b18fcSFaraz Vahedi done 93*f54b18fcSFaraz Vahedi} 94*f54b18fcSFaraz Vahedi 95*f54b18fcSFaraz Vahedi# 965f385077SDag-Erling Smørgrav# Print a usage string and exit. 975f385077SDag-Erling Smørgrav# 985f385077SDag-Erling Smørgravusage() { 99*f54b18fcSFaraz Vahedi echo "usage: $progname [-kru] [-j jail]" >&2 1005f385077SDag-Erling Smørgrav exit 1 1015f385077SDag-Erling Smørgrav} 1025f385077SDag-Erling Smørgrav 1035f385077SDag-Erling Smørgrav# 1045f385077SDag-Erling Smørgrav# Main program. 1055f385077SDag-Erling Smørgrav# 1065f385077SDag-Erling Smørgravmain() { 1075f385077SDag-Erling Smørgrav # parse command-line arguments 108*f54b18fcSFaraz Vahedi local OPTIND=1 OPTARG option 109*f54b18fcSFaraz Vahedi while getopts "kruj:" option ; do 1105f385077SDag-Erling Smørgrav case $option in 1115f385077SDag-Erling Smørgrav k) 1125f385077SDag-Erling Smørgrav opt_k=1 1135f385077SDag-Erling Smørgrav ;; 1146fd07539SDag-Erling Smørgrav r) 1156fd07539SDag-Erling Smørgrav opt_r=1 1166fd07539SDag-Erling Smørgrav ;; 1175f385077SDag-Erling Smørgrav u) 1185f385077SDag-Erling Smørgrav opt_u=1 1195f385077SDag-Erling Smørgrav ;; 120*f54b18fcSFaraz Vahedi j) 121*f54b18fcSFaraz Vahedi if [ $opt_j ] ; then 122*f54b18fcSFaraz Vahedi jail="$jail $OPTARG" 123*f54b18fcSFaraz Vahedi else 124*f54b18fcSFaraz Vahedi opt_j=1 125*f54b18fcSFaraz Vahedi jail="$OPTARG" 126*f54b18fcSFaraz Vahedi fi 127*f54b18fcSFaraz Vahedi ;; 1285f385077SDag-Erling Smørgrav *) 1295f385077SDag-Erling Smørgrav usage 1305f385077SDag-Erling Smørgrav ;; 1315f385077SDag-Erling Smørgrav esac 1325f385077SDag-Erling Smørgrav done 1335f385077SDag-Erling Smørgrav if [ $OPTIND -le $# ] ; then 1345f385077SDag-Erling Smørgrav usage 1355f385077SDag-Erling Smørgrav fi 1365f385077SDag-Erling Smørgrav 1375f385077SDag-Erling Smørgrav # default is -u 138*f54b18fcSFaraz Vahedi if [ $((opt_k + opt_r + opt_u + opt_j)) -eq 0 ] ; then 1395f385077SDag-Erling Smørgrav opt_u=1 1405f385077SDag-Erling Smørgrav fi 1415f385077SDag-Erling Smørgrav 1426fd07539SDag-Erling Smørgrav # print installed kernel version 1435f385077SDag-Erling Smørgrav if [ $opt_k ] ; then 1445f385077SDag-Erling Smørgrav kernel_version 1455f385077SDag-Erling Smørgrav fi 1465f385077SDag-Erling Smørgrav 1476fd07539SDag-Erling Smørgrav # print running kernel version 1486fd07539SDag-Erling Smørgrav if [ $opt_r ] ; then 1496fd07539SDag-Erling Smørgrav running_version 1506fd07539SDag-Erling Smørgrav fi 1516fd07539SDag-Erling Smørgrav 1525f385077SDag-Erling Smørgrav # print userland version 1535f385077SDag-Erling Smørgrav if [ $opt_u ] ; then 1545f385077SDag-Erling Smørgrav userland_version 1555f385077SDag-Erling Smørgrav fi 156*f54b18fcSFaraz Vahedi 157*f54b18fcSFaraz Vahedi # print jail version 158*f54b18fcSFaraz Vahedi if [ $opt_j ] ; then 159*f54b18fcSFaraz Vahedi jail_version 160*f54b18fcSFaraz Vahedi fi 1615f385077SDag-Erling Smørgrav} 1625f385077SDag-Erling Smørgrav 1635f385077SDag-Erling Smørgravmain "$@" 164