source: freebsd-mgnt/system-update.sh@ 406

Last change on this file since 406 was 351, checked in by Rick van der Zwet, 13 years ago

allow batch mode edits...

  • Property svn:executable set to *
File size: 5.9 KB
Line 
1#!/bin/sh
2# FreeBSD system port upgrade script
3#
4# Licence: BSDLike - http://rickvanderzwet.nl/LICENSE
5# Rick van der Zwet <info@rickvanderzwet.nl>
6
7. /etc/rc.subr
8
9# Pointers to avoid confusion co-respond with logical boolean style values.
10# WARNING do not compare with exit codes!
11FALSE=0
12TRUE=1
13
14UNSAFE=${UNSAFE:-0}
15if [ "$UNSAFE" != "0" ]; then
16 echo "# WARNING: Vunabilitiy check disabled!"
17 sleep 1
18fi
19
20ask_question() {
21 # Will return 1 if yes, return 0 if no
22 QUESTION=$1
23 DEFAULT=$2
24 if [ -n "$BATCH" ]; then
25 INPUT="yes"
26 echo "$QUESTION? [$DEFAULT]: $INPUT (BATCH MODE)"
27 else
28 echo -n "$QUESTION? [$DEFAULT]: "; read INPUT
29 fi
30
31 INPUT=${INPUT:-"${DEFAULT}"}
32 checkyesno INPUT || return 1 && return 0
33
34}
35
36echo_list() {
37 PREFIX=$1
38 shift
39 for ENTRY in $*; do
40 echo "$PREFIX $ENTRY"
41 done
42}
43
44
45#
46# SuperCow power only
47if [ `id -u` -ne 0 ]; then
48 echo "Sorry root only" 1>&2
49 exit 128
50fi
51
52# Make sure we always using the latest version
53svn up --non-interactive $(dirname $0) | grep '^[A-Z] '
54if [ $? -eq 0 ]; then
55 sh $0
56 exit 0
57fi
58
59#
60# Check which ports-mgnt tool to use to upgrade outdated ports
61#
62FORCE_PORTUPGRADE=${FORCE_PORTUPGRADE:-$FALSE}
63FORCE_PORTMASTER=${FORCE_PORTMASTER:-$FALSE}
64
65PORTUPGRADE_INSTALLED=$FALSE
66PORTMASTER_INSTALLED=$FALSE
67USE_PORTMGNT="none"
68if [ -n "`whereis -qb portupgrade`" ]; then
69 PORTUPGRADE_INSTALLED=$TRUE
70fi
71if [ -n "`whereis -qb portmaster`" ]; then
72 PORTMASTER_INSTALLED=$TRUE
73fi
74
75if [ $FORCE_PORTMASTER -eq $TRUE ]; then
76 if [ $PORTMASTER_INSTALLED -eq $FALSE ]; then
77 echo "# ERROR: FORCE_PORTMASTER set but binary not found"
78 exit 1
79 fi
80 USE_PORTMGNT="portmaster"
81elif [ $FORCE_PORTUPGRADE -eq $TRUE ]; then
82 if [ $PORTUPGRADE_INSTALLED -eq $FALSE ]; then
83 echo "# ERROR: FORCE_PORTUPGRADE set but binary not found"
84 exit 1
85 fi
86 USE_PORTMGNT="portupgrade"
87else
88 if [ $PORTUPGRADE_INSTALLED -eq $TRUE ]; then
89 if [ $PORTMASTER_INSTALLED -eq $TRUE ]; then
90 echo "# ERROR: both portmaster and portupgrade are installed"
91 echo "# Pick your favorite by setting either FORCE_PORTMASTER=1 or FORCE_PORTUPGRADE=1"
92 exit 1
93 fi
94 USE_PORTMGNT="portupgrade"
95 else
96 if [ $PORTMASTER_INSTALLED -eq $FALSE ]; then
97 echo "# WARNING: ports-mgnt/portupgrade not found!"
98 echo "# WARNING: ports-mgnt/portmaster not found!"
99 echo "# ERROR : Not port upgrade tool installed"
100 exit 1
101 fi
102 USE_PORTMGNT="portmaster"
103 fi
104fi
105
106
107
108
109
110DIRNAME=`dirname $0`
111BATCH=${BATCH-""}
112
113# Get list of rc.d marked for updates
114RC_FILES=`$DIRNAME/port-list.sh`
115RUNNING_DAEMONS=""
116
117for RC_FILE in $RC_FILES; do
118 $RC_FILE onestatus | grep -q 'is running as' && {
119 RUNNING_DAEMONS="$RUNNING_DAEMONS $RC_FILE"
120 }
121done
122
123# Update port tree
124echo "# Updating portstree ..."
125portsnap update > /dev/null
126
127# Update ports listing
128echo "# Checking ports which needs updating ..."
129NEWPORTS=`pkg_version -qol '<'`
130
131# Check for potentional trouble.
132# XXX: Weird -q does not strip at '!' check
133BROKENPORTS=`pkg_version -qol '!' | awk '{print $1}'`
134if [ -n "$BROKENPORTS" ]; then
135 echo "# WARNING comparion failed, fix by hand"; echo_list "# - " $BROKENPORTS
136fi
137
138
139if [ -z "$NEWPORTS" ]; then
140 echo "# No ports to update"
141 echo "# All done, goodbye"
142 exit 0
143fi
144
145# Check for broken pkgdb, else we have trouble during upgrades
146if [ $USE_PORTMGNT = "portupgrade" ]; then
147 pkgdb -a || exit 1
148fi
149
150#
151# Update ports
152if [ -z "$BATCH" ]; then
153 # Make sure we have read the (new) UPDATING announcements
154 # Use ls to display the last motification time of the directories in
155 # /var/db/pkg and assume that is the last time the user read the
156 # UPDATING file
157 LAST_UPDATED=`ls -rtlD '%Y%m%d' /var/db/pkg/ | awk 'END{print $6}'`
158
159 # Find new entries
160 TMPFILE=`mktemp -t $(basename $0).XXX`
161 awk -F: -v last=$LAST_UPDATED '{if (match($0,"^[0-9]+:$") && $1 < last) {exit}; print $0}' /usr/ports/UPDATING > $TMPFILE
162
163 echo "# Show new /usr/ports/UPDATING entries (starting from $LAST_UPDATED) ..."
164 if [`cat $TMPFILE | wc -l` -eq 7 ]; then
165 echo "## No new entries found"
166 else
167 cat $TMPFILE
168 fi
169 rm $TMPFILE
170
171 # agree to the terms of the game
172 echo "# Ports pending update:"
173 echo_list "# - " $NEWPORTS
174 ask_question "# Do you like to upgrade the affected ports" "no" || exit 1
175
176 #
177 # Stop daemons
178 DAEMONS_STOPPED=$FALSE
179 if [ -n "$RC_FILES" ]; then
180 echo "# Affected daemons:"; echo_list "# - " $RC_FILES
181 if [ -n "$RUNNING_DAEMONS" ]; then
182 echo "# Running daemons:"; echo_list "# - " $RUNNING_DAEMONS
183 ask_question "# Do you like to stop running daemons" "yes" && {
184 for RC_FILE in $RUNNING_DAEMONS; do
185 $RC_FILE stop
186 done;
187 DAEMONS_STOPPED=$TRUE
188 }
189 fi
190 fi
191fi
192echo "# Using update tool '$USE_PORTMGNT"
193case $USE_PORTMGNT in
194 portupgrade)
195 case $UNSAFE in
196 0) portupgrade -r -mBATCH=yes -a $NEWPORTS ;;
197 1) portupgrade -r -mBATCH=yes -mDISABLE_VULNERABILITIES=yes -a $NEWPORTS ;;
198 esac
199 ;;
200 portmaster)
201 portmaster -d --no-confirm --no-term-title --no-index-fetch -mBATCH=yes -a $NEWPORTS
202 ;;
203 *)
204 echo "# ERROR: Failed to find a port management tool"
205 exit 1
206 ;;
207esac
208
209echo "# Ports updated:"
210echo_list "# - " $NEWPORTS
211#
212# (Re)start daemons. Assume we only like to start the just stopped ones.
213if [ -n "$RC_FILES" ]; then
214 echo "# Affected daemons:"; echo_list "# - " $RC_FILES
215 if [ -n "$RUNNING_DAEMONS" ]; then
216 if [ $DAEMONS_STOPPED -eq $TRUE ]; then
217 echo "# Enabled daemons: "; echo_list "# - " $RUNNING_DAEMONS
218 ask_question "# Do you like to start your daemons" "yes" && {
219 for RC_FILE in $RUNNING_DAEMONS; do
220 $RC_FILE start
221 done
222 }
223 else
224 echo "# Running daemons: "; echo_list "# - " $RUNNING_DAEMONS
225 ask_question "# Do you like to restart your daemons" "yes" && {
226 for RC_FILE in $RUNNING_DAEMONS; do
227 $RC_FILE restart
228 done
229 }
230 fi
231 fi
232fi
233
234echo "# All done, goodbye"
Note: See TracBrowser for help on using the repository browser.