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

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

Make sure we also allow updating, when port is known to be bad (usually fixed in a couple of days).

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