www/board/subscriptions.cgi (175 lines of code) (raw):

#!/usr/bin/env ruby PAGETITLE = "Board@ List CrossCheck - PMC Chairs" # Wvisible:board,mail $LOAD_PATH.unshift '/srv/whimsy/lib' require 'wunderbar' require 'wunderbar/bootstrap' require 'whimsy/asf' require 'whimsy/asf/mlist' info_chairs = ASF::Committee.load_committee_info.group_by(&:chair) ldap_chairs = ASF.pmc_chairs subscribers, modtime = ASF::MLIST.board_subscribers(false) # excluding archivers member_statuses = ASF::Member.member_statuses _html do _body? do _whimsy_body( title: PAGETITLE, subtitle: 'How Subscribers Are Checked', relatedtitle: 'More Useful Links', related: { "/committers/tools" => "Whimsy Tool Listing", "/committers/subscribe" => "Committer Self-subscribe Tool", "/committers/moderationhelper" => "Mail List Moderation Helper", "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => "See This Source Code" }, helpblock: -> { _p! do _ "This script takes the list of subscribers (updated #{modtime}) to " _a 'board@apache.org', href: 'https://mail-search.apache.org/members/private-arch/board/' _ ' which are matched against ' _a 'members.txt', href: ASF::SVN.svnpath!('foundation', 'members.txt') _ ', ' _a 'iclas.txt', href: ASF::SVN.svnpath!('officers', 'iclas.txt') _ ', and ' _code 'ldapsearch mail' _ ' to match each email address to an Apache ID. ' _br _ 'Those that are not found are listed as ' _code.text_danger '*missing*' _ '. ASF members are ' _strong 'listed in bold' _ '. Emeritus members are ' _em 'listed in italics' _ '. Non ASF member, non-committee chairs are also ' _span.text_danger 'listed in red' _ '.' end _p! do _ 'The resulting list is then cross-checked against ' _a 'committee-info.text', href: ASF::SVN.svnpath!('board', 'committee-info.txt') _ ' and ' _code 'ldapsearch cn=pmc-chairs' _ '. Membership that is only listed in one of these two sources is ' _span.text_danger 'listed in red' _ '.' end } ) do _p! do _ 'PMC chairs apparently not subscribed are ' _a 'listed in a separate table', href: "#unsub" _ '.' end ids = [] maillist = ASF::Mail.list subscribers.each do |line| person = maillist[line.downcase] person ||= maillist[line.downcase.sub(/\+\w+@/,'@')] if person id = person.id id = '*notinavail*' if id == 'notinavail' else person = ASF::Person.find('notinavail') id = '*missing*' end ids << [id, person, line] end _table_.table do _thead do _th 'ID' _th 'Email' _th 'Name' _th 'Committee' end _tbody do ids.sort.each do |id, person, email| _tr_ do href = "/roster/committer/#{id}" status = member_statuses[person.name] if status if status == :current _td! {_strong {_a id, href: href}} else # emeritus or deceased _td! {_em {_a id, href: href}} end elsif id.include? '*' _td.text_danger id elsif info_chairs.include? person or ldap_chairs.include? person _td {_a id, href: href} else _td.text_danger {_a id, href: href} end _td email if not id.include? '*' _td person.public_name else icla = ASF::ICLA.find_by_email(id) if icla _td.text_danger icla.name else _td.text_danger '*notinavail*' end end if info_chairs.include? person text = info_chairs[person].uniq.map(&:display_name).join(', ') if ldap_chairs.include? person or info_chairs[person].all? &:nonpmc? _td text else _td.text_danger text end elsif member_statuses[person.name] _td elsif ldap_chairs.include? person _td.text_danger '***LDAP only***' else pmcs = person.project_owners.map(&:name) if pmcs.length == 0 _td.text_danger '*** non-member, non-officer, non-pmc ***' else _td.text_warning "*** non-member, non-officer, pmcs: #{pmcs.join ','} ***" end end end end end end chairs = ( info_chairs.keys + ldap_chairs ).uniq missing = chairs.map(&:id) - ids.map(&:first) unless missing.empty? _h3_.unsub! 'Not subscribed to the list' _table.table do _tr do _th 'ID' _th 'Name' _th 'Committee' end missing.sort.each do |id| person = ASF::Person.find(id) _tr_ do href = "/roster/committer/#{id}" if member_statuses[person.name] == :current _td! {_strong {_a id, href: href}} elsif member_statuses[person.name] # emeritus or deceased _td! {_em {_a id, href: href}} else _td {_a id, href: href} end _td person.public_name if info_chairs.include? person text = info_chairs[person].uniq.map(&:display_name).join(', ') if ldap_chairs.include? person _td text else _td.text_danger text, title: 'Chair is not in LDAP pmc-chairs group' end elsif ldap_chairs.include? person _td.text_danger '***LDAP only***' else _td end end end end end end end end