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!
|
---|
11 | FALSE=0
|
---|
12 | TRUE=1
|
---|
13 |
|
---|
14 | UNSAFE=${UNSAFE:-0}
|
---|
15 | if [ "$UNSAFE" != "0" ]; then
|
---|
16 | echo "# WARNING: Vunabilitiy check disabled!"
|
---|
17 | sleep 1
|
---|
18 | fi
|
---|
19 |
|
---|
20 | ask_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 |
|
---|
36 | echo_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
|
---|
47 | if [ `id -u` -ne 0 ]; then
|
---|
48 | echo "Sorry root only" 1>&2
|
---|
49 | exit 128
|
---|
50 | fi
|
---|
51 |
|
---|
52 | # Make sure we always using the latest version
|
---|
53 | svn up --non-interactive $(dirname $0) | grep '^[A-Z] '
|
---|
54 | if [ $? -eq 0 ]; then
|
---|
55 | sh $0
|
---|
56 | exit 0
|
---|
57 | fi
|
---|
58 |
|
---|
59 | #
|
---|
60 | # Check which ports-mgnt tool to use to upgrade outdated ports
|
---|
61 | #
|
---|
62 | FORCE_PORTUPGRADE=${FORCE_PORTUPGRADE:-$FALSE}
|
---|
63 | FORCE_PORTMASTER=${FORCE_PORTMASTER:-$FALSE}
|
---|
64 |
|
---|
65 | PORTUPGRADE_INSTALLED=$FALSE
|
---|
66 | PORTMASTER_INSTALLED=$FALSE
|
---|
67 | USE_PORTMGNT="none"
|
---|
68 | if [ -n "`whereis -qb portupgrade`" ]; then
|
---|
69 | PORTUPGRADE_INSTALLED=$TRUE
|
---|
70 | fi
|
---|
71 | if [ -n "`whereis -qb portmaster`" ]; then
|
---|
72 | PORTMASTER_INSTALLED=$TRUE
|
---|
73 | fi
|
---|
74 |
|
---|
75 | if [ $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"
|
---|
81 | elif [ $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"
|
---|
87 | else
|
---|
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
|
---|
104 | fi
|
---|
105 |
|
---|
106 |
|
---|
107 |
|
---|
108 |
|
---|
109 |
|
---|
110 | DIRNAME=`dirname $0`
|
---|
111 | BATCH=${BATCH-""}
|
---|
112 |
|
---|
113 | # Get list of rc.d marked for updates
|
---|
114 | RC_FILES=`$DIRNAME/port-list.sh`
|
---|
115 | RUNNING_DAEMONS=""
|
---|
116 |
|
---|
117 | for RC_FILE in $RC_FILES; do
|
---|
118 | $RC_FILE onestatus | grep -q 'is running as' && {
|
---|
119 | RUNNING_DAEMONS="$RUNNING_DAEMONS $RC_FILE"
|
---|
120 | }
|
---|
121 | done
|
---|
122 |
|
---|
123 | # Update port tree
|
---|
124 | echo "# Updating portstree ..."
|
---|
125 | portsnap update > /dev/null
|
---|
126 |
|
---|
127 | # Update ports listing
|
---|
128 | echo "# Checking ports which needs updating ..."
|
---|
129 | NEWPORTS=`pkg_version -qol '<'`
|
---|
130 |
|
---|
131 | # Check for potentional trouble.
|
---|
132 | # XXX: Weird -q does not strip at '!' check
|
---|
133 | BROKENPORTS=`pkg_version -qol '!' | awk '{print $1}'`
|
---|
134 | if [ -n "$BROKENPORTS" ]; then
|
---|
135 | echo "# WARNING comparion failed, fix by hand"; echo_list "# - " $BROKENPORTS
|
---|
136 | fi
|
---|
137 |
|
---|
138 |
|
---|
139 | if [ -z "$NEWPORTS" ]; then
|
---|
140 | echo "# No ports to update"
|
---|
141 | echo "# All done, goodbye"
|
---|
142 | exit 0
|
---|
143 | fi
|
---|
144 |
|
---|
145 | # Check for broken pkgdb, else we have trouble during upgrades
|
---|
146 | if [ $USE_PORTMGNT = "portupgrade" ]; then
|
---|
147 | pkgdb -a || exit 1
|
---|
148 | fi
|
---|
149 |
|
---|
150 | #
|
---|
151 | # Update ports
|
---|
152 | if [ -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
|
---|
191 | fi
|
---|
192 | echo "# Using update tool '$USE_PORTMGNT"
|
---|
193 | case $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 | ;;
|
---|
207 | esac
|
---|
208 |
|
---|
209 | echo "# Ports updated:"
|
---|
210 | echo_list "# - " $NEWPORTS
|
---|
211 | #
|
---|
212 | # (Re)start daemons. Assume we only like to start the just stopped ones.
|
---|
213 | if [ -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
|
---|
232 | fi
|
---|
233 |
|
---|
234 | echo "# All done, goodbye"
|
---|