blob: 69e3459eed0b251eecee28c25450bb81e6273f0c [file] [log] [blame]
#!/usr/bin/env ruby
$LOAD_PATH.unshift '/srv/whimsy/lib'
#
# add/remove people from PMC Chairs
#
require 'whimsy/asf'
# extract action to be performed
dryrun = ARGV.delete('--dryrun')
puts 'Dry run:' if dryrun
action = ARGV.delete('--add') || ARGV.delete("--rm")
# map arguments provided to people
people = ARGV.map {|id| ASF::Person[id]}
# validate ids
ARGV.zip(people).map do |id, person|
unless person
STDERR.puts "invalid id: #{id}"
exit 1
end
end
# get the list from LDAP to be updated
chairs = ASF::Service.find('pmc-chairs')
# get the list of current chairs from committee-info
current = ASF::Committee.pmcs.map(&:chair).uniq
# partition people based on already in pmc-chairs
already_in_pmc_chairs, not_in_pmc_chairs = people.partition{|p| chairs.members.include?(p)}
#puts 'already in pmc-chairs: ' + already_in_pmc_chairs.map{|p|p.name}.join(' ')
#puts 'not in pmc-chairs: ' + not_in_pmc_chairs.map{|p|p.name}.join(' ')
if (action=='--add') & (!already_in_pmc_chairs.empty?)
puts 'The following ids were not added because they are '\
'already in ldap group pmc-chairs: ' +
already_in_pmc_chairs.map{|p| p.name}.join(' ')
end
# only add people to LDAP who are currently chairs in committee-info
not_yet_in_pmc_chairs, not_a_chair = not_in_pmc_chairs.partition{|p| current.include?(p)}
if (action=='--add') & (!not_a_chair.empty?)
puts 'The following ids were not added because they are '\
'not listed as a chair in committee-info.txt: ' +
not_a_chair.map{|p| p.name}.join(' ')
end
# only remove people who are currently in LDAP pmc-chairs
if (action=='--rm') & (!not_in_pmc_chairs.empty?)
puts 'The following ids were not removed because they are '\
'not in ldap group pmc-chairs: ' +
not_in_pmc_chairs.map{|p| p.name}.join(' ')
end
# only remove people from LDAP who are not currently chairs in committee-info
still_chairs, not_chairs = already_in_pmc_chairs.partition{|p| current.include?(p)}
if (action=='--rm') & (!still_chairs.empty?)
puts 'The following ids were not removed because they are '\
'still listed as chair in committee-info.txt: ' +
still_chairs.map{|p| p.name}.join(' ')
end
# identify candidates for removal from LDAP pmc-chairs
candidates_for_removal = chairs.members.select{|p|!current.include?(p)}
puts 'The following members of LDAP pmc-chairs are not currently ' +
'listed as chairs in committee-info.txt: ' +
candidates_for_removal.map{|p|p.name}.join(' ')
# identify candidates for addition to LDAP pmc-chairs
candidates_for_addition = current.select{|p|!chairs.members.include?(p)}
puts 'The following chairs in committee-info.txt are not currently ' +
'listed as members of LDAP pmc-chairs: ' +
candidates_for_addition.map{|p|p.name}.join(' ')
if ((action=='--add') & not_yet_in_pmc_chairs.empty?) |
((action=='--rm') & not_chairs.empty?)
puts 'Nothing to do.'
exit
end
# execute the action
if action == '--add' and not not_yet_in_pmc_chairs.empty?
puts 'Adding: ' + not_yet_in_pmc_chairs.map{|p|p.name}.join(' ')
exit if dryrun
ASF::LDAP.bind { chairs.add(not_yet_in_pmc_chairs) }
elsif action == '--rm' and not not_chairs.empty?
puts 'Removing: ' + not_chairs.map{|p|p.name}.join(' ')
exit if dryrun
ASF::LDAP.bind { chairs.remove(not_chairs) }
else
STDERR.puts "Usage: #{$PROGRAM_NAME} [--dryrun] (--add|--rm) list..."
end