]>
git.ipfire.org Git - ipfire-2.x.git/blob - src/pakfire/lib/functions.pl
e2c6463132517ad44e501fb9c880c9f6bfe000fd
2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2007-2025 IPFire Team <info@ipfire.org> #
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. #
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. #
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/>. #
20 ###############################################################################
22 require "/opt/pakfire/etc/pakfire.conf" ;
23 require "/var/ipfire/general-functions.pl" ;
39 my @VALID_KEY_FINGERPRINTS = (
41 "3ECA8AA4478208B924BB96206FEF7A8ED713594B" ,
43 "179740DC4D8C47DC63C099C74BDE364C64D96617" ,
46 # A small color-hash :D
48 $color { 'normal' } = " \033 [0m" ;
49 $color { 'black' } = " \033 [0;30m" ;
50 $color { 'darkgrey' } = " \033 [1;30m" ;
51 $color { 'blue' } = " \033 [0;34m" ;
52 $color { 'lightblue' } = " \033 [1;34m" ;
53 $color { 'green' } = " \033 [0;32m" ;
54 $color { 'lightgreen' } = " \033 [1;32m" ;
55 $color { 'cyan' } = " \033 [0;36m" ;
56 $color { 'lightcyan' } = " \033 [1;36m" ;
57 $color { 'red' } = " \033 [0;31m" ;
58 $color { 'lightred' } = " \033 [1;31m" ;
59 $color { 'purple' } = " \033 [0;35m" ;
60 $color { 'lightpurple' } = " \033 [1;35m" ;
61 $color { 'brown' } = " \033 [0;33m" ;
62 $color { 'lightgrey' } = " \033 [0;37m" ;
63 $color { 'yellow' } = " \033 [1;33m" ;
64 $color { 'white' } = " \033 [1;37m" ;
65 our $enable_colors = 1 ;
71 my %pakfiresettings = ();
72 & General
:: readhash
( "${General::swroot}/pakfire/settings" , \
%pakfiresettings );
75 $Conf :: version
= & make_version
();
78 our $lockfile = "/tmp/pakfire_lock" ;
84 if ( $enable_colors == 1 ) {
85 if ( " $message " =~ /ERROR/ ) {
86 $message = " $color {'red'} $message $color {'normal'}" ;
87 } elsif ( " $message " =~ /INFO/ ) {
88 $message = " $color {'cyan'} $message $color {'normal'}" ;
89 } elsif ( " $message " =~ /WARN/ ) {
90 $message = " $color {'yellow'} $message $color {'normal'}" ;
91 } elsif ( " $message " =~ /RESV/ ) {
92 $message = " $color {'purple'} $message $color {'normal'}" ;
93 } elsif ( " $message " =~ /INST/ ) {
94 $message = " $color {'green'} $message $color {'normal'}" ;
95 } elsif ( " $message " =~ /REMV/ ) {
96 $message = " $color {'lightred'} $message $color {'normal'}" ;
97 } elsif ( " $message " =~ /UPGR/ ) {
98 $message = " $color {'lightblue'} $message $color {'normal'}" ;
108 system ( "logger -t pakfire \" $log \" " );
113 & Pakfire
:: message
( "Usage: pakfire COMMAND [OPTIONS] [PACKAGE ...]" );
114 & Pakfire
:: message
( "Manage IPFire add-on packages and updates." );
115 & Pakfire
:: message
( "PACKAGE:" );
116 & Pakfire
:: message
( " one or more add-on package names" );
117 & Pakfire
:: message
( "COMMAND:" );
118 & Pakfire
:: message
( " install - install one or more packages" );
119 & Pakfire
:: message
( " remove - remove one or more packages" );
120 & Pakfire
:: message
( " update - update the pakfire database" );
121 & Pakfire
:: message
( " upgrade - upgrade all packages to the latest version" );
122 & Pakfire
:: message
( " list [installed | notinstalled | upgrade]" );
123 & Pakfire
:: message
( " - display a list of installed, notinstalled," );
124 & Pakfire
:: message
( " upgradeable or all packages" );
125 & Pakfire
:: message
( " info - display metadata for one or more packages" );
126 & Pakfire
:: message
( " resolvedeps - display dependencies for one or more packages" );
127 & Pakfire
:: message
( " status - display pakfire database status," );
128 & Pakfire
:: message
( " available updates and whether a reboot" );
129 & Pakfire
:: message
( " is required to complete any upgrades" );
130 & Pakfire
:: message
( "OPTIONS:" );
131 & Pakfire
:: message
( " --no-colors - turn off colors" );
132 & Pakfire
:: message
( " -y | --non-interactive - automatic yes to prompts" );
133 & Pakfire
:: message
( " -f | --force - for the update command, force" );
134 & Pakfire
:: message
( " a pakfire database update" );
135 & Pakfire
:: message
( "" );
142 my ( @server , $host , $proto , $file , $i );
146 $bfile = basename
( " $getfile " );
148 logger
( "DOWNLOAD STARTED: $getfile " );
151 while (( $allok == 0 ) && $i < 5 ) {
154 if ( " $gethost " eq "" ) {
155 @server = selectmirror
();
158 $file = " $server [2]/ $getfile " ;
164 $proto = "HTTPS" unless $proto ;
166 logger
( "DOWNLOAD INFO: Host: $host ( $proto ) - File: $file " );
168 # Init LWP::UserAgent, request SSL hostname verification
169 # and specify CA file.
170 my $ua = LWP
:: UserAgent
-> new (
172 SSL_ca_file
=> '/etc/ssl/cert.pem' ,
173 verify_hostname
=> 1 ,
176 $ua -> agent ( "Pakfire/ $Conf ::version" );
179 my %proxysettings =();
180 & General
:: readhash
( "${General::swroot}/proxy/advanced/settings" , \
%proxysettings );
182 if ( $proxysettings { 'UPSTREAM_PROXY' }) {
183 logger
( "DOWNLOAD INFO: Upstream proxy: \" $proxysettings {'UPSTREAM_PROXY'} \" " );
184 if ( $proxysettings { 'UPSTREAM_USER' }) {
185 $ua -> proxy ([ "http" , "https" ], "http:// $proxysettings {'UPSTREAM_USER'}: $proxysettings {'UPSTREAM_PASSWORD'}@" . " $proxysettings {'UPSTREAM_PROXY'}/" );
186 logger
( "DOWNLOAD INFO: Logging in with \" $proxysettings {'UPSTREAM_USER'} \" against \" $proxysettings {'UPSTREAM_PROXY'} \" " );
188 $ua -> proxy ([ "http" , "https" ], "http:// $proxysettings {'UPSTREAM_PROXY'}/" );
196 case
"HTTP" { $url = "http:// $host / $file " ; }
197 case
"HTTPS" { $url = "https:// $host / $file " ; }
199 # skip all lines with unknown protocols
200 logger
( "DOWNLOAD WARNING: Skipping Host: $host due to unknown protocol ( $proto ) in mirror database" );
205 my $result = $ua -> head ( $url );
206 my $remote_headers = $result -> headers ;
207 $total_size = $remote_headers -> content_length ;
208 logger
( "DOWNLOAD INFO: $file has size of $total_size bytes" );
210 my $response = $ua -> get ( $url , ':content_cb' => \
& callback
);
213 my $code = $response -> code ();
214 my $log = $response -> status_line ;
215 logger
( "DOWNLOAD INFO: HTTP-Status-Code: $code - $log " );
217 if ( $response -> is_success ) {
218 if ( open ( FILE
, "> $Conf ::tmpdir/ $bfile " )) {
219 print FILE
$final_data ;
221 logger
( "DOWNLOAD INFO: File received. Start checking signature..." );
222 if (& valid_signature
( " $Conf ::tmpdir/ $bfile " )) {
223 logger
( "DOWNLOAD INFO: Signature of $bfile is fine." );
224 move
( " $Conf ::tmpdir/ $bfile " , " $Conf ::cachedir/ $bfile " );
226 message
( "DOWNLOAD ERROR: The downloaded file ( $file ) wasn't verified by IPFire.org. Sorry - Exiting..." );
227 my $ntp = `ntpdate -q -t 10 pool.ntp.org 2>/dev/null | tail -1` ;
228 if ( $ntp !~ /time\ server(.*)offset(.*)/ ){ message
( "TIME ERROR: Unable to get the nettime, this may lead to the verification error." );}
229 else { $ntp =~ /time\ server(.*)offset(.*)/ ; message
( "TIME INFO: Time Server $1has $2 offset to localtime." );}
232 logger
( "DOWNLOAD FINISHED: $file " );
236 logger
( "DOWNLOAD ERROR: Could not open $Conf ::tmpdir/ $bfile for writing." );
239 logger
( "DOWNLOAD ERROR: $log " );
242 message
( "DOWNLOAD ERROR: There was no chance to get the file \" $getfile \" from any available server. \n May be you should run \" pakfire update \" to get some new servers." );
252 if ( - e
" $Conf ::dbdir/lists/server-list.db" ) {
253 my @stat = stat ( " $Conf ::dbdir/lists/server-list.db" );
255 $age = $time - $stat [ 9 ];
256 $force = "force" if ( " $age " >= "3600" );
257 logger
( "MIRROR INFO: server-list.db is $age seconds old. - DEBUG: $force " );
263 if ( " $force " eq "force" ) {
264 if ( fetchfile
( " $Conf ::version/lists/server-list.db" , " $Conf ::mainserver" )) {
265 move
( " $Conf ::cachedir/server-list.db" , " $Conf ::dbdir/lists/server-list.db" );
266 } elsif (! - e
" $Conf ::dbdir/lists/server-list.db" ) {
267 # if we end up with no server-list at all, return failure
280 if ( - e
" $Conf ::dbdir/lists/core-list.db" ) {
281 my @stat = stat ( " $Conf ::dbdir/lists/core-list.db" );
283 $age = $time - $stat [ 9 ];
284 $force = "force" if ( " $age " >= "3600" );
285 logger
( "CORE INFO: core-list.db is $age seconds old. - DEBUG: $force " );
291 if ( " $force " eq "force" ) {
292 if ( fetchfile
( "lists/core-list.db" , "" )) {
293 move
( " $Conf ::cachedir/core-list.db" , " $Conf ::dbdir/lists/core-list.db" );
298 sub valid_signature
($) {
299 my $filename = shift ;
301 open ( my $cmd , "gpg --verify --status-fd 1 \" $filename \" 2>/dev/null |" );
303 # Process valid signature lines
304 if ( /VALIDSIG ([A-Z0-9]+)/ ) {
305 # Check if we know the key
306 foreach my $key ( @VALID_KEY_FINGERPRINTS ) {
308 return 1 if ( $key eq $1 );
314 # Signature is invalid
319 if ( defined ${ Conf
:: mirror
}) {
320 my $uri = URI
-> new ( "${Conf::mirror}" );
322 # Only accept HTTPS mirrors
323 if ( $uri -> scheme eq "https" ) {
324 return ( "HTTPS" , $uri -> host , $uri -> path . "/" . ${ Conf
:: version
});
326 message
( "MIRROR ERROR: Unsupported mirror: " . ${ Conf
:: mirror
});
330 ### Check if there is a current server list and read it.
331 # If there is no list try to get one.
332 unless ( open ( FILE
, "< $Conf ::dbdir/lists/server-list.db" )) {
333 unless ( getmirrors
( "noforce" )) {
334 message
( "MIRROR ERROR: Could not find or download a server list" );
342 ### Count the number of the servers in the list
346 if ( " $_ " =~ /.*;.*;.*;/ ) {
351 logger
( "MIRROR INFO: $scount servers found in list" );
354 logger
( "MIRROR INFO: Could not find any servers. Falling back to main server $Conf ::mainserver" );
355 return ( "HTTPS" , $Conf :: mainserver
, "/ $Conf ::version" );
358 ### Choose a random server and test if it is online
359 # If the check fails try a new server.
360 # This will never give up.
363 $server = int ( rand ( $scount ) + 1 );
365 my ( $line , $proto , $path , $host );
367 foreach $line ( @newlines ) {
369 if ( $servers eq $server ) {
370 @templine = split ( /\;/ , $line );
371 $proto = $templine [ 0 ];
372 $host = $templine [ 1 ];
373 $path = $templine [ 2 ];
375 return ( $proto , $host , $path );
382 ### Update the database if the file is older than one day.
383 # If you pass &Pakfire::dbgetlist(force) the list will be downloaded.
384 # Usage is always with an argument.
390 if ( - e
" $Conf ::dbdir/lists/packages_list.db" ) {
391 my @stat = stat ( " $Conf ::dbdir/lists/packages_list.db" );
393 $age = $time - $stat [ 9 ];
394 $force = "force" if ( " $age " >= "3600" );
395 logger
( "DB INFO: packages_list.db is $age seconds old. - DEBUG: $force " );
401 if ( " $force " eq "force" ) {
402 if ( fetchfile
( "lists/packages_list.db" , "" )) {
403 move
( " $Conf ::cachedir/packages_list.db" , " $Conf ::dbdir/lists/packages_list.db" );
404 } elsif ( - e
" $Conf ::dbdir/lists/packages_list.db" ) {
405 # If we end up with no db file after download error there
406 # is nothing more we can do here.
411 # Update the meta database if new packages was in the package list
418 my %paklist = & Pakfire
:: dblist
( "all" );
420 opendir ( DIR
, " $Conf ::dbdir/meta" );
421 my @files = readdir ( DIR
);
423 foreach $file ( @files ) {
424 next if ( $file eq "." );
425 next if ( $file eq ".." );
426 next if ( $file eq "meta-" );
427 next if ( $file =~ /^old/ );
428 %metadata = parsemetafile
( " $Conf ::dbdir/meta/ $file " );
430 if (( defined $paklist { " $metadata {'Name'}" }) && (
431 ( " $paklist { \" $metadata {'Name'} \" }{'Release'}" ne " $metadata {'Release'}" ) ||
432 ( defined $paklist { " $metadata {'Name'}" }{ 'AvailableRelease' }))
434 move
( " $Conf ::dbdir/meta/meta- $metadata {'Name'}" , " $Conf ::dbdir/meta/old_meta- $metadata {'Name'}" );
435 getmetafile
( $metadata { 'Name' });
441 ### This subroutine returns core db version information in a hash.
442 # Usage is without arguments
444 eval ( `grep "core_" $Conf ::dbdir/lists/core-list.db` );
447 CoreVersion
=> $Conf :: version
,
448 Release
=> $Conf :: core_mine
,
451 $coredb { 'AvailableRelease' } = $core_release if ( " $Conf ::core_mine" < " $core_release " );
457 ### This subroutine returns the packages from the packages_list db in a hash.
458 # It uses the currently cached version of packages_list. To ensure latest
459 # data, run Pakfire::dbgetlist first.
460 # You may also pass a filter: &Pakfire::dblist(filter)
461 # Usage is always with one argument.
463 # - "all": list all known paks,
464 # - "notinstalled": list only not installed paks,
465 # - "installed": list only installed paks
466 # - "upgrade": list only upgradable paks
468 # Returned hash format:
469 # ( "<pak name>" => (
470 # "Installed" => "Yes" or "No" wether the pak is installed,
471 # "ProgVersion" => Installed program version when "Installed" => "Yes" or
472 # Available version when "Installed" => No,
473 # "Release" => Installed pak release number when "Installed" => "Yes" or
474 # Available pak release number when "Installed" => No,
475 # "AvailableProgVersion" => Available program version.
476 # Only defined if an upgrade to a higher version is available,
477 # "AvailableRelease" => Available pak release version.
478 # Only defined if an upgrade to a higher version is available
490 open ( FILE
, "< $Conf ::dbdir/lists/packages_list.db" );
494 if ( " $filter " ne "notinstalled" ) {
495 opendir ( DIR
, " $Conf ::dbdir/installed" );
496 my @files = readdir ( DIR
);
499 foreach $file ( @files ) {
500 next if ( $file eq "." );
501 next if ( $file eq ".." );
502 next if ( $file =~ /^old/ );
503 %metadata = parsemetafile
( " $Conf ::dbdir/installed/ $file " );
505 foreach $line ( @db ) {
506 next unless ( $line =~ /.*;.*;.*;/ );
507 @templine = split ( /\;/ , $line );
508 if (( " $metadata {'Name'}" eq " $templine [0]" ) && ( " $metadata {'Release'}" < " $templine [2]" )) {
509 # Add all upgradable paks to list
510 $paklist { " $metadata {'Name'}" } = {
511 ProgVersion
=> $metadata { 'ProgVersion' },
512 Release
=> $metadata { 'Release' },
513 AvailableProgVersion
=> $templine [ 1 ],
514 AvailableRelease
=> $templine [ 2 ],
518 } elsif (( " $metadata {'Name'}" eq " $templine [0]" ) && ( " $filter " ne "upgrade" )) {
519 # Add installed paks without an upgrade available to list
520 $paklist { " $metadata {'Name'}" } = {
521 ProgVersion
=> $metadata { 'ProgVersion' },
522 Release
=> $metadata { 'Release' },
531 # Add all not installed paks to list
532 if (( " $filter " ne "upgrade" ) && ( " $filter " ne "installed" )) {
533 foreach $line ( @db ) {
534 next unless ( $line =~ /.*;.*;.*;/ );
535 @templine = split ( /\;/ , $line );
536 next if (( defined $paklist { " $templine [0]" }) || (& isinstalled
( $templine [ 0 ]) == 0 ));
538 $paklist { " $templine [0]" } = {
539 ProgVersion
=> " $templine [1]" ,
540 Release
=> " $templine [2]" ,
549 sub resolvedeps_one
{
552 message
( "PAKFIRE RESV: $pak : Resolving dependencies..." );
554 unless ( getmetafile
( " $pak " )) {
555 message
( "PAKFIRE ERROR: Error retrieving dependency information on $pak . Unable to resolve dependencies." );
559 my %metadata = parsemetafile
( " $Conf ::dbdir/meta/meta- $pak " );
561 my @deps = split ( / / , $metadata { 'Dependencies' });
565 my $return = & isinstalled
( $_ );
567 message
( "PAKFIRE RESV: $pak : Dependency is already installed: $_ " );
569 message
( "PAKFIRE RESV: $pak : Need to install dependency: $_ " );
582 # Resolve all not yet installed dependencies of $pak
583 my @deps = & resolvedeps_one
( $pak );
586 # For each dependency, we check if more dependencies exist
588 my $dep = pop ( @deps );
590 my @subdeps = & resolvedeps_one
( $dep );
591 foreach my $subdep ( @subdeps ) {
592 # Skip the package we are currently resolving for
593 next if ( $pak eq $subdep );
595 # If the package is not already to be installed,
596 # we add it to the list (@all) and check if it has
597 # more dependencies on its own.
598 unless ( grep { $_ eq $subdep } @all ) {
599 push ( @deps , $subdep );
608 sub resolvedeps_recursive
{
612 foreach my $pkg ( @packages ) {
613 my @deps = & Pakfire
:: resolvedeps
( $pkg );
615 foreach my $dep ( @deps ) {
620 # Sort the result array and remove dupes
621 my %sort = map { $_ , 1 } @result ;
622 @result = keys %sort ;
631 logger
( "CLEANUP: $dir " );
633 if ( " $dir " eq "meta" ) {
634 $path = " $Conf ::dbdir/meta" ;
635 } elsif ( " $dir " eq "tmp" ) {
636 $path = " $Conf ::tmpdir" ;
640 my @files = readdir ( DIR
);
643 unless (( $_ eq "." ) || ( $_ eq ".." )) {
652 # Try to download meta-file if we don't have one yet, or it is empty for some reason
653 if ((! - e
" $Conf ::dbdir/meta/meta- $pak " ) || ( - z
" $Conf ::dbdir/meta/meta- $pak " )) {
654 return 0 unless ( fetchfile
( "meta/meta- $pak " , "" ));
655 move
( " $Conf ::cachedir/meta- $pak " , " $Conf ::dbdir/meta/meta- $pak " );
658 open ( FILE
, "< $Conf ::dbdir/meta/meta- $pak " );
662 open ( FILE
, "> $Conf ::dbdir/meta/meta- $pak " );
665 $string =~ s/\r\n/\n/g ;
678 if ( my %metadata = parsemetafile
( " $Conf ::dbdir/meta/meta- $pak " )) {
679 return $metadata { 'Size' };
685 ### This subroutine returns a hash with the contents of a meta- file
686 # Pass path to metafile as argument: Pakfire::parsemetafile("$Conf::dbdir/meta/meta-$pak")
687 # Usage is always with an argument.
688 my $metafile = shift ;
695 if (! - e
$metafile ) {
699 open ( FILE
, "< $metafile " );
704 @templine = split ( /\: / , $_ );
707 $metadata { " $templine [0]" } = $templine [ 1 ];
715 ### This subroutine returns a hash of available info for a package
716 # Pass package name and type of info as argument: Pakfire::getmetadata(package, type_of_info)
717 # Type_of_info can be "latest" or "installed"
718 # Usage is always with two argument.
719 my ( $pak , $type ) = @_ ;
725 my %installed_metadata = ();
730 ### Get available version information
731 if ( " $type " eq "latest" ) {
732 ### Check if package is in packages_list and get latest available version
733 my %db = Pakfire
:: dblist
( "all" );
735 if ( defined $db { $pak }) {
736 ### Get and parse latest available metadata
737 if ( getmetafile
( " $pak " )) {
738 %metadata = parsemetafile
( " $Conf ::dbdir/meta/meta- $pak " );
740 $metadata { 'Available' } = "yes" ;
741 ### Rename version info fields
742 $metadata { 'AvailableProgVersion' } = delete $metadata { 'ProgVersion' };
743 $metadata { 'AvailableRelease' } = delete $metadata { 'Release' };
748 ### Parse installed pak metadata
749 if (& isinstalled
( $pak ) == 0 ) {
750 %installed_metadata = parsemetafile
( " $Conf ::dbdir/installed/meta- $pak " );
752 if ( " $type " eq "latest" && exists ( $metadata { 'AvailableProgVersion' })) {
753 ### Add installed version info to latest metadata
754 $metadata { 'ProgVersion' } = $installed_metadata { 'ProgVersion' };
755 $metadata { 'Release' } = $installed_metadata { 'Release' };
757 ### Use metadata of installed pak
758 %metadata = %installed_metadata ;
760 $metadata { 'Installed' } = 'yes' ;
762 $metadata { 'Installed' } = 'no' ;
773 my $file = getpak
( " $pak " , "noforce" );
775 logger
( "DECRYPT STARTED: $pak " );
776 my $return = system ( "cd $Conf ::tmpdir/ && gpg -d --batch --quiet --no-verbose --status-fd 2 --output - < $Conf ::cachedir/ $file 2>/dev/null | tar x" );
778 logger
( "DECRYPT FINISHED: $pak - Status: $return " );
779 if ( $return != 0 ) { exit 1 ; }
786 unless ( getmetafile
( " $pak " )) {
787 message
( "PAKFIRE ERROR: Unable to retrieve $pak metadata." );
791 my %metadata = parsemetafile
( " $Conf ::dbdir/meta/meta- $pak " );
792 my $file = $metadata { 'File' };
795 message
( "No filename given in meta-file." );
799 unless ( " $force " eq "force" ) {
800 if ( - e
" $Conf ::cachedir/ $file " ) {
805 unless ( fetchfile
( "paks/ $file " , "" )) {
806 message
( "PAKFIRE ERROR: Unable to download $pak ." );
815 message
( "PAKFIRE INST: $pak : Decrypting..." );
818 message
( "PAKFIRE INST: $pak : Copying files and running post-installation scripts..." );
819 my $return = system ( "cd $Conf ::tmpdir && NAME= $pak ./install.sh >> $Conf ::logdir/install- $pak .log 2>&1" );
822 move
( " $Conf ::tmpdir/ROOTFILES" , " $Conf ::dbdir/rootfiles/ $pak " );
824 copy
( " $Conf ::dbdir/meta/meta- $pak " , " $Conf ::dbdir/installed/" );
825 message
( "PAKFIRE INST: $pak : Finished." );
828 message
( "PAKFIRE ERROR: Returncode: $return . Sorry. Please search our forum to find a solution for this problem." );
835 # Safety check for lazy testers:
836 # Before we upgrade to the latest release, we re-install the previous release
837 # to make sure that the tester has always been on the latest version.
838 my $tree = & get_tree
();
839 $Conf :: core_mine
-- if ( $tree eq "testing" || $tree eq "unstable" );
841 message
( "CORE UPGR: Upgrading from release $Conf ::core_mine to $core_release " );
843 my @seq = ( $Conf :: core_mine
.. $core_release );
846 foreach $release ( @seq ) {
848 getpak
( "core-upgrade- $release " );
851 foreach $release ( @seq ) {
853 upgradepak
( "core-upgrade- $release " );
856 system ( "echo $core_release > $Conf ::coredir/mine" );
861 if ( open ( FILE
, "< $Conf ::dbdir/installed/meta- $pak " ) ) {
872 message
( "PAKFIRE UPGR: $pak : Decrypting..." );
875 message
( "PAKFIRE UPGR: $pak : Upgrading files and running post-upgrading scripts..." );
876 my $return = system ( "cd $Conf ::tmpdir && NAME= $pak ./update.sh >> $Conf ::logdir/update- $pak .log 2>&1" );
879 move
( " $Conf ::tmpdir/ROOTFILES" , " $Conf ::dbdir/rootfiles/ $pak " );
881 copy
( " $Conf ::dbdir/meta/meta- $pak " , " $Conf ::dbdir/installed/" );
882 message
( "PAKFIRE UPGR: $pak : Finished." );
885 message
( "PAKFIRE ERROR: Returncode: $return . Sorry. Please search our forum to find a solution for this problem." );
894 message
( "PAKFIRE REMV: $pak : Decrypting..." );
897 message
( "PAKFIRE REMV: $pak : Removing files and running post-removing scripts..." );
898 my $return = system ( "cd $Conf ::tmpdir && NAME= $pak ./uninstall.sh >> $Conf ::logdir/uninstall- $pak .log 2>&1" );
901 unlink ( " $Conf ::dbdir/rootfiles/ $pak " );
902 unlink ( " $Conf ::dbdir/installed/meta- $pak " );
904 message
( "PAKFIRE REMV: $pak : Finished." );
907 message
( "PAKFIRE ERROR: Returncode: $return . Sorry. Please search our forum to find a solution for this problem." );
915 #$size = $size / 1024;
918 if ( $size > 1023 * 1024 ) {
919 $size = ( $size / ( 1024 * 1024 ));
921 } elsif ( $size > 1023 ) {
922 $size = ( $size / 1024 );
927 $size = sprintf ( "%.2f" , $size );
928 my $string = " $size $unit " ;
933 unless ( - e
" $Conf ::dbdir/uuid" ) {
934 open ( FILE
, "</proc/sys/kernel/random/uuid" );
938 open ( FILE
, "> $Conf ::dbdir/uuid" );
947 my ( $data , $response , $protocol ) = @_ ;
948 $final_data .= $data ;
949 print progress_bar
( length ( $final_data ), $total_size , 30 , '=' );
953 my ( $got , $total , $width , $char ) = @_ ;
955 $width ||= 30 ; $char ||= '=' ;
956 my $len_bfile = length $bfile ;
957 if ( " $len_bfile " >= "17" ) {
958 $show_bfile = substr ( $bfile , 0 , 17 ). "..." ;
960 $show_bfile = $bfile ;
962 $progress = sprintf ( "%.2f%%" , 100 * $got /+ $total );
963 sprintf " $color {'lightgreen'}%-20s %7s |%-${width}s| %10s $color {'normal'} \r " , $show_bfile , $progress , $char x
(( $width - 1 )* $got / $total ). '>' , beautifysize
( $got );
966 sub updates_available
{
967 # Get packets with updates available
968 my %upgradepaks = & Pakfire
:: dblist
( "upgrade" );
970 # Get the length of the returned hash
971 my $updatecount = keys %upgradepaks ;
973 return " $updatecount " ;
976 sub reboot_required
{
977 if ( - e
"/var/run/need_reboot" ) {
986 ### This subroutine returns pakfire status information in a hash.
987 # Usage is without arguments
989 # Add core version info
990 my %status = & Pakfire
:: coredbinfo
();
992 # Add last update info
993 $status { 'LastUpdate' } = & General
:: age
( "/opt/pakfire/db/core/mine" );
994 $status { 'LastCoreListUpdate' } = & General
:: age
( "/opt/pakfire/db/lists/core-list.db" );
995 $status { 'LastServerListUpdate' } = & General
:: age
( "/opt/pakfire/db/lists/server-list.db" );
996 $status { 'LastPakListUpdate' } = & General
:: age
( "/opt/pakfire/db/lists/packages_list.db" );
998 # Add number of available package updates
999 $status { 'CoreUpdateAvailable' } = ( defined $status { 'AvailableRelease' }) ?
"yes" : "no" ;
1000 $status { 'PakUpdatesAvailable' } = & Pakfire
:: updates_available
();
1002 # Add if reboot is required
1003 $status { 'RebootRequired' } = & Pakfire
:: reboot_required
();
1009 # Append architecture
1010 my ( $sysname , $nodename , $release , $version , $machine ) = POSIX
:: uname
();
1016 # Return stable if nothing is set
1017 return "stable" unless ( defined $pakfiresettings { 'TREE' });
1019 return $pakfiresettings { 'TREE' };
1022 sub make_version
() {
1025 # Open /etc/system-release
1026 open ( RELEASE
, "</etc/system-release" );
1027 my $release = < RELEASE
>;
1030 # Add the main relase
1031 if ( $release =~ m/IPFire ([\d\.]+)/ ) {
1035 # Append suffix for tree
1036 my $tree = & get_tree
();
1037 if ( $tree eq "testing" ) {
1039 } elsif ( $tree eq "unstable" ) {
1043 # Append architecture
1044 $version .= "-" . & get_arch
();