From d6c2e6715575c4d531f1302ab6c7368329da8bd4 Mon Sep 17 00:00:00 2001 From: Stefan Schantl Date: Mon, 24 May 2021 19:38:20 +0200 Subject: [PATCH] pakfire: Prevent from get launched multiple times. 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 Signed-off-by: Michael Tremer --- 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 4d5c6219ab..f9a19b60d8 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 c69a8d3ad6..4139d106b8 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 # +# Copyright (C) 2007-2021 IPFire Team # # # # 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.39.2