[1/2] pakfire: Prevent from get launched multiple times.

Message ID 20210524173821.4596-1-stefan.schantl@ipfire.org
State Accepted
Commit d6c2e6715575c4d531f1302ab6c7368329da8bd4
Headers
Series [1/2] pakfire: Prevent from get launched multiple times. |

Commit Message

Stefan Schantl May 24, 2021, 5:38 p.m. UTC
  When pakfire gets launched a check if a so called lockfile exists and
the process will be aborted, otherwise the file will be created which
prevents any other pakfire instance to perform any operations until the
first process gets finished and the lock will be released again.

Because the release of the lock is located in an END block, the lock
also will be released in case the pakfire process gets interuped or
gains an error.

This prevents from an lock loop and an unuseable pakfire.

Reference: #12621.

Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
---
 src/pakfire/lib/functions.pl |  3 +++
 src/pakfire/pakfire          | 26 +++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)
  

Comments

Michael Tremer May 25, 2021, 9:58 a.m. UTC | #1
Thank you very much.

I merged this and hopefully this won’t break anything *fingers crossed*.

> On 24 May 2021, at 18:38, Stefan Schantl <stefan.schantl@ipfire.org> wrote:
> 
> When pakfire gets launched a check if a so called lockfile exists and
> the process will be aborted, otherwise the file will be created which
> prevents any other pakfire instance to perform any operations until the
> first process gets finished and the lock will be released again.
> 
> Because the release of the lock is located in an END block, the lock
> also will be released in case the pakfire process gets interuped or
> gains an error.
> 
> This prevents from an lock loop and an unuseable pakfire.
> 
> Reference: #12621.
> 
> Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
> ---
> src/pakfire/lib/functions.pl |  3 +++
> src/pakfire/pakfire          | 26 +++++++++++++++++++++++++-
> 2 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl
> index 4d5c6219a..f9a19b60d 100644
> --- a/src/pakfire/lib/functions.pl
> +++ b/src/pakfire/lib/functions.pl
> @@ -73,6 +73,9 @@ my %pakfiresettings = ();
> # Make version
> $Conf::version = &make_version();
> 
> +# Pakfire lock file.
> +our $lockfile = "/tmp/pakfire_lock";
> +
> sub message {
> 	my $message = shift;
> 		
> diff --git a/src/pakfire/pakfire b/src/pakfire/pakfire
> index c69a8d3ad..4139d106b 100644
> --- a/src/pakfire/pakfire
> +++ b/src/pakfire/pakfire
> @@ -2,7 +2,7 @@
> ###############################################################################
> #                                                                             #
> # IPFire.org - A linux based firewall                                         #
> -# Copyright (C) 2007-2015   IPFire Team   <info@ipfire.org>                   #
> +# Copyright (C) 2007-2021   IPFire Team   <info@ipfire.org>                   #
> #                                                                             #
> # This program is free software: you can redistribute it and/or modify        #
> # it under the terms of the GNU General Public License as published by        #
> @@ -31,6 +31,7 @@
> 	
> 	my $interactive = 1;
> 	my $force = "noforce";
> +	my $locked;
> 	
> 	&Pakfire::logger("PAKFIRE INFO: IPFire Pakfire $Conf::version started!");
> 
> @@ -47,6 +48,21 @@
> 		&Pakfire::message("PAKFIRE ERROR: You need to be online to run pakfire!");
> 		exit 2;
> 	}
> +
> +	# Check if a lockfile already exists.
> +	if (-e "$Pakfire::lockfile") {
> +		&Pakfire::message("PAKFIRE ERROR: Another instance of pakfire is already running!");
> +		exit 1;
> +	}
> +
> +	# Write lockfile.
> +	open(LOCK, ">$Pakfire::lockfile");
> +
> +	# Pakfire has locked in this session set locket to "1".
> +	$locked = "1";
> +
> +	# Close filehandle.
> +	close(LOCK);
> 	
> 	### Check if we are started by another name
> 	#
> @@ -330,4 +346,12 @@
> 
> 	&Pakfire::logger("PAKFIRE INFO: Pakfire has finished. Closing.");
> 
> +	END {
> +		# Check if pakfire has been locked in this session.
> +		if ($locked) {
> +			# Remove lockfile.
> +			unlink($Pakfire::lockfile);
> +		}
> +	}
> +
> 	exit 0;
> -- 
> 2.20.1
>
  

Patch

diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl
index 4d5c6219a..f9a19b60d 100644
--- a/src/pakfire/lib/functions.pl
+++ b/src/pakfire/lib/functions.pl
@@ -73,6 +73,9 @@  my %pakfiresettings = ();
 # Make version
 $Conf::version = &make_version();
 
+# Pakfire lock file.
+our $lockfile = "/tmp/pakfire_lock";
+
 sub message {
 	my $message = shift;
 		
diff --git a/src/pakfire/pakfire b/src/pakfire/pakfire
index c69a8d3ad..4139d106b 100644
--- a/src/pakfire/pakfire
+++ b/src/pakfire/pakfire
@@ -2,7 +2,7 @@ 
 ###############################################################################
 #                                                                             #
 # IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2015   IPFire Team   <info@ipfire.org>                   #
+# Copyright (C) 2007-2021   IPFire Team   <info@ipfire.org>                   #
 #                                                                             #
 # This program is free software: you can redistribute it and/or modify        #
 # it under the terms of the GNU General Public License as published by        #
@@ -31,6 +31,7 @@ 
 	
 	my $interactive = 1;
 	my $force = "noforce";
+	my $locked;
 	
 	&Pakfire::logger("PAKFIRE INFO: IPFire Pakfire $Conf::version started!");
 
@@ -47,6 +48,21 @@ 
 		&Pakfire::message("PAKFIRE ERROR: You need to be online to run pakfire!");
 		exit 2;
 	}
+
+	# Check if a lockfile already exists.
+	if (-e "$Pakfire::lockfile") {
+		&Pakfire::message("PAKFIRE ERROR: Another instance of pakfire is already running!");
+		exit 1;
+	}
+
+	# Write lockfile.
+	open(LOCK, ">$Pakfire::lockfile");
+
+	# Pakfire has locked in this session set locket to "1".
+	$locked = "1";
+
+	# Close filehandle.
+	close(LOCK);
 	
 	### Check if we are started by another name
 	#
@@ -330,4 +346,12 @@ 
 
 	&Pakfire::logger("PAKFIRE INFO: Pakfire has finished. Closing.");
 
+	END {
+		# Check if pakfire has been locked in this session.
+		if ($locked) {
+			# Remove lockfile.
+			unlink($Pakfire::lockfile);
+		}
+	}
+
 	exit 0;