]>
Commit | Line | Data |
---|---|---|
c3df33af | 1 | #!/usr/bin/perl |
70df8302 MT |
2 | ############################################################################### |
3 | # # | |
4 | # IPFire.org - A linux based firewall # | |
d6c2e671 | 5 | # Copyright (C) 2007-2021 IPFire Team <info@ipfire.org> # |
70df8302 MT |
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 | ############################################################################### | |
c1ae1ad6 | 21 | |
accc9c30 MT |
22 | ### Clean up our environment |
23 | # | |
24 | delete @ENV{qw(IFS CDPATH ENV BASH_ENV PATH)}; | |
25 | $< = $>; | |
26 | ||
9a507db2 MT |
27 | # Store keys here |
28 | $ENV{"GNUPGHOME"} = "/opt/pakfire/etc/.gnupg"; | |
29 | ||
1bd42c89 MT |
30 | require "/opt/pakfire/lib/functions.pl"; |
31 | ||
32 | my $interactive = 1; | |
377560fb | 33 | my $force = "noforce"; |
d6c2e671 | 34 | my $locked; |
1bd42c89 | 35 | |
a6d327a7 | 36 | &Pakfire::logger("PAKFIRE INFO: IPFire Pakfire $Conf::version started!"); |
c1ae1ad6 | 37 | |
1bd42c89 MT |
38 | ### Check if we are running as root |
39 | # | |
40 | my $user = qx(whoami); | |
41 | chomp($user); | |
42 | unless ( "$user" eq "root" ) { | |
a6d327a7 | 43 | &Pakfire::message("PAKFIRE ERROR: You must run pakfire as user root!"); |
1bd42c89 MT |
44 | exit 1; |
45 | } | |
46 | ||
7bc1b6ac MT |
47 | unless ( -e "/var/ipfire/red/active" ) { |
48 | &Pakfire::message("PAKFIRE ERROR: You need to be online to run pakfire!"); | |
49 | exit 2; | |
50 | } | |
d6c2e671 SS |
51 | |
52 | # Check if a lockfile already exists. | |
53 | if (-e "$Pakfire::lockfile") { | |
54 | &Pakfire::message("PAKFIRE ERROR: Another instance of pakfire is already running!"); | |
55 | exit 1; | |
56 | } | |
57 | ||
58 | # Write lockfile. | |
59 | open(LOCK, ">$Pakfire::lockfile"); | |
60 | ||
61 | # Pakfire has locked in this session set locket to "1". | |
62 | $locked = "1"; | |
63 | ||
64 | # Close filehandle. | |
65 | close(LOCK); | |
7bc1b6ac | 66 | |
06209efc MT |
67 | ### Check if we are started by another name |
68 | # | |
69 | if ( $0 =~ /pakfire-update$/ ) { | |
a6d327a7 | 70 | &Pakfire::message("CRON INFO: Running an update"); |
fc4ac7ac | 71 | my $random = int(rand(60)); |
5d22ef4e MT |
72 | &Pakfire::logger("CRON INFO: Waiting for $random seconds."); |
73 | sleep($random); | |
06209efc MT |
74 | $ARGV[0] = "update"; |
75 | $interactive = 0; | |
76 | } elsif ( $0 =~ /pakfire-upgrade$/ ) { | |
a6d327a7 | 77 | &Pakfire::message("CRON INFO: Running an upgrade"); |
5d22ef4e MT |
78 | my $random = int(rand(3600)); |
79 | &Pakfire::logger("CRON INFO: Waiting for $random seconds."); | |
80 | sleep($random); | |
06209efc MT |
81 | $ARGV[0] = "upgrade"; |
82 | $interactive = 0; | |
83 | } | |
84 | ||
1bd42c89 | 85 | unless (@ARGV) { |
5b2a12ff | 86 | &Pakfire::usage; |
1bd42c89 | 87 | } |
4b122800 MT |
88 | |
89 | foreach (@ARGV) { | |
90 | if ("$_" =~ "^-") { | |
750c1528 | 91 | # Turn off interactive mode |
4b122800 MT |
92 | $interactive = 0 if ("$_" eq "--non-interactive"); |
93 | $interactive = 0 if ("$_" eq "-y"); | |
750c1528 MT |
94 | |
95 | # Turn off shell colors - Bad for displaying in webinterface | |
96 | $Pakfire::enable_colors = 0 if ("$_" eq "--no-colors"); | |
377560fb MT |
97 | |
98 | # Turn on force mode | |
99 | $force = "force" if ("$_" eq "-f" ); | |
100 | $force = "force" if ("$_" eq "--force" ); | |
4b122800 MT |
101 | } |
102 | } | |
c1ae1ad6 | 103 | |
1bd42c89 MT |
104 | if ("$ARGV[0]" eq "install") { |
105 | shift; | |
99e6df8e MT |
106 | |
107 | ### Make sure that the list is not outdated. | |
108 | &Pakfire::dbgetlist("noforce"); | |
109 | ||
110 | open(FILE, "<$Conf::dbdir/lists/packages_list.db"); | |
111 | my @db = <FILE>; | |
112 | close(FILE); | |
113 | ||
114 | my $dep; | |
a08c3a2e | 115 | my @deps; |
99e6df8e | 116 | my $pak; |
a08c3a2e MT |
117 | my @paks; |
118 | my @temp; | |
99e6df8e MT |
119 | my @templine; |
120 | my $found = 0; | |
186e3d2c | 121 | my $return; |
4b122800 | 122 | my @all; |
99e6df8e MT |
123 | foreach $pak (@ARGV) { |
124 | unless ("$pak" =~ "^-") { | |
186e3d2c MT |
125 | $return = &Pakfire::isinstalled($pak); |
126 | if ($return eq 0) { | |
a6d327a7 | 127 | &Pakfire::message("PAKFIRE INFO: $pak is already installed"); |
186e3d2c MT |
128 | next; |
129 | } | |
99e6df8e MT |
130 | $found = 0; |
131 | foreach (@db) { | |
132 | @templine = split(/;/,$_); | |
133 | if ("$templine[0]" eq "$pak" ) { | |
134 | push(@paks,$pak); | |
135 | push(@all,$pak); | |
136 | @temp = &Pakfire::resolvedeps("$pak"); | |
137 | foreach $dep (@temp) { | |
138 | push(@deps,$dep) if $dep; | |
139 | push(@all,$dep) if $dep; | |
140 | } | |
141 | $found = 1; | |
142 | break; | |
143 | } | |
144 | } | |
a6d327a7 MT |
145 | if ($found == 0) { |
146 | &Pakfire::message(""); | |
147 | &Pakfire::message("PAKFIRE WARN: The pak \"$pak\" is not known. Please try running \"pakfire update\"."); | |
148 | } | |
5b2a12ff | 149 | } |
a08c3a2e | 150 | } |
186e3d2c MT |
151 | |
152 | unless (@paks) { | |
a6d327a7 | 153 | &Pakfire::message("PAKFIRE ERROR: No packages to install. Exiting..."); |
186e3d2c MT |
154 | exit 1; |
155 | } | |
97520ed5 | 156 | |
186e3d2c | 157 | if (@deps) { |
519f8431 | 158 | my %sort = map{ $_, 1 } @deps; |
3a3c02ee | 159 | @deps = keys %sort; |
186e3d2c | 160 | &Pakfire::message(""); |
a6d327a7 | 161 | &Pakfire::message("PAKFIRE INFO: Packages to install for dependencies:"); |
186e3d2c | 162 | } |
373e13c2 | 163 | foreach $dep (@deps) { |
186e3d2c | 164 | my $size = &Pakfire::getsize("$dep"); |
1bd42c89 | 165 | $size = &Pakfire::beautifysize($size); |
35f38a8b | 166 | &Pakfire::message("PAKFIRE INFO: $dep \t - $size"); |
1bd42c89 | 167 | } |
373e13c2 CS |
168 | |
169 | &Pakfire::message(""); | |
170 | &Pakfire::message(""); | |
171 | &Pakfire::message("PAKFIRE INFO: Packages to install:"); | |
172 | foreach $pak (@paks) { | |
173 | my $size = &Pakfire::getsize("$pak"); | |
174 | $size = &Pakfire::beautifysize($size); | |
175 | &Pakfire::message("PAKFIRE INFO: $pak \t - $size"); | |
176 | } | |
4b122800 MT |
177 | |
178 | my $totalsize; | |
186e3d2c MT |
179 | foreach $pak (@all) { |
180 | $totalsize = ($totalsize + &Pakfire::getsize("$pak")); | |
4b122800 | 181 | } |
1bd42c89 | 182 | $totalsize = &Pakfire::beautifysize($totalsize); |
186e3d2c | 183 | &Pakfire::message(""); |
a6d327a7 | 184 | &Pakfire::message("PAKFIRE INFO: Total size: \t ~ $totalsize"); |
186e3d2c | 185 | &Pakfire::message(""); |
1bd42c89 MT |
186 | |
187 | if ($interactive) { | |
a6d327a7 | 188 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); |
1bd42c89 MT |
189 | my $ret = <STDIN>; |
190 | chomp($ret); | |
a6d327a7 | 191 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); |
1bd42c89 | 192 | if ( $ret ne "y" ) { |
a6d327a7 | 193 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); |
1bd42c89 MT |
194 | exit 1; |
195 | } | |
a6d327a7 MT |
196 | } else { |
197 | &Pakfire::logger("PAKFIRE INFO: Interaction skipped."); | |
1bd42c89 | 198 | } |
186e3d2c | 199 | |
373e13c2 CS |
200 | # my %sort = map{ $_, 1 } @all; |
201 | # @all = sort keys %sort; | |
a08c3a2e MT |
202 | |
203 | ### Download first | |
373e13c2 | 204 | foreach $pak (@all) { |
186e3d2c | 205 | &Pakfire::getpak("$pak", ""); |
a08c3a2e | 206 | } |
c1ae1ad6 | 207 | |
35f38a8b MT |
208 | &Pakfire::message(""); |
209 | ||
373e13c2 | 210 | foreach $pak (@deps) { |
186e3d2c | 211 | &Pakfire::setuppak("$pak") if ($pak ne ""); |
1bd42c89 | 212 | } |
1bd42c89 | 213 | |
373e13c2 CS |
214 | |
215 | foreach $pak (@paks) { | |
216 | &Pakfire::setuppak("$pak") if ($pak ne ""); | |
217 | } | |
218 | ||
219 | ||
1bd42c89 | 220 | } elsif ("$ARGV[0]" eq "remove") { |
e44b26cf MT |
221 | shift; |
222 | ||
223 | my @paks; | |
224 | my $pak; | |
e44b26cf MT |
225 | foreach $pak (@ARGV) { |
226 | unless ("$pak" =~ "^-") { | |
227 | $return = &Pakfire::isinstalled($pak); | |
228 | if ($return ne 0) { | |
a6d327a7 | 229 | &Pakfire::message("PAKFIRE WARN: $pak is not installed"); |
e44b26cf MT |
230 | next; |
231 | } | |
e44b26cf | 232 | push(@paks, $pak); |
e44b26cf MT |
233 | } |
234 | } | |
235 | ||
236 | unless (@paks) { | |
a6d327a7 | 237 | &Pakfire::message("PAKFIRE ERROR: No packages to remove. Exiting..."); |
e44b26cf MT |
238 | exit 1; |
239 | } | |
240 | ||
241 | &Pakfire::message(""); | |
242 | &Pakfire::message(""); | |
35f38a8b | 243 | &Pakfire::message("PAKFIRE INFO: Packages to remove:"); |
e44b26cf MT |
244 | foreach $pak (sort @paks) { |
245 | my $size = &Pakfire::getsize("$pak"); | |
246 | $size = &Pakfire::beautifysize($size); | |
35f38a8b | 247 | &Pakfire::message("PAKFIRE INFO: $pak \t - $size"); |
e44b26cf MT |
248 | } |
249 | ||
250 | if ($interactive) { | |
35f38a8b | 251 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); |
e44b26cf MT |
252 | my $ret = <STDIN>; |
253 | chomp($ret); | |
35f38a8b | 254 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); |
e44b26cf | 255 | if ( $ret ne "y" ) { |
35f38a8b | 256 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); |
e44b26cf MT |
257 | exit 1; |
258 | } | |
259 | } | |
260 | ||
261 | foreach $pak (@paks) { | |
262 | &Pakfire::removepak("$pak"); | |
263 | } | |
1bd42c89 MT |
264 | |
265 | ||
266 | } elsif ("$ARGV[0]" eq "update") { | |
8e58bd37 | 267 | &Pakfire::makeuuid(); |
377560fb MT |
268 | &Pakfire::getmirrors("$force"); |
269 | &Pakfire::dbgetlist("$force"); | |
270 | &Pakfire::getcoredb("$force"); | |
e3670217 | 271 | |
4b122800 | 272 | } elsif ("$ARGV[0]" eq "upgrade") { |
2aa6d448 | 273 | &Pakfire::upgradecore(); |
99e6df8e | 274 | my @upgradepaks = &Pakfire::dblist("upgrade", "noweb"); |
5555c4b8 | 275 | my @deps = (); |
9f1f68f1 | 276 | |
99e6df8e | 277 | if (@upgradepaks) { |
9f1f68f1 | 278 | # Resolve the dependencies of the to be upgraded packages |
5555c4b8 | 279 | @deps = &Pakfire::resolvedeps_recursive(@upgradepaks); |
9f1f68f1 | 280 | |
99e6df8e | 281 | &Pakfire::message(""); |
35f38a8b | 282 | &Pakfire::message("PAKFIRE UPGR: We are going to install all packages listed above."); |
99e6df8e | 283 | if ($interactive) { |
35f38a8b | 284 | &Pakfire::message("PAKFIRE INFO: Is this okay? [y/N]"); |
99e6df8e MT |
285 | my $ret = <STDIN>; |
286 | chomp($ret); | |
35f38a8b | 287 | &Pakfire::logger("PAKFIRE INFO: Answer: $ret"); |
99e6df8e | 288 | if ( $ret ne "y" ) { |
35f38a8b | 289 | &Pakfire::message("PAKFIRE ERROR: Installation aborted."); |
99e6df8e MT |
290 | exit 1; |
291 | } | |
292 | } | |
293 | } | |
294 | ||
9f1f68f1 | 295 | # Download packages |
373e13c2 | 296 | foreach $pak (@upgradepaks) { |
4e4b54c5 | 297 | &Pakfire::getpak("$pak", ""); |
99e6df8e | 298 | } |
9f1f68f1 MT |
299 | |
300 | # Download dependencies | |
301 | foreach $pak (@deps) { | |
302 | &Pakfire::getpak("$pak", ""); | |
303 | } | |
304 | ||
305 | # Install dependencies first | |
306 | foreach $pak (@deps) { | |
307 | &Pakfire::setuppak("$pak"); | |
308 | } | |
309 | ||
310 | # Install all upgrades | |
373e13c2 | 311 | foreach $pak (@upgradepaks) { |
9f1f68f1 | 312 | &Pakfire::upgradepak("$pak"); |
99e6df8e | 313 | } |
4b122800 | 314 | |
afabe9f7 | 315 | } elsif ("$ARGV[0]" eq "list") { |
e3670217 MT |
316 | if ("$ARGV[1]" =~ /installed|notinstalled/) { |
317 | &Pakfire::dblist("$ARGV[1]", "noweb"); | |
318 | } else { | |
319 | &Pakfire::message("PAKFIRE WARN: Not a known option $ARGV[1]") if ($ARGV[1]); | |
320 | &Pakfire::dblist("all", "noweb"); | |
321 | } | |
5b2a12ff MT |
322 | |
323 | } elsif ("$ARGV[0]" eq "resolvedeps") { | |
324 | foreach (@ARGV) { | |
325 | next if ("$_" eq "resolvedeps"); | |
750c1528 | 326 | next if ("$_" =~ "^-"); |
5b2a12ff MT |
327 | &Pakfire::resolvedeps("$_"); |
328 | } | |
377560fb MT |
329 | } elsif ("$ARGV[0]" eq "enable") { |
330 | if ("$ARGV[1]" eq "updates") { | |
331 | system("ln -s ../../opt/pakfire/pakfire /etc/fcron.daily/pakfire-update"); | |
37610d7b | 332 | } elsif ("$ARGV[1]" eq "upgrades") { |
377560fb MT |
333 | system("ln -s ../../opt/pakfire/pakfire /etc/fcron.daily/pakfire-upgrade"); |
334 | } | |
335 | } elsif ("$ARGV[0]" eq "disable") { | |
336 | if ("$ARGV[1]" eq "updates") { | |
337 | system("rm -f /etc/fcron.daily/pakfire-update"); | |
37610d7b | 338 | } elsif ("$ARGV[1]" eq "upgrades") { |
377560fb MT |
339 | system("rm -f /etc/fcron.daily/pakfire-upgrade"); |
340 | } | |
090af02e AK |
341 | } elsif ("$ARGV[0]" eq "status") { |
342 | &Pakfire::status; | |
5b2a12ff MT |
343 | } else { |
344 | &Pakfire::usage; | |
1bd42c89 | 345 | } |
a6d327a7 | 346 | |
70df8302 | 347 | &Pakfire::logger("PAKFIRE INFO: Pakfire has finished. Closing."); |
35f38a8b | 348 | |
d6c2e671 SS |
349 | END { |
350 | # Check if pakfire has been locked in this session. | |
351 | if ($locked) { | |
352 | # Remove lockfile. | |
353 | unlink($Pakfire::lockfile); | |
354 | } | |
355 | } | |
356 | ||
70df8302 | 357 | exit 0; |