]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - bin/freebsd-version/freebsd-version.sh.in
MFV: xz 5.4.0
[FreeBSD/FreeBSD.git] / bin / freebsd-version / freebsd-version.sh.in
1 #!/bin/sh
2 #-
3 # Copyright (c) 2013 Dag-Erling Smørgrav
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 # SUCH DAMAGE.
26 #
27 # $FreeBSD$
28 #
29
30 set -e
31
32 USERLAND_VERSION="@@REVISION@@-@@BRANCH@@"
33
34 : ${ROOT:=}
35 : ${LOADER_DIR:=$ROOT/boot}
36 : ${LOADER_CONF_FILES:=$LOADER_DIR/defaults/loader.conf $LOADER_DIR/loader.conf $LOADER_DIR/loader.conf.local}
37 LOADER_RE1='^\([A-Z_a-z][0-9A-Z_a-z]*=[-./0-9A-Z_a-z]\{1,\}\).*$'
38 LOADER_RE2='^\([A-Z_a-z][0-9A-Z_a-z]*="[-./0-9A-Z_a-z]\{1,\}"\).*$'
39 KERNEL_RE='^@@TYPE@@ \([-.0-9A-Za-z]\{1,\}\) .*$'
40
41 progname=${0##*/}
42
43 #
44 # Print an error message and exit.
45 #
46 error() {
47         echo "$progname: $*" >&2
48         exit 1
49 }
50
51 #
52 # Try to get the name of the installed kernel from loader.conf and
53 # return the full path.  If loader.conf does not exist or we could not
54 # read it, return the path to the default kernel.
55 #
56 kernel_file() {
57         eval $(sed -n "s/$LOADER_RE1/\\1;/p; s/$LOADER_RE2/\\1;/p" \
58             $LOADER_CONF_FILES 2>/dev/null)
59         echo "$LOADER_DIR/${kernel:-kernel}/${bootfile:-kernel}"
60 }
61
62 #
63 # Extract the kernel version from the installed kernel.
64 #
65 kernel_version() {
66         kernfile=$(kernel_file)
67         if [ ! -f "$kernfile" -o ! -r "$kernfile" ] ; then
68                 error "unable to locate kernel"
69         fi
70         what -qs "$kernfile" | sed -n "s/$KERNEL_RE/\\1/p"
71 }
72
73 #
74 # Print the version of the currently running kernel.
75 #
76 running_version() {
77         sysctl -n kern.osrelease
78 }
79
80 #
81 # Print the hardcoded userland version.
82 #
83 userland_version() {
84         echo $USERLAND_VERSION
85 }
86
87 #
88 # Print the hardcoded userland version of a jail.
89 #
90 jail_version() {
91         for i in $jail; do
92                 jexec -- $i freebsd-version
93         done
94 }
95
96 #
97 # Print a usage string and exit.
98 #
99 usage() {
100         echo "usage: $progname [-kru] [-j jail]" >&2
101         exit 1
102 }
103
104 #
105 # Main program.
106 #
107 main() {
108         # parse command-line arguments
109         local OPTIND=1 OPTARG option
110         while getopts "kruj:" option ; do
111                 case $option in
112                 k)
113                         opt_k=1
114                         ;;
115                 r)
116                         opt_r=1
117                         ;;
118                 u)
119                         opt_u=1
120                         ;;
121                 j)
122                         if [ $opt_j ] ; then
123                                 jail="$jail $OPTARG"
124                         else
125                                 opt_j=1
126                                 jail="$OPTARG"
127                         fi
128                         ;;
129                 *)
130                         usage
131                         ;;
132                 esac
133         done
134         if [ $OPTIND -le $# ] ; then
135                 usage
136         fi
137
138         # default is -u
139         if [ $((opt_k + opt_r + opt_u + opt_j)) -eq 0 ] ; then
140                 opt_u=1
141         fi
142
143         # print installed kernel version
144         if [ $opt_k ] ; then
145                 kernel_version
146         fi
147
148         # print running kernel version
149         if [ $opt_r ] ; then
150                 running_version
151         fi
152
153         # print userland version
154         if [ $opt_u ] ; then
155                 userland_version
156         fi
157
158         # print jail version
159         if [ $opt_j ] ; then
160                 jail_version
161         fi
162 }
163
164 main "$@"