From 145eb53f985d3a9fa0a09f4c34f6aced00d1f391 Mon Sep 17 00:00:00 2001 From: Lorenzo Salvadore Date: Mon, 6 Feb 2023 11:13:36 +0100 Subject: status: Update report submission methods - Import the sendcalls tool from https://github.com/freebsd/freebsd-quarterly/blob/main/tools/sendcalls and modify it to integrate as expected in the doc tree. - Import the email template to send calls from https://github.com/freebsd/freebsd-quarterly/blob/main/tools/call.txt.template and update it with the new submission methods. - Update status/_index.adoc with the new submission methods. - Import the report sample from https://github.com/freebsd/freebsd-quarterly/blob/main/report-sample.adoc and update the corresponding link in status/_index.adoc. Approved by: status (paumma, debdrup), doceng (carlavilla) Differential Revision: https://reviews.freebsd.org/D38398 --- tools/sendcalls/call.txt.template | 37 +++++ tools/sendcalls/sendcalls | 308 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 345 insertions(+) create mode 100644 tools/sendcalls/call.txt.template create mode 100755 tools/sendcalls/sendcalls (limited to 'tools') diff --git a/tools/sendcalls/call.txt.template b/tools/sendcalls/call.txt.template new file mode 100644 index 0000000000..3037b557c9 --- /dev/null +++ b/tools/sendcalls/call.txt.template @@ -0,0 +1,37 @@ +Dear FreeBSD Community, + +The deadline for the next FreeBSD Status Report update is +%%DEADLINE%% for work done since the last round of quarterly reports: +%%START%% %%YEAR%% - %%STOP%% %%YEAR%%. +I would like to remind you that reports are published on a quarterly +basis and are usually collected during the last month of each quarter, +You are also welcome to submit them even earlier if you want, and the +earliest you submit them, the more time we have for reviewing. + +Status report submissions do not need to be very long. They may be +about anything happening in the FreeBSD project and community, and +they provide a great way to inform FreeBSD users and developers about +work that is underway or has been completed. Report submissions are +not limited to committers; anyone doing anything interesting and +FreeBSD related can -- and should -- write one! + +The following methods are available to submit your reports: + +* submit a review on Phabricator and add the group "status" to the + reviewers list. You should put your reports in the directory + doc/website/content/en/status/report-%%YEAR%%-%%START_NUM%%-%%YEAR%%-%%STOP_NUM%%/ ; + +* submit a pull request at https://github.com/freebsd/freebsd-doc . + You should put your reports in the directory + doc/website/content/en/status/report-%%YEAR%%-%%START_NUM%%-%%YEAR%%-%%STOP_NUM%%/ ; + +* send an email to status-submissions@FreeBSD.org including your report. + +An AsciiDoctor template is available at +https://www.FreeBSD.org/status/report-sample.adoc . + +We look forward to seeing your %%YEAR%%Q%%QUARTER%% reports! + +Thanks, + +%%SIGNATURE%% (on behalf of status@) diff --git a/tools/sendcalls/sendcalls b/tools/sendcalls/sendcalls new file mode 100755 index 0000000000..57b6c384a6 --- /dev/null +++ b/tools/sendcalls/sendcalls @@ -0,0 +1,308 @@ +#!/usr/bin/env perl +# +# Copyright (c) 2020-2023 Lorenzo Salvadore +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +use strict; +use warnings; + +use Getopt::Std; + +# ------------------------------------------------------- +# Global variables declaration +# ------------------------------------------------------- + +# Variables used to compute the time coordinates of the call (see below) +# +# They can be computed based on present date or given on the command line +# through options (see --help). +my $day; +my $month; +my $year; + +# Time coordinates of the call +# +# - $quarter is the number of the quarter for which we are sending the +# calls. +# - $urgency_tag indicates the urgency with which we are requesting the +# reports. It will be included in the subject of the calling mail. It +# can be empty, [2 WEEKS LEFT REMINDER] or [LAST OFFICIAL REMINDER]. +my $quarter; +my $urgency_tag; + +# Variables related to the contacts of the last status reports +# +# $year_last, $month_last_start, %month_last_stop and $quarter_last are +# the year, the initial month, the last month and the number of the +# quarter of the last quarterly status reports. They are used to compute +# $quarter_last_directory, the directory where the reports for last +# quarter can be found. +my $year_last; +my $month_last_start; +my $month_last_stop; +my $quarter_last; +my $quarter_last_directory; + +# Variables related to the calls mail we are sending +# +# - $subject is the subject of the mail we send. +# - $send_command is the command we run to send the mail. +# - @bcc_recipients and @cc_recipients are the array of all the addresses +# we want to put in the BCC and CC field respectively. The To field +# contains freebsd-status-calls@FreeBSD.org. +my $subject; +my $send_command; +my @bcc_recipients; +my @cc_recipients; + +# Other variables +# - %quarter_specific_recipients is a hash that contains lists of +# addresses. The addresses of each list should be contacted only for the +# quarter specified by the list's the keys. +# - %template_substitutions is a hash that specifies for each quarter how +# the variabes in the call.template file should be substituted. +# - %options is a hash used for registering option. See --help to list all +# available options. +my %quarter_specific_recipients; +my %template_substitutions; +my %options; + +# ------------------------------------------------------- +# Variables initialization +# ------------------------------------------------------- + +@bcc_recipients = (); +@cc_recipients = ( 'freebsd-current@FreeBSD.org', + 'freebsd-hackers@FreeBSD.org', + 'devsummit@FreeBSD.org' ); + +$quarter_specific_recipients{1} = [ 'secretary@asiabsdcon.org' ]; +$quarter_specific_recipients{2} = [ 'info@bsdcan.org', + 'soc-students@FreeBSD.org', + 'soc-mentors@FreeBSD.org' ]; +$quarter_specific_recipients{3} = [ 'soc-students@FreeBSD.org', + 'soc-mentors@FreeBSD.org' ]; +$quarter_specific_recipients{4} = []; + +$template_substitutions{1}{'%%START%%'} = 'January'; +$template_substitutions{1}{'%%STOP%%'} = 'March'; +$template_substitutions{1}{'%%START_NUM%%'} = '01'; +$template_substitutions{1}{'%%STOP_NUM%%'} = '03'; +$template_substitutions{1}{'%%DEADLINE%%'} = 'March, 31st'; +$template_substitutions{2}{'%%START%%'} = 'April'; +$template_substitutions{2}{'%%STOP%%'} = 'June'; +$template_substitutions{2}{'%%START_NUM%%'} = '04'; +$template_substitutions{2}{'%%STOP_NUM%%'} = '06'; +$template_substitutions{2}{'%%DEADLINE%%'} = 'June, 30th'; +$template_substitutions{3}{'%%START%%'} = 'July'; +$template_substitutions{3}{'%%STOP%%'} = 'September'; +$template_substitutions{3}{'%%START_NUM%%'} = '07'; +$template_substitutions{3}{'%%STOP_NUM%%'} = '09'; +$template_substitutions{3}{'%%DEADLINE%%'} = 'September, 30th'; +$template_substitutions{4}{'%%START%%'} = 'October'; +$template_substitutions{4}{'%%STOP%%'} = 'December'; +$template_substitutions{4}{'%%DEADLINE%%'} = 'December, 31st'; +$template_substitutions{4}{'%%START_NUM%%'} = '10'; +$template_substitutions{4}{'%%STOP_NUM%%'} = '12'; + +$main::VERSION = "[not versioned]"; +$Getopt::Std::STANDARD_HELP_VERSION = 1; + +# ------------------------------------------------------- +# Subroutines definition +# ------------------------------------------------------- + +sub main::HELP_MESSAGE +{ + print <= 1970 + (I think you are unlikely to send calls before + the Unix epoch. And I am writing it in 2020.) + -t Testing flag. Set it it you want to test the + script without actually send mails. + -s signature Name to use for signing the status reports calls mail. + +Example: + ./sendcalls -d 31 -m 2 -y 2000 -s 'Lorenzo Salvadore' + (Yes, you can send calls even on inexistent days such as + 2020 February, 31st.) +EOT + exit 1; +} + +# ------------------------------------------------------- +# Execution starts here +# ------------------------------------------------------- +getopts('d:m:y:s:t', \%options); + +main::HELP_MESSAGE if(not $options{'s'}); + +# ------------------------------------------------------- +# Compute time coordinates (see global variables declaration) +# ------------------------------------------------------- + +(undef, undef, undef, $day, $month, $year, undef, undef, undef) = localtime(); +$year = $year + 1900; + +$day = $options{'d'} if($options{'d'}); +$month = $options{'m'} - 1 if($options{'m'}); +$year = $options{'y'} if($options{'y'}); + +die "Choosen date does not seem plausibile: year is $year, month is $month and day is $day" +if( $day < 1 or + $day > 31 or + $month < 1 or + $month > 12 or + $year < 1970 ); + +if($day < 14) +{ + $urgency_tag = ''; +} +elsif($day < 23) +{ + $urgency_tag = '[2 WEEKS LEFT REMINDER] '; +} +else +{ + $urgency_tag = '[LAST OFFICIAL REMINDER] '; +} + +$quarter = int($month / 3) + 1; + +# ------------------------------------------------------- +# Compute @bcc_recipients and @cc_recipients +# ------------------------------------------------------- +$year_last = $year; +$month_last_start = sprintf("%02d",int((($month - 3) % 12) / 3) * 3 + 1); +$month_last_stop = sprintf("%02d",$month_last_start + 2); +$quarter_last = $quarter - 1; +if($quarter_last == 0) +{ + $year_last = $year_last - 1; + $quarter_last = 4; +} +$quarter_last_directory = '../../website/content/en/status/report-'. + $year_last. + '-'. + $month_last_start. + '-'. + $year_last. + '-'. + $month_last_stop; +foreach(`ls $quarter_last_directory`) +{ + $_ =~ tr/\n//d; + open(quarterly_report, '<', $quarter_last_directory.'/'.$_) or + die "Could not open $quarter_last_directory/$_: $!"; + while() + { + if($_ =~ m/^Contact:.*(<.*@.*>)/) + { + my $address = $1; + $address =~ tr/<>//d; + push @bcc_recipients, $address if(not $address =~ m/\@FreeBSD.org$/i); + } + } + close(quarterly_report); +} + +{ + my %tmp = map {$_ => 0} @bcc_recipients; + @bcc_recipients = keys %tmp; +} + +push @cc_recipients, @{ $quarter_specific_recipients{$quarter} }; + +# ------------------------------------------------------- +# Compute missing %template_substitutions elements +# ------------------------------------------------------- +$template_substitutions{$quarter}{'%%QUARTER%%'} = $quarter; +$template_substitutions{$quarter}{'%%YEAR%%'} = $year; +$template_substitutions{$quarter}{'%%SIGNATURE%%'} = $options{'s'}; +$template_substitutions{$quarter}{'%%DEADLINE%%'} = +$template_substitutions{$quarter}{'%%DEADLINE%%'}.' '.$year; + +# ------------------------------------------------------- +# Generate mail text +# ------------------------------------------------------- +open(call_template, '<', 'call.txt.template') or +die "Could not open call.txt.template: $!"; +open(call_mail, '>', 'call.txt') or +die "Could not open call.txt: $!"; +while() +{ + my $line = $_; + $line =~ s/$_/$template_substitutions{$quarter}{$_}/g + foreach(keys %{ $template_substitutions{$quarter} }); + print call_mail $line; +} +close(call_template); +close(call_mail); + +# ------------------------------------------------------- +# Compute $subject and $send_command +# ------------------------------------------------------- +$subject = $urgency_tag."Call for ".$year."Q".$quarter." status reports"; + +$send_command = "cat call.txt | mail -s \"".$subject."\""; +# @bcc_recipients should never be empty as we have reports with mail +# contacts every quarter, but we test it anyway: we do not want to +# assume that this will be true forever +$send_command = $send_command.' -b '.(join ',', @bcc_recipients) if(@bcc_recipients); +# @cc_recipients should never be empty as we initialize it not empty +# and never remove addresses from there, but we test it anyway: we do +# not want to assume that this will be true forever +$send_command = $send_command.' -c '.(join ',', @cc_recipients) if(@cc_recipients); +$send_command = $send_command.' freebsd-status-calls@FreeBSD.org'; + +# ------------------------------------------------------- +# Send mail or show testing information +# ------------------------------------------------------- +if($options{'t'}) +{ + print <; + close(call_mail); +} +else +{ + system $send_command; +} + +# ------------------------------------------------------- +# Clean environment +# ------------------------------------------------------- +unlink "call.txt"; -- cgit v1.2.3