]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl | |
2 | ############################################################################### | |
3 | # # | |
4 | # IPFire.org - A linux based firewall # | |
5 | # Copyright (C) 2007-2015 IPFire Team <info@ipfire.org> # | |
6 | # # | |
7 | # This program is free software: you can redistribute it and/or modify # | |
8 | # it under the terms of the GNU General Public License as published by # | |
9 | # the Free Software Foundation, either version 3 of the License, or # | |
10 | # (at your option) any later version. # | |
11 | # # | |
12 | # This program is distributed in the hope that it will be useful, # | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # | |
15 | # GNU General Public License for more details. # | |
16 | # # | |
17 | # You should have received a copy of the GNU General Public License # | |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. # | |
19 | # # | |
20 | ############################################################################### | |
21 | ||
22 | ### Clean up our environment | |
23 | # | |
24 | delete @ENV{qw(IFS CDPATH ENV BASH_ENV PATH)}; | |
25 | $< = $>; | |
26 | ||
27 | # Store keys here | |
28 | $ENV{"GNUPGHOME"} = "/opt/pakfire/etc/.gnupg"; | |
29 | ||
30 | require "/opt/pakfire/lib/functions.pl"; | |
31 | ||
32 | my $interactive = 1; | |
33 | my $force = "noforce"; | |
34 | ||
35 | &Pakfire::logger("PAKFIRE INFO: IPFire Pakfire $Conf::version started!"); | |
36 | ||
37 | ### Check if we are running as root | |
38 | # | |
39 | my $user = qx(whoami); | |
40 | chomp($user); | |
41 | unless ( "$user" eq "root" ) { | |
42 | &Pakfire::message("PAKFIRE ERROR: You must run pakfire as user root!"); | |
43 | exit 1; | |
44 | } | |
45 | ||
46 | unless ( -e "/var/ipfire/red/active" ) { | |
47 | &Pakfire::message("PAKFIRE ERROR: You need to be online to run pakfire!"); | |
48 | exit 2; | |
49 | } | |
50 | ||
51 | ### Check if we are started by another name | |
52 | # | |
53 | if ( $0 =~ /pakfire-update$/ ) { | |
54 | &Pakfire::message("CRON INFO: Running an update"); | |
55 | my $random = int(rand(60)); | |
56 | &Pakfire::logger("CRON INFO: Waiting for $random seconds."); | |
57 | sleep($random); | |
58 | $ARGV[0] = "update"; | |
59 | $interactive = 0; | |
60 | } elsif ( $0 =~ /pakfire-upgrade$/ ) { | |
61 | &Pakfire::message("CRON INFO: Running an upgrade"); | |
62 | my $random = int(rand(3600)); | |
63 | &Pakfire::logger("CRON INFO: Waiting for $random seconds."); | |
64 | sleep($random); | |
65 | $ARGV[0] = "upgrade"; | |
66 | $interactive = 0; | |
67 | } | |
68 | ||
69 | unless (@ARGV) { | |
70 | &Pakfire::usage; | |
71 | } | |
72 | ||
73 | foreach (@ARGV) { | |
74 | if ("$_" =~ "^-") { | |
75 | # Turn off interactive mode | |
76 | $interactive = 0 if ("$_" eq "--non-interactive"); | |
77 | $interactive = 0 if ("$_" eq "-y"); | |
78 | ||
79 | # Turn off shell colors - Bad for displaying in webinterface | |
80 | $Pakfire::enable_colors = 0 if ("$_" eq "--no-colors"); | |
81 | ||
82 | # Turn on force mode | |
83 | $force = "force" if ("$_" eq "-f" ); | |
84 | $force = "force" if ("$_" eq "--force" ); | |
85 | } | |
86 | } | |
87 | ||
88 | if ("$ARGV[0]" eq "install") { | |
89 | shift; | |
90 | ||
91 | ### Make sure that the list is not outdated. | |
92 | &Pakfire::dbgetlist("noforce"); | |
93 | ||
94 | open(FILE, "<$Conf::dbdir/lists/packages_list.db"); | |
95 | my @db = <FILE>; | |
96 | close(FILE); | |
97 | ||
98 | my $dep; | |
99 | my @deps; | |
100 | my $pak; | |
101 | my @paks; | |
102 | my @temp; | |
103 | my @templine; | |
104 | my $found = 0; | |
105 | my $return; | |
106 | my @all; | |
107 | foreach $pak (@ARGV) { | |
108 | unless ("$pak" =~ "^-") { | |
109 | $return = &Pakfire::isinstalled($pak); | |
110 | if ($return eq 0) { | |
111 | &Pakfire::message("PAKFIRE INFO: $pak is already installed"); | |
112 | next; | |
113 | } | |
114 | $found = 0; | |
115 | foreach (@db) { | |
116 | @templine = split(/;/,$_); | |
117 | if ("$templine[0]" eq "$pak" ) { | |
118 | push(@paks,$pak); | |
119 | push(@all,$pak); | |
120 | @temp = &Pakfire::resolvedeps("$pak"); | |
121 | foreach $dep (@temp) { | |
122 | push(@deps,$dep) if $dep; | |
123 | push(@all,$dep) if $dep; | |
124 | } | |
125 | $found = 1; | |
126 | break; | |
127 | } | |
128 | } | |
129 | if ($found == 0) { | |
130 | &Pakfire::message(""); | |
131 | &Pakfire::message("PAKFIRE WARN: The pak \"$pak\" is not known. Please try running \"pakfire update\"."); | |
132 | } | |
133 | } | |
134 | } | |
135 | ||
136 | unless (@paks) { | |
137 | &Pakfire::message("PAKFIRE ERROR: No packages to install. Exiting..."); | |
138 | exit 1; | |
139 | } | |
140 | ||
141 | if (@deps) { | |
142 | my %sort = map{ $_, 1 } @deps; | |
143 | @deps = keys %sort; | |
144 | &Pakfire::message(""); | |
145 | &Pakfire::message("PAKFIRE INFO: Packages to install for dependencies:"); | |
146 | } | |
147 | foreach $dep (@deps) { | |
148 | my $size = &Pakfire::getsize("$dep"); | |
149 | $size = &Pakfire::beautifysize($size); | |
150 | &Pakfire::message("PAKFIRE INFO: $dep \t - $size"); | |
151 | } | |
152 | ||
153 | &Pakfire::message(""); | |
154 | &Pakfire::message(""); | |
155 | &Pakfire::message("PAKFIRE INFO: Packages to install:"); | |
156 | foreach $pak (@paks) { | |
157 | my $size = &Pakfire::getsize("$pak"); | |
158 | $size = &Pakfire::beautifysize($size); | |
159 | &Pakfire::message("PAKFIRE INFO: $pak \t - $size"); | |
160 | } | |
161 | ||
162 | my $totalsize; | |
163 | foreach $pak (@all) { | |
164 | $totalsize = ($totalsize + &Pakfire::getsize("$pak")); | |
165 | } | |
166 | $totalsize = &Pakfire::beautifysize($totalsize); | |
167 | &Pakfire::message(""); | |
168 | &Pakfire::message("PAKFIRE INFO: Total size: \t ~ $totalsize"); | |
169 | &Pakfire::message(""); | |
170 | ||
171 | if ($interactive) { | |
172 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); | |
173 | my $ret = <STDIN>; | |
174 | chomp($ret); | |
175 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); | |
176 | if ( $ret ne "y" ) { | |
177 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); | |
178 | exit 1; | |
179 | } | |
180 | } else { | |
181 | &Pakfire::logger("PAKFIRE INFO: Interaction skipped."); | |
182 | } | |
183 | ||
184 | # my %sort = map{ $_, 1 } @all; | |
185 | # @all = sort keys %sort; | |
186 | ||
187 | ### Download first | |
188 | foreach $pak (@all) { | |
189 | &Pakfire::getpak("$pak", ""); | |
190 | } | |
191 | ||
192 | &Pakfire::message(""); | |
193 | ||
194 | foreach $pak (@deps) { | |
195 | &Pakfire::setuppak("$pak") if ($pak ne ""); | |
196 | } | |
197 | ||
198 | ||
199 | foreach $pak (@paks) { | |
200 | &Pakfire::setuppak("$pak") if ($pak ne ""); | |
201 | } | |
202 | ||
203 | ||
204 | } elsif ("$ARGV[0]" eq "remove") { | |
205 | shift; | |
206 | ||
207 | my @paks; | |
208 | my $pak; | |
209 | foreach $pak (@ARGV) { | |
210 | unless ("$pak" =~ "^-") { | |
211 | $return = &Pakfire::isinstalled($pak); | |
212 | if ($return ne 0) { | |
213 | &Pakfire::message("PAKFIRE WARN: $pak is not installed"); | |
214 | next; | |
215 | } | |
216 | push(@paks, $pak); | |
217 | } | |
218 | } | |
219 | ||
220 | unless (@paks) { | |
221 | &Pakfire::message("PAKFIRE ERROR: No packages to remove. Exiting..."); | |
222 | exit 1; | |
223 | } | |
224 | ||
225 | &Pakfire::message(""); | |
226 | &Pakfire::message(""); | |
227 | &Pakfire::message("PAKFIRE INFO: Packages to remove:"); | |
228 | foreach $pak (sort @paks) { | |
229 | my $size = &Pakfire::getsize("$pak"); | |
230 | $size = &Pakfire::beautifysize($size); | |
231 | &Pakfire::message("PAKFIRE INFO: $pak \t - $size"); | |
232 | } | |
233 | ||
234 | if ($interactive) { | |
235 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); | |
236 | my $ret = <STDIN>; | |
237 | chomp($ret); | |
238 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); | |
239 | if ( $ret ne "y" ) { | |
240 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); | |
241 | exit 1; | |
242 | } | |
243 | } | |
244 | ||
245 | foreach $pak (@paks) { | |
246 | &Pakfire::removepak("$pak"); | |
247 | } | |
248 | ||
249 | ||
250 | } elsif ("$ARGV[0]" eq "update") { | |
251 | &Pakfire::makeuuid(); | |
252 | &Pakfire::getmirrors("$force"); | |
253 | &Pakfire::dbgetlist("$force"); | |
254 | &Pakfire::getcoredb("$force"); | |
255 | ||
256 | } elsif ("$ARGV[0]" eq "upgrade") { | |
257 | &Pakfire::upgradecore(); | |
258 | my @upgradepaks = &Pakfire::dblist("upgrade", "noweb"); | |
259 | my @deps = (); | |
260 | ||
261 | if (@upgradepaks) { | |
262 | # Resolve the dependencies of the to be upgraded packages | |
263 | @deps = &Pakfire::resolvedeps_recursive(@upgradepaks); | |
264 | ||
265 | &Pakfire::message(""); | |
266 | &Pakfire::message("PAKFIRE UPGR: We are going to install all packages listed above."); | |
267 | if ($interactive) { | |
268 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); | |
269 | my $ret = <STDIN>; | |
270 | chomp($ret); | |
271 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); | |
272 | if ( $ret ne "y" ) { | |
273 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); | |
274 | exit 1; | |
275 | } | |
276 | } | |
277 | } | |
278 | ||
279 | # Download packages | |
280 | foreach $pak (@upgradepaks) { | |
281 | &Pakfire::getpak("$pak", ""); | |
282 | } | |
283 | ||
284 | # Download dependencies | |
285 | foreach $pak (@deps) { | |
286 | &Pakfire::getpak("$pak", ""); | |
287 | } | |
288 | ||
289 | # Install dependencies first | |
290 | foreach $pak (@deps) { | |
291 | &Pakfire::setuppak("$pak"); | |
292 | } | |
293 | ||
294 | # Install all upgrades | |
295 | foreach $pak (@upgradepaks) { | |
296 | &Pakfire::upgradepak("$pak"); | |
297 | } | |
298 | ||
299 | } elsif ("$ARGV[0]" eq "list") { | |
300 | if ("$ARGV[1]" =~ /installed|notinstalled/) { | |
301 | &Pakfire::dblist("$ARGV[1]", "noweb"); | |
302 | } else { | |
303 | &Pakfire::message("PAKFIRE WARN: Not a known option $ARGV[1]") if ($ARGV[1]); | |
304 | &Pakfire::dblist("all", "noweb"); | |
305 | } | |
306 | ||
307 | } elsif ("$ARGV[0]" eq "resolvedeps") { | |
308 | foreach (@ARGV) { | |
309 | next if ("$_" eq "resolvedeps"); | |
310 | next if ("$_" =~ "^-"); | |
311 | &Pakfire::resolvedeps("$_"); | |
312 | } | |
313 | } elsif ("$ARGV[0]" eq "enable") { | |
314 | if ("$ARGV[1]" eq "updates") { | |
315 | system("ln -s ../../opt/pakfire/pakfire /etc/fcron.daily/pakfire-update"); | |
316 | } elsif ("$ARGV[1]" eq "upgrades") { | |
317 | system("ln -s ../../opt/pakfire/pakfire /etc/fcron.daily/pakfire-upgrade"); | |
318 | } | |
319 | } elsif ("$ARGV[0]" eq "disable") { | |
320 | if ("$ARGV[1]" eq "updates") { | |
321 | system("rm -f /etc/fcron.daily/pakfire-update"); | |
322 | } elsif ("$ARGV[1]" eq "upgrades") { | |
323 | system("rm -f /etc/fcron.daily/pakfire-upgrade"); | |
324 | } | |
325 | } else { | |
326 | &Pakfire::usage; | |
327 | } | |
328 | ||
329 | &Pakfire::logger("PAKFIRE INFO: Pakfire has finished. Closing."); | |
330 | ||
331 | exit 0; |