xref: /freebsd/bin/freebsd-version/freebsd-version.sh.in (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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