Add the Auto Nice Daemon as sysutils/and

The auto nice daemon will renice or even kill jobs according to a
priority database, after they take up too much CPU time.
This commit is contained in:
hauke 2023-06-15 09:55:25 +00:00
parent 6f154d6ade
commit 600ffe3c78
10 changed files with 307 additions and 1 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.1053 2023/06/13 13:15:05 bacon Exp $
# $NetBSD: Makefile,v 1.1054 2023/06/15 09:55:25 hauke Exp $
#
COMMENT= System utilities
@ -30,6 +30,7 @@ SUBDIR+= amanda-plot
SUBDIR+= amanda-server
SUBDIR+= amlogic-meson-fwtools
SUBDIR+= amtterm
SUBDIR+= and
SUBDIR+= ansible
SUBDIR+= ansible-core
SUBDIR+= ansible-lint

4
sysutils/and/DESCR Normal file
View File

@ -0,0 +1,4 @@
The auto nice daemon will renice or even kill jobs according to a priority
database, after they take up too much CPU time.
You define what "too much" actually means.

64
sysutils/and/Makefile Normal file
View File

@ -0,0 +1,64 @@
# $NetBSD: Makefile,v 1.1 2023/06/15 09:55:25 hauke Exp $
DISTNAME= and-1.2.2
CATEGORIES= sysutils
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=and/}
MAINTAINER= hauke@NetBSD.org
HOMEPAGE= http://and.sourceforge.net/
COMMENT= Renice or kill jobs based on priority database
LICENSE= gnu-gpl-v2
USE_TOOLS+= gmake
USE_LANGUAGES= c
BUILD_TARGET= and doc
RCD_SCRIPTS= and
EGDIR= share/examples/and
CONFIG_FILES= and.conf and.priorities
.include "../../mk/bsd.prefs.mk"
SUBST_CLASSES+= paths
SUBST_MESSAGE.paths= Fixing hardcoded paths.
SUBST_STAGE.paths= pre-configure
SUBST_FILES.paths= Makefile
SUBST_FILES.paths+= and.service
SUBST_VARS.paths= PREFIX PKG_SYSCONFDIR VARBASE
SUBST_CLASSES+= man
SUBST_MESSAGE.man= Fixing hardcoded paths in man pages.
SUBST_STAGE.man= pre-configure
SUBST_FILES.man= *.man
SUBST_SED.man= -e 's,/etc/,${PKG_SYSCONFDIR}/,g'
LIBS.NetBSD+= -lkvm
LIBS.FreeBSD+= -lkvm
MAKE_FLAGS+= LD=${CC:Q} LIBS=${LIBS:Q}
.for f in ${CONFIG_FILES}
CONF_FILES+= ${EGDIR}/${f} ${PKG_SYSCONFDIR}/${f}
.endfor
INSTALLATION_DIRS+= sbin ${PKGMANDIR}/man5 ${PKGMANDIR}/man8 ${EGDIR}
post-extract:
cp ${FILESDIR}/and.service ${WRKSRC}/
cp ${WRKSRC}/and-OpenBSD.c ${WRKSRC}/and-NetBSD.c
do-install:
${INSTALL_PROGRAM} ${WRKSRC}/and ${DESTDIR}${PREFIX}/sbin/and
.for mp in and.conf and.priorities
${INSTALL_MAN} ${WRKSRC}/${mp}.5 ${DESTDIR}${PREFIX}/${PKGMANDIR}/man5/
.endfor
${INSTALL_MAN} ${WRKSRC}/and.8 ${DESTDIR}${PREFIX}/${PKGMANDIR}/man8/
.for cf in ${CONFIG_FILES} and.init.debian and.service and.startup
${INSTALL_DATA} ${WRKSRC}/${cf} ${DESTDIR}${PREFIX}/${EGDIR}
.endfor
.include "../../mk/bsd.pkg.mk"

10
sysutils/and/PLIST Normal file
View File

@ -0,0 +1,10 @@
@comment $NetBSD: PLIST,v 1.1 2023/06/15 09:55:25 hauke Exp $
man/man5/and.conf.5
man/man5/and.priorities.5
man/man8/and.8
sbin/and
share/examples/and/and.conf
share/examples/and/and.init.debian
share/examples/and/and.priorities
share/examples/and/and.service
share/examples/and/and.startup

8
sysutils/and/distinfo Normal file
View File

@ -0,0 +1,8 @@
$NetBSD: distinfo,v 1.1 2023/06/15 09:55:25 hauke Exp $
BLAKE2s (and-1.2.2.tar.gz) = 0b2c5970802a3698b0239be10227af29675ee370ca6088854b69bfb46b0a3550
SHA512 (and-1.2.2.tar.gz) = f9ae5a6193a0029b6d1e6ce3c160635d39b152c49ad88b7ae686f3abf8ebcb5ec994edce5915a7f0eaa0f327c3ee7c4f0be2fc7c8bb01b7f374afdd594d6b609
Size (and-1.2.2.tar.gz) = 29989 bytes
SHA1 (patch-Makefile) = 78c44b93317d4f726e33c22a490995ec06eb269b
SHA1 (patch-and-NetBSD.c) = ff29d9d34b2c5e0e3c6c1b58e7e71a42b0b5bddd
SHA1 (patch-and.c) = 1dd220def1520ef2b3d967eb0c940e001a75c917

View File

@ -0,0 +1,17 @@
# Linux systemd service definition
[Unit]
Description=Auto Nice Daemon
# We need group information from YP
Requires=rpcbind.service domainname.service
After=rpcbind.service domainname.service network.target
[Service]
Type=forking
GuessMainPID=yes
ExecStart=@PREFIX@/sbin/and
ExecReload=/bin/kill -1 -- $MAINPID
ExecStop=/bin/kill -- $MAINPID
[Install]
WantedBy=multi-user.target

23
sysutils/and/files/and.sh Normal file
View File

@ -0,0 +1,23 @@
#!@RCD_SCRIPTS_SHELL@
#
# $NetBSD: and.sh,v 1.1 2023/06/15 09:55:25 hauke Exp $
#
# PROVIDE: and
# REQUIRE: DAEMON
name="and"
command="@PREFIX@/sbin/${name}"
if [ -f @SYSCONFBASE@/rc.subr ]; then
. @SYSCONFBASE@/rc.subr
rcvar=${name}
required_files="@PKG_SYSCONFDIR@/${name}.conf"
pidfile="@VARBASE@/run/${name}.pid"
load_rc_config ${name}
run_rc_command "$1"
else
@ECHO@ -n " ${name}"
${command} ${and_flags}
fi

View File

@ -0,0 +1,81 @@
$NetBSD: patch-Makefile,v 1.1 2023/06/15 09:55:25 hauke Exp $
Use pkgsrc paths and build options
--- Makefile.orig 2005-03-27 19:39:37.000000000 +0000
+++ Makefile
@@ -22,11 +22,15 @@ INITSCRIPT=and.init
# Target directories. Examples for common configurations are
# given below.
#
-PREFIX=/usr/local
-INSTALL_ETC=$(PREFIX)/etc
-INSTALL_INITD=/etc/init.d
-INSTALL_SBIN=$(PREFIX)/sbin
-INSTALL_MAN=$(PREFIX)/man
+#PREFIX=/usr/local
+#INSTALL_ETC=$(PREFIX)/etc
+#INSTALL_INITD=/etc/init.d
+#INSTALL_SBIN=$(PREFIX)/sbin
+#INSTALL_MAN=$(PREFIX)/man
+
+# pkgsrc
+PREFIX=@PREFIX@
+INSTALL_ETC=@PKG_SYSCONFDIR@
# typical OpenBSD or FreeBSD configuration
#PREFIX=/usr/local
@@ -91,53 +95,6 @@ MANPAGES=and.8 and.conf.5 and.priorities
#
ARCH=$(shell uname)
-#
-# Architecture-dependent settings: ANSI C compiler and linker
-#
-ifeq (${ARCH},Linux)
- CC = gcc -ansi -pedantic -Wall -g
- LD = gcc
- LIBS =
-else
-ifeq (${ARCH},OSF1)
- CC = cc -ansi
- LD = cc
- LIBS =
-else
-ifeq (${ARCH},OpenBSD)
- CC = gcc
- LD = gcc
- LIBS = -lkvm
-else
-ifeq (${ARCH},FreeBSD)
- CC = gcc -Wall
- LD = gcc
- LIBS = -lkvm
-else
-ifeq (${ARCH},SunOS)
- CC = cc -D__SunOS__
- LD = cc
-else
-ifeq (${ARCH},IRIX)
- CC = cc
- LD = cc
-else
-ifeq (${ARCH},IRIX64)
- CC = cc
- LD = cc
-else
- # unsupported architecture
- CC = false
- LD = false
- LIBS =
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-
#
# Build the auto-nice daemon.

View File

@ -0,0 +1,39 @@
$NetBSD: patch-and-NetBSD.c,v 1.1 2023/06/15 09:55:25 hauke Exp $
Make NetBSD kernel data structures visible
Apparently, <sys/resourcevar.h> is not to be exposed to userland, and
it is not needed, anyway
Drop FreeBSD specific #include
--- and-NetBSD.c.orig 2023-06-14 09:29:04.355389748 +0000
+++ and-NetBSD.c
@@ -20,23 +20,21 @@
*/
+#define _KMEMUSER
+
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <kvm.h>
#include <fcntl.h>
#include <limits.h>
+
+#include <sys/types.h>
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/proc.h>
#include <sys/time.h>
#include <sys/resource.h>
-#include <sys/resourcevar.h>
-
-#ifdef __FreeBSD__
-#include <sys/user.h>
-#endif
-
#include "and.h"

View File

@ -0,0 +1,59 @@
$NetBSD: patch-and.c,v 1.1 2023/06/15 09:55:25 hauke Exp $
<values.h> is non-portable, replace with <limits.h> definitions.
--- and.c.orig 2004-04-05 19:19:01.000000000 +0000
+++ and.c
@@ -47,7 +47,6 @@
#include <sys/types.h>
#include <signal.h>
#include <regex.h>
-#include <values.h>
#define DEBUG 0
@@ -704,7 +703,7 @@ int and_getnice (int uid, int gid, char
/* Strategy: each priority database accumulates accuracy points
for every aspect: user, group, command, parent. An exact hit is
worth the configured weight of the aspect (1, 2, 4, 8); a joker
- is worth 0; and a miss is with -MAXINT, effectively eliminating
+ is worth 0; and a miss is with -INT_MAX, effectively eliminating
the entry (veto). At the end, the highest rated entry is
used to determine the new nice level. */
for (i=0; i<and_db.n; i++) {
@@ -714,7 +713,7 @@ int and_getnice (int uid, int gid, char
} else if (and_db.entry[i].uid == -1) {
exactness[i] = 0;
} else {
- exactness[i] = -MAXINT;
+ exactness[i] = -INT_MAX;
}
/* group id */
if (gid == and_db.entry[i].gid) {
@@ -722,7 +721,7 @@ int and_getnice (int uid, int gid, char
} else if (and_db.entry[i].gid == -1) {
exactness[i] += 0;
} else {
- exactness[i] = -MAXINT;
+ exactness[i] = -INT_MAX;
}
/* command */
if (command!=NULL && regexec(and_db.entry[i].command,command,0,0,0) == 0) {
@@ -730,7 +729,7 @@ int and_getnice (int uid, int gid, char
} else if (strcmp(and_db.entry[i].command_str,"*") == 0) {
exactness[i] += 0;
} else {
- exactness[i] = -MAXINT;
+ exactness[i] = -INT_MAX;
}
/* parent */
par = parent;
@@ -745,7 +744,7 @@ int and_getnice (int uid, int gid, char
exactness[i] += 0;
break;
} else if (last) {
- exactness[i] = -MAXINT;
+ exactness[i] = -INT_MAX;
break;
}
par = par->parent;