pkgsrc-Changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
CVS commit: pkgsrc/www/p5-FCGI-Daemon
Module Name: pkgsrc
Committed By: ast
Date: Wed Nov 4 13:46:53 UTC 2026
Added Files:
pkgsrc/www/p5-FCGI-Daemon: DESCR Makefile PLIST distinfo
pkgsrc/www/p5-FCGI-Daemon/files: fcgi_daemon.sh
pkgsrc/www/p5-FCGI-Daemon/patches: patch-lib-FCGI-Daemon.pm
Log Message:
www/p5-FCGI-Daemon: Add Fast CGI daemon for use with nginx web server.
To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 pkgsrc/www/p5-FCGI-Daemon/DESCR \
pkgsrc/www/p5-FCGI-Daemon/Makefile pkgsrc/www/p5-FCGI-Daemon/PLIST \
pkgsrc/www/p5-FCGI-Daemon/distinfo
cvs rdiff -u -r0 -r1.1 pkgsrc/www/p5-FCGI-Daemon/files/fcgi_daemon.sh
cvs rdiff -u -r0 -r1.1 \
pkgsrc/www/p5-FCGI-Daemon/patches/patch-lib-FCGI-Daemon.pm
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Added files:
Index: pkgsrc/www/p5-FCGI-Daemon/DESCR
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/DESCR:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/DESCR Wed Nov 4 13:46:52 2026
@@ -0,0 +1,12 @@
+FCGI::Daemon is a small FastCGI server for use as CGI-wrapper for
+CGI applications.
+
+Like mod_perl, FCGI-Daemon stays persistent in memory to accelerate
+unmodified CGI applications written in Perl.
+
+FCGI-Daemon run CGI scripts with RLIMITs and predefined number of
+workers.
+
+FCGI-Daemon checks for executable in path and correctly sets
+PATH_INFO environment variable which is crucial for some CGI
+applications like fossil (http://fossil-scm.org).
Index: pkgsrc/www/p5-FCGI-Daemon/Makefile
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/Makefile:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/Makefile Wed Nov 4 13:46:52 2026
@@ -0,0 +1,47 @@
+# $NetBSD: Makefile,v 1.1 2026/11/04 13:46:52 ast Exp $
+
+PKGBASE= FCGI-Daemon
+DISTNAME= ${PKGBASE}-0.20220206
+PKGNAME= p5-${DISTNAME}
+PKGREVISION= 1
+CATEGORIES= www perl5
+MASTER_SITES= ${MASTER_SITE_PERL_CPAN:=FCGI/}
+
+MAINTAINER= ast%NetBSD.org@localhost
+HOMEPAGE= https://metacpan.org/release/FCGI-Daemon
+COMMENT= Perl-aware Fast CGI daemon for use with nginx web server
+LICENSE= gnu-agpl-v3
+
+USE_TOOLS+= perl:run
+
+DEPENDS+= p5-FCGI>=0.82:../../www/p5-FCGI
+DEPENDS+= p5-BSD-Resource>=1.29:../../devel/p5-BSD-Resource
+DEPENDS+= p5-FCGI-ProcManager>=0.28:../../www/p5-FCGI-ProcManager
+
+FCGID_EG_DIR= share/examples/fcgi-daemon
+FCGID_NGINX= nginx/common.conf nginx/ikiwiki.conf nginx/sample.conf
+
+INSTALLATION_DIRS+= ${FCGID_EG_DIR} ${FCGID_EG_DIR}/nginx
+INSTALLATION_DIRS+= ${PERL5_SUB_INSTALLVENDORMAN3DIR}
+INSTALLATION_DIRS+= ${PERL5_SUB_INSTALLVENDORLIB}/FCGI
+
+REPLACE_PERL= lib/FCGI/Daemon.pm
+
+RCD_SCRIPTS= fcgi_daemon
+
+do-install:
+ ${INSTALL_SCRIPT} \
+ ${WRKSRC}/blib/lib/FCGI/Daemon.pm \
+ ${DESTDIR}${PREFIX}/${PERL5_SUB_INSTALLVENDORLIB}/FCGI
+ ${INSTALL_MAN} \
+ ${WRKSRC}/blib/man3/FCGI::Daemon.3 \
+ ${DESTDIR}${PREFIX}/${PERL5_SUB_INSTALLVENDORMAN3DIR}
+
+post-install:
+.for file in ${FCGID_NGINX}
+ ${INSTALL_DATA} ${WRKSRC}/examples/${file} \
+ ${DESTDIR}${PREFIX}/${FCGID_EG_DIR}/nginx
+.endfor
+
+.include "../../lang/perl5/module.mk"
+.include "../../mk/bsd.pkg.mk"
Index: pkgsrc/www/p5-FCGI-Daemon/PLIST
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/PLIST:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/PLIST Wed Nov 4 13:46:52 2026
@@ -0,0 +1,7 @@
+@comment $NetBSD: PLIST,v 1.1 2026/11/04 13:46:52 ast Exp $
+${PERL5_SUB_INSTALLVENDORLIB}/FCGI/Daemon.pm
+lib/perl5/vendor_perl/man/man3/FCGI::Daemon.3
+share/examples/fcgi-daemon/nginx/common.conf
+share/examples/fcgi-daemon/nginx/ikiwiki.conf
+share/examples/fcgi-daemon/nginx/sample.conf
+share/examples/rc.d/fcgi_daemon
Index: pkgsrc/www/p5-FCGI-Daemon/distinfo
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/distinfo:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/distinfo Wed Nov 4 13:46:52 2026
@@ -0,0 +1,6 @@
+$NetBSD: distinfo,v 1.1 2026/11/04 13:46:52 ast Exp $
+
+BLAKE2s (FCGI-Daemon-0.20220206.tar.gz) = ca58656d54596755b961fd4f0430c49c8a31b658341fb7471092125f0ec6dd7d
+SHA512 (FCGI-Daemon-0.20220206.tar.gz) = 827d3940f18c66c9cc155aa3045fb24e6afecef6ce9b03d3a8344e339749216db63ab39910ec826c2b7a992b4d21c3fede634355fffc3241892737743eb1b1dc
+Size (FCGI-Daemon-0.20220206.tar.gz) = 25156 bytes
+SHA1 (patch-lib-FCGI-Daemon.pm) = 3e9a640c06ead3dd46c34ab8b14e03362512951d
Index: pkgsrc/www/p5-FCGI-Daemon/files/fcgi_daemon.sh
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/files/fcgi_daemon.sh:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/files/fcgi_daemon.sh Wed Nov 4 13:46:52 2026
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# $NetBSD: fcgi_daemon.sh,v 1.1 2026/11/04 13:46:52 ast Exp $
+#
+
+# PROVIDE: fcgi_daemon
+# REQUIRE: DAEMON
+# BEFORE: LOGIN
+
+$_rc_subr_loaded . /etc/rc.subr
+
+name="fcgi_daemon"
+pidfile="/var/run/${name}.pid"
+sockfile="/var/run/${name}.sock"
+rcvar=$name
+
+start_cmd="fcgi_daemon_start"
+status_cmd="fcgi_daemon_status"
+stop_cmd="fcgi_daemon_stop"
+
+extra_commands="status"
+
+fcgi_daemon_args="-p ${pidfile} -s ${sockfile} -u nginx -g nginx -w 2 -d"
+
+cmd_args=${fcgi_daemon_flags:-$fcgi_daemon_args}
+
+perl='/usr/pkg/bin/perl'
+[ -x ${perl} ] || { echo "Missing ${perl}">&2; exit 1; }
+
+cmd=`${perl} -MFCGI::Daemon -e 'print $INC{"FCGI/Daemon.pm"}' 2>/dev/null`
+[ -f "${cmd}" ] || { echo "Missing FCGI::Daemon Perl module">&2; exit 1; }
+
+fcgi_daemon_start()
+{
+ /usr/bin/env - ${perl} ${cmd} ${cmd_args}
+ if [ $? -eq 0 ]; then
+ echo "$name manager and workers started."
+ else
+ echo "$name failed to start."
+ fi
+}
+
+fcgi_daemon_status()
+{
+ local pids p t
+
+ pids=`/usr/bin/pgrep FCGI::Daemon`
+ [ -z "$pids" ] && { echo "No $name running."; exit 1; }
+
+ # list all FCGI::Daemon processes
+ t=/bin/cat
+ for p in $pids; do
+ /bin/ps -ouser,group,pid,ppid,cpu,vsz,rss,wchan,time,command -p $p | $t
+ t='/usr/bin/tail -1'
+ done
+
+ # list all socket files
+ /usr/bin/sockstat -l | /usr/bin/head -1
+ /usr/bin/sockstat -l | /usr/bin/grep ${sockfile}
+
+ return 0
+}
+
+fcgi_daemon_stop()
+{
+ kill `cat ${pidfile} 2>/dev/null` >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ echo "$name stopped."
+ else
+ echo "Failed to stop $name."
+ fcgi_daemon_status
+ fi
+}
+
+load_rc_config $name
+run_rc_command "$1"
Index: pkgsrc/www/p5-FCGI-Daemon/patches/patch-lib-FCGI-Daemon.pm
diff -u /dev/null pkgsrc/www/p5-FCGI-Daemon/patches/patch-lib-FCGI-Daemon.pm:1.1
--- /dev/null Wed Nov 4 13:46:53 2026
+++ pkgsrc/www/p5-FCGI-Daemon/patches/patch-lib-FCGI-Daemon.pm Wed Nov 4 13:46:53 2026
@@ -0,0 +1,259 @@
+$NetBSD: patch-lib-FCGI-Daemon.pm,v 1.1 2026/11/04 13:46:53 ast Exp $
+
+Add an option -X to enable debugging.
+
+Unlink files without testing for existence as we ignore exit status
+anyway.
+
+Use POSIX calls setgid and setuid to non-root user when running as
+"root" daemon.
+
+Use only $EFFECTIVE_USER_ID to discrimiate if we need to set[gu]id
+and don't install signal handlers INT and TERM as FCGI::ProcManager
+does that.
+
+Close socket when running as root (manager) and remove files in
+pm_die() routine.
+
+Instead of using a non-portable /proc/$$/status read to get memory
+usage on Linux, use a non-portable /bin/ps command on BSD platforms.
+
+Mention NetBSD and pkgsrc in POD.
+
+Make sure all test pass.
+
+
+--- lib/FCGI/Daemon.pm.orig 2022-02-06 15:23:10.000000000 +0000
++++ lib/FCGI/Daemon.pm 2022-07-28 16:42:18.127502146 +0000
+@@ -6,6 +6,7 @@
+ package FCGI::Daemon;
+ our $VERSION = '0.20220206';
+ use 5.14.2;
++use POSIX;
+ use English '-no_match_vars';
+ use BSD::Resource; # on Debian available as libbsd-resource-perl
+ use FCGI 0.82; # on Debian available as libfcgi-perl
+@@ -25,6 +26,7 @@
+ =cut
+
+ my %o;
++my $DEBUG = 0;
+
+ __PACKAGE__->run() unless caller(); # modulino i.e. executable rather than module
+
+@@ -39,9 +41,7 @@
+ sub dieif {
+ if($ARG[0]){
+ my $err=$ARG[1];
+- for my $f ( @o{'pidfile','sockfile'} ) {
+- unlink $f if -f $f;
+- }
++ unlink $o{$_} for qw(pidfile sockfile);
+ print "Error - $err:\n",$ARG[0],"\n";
+ exit 1;
+ }
+@@ -51,7 +51,7 @@
+ Modulino-style main routine
+ =cut
+ sub run {
+- getopts('hde:f:q:p:s:g:u:m:c:l:w:',\%o) or help(0);
++ getopts('hde:f:q:p:s:g:u:m:c:l:w:X',\%o) or help(0);
+ help(2) if $o{'h'};
+
+ $o{sockfile}=$o{'s'}||'/var/run/fcgi-daemon.sock';
+@@ -63,21 +63,18 @@
+ $o{max_evals}=defined $o{'e'} ? $o{'e'} : 10240; #max evals before exit - paranoid to free memory if leaks
+ $o{file_pattern}=$o{'f'}||qr{\.pl};
+ $o{leak_threshold}=$o{'l'}||1.3;
++ $DEBUG++ if $o{'X'};
+
+- if($REAL_USER_ID==$EFFECTIVE_USER_ID and $EFFECTIVE_USER_ID==0){ # if run as root
++ if($EFFECTIVE_USER_ID==0){
+ $o{gid}=$o{g}||'www-data'; $o{gid_num}=scalar getgrnam($o{gid});
+ $o{uid}=$o{u}||'www-data'; $o{uid_num}=scalar getpwnam($o{uid});
+ }
+
+- local $SIG{INT}= local $SIG{TERM}= sub{
+- # actually FCGI::ProcManager override our TERM handler so .sock and .pid files will be removed only by sysv script... :(
+- $o{fcgi_pm}->pm_remove_pid_file() if $o{fcgi_pm};
+- for my $f ( @o{'pidfile','sockfile'} ) {
+- unlink $f if -f $f;
+- }
+- $o{fcgi_pm}->pm_die() if $o{fcgi_pm}; #pm_die() does not return
+- exit 0;
+- };
++ if ($DEBUG) {
++ use Data::Dumper;
++ $Data::Dumper::Indent = 1;
++ warn Data::Dumper->Dump([\%o],['o']);
++ }
+
+ # daemonize
+ if($o{'d'}){
+@@ -85,10 +82,10 @@
+ local $PROGRAM_NAME='FCGI::Daemon';
+ defined(my $pid=fork) or die "Can't fork: $!";
+ exit if $pid;
+- eval {use POSIX qw(setsid); POSIX::setsid();} or die q{Can't start a new session: }.$OS_ERROR;
++ POSIX::setsid() or die q{Can't start a new session: }.$OS_ERROR;
+ open *STDIN,'<','/dev/null';
+ open *STDOUT,'>>','/dev/null';
+- open *STDERR,'>>','/dev/null';
++ open *STDERR,'>>','/dev/null' unless $DEBUG;
+ umask 022;
+ }
+
+@@ -98,32 +95,24 @@
+ pid_fname=>$o{pidfile}
+ });
+ print "Opening socket $o{sockfile}\n";
++ $o{socket_fh} = FCGI::OpenSocket($o{sockfile},$o{prefork}*$o{queue});
+ my $rqst=FCGI::Request(\*STDIN,\*STDOUT,\*STDERR,\%req_env,
+- FCGI::OpenSocket($o{sockfile},$o{prefork}*$o{queue}),
+- FCGI::FAIL_ACCEPT_ON_INTR())
++ $o{socket_fh}, FCGI::FAIL_ACCEPT_ON_INTR())
+ or die "Error: Unable to create FCGI::Request...";
+
+- if(defined $o{gid_num} and defined $o{uid_num}){ # if run as root
+- chown $o{uid_num},$o{gid_num},$o{sockfile} # chown SOCKfile
+- or dieif($OS_ERROR,'Unable to chown SOCKfile');
++ # drop privileges if run as root
++ if(defined $o{uid_num} && defined $o{gid_num}) {
++ my $old_euid = $EFFECTIVE_USER_ID;
++ chown $o{uid_num},$o{gid_num},$o{sockfile}
++ or dieif($OS_ERROR,'Unable to chown SOCKfile '.$o{sockfile});
++ POSIX::setgid($o{gid_num}) or dieif($OS_ERROR,
++ "UID $old_euid couldn't change group to $o{gid} ($o{gid_num})");
++ POSIX::setuid($o{uid_num}) or dieif($OS_ERROR,
++ "UID $old_euid couldn't change user to $o{uid} ($o{uid_num})");
+ }
+
+ $o{fcgi_pm}->pm_manage(); # from now on we are worker process
+
+- # drop privileges if run as root
+- if(defined $o{gid_num} and defined $o{uid_num}){
+- my $gid = getgrnam($o{gid});
+- $EFFECTIVE_GROUP_ID = "$gid $gid";
+- dieif($OS_ERROR,'Unable to effective group_id to '.$o{gid});
+- $REAL_GROUP_ID = $gid;
+- dieif($OS_ERROR,'Unable to change real group_id to '.$o{gid});
+- my $uid = getpwnam($o{uid});
+- $EFFECTIVE_USER_ID = $uid;
+- dieif($OS_ERROR,'Unable to change effective user_id to '.$o{uid});
+- $REAL_USER_ID = $uid;
+- dieif($OS_ERROR,'Unable to change real user_id to '.$o{uid});
+- }
+-
+ ## set rlimit(s)
+ setrlimit(RLIMIT_AS, $o{rlimit_vmem}, $o{rlimit_vmem})
+ or warn "Unable to set RLIMIT_AS.\n";
+@@ -181,21 +170,37 @@
+ delete $main::{$_};
+ }
+
+- if(open my $STAT,'<',"/proc/$$/status"){
+- my %stat;
+- while(my ($k,$v)=split /\:\s+/,<$STAT>){
+- chop $v;
+- $stat{$k}=$v;
++ exit unless --$o{max_evals};
++
++ # exit if child takes too much resident memory
++ my %stat = ();
++ if ( $OSNAME =~ m{bsd}oi ) {
++ if (open my $STAT,'-|',"/bin/ps -o vsz,rss -p $$") {
++ while(<$STAT>) {
++ if ( m{^\s*(\d+)\s+(\d+)$}o ) {
++ $stat{VmSize} = $1;
++ $stat{VmRSS} = $2;
++ last;
++ }
++ }
++ close $STAT;
+ }
+- close $STAT;
+- # check if child takes too much resident memory and terminate if necessary
+- if($stat{VmSize}/$stat{VmRSS}<$o{leak_threshold}){
+- print {*STDERR} 'fcgi-daemon :: terminating child - memory leak? '
+- ."VmSize:$stat{VmSize}; VmRSS:$stat{VmRSS}; Ratio:".$stat{VmSize}/$stat{VmRSS};
+- exit;
++ } else {
++ if(open my $STAT,'<',"/proc/$$/status"){
++ while(my ($k,$v)=split /\:\s+/,<$STAT>){
++ chop $v;
++ $stat{$k}=$v;
++ }
++ close $STAT;
+ }
+ }
+- exit unless --$o{max_evals};
++ if ( $stat{VmSize} && $stat{VmRSS}
++ && ($stat{VmSize}/$stat{VmRSS}<$o{leak_threshold}) ) {
++ die 'fcgi-daemon :: terminating child - memory leak? '
++ ."VmSize:$stat{VmSize}; VmRSS:$stat{VmRSS}; Ratio:"
++ .$stat{VmSize}/$stat{VmRSS};
++ }
++
+ next REQ_LOOP;
+ }
+
+@@ -253,6 +258,24 @@
+ return;
+ }
+
++=head2 managing_init ()
++ close socket as manager
++=cut
++sub managing_init {
++ # manager (running as root) doesn't need to listen on the socket
++ close $o{socket_fh} if $EFFECTIVE_USER_ID==0;
++ return $o{fcgi_pm}->managing_init(shift @_);
++}
++
++=head2 pm_die()
++ exit cleanly
++=cut
++sub pm_die {
++ # manager (running as root) can remove these better
++ unlink $o{$_} for qw(pidfile sockfile);
++ return $o{fcgi_pm}->pm_die(shift @_);
++}
++
+ # overriding process names
+ sub FCGI::ProcManager::pm_change_process_name {
+ my ($self,$name)=@_;
+@@ -293,7 +316,7 @@
+ CGI applications.
+
+ Like mod_perl FCGI-Daemon stay persistent in memory and accelerate
+-unmodified CGI applications written in Perl.
++unmodified CGI applications written in Perl.
+
+ FCGI-Daemon run CGI scripts with RLIMITs and predefined number of workers.
+
+@@ -302,7 +325,7 @@
+
+ FCGI-Daemon check for executable in path and correctly set PATH_INFO
+ environment variable which is crucial for some CGI applications like
+-fossil (L<http://fossil-scm.org>).
++fossil (L<http://fossil-scm.org>).
+ (Lack of this functionality make cgiwrap-fcgi.pl unsuitable for some scripts.)
+
+
+@@ -351,6 +374,7 @@
+ -u www-data # user name to become (if run as root)
+ -g www-data # group name to become (if run as root)
+ -d # daemonize (run in background)
++ -X # enable debugging
+
+ All options are optional.
+
+@@ -410,7 +434,7 @@
+
+ =head1 COMPATIBILITY
+
+-Tested only on GNU/Linux systems.
++Tested on GNU/Linux and NetBSD systems (pkgsrc).
+ NOT tested and not expected to work on Windows.
+
+ =head1 NOTES
Home |
Main Index |
Thread Index |
Old Index