1 #!/bin/bash |
|
2 |
|
3 # |
|
4 # Script to install/uninstall packages produced by jpackage jtreg |
|
5 # tests doing platform specific packaging. |
|
6 # |
|
7 # The script will install/uninstall all packages from the files |
|
8 # found in the current directory or the one specified with command line option. |
|
9 # |
|
10 # When jtreg jpackage tests are executed with jpackage.test.output |
|
11 # Java property set, produced package files (msi, exe, deb, rpm, etc.) will |
|
12 # be saved in the directory specified with this property. |
|
13 # |
|
14 # Usage example: |
|
15 # # Set directory where to save package files from jtreg jpackage tests |
|
16 # JTREG_OUTPUT_DIR=/tmp/jpackage_jtreg_packages |
|
17 # |
|
18 # # Run tests and fill $JTREG_OUTPUT_DIR directory with package files |
|
19 # jtreg -Djpackage.test.output=$JTREG_OUTPUT_DIR ... |
|
20 # |
|
21 # # Install all packages |
|
22 # manage_pachages.sh -d $JTREG_OUTPUT_DIR |
|
23 # |
|
24 # # Uninstall all packages |
|
25 # manage_pachages.sh -d $JTREG_OUTPUT_DIR -u |
|
26 # |
|
27 |
|
28 # |
|
29 # When using with MSI installers, Cygwin shell from which this script is |
|
30 # executed should be started as administrator. Otherwise silent installation |
|
31 # won't work. |
|
32 # |
|
33 |
|
34 # Fail fast |
|
35 set -e; set -o pipefail; |
|
36 |
|
37 |
|
38 help_usage () |
|
39 { |
|
40 echo "Usage: `basename $0` [OPTION]" |
|
41 echo "Options:" |
|
42 echo " -h - print this message" |
|
43 echo " -v - verbose output" |
|
44 echo " -d <dir> - path to directory where to look for package files" |
|
45 echo " -u - uninstall packages instead of the default install" |
|
46 echo " -t - dry run, print commands but don't execute them" |
|
47 } |
|
48 |
|
49 error () |
|
50 { |
|
51 echo "$@" > /dev/stderr |
|
52 } |
|
53 |
|
54 fatal () |
|
55 { |
|
56 error "$@" |
|
57 exit 1 |
|
58 } |
|
59 |
|
60 fatal_with_help_usage () |
|
61 { |
|
62 error "$@" |
|
63 help_usage |
|
64 exit 1 |
|
65 } |
|
66 |
|
67 |
|
68 # Directory where to look for package files. |
|
69 package_dir=$PWD |
|
70 |
|
71 # Script debug. |
|
72 verbose= |
|
73 |
|
74 # Operation mode. |
|
75 mode=install |
|
76 |
|
77 dryrun= |
|
78 |
|
79 while getopts "vhd:ut" argname; do |
|
80 case "$argname" in |
|
81 v) verbose=yes;; |
|
82 t) dryrun=yes;; |
|
83 u) mode=uninstall;; |
|
84 d) package_dir="$OPTARG";; |
|
85 h) help_usage; exit 0;; |
|
86 ?) help_usage; exit 1;; |
|
87 esac |
|
88 done |
|
89 shift $(( OPTIND - 1 )) |
|
90 |
|
91 [ -d "$package_dir" ] || fatal_with_help_usage "Package directory [$package_dir] is not a directory" |
|
92 |
|
93 [ -z "$verbose" ] || set -x |
|
94 |
|
95 |
|
96 function find_packages_of_type () |
|
97 { |
|
98 # sort output alphabetically |
|
99 find "$package_dir" -maxdepth 1 -type f -name '*.'"$1" | sort |
|
100 } |
|
101 |
|
102 function find_packages () |
|
103 { |
|
104 local package_suffixes=(deb rpm msi exe) |
|
105 for suffix in "${package_suffixes[@]}"; do |
|
106 if [ "$mode" == "uninstall" ]; then |
|
107 packages=$(find_packages_of_type $suffix | tac) |
|
108 else |
|
109 packages=$(find_packages_of_type $suffix) |
|
110 fi |
|
111 if [ -n "$packages" ]; then |
|
112 package_type=$suffix |
|
113 break; |
|
114 fi |
|
115 done |
|
116 } |
|
117 |
|
118 |
|
119 # RPM |
|
120 install_cmd_rpm () |
|
121 { |
|
122 echo sudo rpm --install "$@" |
|
123 } |
|
124 uninstall_cmd_rpm () |
|
125 { |
|
126 local package_name=$(rpm -qp --queryformat '%{Name}' "$@") |
|
127 echo sudo rpm -e "$package_name" |
|
128 } |
|
129 |
|
130 # DEB |
|
131 install_cmd_deb () |
|
132 { |
|
133 echo sudo dpkg -i "$@" |
|
134 } |
|
135 uninstall_cmd_deb () |
|
136 { |
|
137 local package_name=$(dpkg-deb -f "$@" Package) |
|
138 echo sudo dpkg -r "$package_name" |
|
139 } |
|
140 |
|
141 # MSI |
|
142 install_cmd_msi () |
|
143 { |
|
144 echo msiexec /qn /norestart /i $(cygpath -w "$@") |
|
145 } |
|
146 uninstall_cmd_msi () |
|
147 { |
|
148 echo msiexec /qn /norestart /x $(cygpath -w "$@") |
|
149 } |
|
150 |
|
151 # EXE |
|
152 install_cmd_exe () |
|
153 { |
|
154 echo "$@" |
|
155 } |
|
156 uninstall_cmd_exe () |
|
157 { |
|
158 error No implemented |
|
159 } |
|
160 |
|
161 |
|
162 # Find packages |
|
163 packages= |
|
164 find_packages |
|
165 if [ -z "$packages" ]; then |
|
166 echo "No packages found in $package_dir directory" |
|
167 exit |
|
168 fi |
|
169 |
|
170 # Build list of commands to execute |
|
171 declare -a commands |
|
172 for p in $packages; do |
|
173 commands[${#commands[@]}]=$(${mode}_cmd_${package_type} "$p") |
|
174 done |
|
175 |
|
176 if [ -z "$dryrun" ]; then |
|
177 # Run commands |
|
178 for cmd in "${commands[@]}"; do |
|
179 echo Running: $cmd |
|
180 $cmd || true; |
|
181 done |
|
182 else |
|
183 # Print commands |
|
184 for cmd in "${commands[@]}"; do echo $cmd; done |
|
185 fi |
|