#!/usr/bin/perl -w # $Id$ # # Copyright 2015 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Author: Robin H Johnson # # statify: Produce early election statistics # BEGIN { my $dirname; if(-f '/etc/elections/Votify.pm') { $dirname = '/etc/elections'; } else { use Cwd qw(abs_path); use File::Basename qw(dirname); $dirname = dirname(abs_path(__FILE__)); } push @INC, $dirname; } use POSIX; use Getopt::Long; use List::Util; use Cwd qw(abs_path); use File::Spec::Functions; use Votify 'official'; use strict; ###################################################################### # Global vars ###################################################################### (my $zero = $0) =~ s,.*/,,; (my $version = $Votify::version) =~ s/.*?(\d.*\d).*/$zero version $1\n/; my %opt; # Collect the open elections my (%open_elections, $usage_elections); %open_elections = Votify::get_open_elections_hash(); if (scalar keys %open_elections) { $usage_elections = join("\n ", keys %open_elections); } else { $usage_elections = "(no elections currently open)"; } # rest of usage my $usage = < $zero [OPTS] --all where options are: --all Run on all open elections --write-to-officials Write statistics to officials homedirs and is one of the elections currently in-progress. The following elections are currently open: $usage_elections EOT ###################################################################### # Main ###################################################################### for my $election_name (keys %open_elections) { my (@officials, @voters); open(F, '<', $open_elections{$election_name}{'officialsfile'}) or die("failed to open officials file"); chomp(@officials = ); close(F); $open_elections{$election_name}{'officials'} = @officials; open(F, '<', $open_elections{$election_name}{'votersfile'}) or die("failed to open voters file"); chomp(@voters = ); close(F); $open_elections{$election_name}{'voters'} = @voters; my ($count_voters, $count_submit, $count_pending) = (0, 0,0); for my $votername (@voters) { $count_voters++; if(-e catfile('/home', $votername, ".ballot-${election_name}-submitted")) { $count_submit++; } elsif (-e catfile('/home', $votername, ".ballot-${election_name}")) { $count_pending++; } } die "Mismatched voter count" unless $count_voters == scalar(@voters); $open_elections{$election_name}{'count'} = { voters => $count_voters, submitted => $count_submit, pending => $count_pending, }; my $results_buffer = '' .sprintf("Election: %s\n", $election_name) .sprintf("Timestamp: %s\n", POSIX::strftime($Votify::datefmt, gmtime)) .sprintf("Eligable voters: %d\n", $count_voters) .sprintf("Submitted votes: %d\n", $count_submit) .sprintf("Pending votes: %d\n", $count_pending) .sprintf("Turnout: %02.3f%%\n", $count_submit*100.0/$count_voters) .sprintf("Pending Turnout: %02.3f%%\n", ($count_submit+$count_pending)*100.0/$count_voters); print "$results_buffer\n"; umask 077; for my $officialname (@officials) { my $fn = catfile('/home', $officialname, 'voter-turnout-'.$election_name); open(F, '>', $fn) or die("failed to open voter turnout file ($fn): $!"); print F $results_buffer; close F; my $uid = (getpwnam($officialname))[2]; chown($uid, -1, $fn) or die("failed to chown voter turnout file ($fn): $!"); } } __END__ # vim:sw=4 et