Update uninstall script.
[pkgusr] / usr / lib / pkgusr / uninstall_package
1 #!/bin/sh
2 # Original...
3 # Copyright (c) 2004 Matthias S. Benkmann <article AT winterdrache DOT de>
4 # You may do everything with this code except misrepresent its origin.
5 # PROVIDED `AS IS' WITH ABSOLUTELY NO WARRANTY OF ANY KIND!
6
7 # Copyright (C) 2007 - 2014 Steve Youngs <steve@sxemacs.org>
8 # Originally, all this script did was to echo a command to stdout.  It didn't
9 # actually do any deleting.  To remove the package you had to kill/yank that
10 # command and then remove the "echo"s in it to get the job done.
11
12 # Rewritten to eliminate the need for kill/yank and echo removal.  The default
13 # is still a dry-run, but now the "wet" run is achieved by adding a 2nd argument
14 # to the command line: `now'.  The `dry_run' is piped through less(1) for easier
15 # inspection.  And errors are redirected to /tmp/<pkgname>.err during the real
16 # uninstall.
17
18 if [ $(id -u) -eq 0 ]; then
19         echo 1>&2 "It is too hazardous to delete packages with root"
20         echo 1>&2 "Aborting"
21         exit 1
22 fi
23
24 pkg=$1
25
26 usage()
27 {
28         cat<<EOF
29 USAGE: uninstall_package pgname [now]
30
31 PGNAME is the name of the package.  Normally, this would be the same
32         as the pkgusr name, but can also be a group name.
33
34 Unless you specify "now" as the 2nd arg, nothing will actually
35 be deleted.
36
37 EOF
38 }
39
40
41 check_suid()
42 {
43         forall_direntries_from ${pkg} -not -user $(whoami) -fprint /tmp/${pkg}.suid
44         if [ -s /tmp/${pkg}.suid ]; then
45                 HAVE_SUID=1
46         else
47                 HAVE_SUID=0
48         fi
49 }
50
51 dry_run()
52 {
53         forall_direntries_from ${pkg} -not -type d -exec echo rm -vf {} 2>/dev/null \;
54         check_suid
55         if [ $HAVE_SUID -eq 1 ]; then
56                 echo ******************** S U I D ***********************
57                 echo Detected setuid files that must be dealt with before
58                 echo this package can be safely removed.
59                 echo
60                 echo See: /tmp/${pkg}.suid
61                 echo ******************** S U I D ***********************
62         fi
63         echo
64         echo Use: \`uninstall_package ${pkg} now\' to really remove this package.
65         echo Any errors will be redirected to /tmp/${pkg}.err
66 }
67
68 run()
69 {
70         # Check for suid
71         check_suid
72         if [ $HAVE_SUID -eq 1 ]; then
73                 echo 1>&2 ******************** S U I D ***********************
74                 echo 1>&2 Detected setuid files that must be dealt with before
75                 echo 1>&2 this package can be safely removed.
76                 echo 1>&2
77                 echo 1>&2 See: /tmp/${pkg}.suid
78                 echo 1>&2 ******************** S U I D ***********************
79                 exit 2
80         fi
81
82         # Delete anything that isn't a directory
83         forall_direntries_from ${pkg} \
84             -not -type d -exec rm -vf {} 2>>/tmp/${pkg}.err \;
85
86         # Remove any empty directories, but ONLY empty directories
87         dirlist=$(mktemp --tmpdir dirs.XXXXXXXX)
88         forall_direntries_from ${pkg} -type d -empty -fprint ${dirlist}
89         while [ -s ${dirlist} ]; do
90                 while read dir; do
91                         rmdir -v ${dir} 2>>/tmp/${pkg}.err
92                 done<${dirlist}
93                 forall_direntries_from ${pkg} -type d -empty -fprint ${dirlist}
94         done
95
96         # Make sure there isn't anything left
97         leftovers=$(forall_direntries_from ${pkg})
98         if [ -s /tmp/${pkg}.err -a -n "${leftovers}" ]; then
99                 echo Errors were reported.  Please inspect /tmp/${pkg}.err
100                 exit 1
101         else
102                 rm -f /tmp/${pkg}.err ${dirlist} /tmp/${pkg}.suid
103         fi
104
105         # Bring ~/.project inline with reality
106         echo -n "Updating .project file... "
107         if [ ${pkg} = $(id -un) ]; then
108                 sed -i -e 's/\(Last_Updated: \).*$/\1Not Installed/' \
109                     -e 's/\(Version: \).*$/\1Not Installed/' \
110                         -e 's/\(Deps: \).*$/\1Not Installed/' ${HOME}/.project
111                 awk '/^CONTENTS:/ { print; exit; } {print}' ${HOME}/.project > \
112                     ${HOME}/.projtmp
113                 echo "--------" >> ${HOME}/.projtmp
114                 mv ${HOME}/.projtmp ${HOME}/.project
115         else
116                 # doing a sub-pkg, just update-pkg-project
117                 update-pkg-project $(whoami)
118         fi
119         echo "Done!"
120         # We should be done.
121         echo Package: ${pkg} successfully removed
122 }
123
124 if [ ${pkg} != $(id -un) -a ${pkg} != $(id -gn) ]; then
125         usage
126         exit 0
127 fi
128
129 if [ "$2" = "now" ]; then
130         IGNORE_READDIR_RACE='-ignore_readdir_race' \
131         run
132 else
133         dry_run|less
134 fi
135
136 exit 0