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 <stefan.schantl@ipfire.org>
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
This commit is contained in:
Stefan Schantl
2021-05-24 19:38:20 +02:00
committed by Michael Tremer
parent f0996ee643
commit d6c2e67155
2 changed files with 28 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;