From patchwork Tue Sep 28 11:09:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo-Andres Hofmann X-Patchwork-Id: 4750 Return-Path: Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by web04.haj.ipfire.org (Postfix) with ESMTPS id 4HJcGJ4F2Vz3xWd for ; Tue, 28 Sep 2021 11:09:28 +0000 (UTC) Received: from mail02.haj.ipfire.org (mail02.haj.ipfire.org [172.28.1.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail02.haj.ipfire.org", Issuer "R3" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 4HJcGF6lYkz6Yq; Tue, 28 Sep 2021 11:09:25 +0000 (UTC) Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4HJcGF57Lnz32KN; Tue, 28 Sep 2021 11:09:25 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4HJcGF12Knz2y4n for ; Tue, 28 Sep 2021 11:09:25 +0000 (UTC) Received: from arche.uberspace.de (arche.uberspace.de [185.26.156.147]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail01.ipfire.org (Postfix) with ESMTPS id 4HJcG775gLz136 for ; Tue, 28 Sep 2021 11:09:19 +0000 (UTC) Received: (qmail 16584 invoked from network); 28 Sep 2021 11:09:19 -0000 Received: from localhost (HELO localhost) (127.0.0.1) by arche.uberspace.de with SMTP; 28 Sep 2021 11:09:19 -0000 From: Leo-Andres Hofmann To: development@lists.ipfire.org Subject: [PATCH v2 2/3] make.sh: Add check-manualpages function Date: Tue, 28 Sep 2021 13:09:05 +0200 Message-Id: <20210928110906.1089-2-hofmann@leo-andres.de> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20210928110906.1089-1-hofmann@leo-andres.de> References: <20210928110906.1089-1-hofmann@leo-andres.de> MIME-Version: 1.0 ARC-Seal: i=1; s=202003rsa; d=lists.ipfire.org; t=1632827360; a=rsa-sha256; cv=none; b=MySxm4KfF2VbCf/CWZOPS9k49e/4S2xH41N+cicZdu88TzfGh8UXiD9gAKJbxbbcjrs1fz IIEJSqWkYRNK8JnqWcuXT6UcOpvUm2M7u1OCM2QAx6ZhZ+l70A6Rwvwx/9jEG1QGKjzSlk XvLHBfjN2gStAmOBYNF7sR2NSZ+ey55CwoqsWZlkOYRd4LqgxwCQNeigNwZXvw01XsGmmm BBBg/CWiPr1jxCG6pVYczpyKFV/uEZznXnEO86wGh5uwSBdq3GeuhTRmLGvjhV/KPQ9YuP QCof2+FArny6xVt5GdYrBAWFOt5BysBfifNNanF4yNYcCtNR139iG7RNOiYWrw== ARC-Authentication-Results: i=1; mail01.ipfire.org; dkim=none; dmarc=none; spf=pass (mail01.ipfire.org: domain of hofmann@leo-andres.de designates 185.26.156.147 as permitted sender) smtp.mailfrom=hofmann@leo-andres.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=lists.ipfire.org; s=202003rsa; t=1632827360; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GiOJI9sBsv9Vkq+FBxsStIeVqd30zHnz8OTJiisaOv8=; b=fE7GOrc756mxfMI7EWRpsnrysL3WxNn0BNzq+UT9nHrKefkFWyENQLPrvC3xI9E7E7gwe3 PRHWa0BcKm+ArLKgvxb2dcK4TIuVYeLszVUKK+CXS5qGUqltc1V5AHmC+hahnq0kz+Nbsk RbIpjk9tMYkd7uc1rPSnRPdSFkSpL+eLn7kq4/Bi+lXhl6eKPdxfMj5074+rItEMYXgIDw ZOmtKV0vp1V9+pDruWayyIhBlrPqif0eHGkMCXZ5KzkOzILuNuBSUK4aJPeuJXIMtFv6Pq UljUKlyozJSKijD4rno3h7yvHpTt1/YFvMhDy31ARcM+Yu2/SAz7BnY2dPBjEA== Authentication-Results: mail01.ipfire.org; dkim=none; dmarc=none; spf=pass (mail01.ipfire.org: domain of hofmann@leo-andres.de designates 185.26.156.147 as permitted sender) smtp.mailfrom=hofmann@leo-andres.de X-Rspamd-Server: mail01.haj.ipfire.org X-Spamd-Result: default: False [-2.19 / 11.00]; BAYES_HAM(-3.00)[99.98%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM(-0.89)[-0.891]; MX_INVALID(0.50)[]; R_MISSING_CHARSET(0.50)[]; R_SPF_ALLOW(-0.20)[+mx:c]; MIME_GOOD(-0.10)[text/plain]; IP_REPUTATION_HAM(-0.01)[asn: 205766(0.00), country: DE(-0.01), ip: 185.26.156.147(0.00)]; ARC_SIGNED(0.00)[lists.ipfire.org:s=202003rsa:i=1]; R_DKIM_NA(0.00)[]; ASN(0.00)[asn:205766, ipnet:185.26.156.0/24, country:DE]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; TO_MATCH_ENVRCPT_ALL(0.00)[]; RCVD_TLS_LAST(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; DMARC_NA(0.00)[leo-andres.de]; ARC_NA(0.00)[] X-Rspamd-Queue-Id: 4HJcG775gLz136 X-BeenThere: development@lists.ipfire.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: IPFire development talk List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: development-bounces@lists.ipfire.org Sender: "Development" This patch adds a function to verify the user manual links configuration file at build time. Run with "./make.sh check-manualpages" Signed-off-by: Leo-Andres Hofmann Reviewed-by: Bernhard Bitsch --- make.sh | 12 +++++- tools/check_manualpages.pl | 84 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tools/check_manualpages.pl diff --git a/make.sh b/make.sh index 8b97b24df..370a19aa5 100755 --- a/make.sh +++ b/make.sh @@ -1958,8 +1958,18 @@ find-dependencies) shift exec "${BASEDIR}/tools/find-dependencies" "${BASEDIR}/build" "$@" ;; +check-manualpages) + echo "Checking the manual pages for broken links..." + + chmod 755 $BASEDIR/tools/check_manualpages.pl + if $BASEDIR/tools/check_manualpages.pl; then + print_status DONE + else + print_status FAIL + fi + ;; *) - echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain|update-contributors|find-dependencies}" + echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain|update-contributors|find-dependencies|check-manualpages}" cat doc/make.sh-usage ;; esac diff --git a/tools/check_manualpages.pl b/tools/check_manualpages.pl new file mode 100644 index 000000000..8eefc63e2 --- /dev/null +++ b/tools/check_manualpages.pl @@ -0,0 +1,84 @@ +#!/usr/bin/perl +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2005-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 # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +use strict; +#use warnings; + +# Import make.sh environment +my $basedir = $ENV{'BASEDIR'}; + +# Load configuration file (General::readhash isn't available yet) +my $configfile = "${basedir}/config/cfgroot/manualpages"; +my %manualpages = (); + +open(my $file, "<", $configfile) or die "ERROR: Can't read from file '$configfile'!\n"; +while(my $line = <$file>) { + $line =~ s/\R//g; + next unless($line =~ /=/); + + my($left, $value) = split(/=/, $line, 2); + if($left =~ /(^[A-Za-z0-9_-]+$)/) { + my $key = $1; # Got alphanumeric key + $manualpages{$key} = $value; + } +} +close($file); + +# Check configuration +if(! defined $manualpages{'BASE_URL'}) { + die "ERROR: User manual base URL not configured!\n"; +} +my $baseurl = $manualpages{'BASE_URL'}; +delete $manualpages{'BASE_URL'}; + +if ($baseurl =~ /\/\s*$/) { + die "ERROR: User manual base URL must not end with a slash!\n"; +} + +# Loop trough configured manual pages +foreach my $page (keys %manualpages) { + # Build absolute path and URL + my $cgifile = "${basedir}/html/cgi-bin/${page}.cgi"; + my $url = "${baseurl}/$manualpages{$page}"; + + print "${page}.cgi -> '$url'\n"; + + # Check CGI file exists + if(! -f $cgifile) { + print "WARNING: Obsolete link, page '$cgifile' doesn't exist!\n"; + } + + # Check obvious invalid characters + if($url =~ /[^[:graph:]]/) { + die("ERROR: URL contains invalid characters!\n"); + } + + # Check HTTP 200 "OK" result, follow up to 1 redirect (e.g. HTTP -> HTTPS) + my $status = `curl --silent --show-error --output /dev/null --location --max-redirs 1 --max-time 10 --write-out "%{http_code}" --url "${url}"`; + if($status != 200) { + die("ERROR: Received unexpected HTTP '$status'!\n"); + } + + print "SUCCESS: Received HTTP '$status'.\n"; +} + +# Clean exit +exit 0;