| #!/usr/bin/env ruby |
| $LOAD_PATH.unshift '/srv/whimsy/lib' |
| require 'wunderbar/bootstrap' |
| require 'whimsy/asf' |
| require 'whimsy/asf/mlist' |
| |
| WHITELIST = [ |
| /^archive-asf-private@cust-asf\.ponee\.io$/, |
| /^private@mbox-vm\.apache\.org$/, |
| /^security-archive@.*\.apache\.org$/, |
| /^apmail-\w+-security-archive@www.apache.org/, # Direct subscription |
| ] |
| |
| def isArchiver?(email) |
| WHITELIST.any? {|regex| email =~ regex} |
| end |
| |
| NOSUBSCRIBERS = 'No subscribers' |
| MINSUB = 3 |
| TOOFEW = "Not enough subscribers (< #{MINSUB})" |
| |
| # ensure that there is a trailing slash (so relative paths will work) |
| if not ENV['PATH_INFO'] |
| print "Status: 302 Found\r\nLocation: #{ENV['SCRIPT_URI']}/\r\n\r\n" |
| exit |
| end |
| |
| # extract information for all security@pmc.apache.org lists |
| lists = {} |
| ASF::MLIST.list_parse('sub') do |dom, list, subs| |
| next unless list == 'security' |
| next unless dom.end_with? '.apache.org' |
| lists[dom.sub('.apache.org', '')] = subs |
| end |
| |
| _html do |
| _whimsy_body( |
| title: "Security Mailing List Subscriptions", |
| breadcrumbs: { |
| subscriptions: '.' |
| } |
| |
| ) do |
| path = ENV['PATH_INFO'].sub('/', '') |
| if path == '' |
| _p do |
| _ 'The counts below exclude the archivers, using the highlights: ' |
| _span.bg_danger NOSUBSCRIBERS |
| _span.bg_warning TOOFEW |
| end |
| _table.table.table_responsive do |
| _tr do |
| _th.col_xs_1.text_right 'count' |
| _th.col_xs_3 'project' |
| _th.col_xs_1.text_right 'count' |
| _th.col_xs_3 'project' |
| _th.col_xs_1.text_right 'count' |
| _th.col_xs_3 'project' |
| # cols must add up to twelve |
| end |
| lists.each_slice(3) do |slice| |
| _tr do |
| slice.each do |dom, subs| |
| arch = subs.select{|sub| isArchiver?(sub)}.length |
| subcount = (subs.length - arch) |
| options = {} |
| if subcount == 0 |
| options = {class: 'bg-danger', title: NOSUBSCRIBERS} |
| elsif subcount < MINSUB |
| options = {class: 'bg-warning', title: TOOFEW} |
| end |
| _td.text_right options do |
| _ subcount |
| end |
| _td do |
| _a dom, href: dom |
| end |
| end |
| end |
| end |
| end |
| |
| elsif lists[path] |
| podling = ASF::Podling.find(path) |
| committee = ASF::Committee.find(path) |
| project = ASF::Project.find(path) |
| colors=Hash.new{|h,k| h[k]=0} # counts of colors |
| order=['bg-danger', 'bg-warning', 'bg-info', 'bg-success', ''] # sort order |
| subh = Hash[ |
| lists[path].map do |email| |
| name = '*UNKNOWN*' |
| if WHITELIST.any? {|regex| email =~ regex} |
| person = nil |
| name = '(archiver)' |
| color = '' |
| else |
| person = ASF::Person.find_by_email(email) |
| if person |
| name = person.public_name |
| if person.asf_member? or project.owners.include? person |
| color = 'bg-success' |
| elsif project.members.include? person |
| color = 'bg-info' |
| else |
| color = 'bg-warning' |
| end |
| else |
| color = 'bg-danger' |
| end |
| end |
| colors[color] += 1 |
| [email, {person: person , color: color, name: name}] |
| end |
| ].sort_by {|k,v| [order.index(v[:color]),v[:name]]} |
| |
| _table do |
| _tr do |
| _th 'Count ' |
| _th 'Legend' |
| end |
| _tr do |
| _td colors['bg-danger'] |
| _td class: 'bg-danger' do |
| _ 'Person (email) not recognised' |
| end |
| end |
| _tr do |
| _td colors['bg-warning'] |
| _td class: 'bg-warning' do |
| _ 'ASF committer not associated with the project' |
| end |
| end |
| _tr do |
| _td colors['bg-info'] |
| _td class: 'bg-info' do |
| _ 'Project committer - not on (P)PMC' |
| end |
| end |
| _tr do |
| _td colors['bg-success'] |
| _td class: 'bg-success' do |
| _ 'ASF member or project member' |
| end |
| end |
| _tr do |
| _td colors[''] |
| _td do |
| _ 'Archiver (there are expected to be up to 3 archivers)' |
| end |
| end |
| end |
| _h2 do |
| if podling |
| _a podling.display_name, |
| href: "../../roster/ppmc/#{podling.id}" |
| else |
| _a committee.display_name, |
| href: "../../roster/committee/#{committee.id}" |
| end |
| _span class: 'small' do |
| _a "(security@#{path}.apache.org)", href: "https://lists.apache.org/list.html?security@#{path}.apache.org" |
| end |
| end |
| |
| _table.table do |
| _thead do |
| _tr do |
| _th 'email' |
| _th 'person' |
| end |
| end |
| |
| _tbody do |
| subh.each do |email, hash| |
| color = hash[:color] |
| person = hash[:person] |
| name = hash[:name] |
| |
| _tr class: color do |
| _td email |
| _td do |
| if person |
| if person.asf_member? |
| _b do |
| _a name, href: "../../roster/committer/#{person.id}" |
| end |
| else |
| _a name, href: "../../roster/committer/#{person.id}" |
| end |
| else |
| _ name |
| end |
| end |
| end |
| end |
| end |
| end |
| else |
| _h3 class: 'bg-warning' do |
| _ "Could not find a security list for the project #{path}" |
| end |
| _br |
| end |
| end |
| end |