From 90d22c3af0a27b022f835dbcdc28e7e48744a468 Mon Sep 17 00:00:00 2001 From: Nicolas Geniteau Date: Tue, 5 Nov 2013 03:45:35 +0100 Subject: [PATCH 01/36] Add Knuth in servers list --- commands/manage-server.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/manage-server.sh b/commands/manage-server.sh index 145bed9..3c0620a 100755 --- a/commands/manage-server.sh +++ b/commands/manage-server.sh @@ -1,10 +1,10 @@ -#! /bin/bash +#! /usr/bin/env bash cd $(dirname "$0") WKS_LIST="apl" SRV_LIST="moore noyce hamano cpp" -SCP_LIST="ksh" +SCP_LIST="ksh knuth" KNOWN_ACTIONS="start stop restart update log viewlog view_log" From 691a72406150dbfdcb484d9577de2136c4cf07c1 Mon Sep 17 00:00:00 2001 From: Nicolas Geniteau Date: Tue, 5 Nov 2013 17:26:56 +0100 Subject: [PATCH 02/36] adding otto as server --- commands/manage-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/manage-server.sh b/commands/manage-server.sh index 3c0620a..e1ea557 100755 --- a/commands/manage-server.sh +++ b/commands/manage-server.sh @@ -3,7 +3,7 @@ cd $(dirname "$0") WKS_LIST="apl" -SRV_LIST="moore noyce hamano cpp" +SRV_LIST="moore noyce hamano cpp otto" SCP_LIST="ksh knuth" KNOWN_ACTIONS="start stop restart update log viewlog view_log" From dfbd4e69bad07303f3bfcf3fe25dbe317fb5cf04 Mon Sep 17 00:00:00 2001 From: Nicolas Geniteau Date: Tue, 5 Nov 2013 17:29:06 +0100 Subject: [PATCH 03/36] ACU::Jail --- ACU/Jail.pm | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 ACU/Jail.pm diff --git a/ACU/Jail.pm b/ACU/Jail.pm new file mode 100644 index 0000000..3139925 --- /dev/null +++ b/ACU/Jail.pm @@ -0,0 +1,71 @@ +#! /usr/bin/env perl + +package Jail; + +use v5.10.1; +use strict; +use warnings; +use Carp; +use File::Temp qw(tempdir); +use File::Path qw(remove_tree); +use File::Copy::Recursive qw(dircopy); + +use ACU::Log; + +use constant { + JAILS_DIR => "/jail/", + RULESET_NO => 4, +}; + +sub run_command +{ + my $jail = shift; + my $command = shift; + my $readonly = shift; + my $work_dir = shift; + + # Verifications + croak JAILS_DIR . "$jail doesn't exist." unless ( -d JAILS_DIR . $jail); + croak JAILS_DIR . "$jail/data doesn't exist." unless ( -d JAILS_DIR . "$jail/data"); + + + my $jail_path = JAILS_DIR . $jail; + my $mounts = ""; + if ($readonly) { + $jail_path = tempdir(); + $mounts = "mount='" . JAILS_DIR . "$jail $jail_path nullfs ro 0 0' "; + } + + $mounts .= "mount='tmpfs $jail_path/tmp tmpfs rw,mode=777 0 0' "; + + my $jail_data_path = "$jail_path/data"; + + # Creating the working directory + if (defined ($work_dir) and $work_dir ne "") { + $mounts .= "mount='$work_dir $jail_data_path nullfs rw 0 0' "; + } + + # Create and start jail + my $jail_cmd = "jail -c path='$jail_path' "; + $jail_cmd .= "persist=false "; + $jail_cmd .= "devfs_ruleset=". RULESET_NO ." "; + $jail_cmd .= "$mounts"; + if (defined ($work_dir) and $work_dir ne "") { + $jail_cmd .= "exec.start='cd $jail_data_path && $command'"; + } else { + $jail_cmd .= "exec.start='$command'"; + } + system($jail_cmd); + croak "Error while executing '$jail_cmd'" if ($?); + + # Force umount + system("umount -f $jail_path/tmp"); + if (defined ($work_dir) and $work_dir ne "") { + system("umount -f $jail_data_path"); + } + if ($readonly) { + system("umount -f $jail_path"); + } +} + +1; From 92a222d346ff623b5e36fca283861d4ec9b78119 Mon Sep 17 00:00:00 2001 From: Nicolas Geniteau Date: Tue, 5 Nov 2013 17:37:03 +0100 Subject: [PATCH 04/36] hook dump-help --- hooks/dump-help.pl | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 hooks/dump-help.pl diff --git a/hooks/dump-help.pl b/hooks/dump-help.pl new file mode 100755 index 0000000..dd8d29f --- /dev/null +++ b/hooks/dump-help.pl @@ -0,0 +1,40 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use v5.10; +use utf8; +use Carp; +use File::Basename; +use File::Path qw(remove_tree); +use File::Temp qw/tempfile tempdir/; + +use ACU::Log; +$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log"; +use ACU::Process; + +# First, check if the repository is dump-help +exit 0 if ($ENV{GL_REPO} ne "dump-help"); + +my ($ref, $oldsha, $newsha) = @ARGV; + +log DONE, "This is the dump-help repository!"; + +exit 0 if ($newsha eq '0' x 40); + +if ($ref eq "refs/tags/release") +{ + + my $archive = qx(git archive --format=tgz $newsha); + #qx(git clone -b release /srv/git/repositories/dump-help.git '$tempdir') or croak "It is not a valid repository."; + + Process::Client::launch("docs_compile", + { + "type" => "dump_help", + "file" => "dump-help.tgz" , + }, + { "dump-help.tgz" => $archive }); + +} + +exit 0; From 3c0e0f09be98b921887553a0fb267f827154b11e Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 4 Nov 2013 02:26:04 +0100 Subject: [PATCH 05/36] Migration: migrate also .ltx files --- migration/repo.sh | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/migration/repo.sh b/migration/repo.sh index 4f97bbc..be4338a 100755 --- a/migration/repo.sh +++ b/migration/repo.sh @@ -46,6 +46,8 @@ tex2md() sed -Ei 's/\\begin *\{cartouche_nospaces\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{cartouche_nospaces\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\verb ([^+]+) /\\verb+\1+/g' "$i" + sed -Ei 's/``/"/g' "$i" + sed -Ei "s/''/\"/g" "$i" # Special macros sed -Ei 's/\\(file|email|command|code|bcode) *\{([^}]*)\}/\\verb+\2+/gi' "$i" @@ -109,7 +111,7 @@ clean_tex() exit 1; fi - for f in data Makefile images/acu.pdf images/assistants.pdf images/assistants-subject.pdf images/assistants-slides.pdf images/assistants.png images/epita.pdf images/epita.png images/epita-invert.pdf images/assistants-invert.pdf images/epita-invert.png images/assistants-bg.png images/logo_epita.jpg images/acu-bottom.png images/acu-bottom.pdf images/acu-bg.pdf images/acu2011.png images/acu.png *.cls *.sty *.tex + for f in data Makefile images/acu.pdf images/assistants.pdf images/assistants-subject.pdf images/assistants-slides.pdf images/assistants.png images/epita.pdf images/epita.png images/epita-invert.pdf images/assistants-invert.pdf images/epita-invert.png images/assistants-bg.png images/logo_epita.jpg images/acu-bottom.png images/acu-bottom.pdf images/acu-bg.pdf images/acu2011.png images/acu.png *.cls *.sty do if [ -f "$f" ] then @@ -120,6 +122,11 @@ clean_tex() fi done + for file in `find -name "*.ltx"` + do + git mv "$file" "${file%%.ltx}.tex" + done + if [ -d "include" ] then cd include @@ -130,6 +137,20 @@ clean_tex() git mv * .. fi + cd "$1" + tex2md . + maintex2md + rmdir include 2> /dev/null + elif [ -d "subdocs" ] + then + cd subdocs + tex2md .. + + if [ `find | wc -l` -gt 1 ] + then + git mv * .. + fi + cd "$1" tex2md . maintex2md From fe9cc480a122b3f76a2b980ff1d9bbe9b2d6107a Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Tue, 5 Nov 2013 17:40:52 +0100 Subject: [PATCH 06/36] Add install procedure into manage-server --- commands/manage-server.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/commands/manage-server.sh b/commands/manage-server.sh index e1ea557..9bb03f2 100755 --- a/commands/manage-server.sh +++ b/commands/manage-server.sh @@ -6,7 +6,7 @@ WKS_LIST="apl" SRV_LIST="moore noyce hamano cpp otto" SCP_LIST="ksh knuth" -KNOWN_ACTIONS="start stop restart update log viewlog view_log" +KNOWN_ACTIONS="start stop restart install update log viewlog view_log" LOG=`mktemp` @@ -80,7 +80,7 @@ do for DEST in $DESTS do echo -e "\e[1;34m>>>\e[0m \e[33m$ACTION\e[0m on \e[1m$DEST\e[0m" - if [ "$ACTION" == "update" ] + if [ "$ACTION" == "install" ] || [ "$ACTION" == "update" ] then SCP=0 for D in $SCP_LIST @@ -94,6 +94,11 @@ do if [ $SCP -eq 0 ] then + if [ "$ACTION" == "install" ] && + ! ssh root@$DEST "mkdir -p /home/intradmin/ && git clone '$(echo `git remote -v` | cut -d " " -f 2)' /home/intradmin/liblerdorf && ln -s /home/intradmin/liblerdorf ~/liblerdorf" + then + exit 1 + fi ssh root@$DEST "make -C liblerdorf update upgrade" else cd .. From 0af1174ca8c1ab8884c28907c41ce3a5a6a9468c Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Tue, 5 Nov 2013 18:03:54 +0100 Subject: [PATCH 07/36] Replace croak by die when unexpected error --- process/files/intradata_get.pl | 90 +++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index 7e1eae3..c1f58e0 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -42,7 +42,7 @@ sub create_tree($$) croak "No directory for year $year. Ask a root to create it." if (! -d "$basedir/$year/"); if (! -e "$basedir/$year/$project_id/") { - mkdir "$basedir/$year/$project_id/" or croak $!; + mkdir "$basedir/$year/$project_id/" or die $!; } } @@ -57,11 +57,14 @@ sub grades_generate croak "No project_id given." if (! $project_id); if (! -e "$basedir/$year/$project_id/grades/") { - mkdir "$basedir/$year/$project_id/grades/" or croak $!; + mkdir "$basedir/$year/$project_id/grades/" or die $!; } log DEBUG, "Generate list of students"; + # Get groups from the intranet + my $groups = API::Projects::get_groups($project_id, $year); + # Create list of students to generate my @logins; if ($args->{unamed}) @@ -72,22 +75,11 @@ sub grades_generate } else { - opendir(my $dh, "$basedir/$year/$project_id/traces/") or croak "can't opendir $basedir/$year/$project_id/traces/: $!"; - for my $dir (grep { ( ! /^\./ ) && -d "$basedir/$year/$project_id/traces/$_" } readdir($dh)) - { - opendir(my $dhm, "$basedir/$year/$project_id/traces/$dir") or croak "can't opendir $basedir/$year/$project_id/traces/$dir: $!"; - - for my $login (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/traces/$dir/$_" } readdir($dhm)) - { - $login =~ s/\.xml$//; - if (! grep { /^\Q$login\E$/ } @logins) { - push @logins, $login; - } + map { + for my $member (@{ $_->{stds} }) { + push @logins, $member->{login}; } - - closedir $dhm; - } - closedir $dh; + } @{ $groups->{groups} }; } log TRACE, @logins; @@ -110,18 +102,46 @@ sub grades_generate log DEBUG, "Generating grades for $login"; for my $dir (@trace_dirs) { - log DEBUG, "Generating grades from $dir"; - if (-f "$basedir/$year/$project_id/traces/$dir/$login.xml") + log DEBUG, "Fetching identifiers from $dir"; + + my $tr_file = "$year/$project_id/traces/$dir/$login.xml"; + + # Looking for a group traces? + if (! -f "$basedir/$tr_file") { - open my $xmltrace, "<", "$basedir/$year/$project_id/traces/$dir/$login.xml" or croak "traces/$dir/$login.xml: $!"; + for my $grp (@{ $groups->{groups} }) + { + my $this = 0; + my $chief; + for my $member (@{ $grp->{stds} }) + { + if ($member->{chief} eq "true" or $member->{chief} eq "1" or $member->{chief} eq "chief") + { + $chief = $member; + next; + } + $this = 1 if ($member->{login} eq $login); + } + if ($this && $chief) + { + $tr_file = "$year/$project_id/traces/$dir/".$chief->{login}.".xml"; + log DEBUG, "Using group trace: chief is ".$chief->{login}; + last; + } + } + } + + if (-f "$basedir/$tr_file") + { + open my $xmltrace, "<", "$basedir/$tr_file" or croak "$tr_file: $!"; binmode $xmltrace; my $trace = Trace->new($xmltrace); close $xmltrace; - log DEBUG, "Fill from file: traces/$dir/$login.xml"; + log DEBUG, "Fill from file: $tr_file"; log TRACE, $trace->getIds; - $grading->fill($trace->getIds); + $grading->fill($trace->getIds($login)); } } @@ -149,10 +169,10 @@ sub grades_new_bonus croak "No project_id given" if (! $project_id); if (! -e "$basedir/$year/$project_id/traces/") { - mkdir "$basedir/$year/$project_id/traces/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/" or die $!; } if (! -e "$basedir/$year/$project_id/traces/bonus/") { - mkdir "$basedir/$year/$project_id/traces/bonus/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/bonus/" or die $!; } for my $kfile (keys %{ $args->{files} }) @@ -192,7 +212,7 @@ sub grades_new_bonus } if (-e "$basedir/$year/$project_id/traces/bonus/$login.xml") { - open my $xml, "<", "$basedir/$year/$project_id/traces/bonus/$login.xml" or croak $!; + open my $xml, "<", "$basedir/$year/$project_id/traces/bonus/$login.xml" or die $!; binmode $xml; $trace = Trace->new($xml); close $xml; @@ -216,7 +236,7 @@ sub grades_new_bonus log DEBUG, "Updating $basedir/$year/$project_id/traces/bonus/$login.xml"; - open my $xml, ">", "$basedir/$year/$project_id/traces/bonus/$login.xml" or croak $!; + open my $xml, ">", "$basedir/$year/$project_id/traces/bonus/$login.xml" or die $!; print $xml $trace->toString(); close $xml; } @@ -251,19 +271,19 @@ sub update_defense log INFO, "Update $year/$project_id/defenses/$defense_id.xml"; if (! -e "$basedir/$year/$project_id/defenses/") { - mkdir "$basedir/$year/$project_id/defenses/" or croak $!; + mkdir "$basedir/$year/$project_id/defenses/" or die $!; } if (! -e "$basedir/$year/$project_id/traces/") { - mkdir "$basedir/$year/$project_id/traces/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/" or die $!; } if (! -e "$basedir/$year/$project_id/traces/defense_$defense_id/") { - mkdir "$basedir/$year/$project_id/traces/defense_$defense_id/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/defense_$defense_id/" or die $!; my ($login, $pass, $uid, $gid) = getpwnam("www-data"); - chown $uid, $gid, "$basedir/$year/$project_id/traces/defense_$defense_id/" or croak $!; - chmod 0775, "$basedir/$year/$project_id/traces/defense_$defense_id/" or croak $!; + chown $uid, $gid, "$basedir/$year/$project_id/traces/defense_$defense_id/" or die $!; + chmod 0775, "$basedir/$year/$project_id/traces/defense_$defense_id/" or die $!; } - open my $out, ">", "$basedir/$year/$project_id/defenses/$defense_id.xml" or croak $!; + open my $out, ">", "$basedir/$year/$project_id/defenses/$defense_id.xml" or die $!; print $out $defense; close $out; @@ -322,11 +342,11 @@ sub update_trace log INFO, "Update $year/$project_id/traces/$rendu_id/$login.xml"; if (! -e "$basedir/$year/$project_id/traces/") { - mkdir "$basedir/$year/$project_id/traces/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/" or die $!; } if (! -e "$basedir/$year/$project_id/traces/$rendu_id/") { - mkdir "$basedir/$year/$project_id/traces/$rendu_id/" or croak $!; - chmod 0755, "$basedir/$year/$project_id/traces/$rendu_id/" or croak $!; + mkdir "$basedir/$year/$project_id/traces/$rendu_id/" or die $!; + chmod 0755, "$basedir/$year/$project_id/traces/$rendu_id/" or die $!; } open my $out, ">", "$basedir/$year/$project_id/traces/$rendu_id/$login.xml" or croak("Unable to write to $rendu_id/$login.xml"); From 90727e48d570935f86504d3e25393232c578cbdc Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 6 Nov 2013 18:11:17 +0100 Subject: [PATCH 08/36] Fix errors --- ACU/VCS/Git.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ACU/VCS/Git.pm b/ACU/VCS/Git.pm index 169b028..a1ed4fa 100644 --- a/ACU/VCS/Git.pm +++ b/ACU/VCS/Git.pm @@ -27,7 +27,7 @@ sub init_conf(;$) { $git_server = $_ if (shift); - $gitolite_directory = mktemp("/tmp/git_manage_XXXX") unless(-d $gitolite_directory); + $gitolite_directory = mktemp("/tmp/git_manage_XXXX"); log INFO, "Cloning $git_user\@$git_server:$git_adminrepo to $gitolite_directory"; @@ -271,7 +271,7 @@ sub user_delete { if ($f =~ /^[0-9]/ && -d "$gitolite_directory/keydir/$f") { log INFO, "Removing $f directory"; - rmtree("$gitolite_directory/keydir/$f"); + remove_tree("$gitolite_directory/keydir/$f"); } } else From 8a4b545da67ef61f6c02dbd9aaf6961222763d29 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 6 Nov 2013 18:13:08 +0100 Subject: [PATCH 09/36] chdir before remove dir --- ACU/VCS/Git.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/ACU/VCS/Git.pm b/ACU/VCS/Git.pm index a1ed4fa..a9ad31c 100644 --- a/ACU/VCS/Git.pm +++ b/ACU/VCS/Git.pm @@ -48,6 +48,7 @@ sub save_conf(;$) log INFO, "Saving repositories configuration"; qx(git push); + chdir("/"); remove_tree($gitolite_directory); $gitolite_directory = undef; } From de88e60fa5b8cfc5973bb6d52ddf7ffc36e570c8 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 6 Nov 2013 18:22:07 +0100 Subject: [PATCH 10/36] Fix too much kill of ssh-agent --- process/launch.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/process/launch.sh b/process/launch.sh index fef7b54..efac6fd 100755 --- a/process/launch.sh +++ b/process/launch.sh @@ -12,13 +12,17 @@ else fi PERL='/usr/bin/env perl' +reset_agents() +{ + echo "killall ssh-agent" | $SU intradmin +} + launch_screen() { CMD=$2 if [ -n "$3" ] && [ -f "$3" ] then TMP=`echo mktemp | $SU intradmin` - echo "killall ssh-agent" | $SU intradmin echo "ssh-agent" | $SU intradmin > "$TMP" echo ". $TMP; ssh-add '$3'" | $SU intradmin CMD=". $TMP; ssh-add -l; echo; $CMD" @@ -80,10 +84,12 @@ then case $HOSTNAME in cpp) + reset_agents launch_screen "lerdorf_process_ldap_sync_ssh_keys_forge" "while true; do $PERL ~/liblerdorf/process/ldap/sync_ssh_keys_forge.pl; done" ~intradmin/.ssh/git ;; hamano) + reset_agents launch_screen "lerdorf_process_ldap_sync_ssh_keys_git" "while true; do $PERL ~/liblerdorf/process/ldap/sync_ssh_keys_git.pl; done" ~intradmin/.ssh/git launch_screen "lerdorf_process_send_git" "while true; do $PERL ~/liblerdorf/process/files/send_git.pl; done" ~intradmin/.ssh/git ;; From cda7b5b02614be0e9bb9772b229835fc59d72b4b Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Thu, 7 Nov 2013 14:46:28 +0100 Subject: [PATCH 11/36] LPT: fix grant-lab and add delete account capability --- ACU/LDAP.pm | 6 +-- utils/lpt | 108 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 98 insertions(+), 16 deletions(-) diff --git a/ACU/LDAP.pm b/ACU/LDAP.pm index 5e7e229..04b94e7 100644 --- a/ACU/LDAP.pm +++ b/ACU/LDAP.pm @@ -193,9 +193,9 @@ sub get_dn($$@) base => "$dn", filter => Net::LDAP::Filter->new("(objectClass=*)"), attrs => \@_, - scope => "sub" + scope => "base" ); - if ($mesg->code != 0) { log(WARN, $mesg->error); return undef; } + return undef if ($mesg->code != 0); if ($mesg->count != 1) { log(WARN, "$dn not found or multiple entries match"); return undef; } return $mesg->entry(0); @@ -331,7 +331,7 @@ sub search_dn($$@) attrs => [ ], scope => "sub" ); - croak($mesg->error) if ($mesg->code != 0); + return undef if ($mesg->code != 0); croak("$filter not found") if ($mesg->count == 0); croak("$filter not unique") if ($mesg->count > 1); diff --git a/utils/lpt b/utils/lpt index e760ed0..c96d936 100755 --- a/utils/lpt +++ b/utils/lpt @@ -73,6 +73,7 @@ my %cmds_account = "close" => \&cmd_account_close, "cn" => \&cmd_account_cn, "create" => \&cmd_account_create, + "delete" => \&cmd_account_delete, "finger" => \&cmd_account_view, "mail" => \&cmd_account_mail, "name" => \&cmd_account_cn, @@ -259,11 +260,31 @@ sub cmd_account_create($@) log(DEBUG, "Adding dn: uid=$login,ou=$group,ou=users,dc=acu,dc=epita,dc=fr ..."); my $ldap = LDAP::ldap_connect(); - my $mesg = $ldap->add( "uid=$login,ou=$group,ou=users,dc=acu,dc=epita,dc=fr", + + # Check if the OU exists + my $oudn = "ou=$group,ou=users,dc=acu,dc=epita,dc=fr"; + my $ou = LDAP::get_dn($ldap, $oudn); + + if (! $ou) + { + my $mesg = $ldap->add( "$oudn", + attrs => [ + objectclass => [ "top", "organizationalUnit" ], + ou => "$group", + ] + ); + if ($mesg->code == 0) { + log(INFO, "New OU created: $oudn"); + } else { + log(WARN, "Unable to add new OU $oudn: ", RESET, $mesg->error); + } + } + + my $mesg = $ldap->add( "uid=$login,$oudn", attrs => [ objectclass => [ "top", "epitaAccount" ], uidNumber => shift, - cn => shift(@_)." ".shift(@_), + cn => ucfirst(shift(@_))." ".ucfirst(shift(@_)), mail => "$login\@epita.fr", uid => $login, ] @@ -271,10 +292,11 @@ sub cmd_account_create($@) #$ldap->unbind or die ("couldn't disconnect correctly"); - if ($mesg->code == 0) { + if ($mesg->code == 0) + { log(INFO, "Account added: $login"); my $pass = shift; - return cmd_account($login, $pass) if ($pass ne "nopass"); + return cmd_account($login, $pass, @_) if ($pass ne "nopass"); return 0; } else { @@ -282,6 +304,28 @@ sub cmd_account_create($@) } } +sub cmd_account_delete($@) +{ + my $login = shift; + + my $ldap = LDAP::ldap_connect(); + + my $dn = LDAP::search_dn($ldap, "ou=users", "uid=$login"); + + log(DEBUG, "Deleting dn: $dn ..."); + + if (LDAP::delete_entry($ldap, $dn)) + { + log DONE, "Account ", YELLOW, $login, RESET, " successfully deleted."; + return 0; + } + else + { + log ERROR, "Unable to delete account ", YELLOW, $login, RESET, "."; + return 1; + } +} + sub cmd_account_grantintra($@) { my $login = shift; @@ -300,27 +344,58 @@ sub cmd_account_grantintra($@) sub cmd_account_grantlab($@) { my $login = shift; - my $group = shift; + my $group = shift // ""; - if ($group ne "acu" && $group ne "yaka") { - log(USAGE, "lpt account grantlab "); + if ($group ne "acu" && $group ne "yaka" && $group ne "ferry") + { + log(USAGE, "lpt account grant-lab "); return 1; } my $ldap = LDAP::ldap_connect(); my $dn = LDAP::search_dn($ldap, "ou=users", "uid=$login"); + my $entry = LDAP::get_dn($ldap, $dn, "objectClass", "mail", "mailAlias", "mailAccountActive", "loginShell", "homeDirectory", "gidNumber"); if (!LDAP::get_attribute($ldap, $dn, "mail")) { LDAP::add_attribute($ldap, $dn, "mail", "$login\@epita.fr"); } - LDAP::add_attribute($ldap, $dn, "mailAlias", "$login\@$group.epita.fr"); - LDAP::update_attribute($ldap, $dn, "mailAccountActive", "yes"); - LDAP::add_attribute($ldap, $dn, "objectClass", "MailAccount"); - LDAP::add_attribute($ldap, $dn, "objectClass", "labAccount"); + if ($group eq "acu" || $group eq "yaka") + { + if (! grep { $_ eq "MailAccount" } @{ $entry->get_value("objectClass") }) + { + $entry->replace("mailAccountActive" => [ "yes" ]); - log(INFO, "$login now grants to receive e-mail and connect in laboratory."); + my @oc = $entry->get_value("objectClass"); + push @oc, "MailAccount"; + $entry->replace("objectClass" => \@oc); + + my @aliases = $entry->get_value("mailAlias"); + push @aliases, "$login\@$group.epita.fr"; + $entry->replace("objectClass" => \@aliases); + } + + $entry->replace("loginShell" => [ "/bin/zsh" ]) if ($entry->get_value("loginShell")); + $entry->replace("homeDirectory" => [ "/home/201X/$login" ]) if ($entry->get_value("homeDirectory")); + $entry->replace("gidNumber" => [ "4242" ]) if ($entry->get_value("gidNumber")); + } + elsif ($group eq "ferry") + { + $entry->replace("loginShell" => [ "/bin/noexists" ]); + $entry->replace("homeDirectory" => [ "/dev/null" ]); + $entry->replace("gidNumber" => [ "4243" ]); + } + + my @oc = $entry->get_value("objectClass"); + push @oc, "labAccount"; + $entry->replace("objectClass" => \@oc); + + my $mesg = $entry->update($ldap) or die $!; + if ($mesg->code != 0) { log(WARN, $mesg->error); return 0; } + + log(INFO, "$login now grants to receive e-mail and connect in laboratory.") if ($group eq "acu" || $group eq "yaka"); + log(INFO, "$login now grants to connect in laboratory for exam.") if ($group eq "ferry"); $ldap->unbind or die ("couldn't disconnect correctly"); } @@ -1855,10 +1930,12 @@ B I Give rights to the user to access the intranet. -B I +B I Give rights to the user to access intern systems of the laboratory (SSH, Unix, ...) + If ferry is given, open an account for exam only, with restricted rights. + B I Give rights to the user to receive e-mails. @@ -1871,6 +1948,11 @@ B I This is used to close an existing account. +B I + + This is used to delete an existing account. + NEVER DELETE AN ACCOUNT, close it instead. + B I [new-mail] This is used to display, or change if [new-mail] is given, the account contact adress. From 584fbf98954a1c99ad3d25951b6046d0bfac1e47 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Fri, 8 Nov 2013 21:05:05 +0100 Subject: [PATCH 12/36] Add APPING1 to exception --- hooks/submissions.pl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hooks/submissions.pl b/hooks/submissions.pl index 52d7e59..058e393 100755 --- a/hooks/submissions.pl +++ b/hooks/submissions.pl @@ -22,6 +22,8 @@ my $promo; my $id_project; my $repo_login; +my @apping = qw(zinger_a zebard_w zanell_a yao_p vinois_a sraka_y soupam_j seck_a ngomsi_s morin_h milis_e menkar_m eusebe_r crief_a chhum_s boumra_n blemus_a bengan_l amasho_a); + # First, extract information, from config then guess from repository adress if (my $tmp = `git config hooks.promo`) { chomp $tmp; $promo = $tmp; } if (my $tmp = `git config hooks.idproject`) { chomp $tmp; $id_project = $tmp; } @@ -71,6 +73,12 @@ if ($ref =~ m<^refs/tags/(.+)$>) my $open = DateTime::Format::ISO8601->parse_datetime($rendu->{period}{begin}); my $close = DateTime::Format::ISO8601->parse_datetime($rendu->{period}{end}); + if ($id_project eq "myhttpd" && grep { $_ eq $repo_login } @apping) + { + $open = DateTime::Format::ISO8601->parse_datetime("2013-11-08T20:00:00"); + $close = DateTime::Format::ISO8601->parse_datetime("2013-11-10T11:42:00"); + } + # TODO: check exceptions by login/group $open = DateTime::Format::ISO8601->parse_datetime("2013-10-16T16:00:00") if ($repo_login eq "ikouna_l"); From 1de1b9a2218f628aaa6a7243101d8c891627199d Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Sat, 9 Nov 2013 17:42:59 +0100 Subject: [PATCH 13/36] New exception --- hooks/gl-pre-git | 1 + 1 file changed, 1 insertion(+) diff --git a/hooks/gl-pre-git b/hooks/gl-pre-git index 5f6fd16..65c8952 100755 --- a/hooks/gl-pre-git +++ b/hooks/gl-pre-git @@ -49,6 +49,7 @@ if ($ip->overlaps($labnetwork) == $IP_A_IN_B_OVERLAP) #} exit 0 if (grep { /\Q$repo_login\E/ } @habitent_loin); +exit 0 if ($repo_login eq "bellev_m"); my $schoolnetwork = Net::IP->new('10.41.0.0/16'); #my $vjschoolnetwork = Net::IP->new('10.3.0.0/16'); From 15f89a5e396f237700a7f2b473e6de10b5f095c2 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:09:53 +0100 Subject: [PATCH 14/36] New parser for traces --- ACU/Grading.pm | 2 +- ACU/Trace.pm | 393 +++++++++++++++++++++------------ process/files/intradata_get.pl | 2 +- 3 files changed, 251 insertions(+), 146 deletions(-) diff --git a/ACU/Grading.pm b/ACU/Grading.pm index b01693c..7db43cb 100644 --- a/ACU/Grading.pm +++ b/ACU/Grading.pm @@ -111,7 +111,7 @@ sub insert ($$$) $self->{ids}{$_[0]} = $_[1]; } -sub fill ($$) +sub fill { my $self = shift; my $ids = shift; diff --git a/ACU/Trace.pm b/ACU/Trace.pm index fba6621..e4ae66e 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -9,16 +9,13 @@ use Carp; use utf8; use open qw(:encoding(UTF-8) :std); use XML::LibXML; -use XML::SAX::ParserFactory; sub new { my $class = shift; my $self = { - ids => {}, infos => {}, - comments => {}, - who => {}, + groups => [], }; bless $self, $class; @@ -33,10 +30,47 @@ sub _initialize ($$) { my $self = shift; - my $sax_handler = TraceHandler->new($self); - my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler ); + my $dom = XML::LibXML->load_xml(string => shift); + $self->{groups} = $self->parseTrace($dom->documentElement()); + $self->{type} = $dom->documentElement()->getAttribute("type") // "mill"; + $self->{version} = $dom->documentElement()->getAttribute("version") // 1; +} - $parser->parse_file(shift); +sub parseTrace($$) +{ + my $self = shift; + my $tree = shift; + my $ret = []; + + foreach my $node ($tree->childNodes()) + { + if ($node->nodeName eq "info") + { + my $tmp = $node->textContent; + chomp($tmp); + $self->{infos}{ $node->getAttribute("name") } = $tmp; + } + elsif ($node->nodeName eq "group") + { + my $g = Trace::Group->new( + $node->getAttribute("id"), + $node->getAttribute("name") + ); + $g->append(@{ $self->parseTrace($node) }); + push @$ret, $g; + } + elsif ($node->nodeName eq "eval") + { + my $e = Trace::Eval->new( + $node->getAttribute("id"), + $node->getAttribute("type"), + $node + ); + push @$ret, $e; + } + } + + return $ret; } sub getVersion ($) @@ -63,64 +97,63 @@ sub getInfos ($) return $self->{infos}; } -sub getComment ($$) +sub getIds { my $self = shift; - return $self->{comments}{$_[0]}; + my $login = shift; + + my %ids; + foreach my $group (@{ $self->{groups} }) + { + my %tmp = $group->getIds($login); + while (my ($key, $value) = each %tmp) + { + %ids{$key} = $value; + } + } + return %ids; } -sub getComments ($) +sub getValue { my $self = shift; - return $self->{comments}; + my $id = shift; + my $login = shift; + + my $value = 0; + foreach my $group (@{ $self->{groups} }) + { + $value += $group->getValue($id, $login); + } + return $value; } sub getWho ($$) { my $self = shift; - return $self->{who}{$_[0]}; + return $self->getWhos()->{$_[0]}; } sub getFirstWho ($) { my $self = shift; - - return $self->{who}{def1_end_group}; + return $self->getWhos()->{def1_end_group}; } -sub getWhos ($) +sub getWhos { my $self = shift; - return $self->{who}; -} + my $ret = {}; -sub getValue ($$) -{ - my $self = shift; - return $self->{ids}{$_[0]}; -} + foreach my $group (@{ $self->{groups} }) + { + my $whos = $group->getWhos(); + foreach my $who (keys %{ $whos }) { + $ret->{ $who } = $whos->{$who}; + } + } -sub getIds ($) -{ - my $self = shift; - return $self->{ids}; -} - -sub addId($$;$) -{ - my $self = shift; - my $key = shift; - my $value = shift // 1; - - $self->{ids}{$key} = $value; -} - -sub delId($$) -{ - my $self = shift; - my $key = shift; - - delete $self->{ids}{$key}; + return $ret; } sub toString ($;$) @@ -153,23 +186,20 @@ sub toString ($;$) } -package TraceHandler; +package Trace::Group; +use v5.10.1; +use strict; +use warnings; use Carp; -use constant NO_ID_VALUE => "__#"; sub new ($$) { my $class = shift; my $self = { - groups => [], - parsed => shift, - inComment => "", - inEval => "", - inInfo => "", - inValue => "", - inWho => "", - values => "" + id => shift, + name => shift, + groups => [] }; bless $self, $class; @@ -177,113 +207,188 @@ sub new ($$) return $self; } -sub start_element +sub append ($@) { - my ($self, $element) = @_; + my $self = shift; - if ($element->{Name} eq "trace") { - $self->{parsed}{version} = $element->{Attributes}{"{}version"}{Value}; - $self->{parsed}{type} = $element->{Attributes}{"{}type"}{Value}; - } - elsif ($element->{Name} eq "info") { - $self->{inInfo} = $element->{Attributes}{"{}name"}{Value}; - $self->{parsed}{infos}{ $self->{inInfo} } = 0; - $self->{values} = ""; - } - elsif ($element->{Name} eq "eval") { - my $tmp = $element->{Attributes}{"{}id"}{Value}; - if ($tmp) { - $self->{inEval} = $tmp; - $self->{parsed}{ids}{ $self->{inEval} } = 0; - } - } - elsif ($element->{Name} eq "comment" && $self->{inEval}) { - $self->{inComment} = $self->{inEval}; - $self->{values} = ""; - } - elsif ($element->{Name} eq "who" && $self->{inEval}) { - $self->{inWho} = $self->{inEval}; - $self->{values} = ""; - } - elsif ($element->{Name} eq "value") { - if ($element->{Attributes}{"{}id"}{Value}) { - $self->{inValue} = $element->{Attributes}{"{}id"}{Value}; - } else { - $self->{inValue} = NO_ID_VALUE; - } - - $self->{values} = ""; - } - elsif ($element->{Name} eq "group") - { - push @{ $self->{groups} }, ($element->{Attributes}{"{}id"}{Value} // ""); - } - elsif ($element->{Name} ne "name" && $element->{Name} ne "statut" && $element->{Name} ne "status" && $element->{Name} ne "log") { - croak "Not a valid trace XML: unknown tag ".$element->{Name}; - } + push @{ $self->{groups} }, @_; } -sub characters +sub getIds { - my ($self, $characters) = @_; + my $self = shift; + my $login = shift; - if ($self->{inValue} || $self->{inInfo} || $self->{inComment} || $self->{inWho}) { - $self->{values} .= $characters->{Data}; - } -} - -sub end_element -{ - my ($self, $element) = @_; - - if ($element->{Name} eq "value") + my %ids; + foreach my $group (@{ $self->{groups} }) { - if ($self->{values} =~ /([-+]?[0-9]+(.[0-9]+)?)/) + my %tmp = $group->getIds($login); + while (($key, $value) = each %tmp) { - $self->{parsed}{ids}{ $self->{inEval} } += $1; - if ($self->{inValue} ne NO_ID_VALUE and $1) { - $self->{parsed}{ids}{ $self->{inValue} } = $1; - } - if ($self->{groups}) { - my $key = @{ $self->{groups} }[$#{ $self->{groups} }]; - $self->{parsed}{ids}{ $key } += $1; + %ids{$key} = $value; + } + } + + %ids{ $self->{id} } = $self->getValue($self->{id}, $login); + + return %ids; +} + +sub getValue +{ + my $self = shift; + my $id = shift // $self->{id}; + my $login = shift + + if ($id eq $self->{id}) + { + my $value = 0; + foreach my $group (@{ $self->{groups} }) + { + $value += $group->getValue(undef, $login); + } + return $value; + } + else + { + my $value = 0; + foreach my $group (@{ $self->{groups} }) + { + $value += $group->getValue($id, $login); + } + return $value; + } +} + +sub getWhos +{ + my $self = shift; + my $ret = {}; + + foreach my $group (@{ $self->{groups} }) + { + my $whos = $group->getWhos(); + foreach my $who (keys %{ $whos }) { + $ret->{ $who } = $whos->{$who}; + } + } + + return $ret; +} + + +package Trace::Eval; + +use v5.10.1; +use strict; +use warnings; +use Carp; + +sub new ($$;$) +{ + my $class = shift; + my $self = { + id => shift, + type => shift // "test", + values => {}, + logs => {}, + }; + + bless $self, $class; + if ($#_ >= 0) { + $self->parseEval(@_); + } + + return $self; +} + +sub parseEval +{ + my $self = shift; + my $tree = shift; + + foreach my $node ($tree->childNodes()) + { + my $val = $node->textContent; + chomp($val); + + if ($node->nodeName eq "value") + { + my $key; + if ($node->hasAttribute("id")) { + $key = $node->getAttribute("id"); + } else { + $key = ""; } + + $self->{values}{ $key } = 0 if (!exists $self->{values}{ $key }); + $self->{values}{ $key } += $val; } - $self->{inValue} = ""; - } - elsif ($element->{Name} eq "eval") - { - # Remove empty identifier - delete $self->{parsed}{ids}{ $self->{inEval} } if (!$self->{parsed}{ids}{ $self->{inEval} }); - $self->{inEval} = ""; - } - elsif ($element->{Name} eq "comment") - { - if ($self->{values} =~ /([^\s].*[^\s]|[^\s])/) { - $self->{parsed}{comments}{ $self->{inComment} } = $1; + elsif ($node->nodeName eq "name") + { + $self->{name} = $val; } - $self->{inComment} = ""; - } - elsif ($element->{Name} eq "who") - { - if ($self->{values} =~ /([^\s].*[^\s]|[^\s])/) { - $self->{parsed}{who}{ $self->{inWho} } = $1; + elsif ($node->nodeName eq "status") + { + $self->{status} = $val; } - $self->{inComment} = ""; - } - elsif ($element->{Name} eq "info") - { - if ($self->{values} =~ /([^\s].*[^\s]|[^\s])/) { - $self->{parsed}{infos}{ $self->{inInfo} } = $1; + elsif ($node->nodeName eq "log") + { + my $key = $node->getAttribute("type") // "stdout"; + + $self->{logs}{ $key } = $val; + } + elsif ($node->nodeName eq "who") + { + $self->{who} = { + login => $val, + type => $node->getAttribute("type") // "login" + }; } - $self->{inInfo} = ""; } - elsif ($element->{Name} eq "group") +} + +sub getIds +{ + my $self = shift; + my $login = shift; + + my %ids; + if (!$login || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) { - my $key = pop @{ $self->{groups} }; - # Remove empty identifier - delete $self->{parsed}{ids}{ $key } if ($key && !$self->{parsed}{ids}{ $key }); + while (my ($key, $value) = each %{ $self->{who}{values} }) + { + %ids{$key} = $value if ($key); + } } + + %ids{ $self->{id} } = $self->getValue($self->{id}, $login); + + return %ids; +} + +sub getValue +{ + my $self = shift; + my $id = shift // $self->{id}; + my $login = shift; + + my $value = 0; + if (!$login || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) + { + foreach my $key (%{ $self->{values} }) + { + $value += $self->{values}{$key} if ($id eq $self->{id} || !$key || $key eq $id); + } + } + return $value; +} + +sub getWhos +{ + my $self = shift; + + return { $self->{id} => $self->{who} }; } 1; diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index c1f58e0..bbf7d1c 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -133,7 +133,7 @@ sub grades_generate if (-f "$basedir/$tr_file") { - open my $xmltrace, "<", "$basedir/$tr_file" or croak "$tr_file: $!"; + open my $xmltrace, "<", "$basedir/$tr_file" or die "$tr_file: $!"; binmode $xmltrace; my $trace = Trace->new($xmltrace); close $xmltrace; From 440ace265440fd11fc6167e5b5956bb95822868e Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:15:59 +0100 Subject: [PATCH 15/36] Fix syntax --- ACU/Trace.pm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index e4ae66e..d627b1e 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -108,7 +108,7 @@ sub getIds my %tmp = $group->getIds($login); while (my ($key, $value) = each %tmp) { - %ids{$key} = $value; + $ids{$key} = $value; } } return %ids; @@ -223,13 +223,13 @@ sub getIds foreach my $group (@{ $self->{groups} }) { my %tmp = $group->getIds($login); - while (($key, $value) = each %tmp) + while (my ($key, $value) = each %tmp) { - %ids{$key} = $value; + $ids{$key} = $value; } } - %ids{ $self->{id} } = $self->getValue($self->{id}, $login); + $ids{ $self->{id} } = $self->getValue($self->{id}, $login); return %ids; } @@ -238,7 +238,7 @@ sub getValue { my $self = shift; my $id = shift // $self->{id}; - my $login = shift + my $login = shift; if ($id eq $self->{id}) { @@ -358,11 +358,11 @@ sub getIds { while (my ($key, $value) = each %{ $self->{who}{values} }) { - %ids{$key} = $value if ($key); + $ids{$key} = $value if ($key); } } - %ids{ $self->{id} } = $self->getValue($self->{id}, $login); + $ids{ $self->{id} } = $self->getValue($self->{id}, $login); return %ids; } From ddb8788eb6b8db9ad2e8724da579d5e9b0cc609f Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:23:23 +0100 Subject: [PATCH 16/36] Import API --- process/files/intradata_get.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index bbf7d1c..36d2097 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -8,6 +8,7 @@ use Pod::Usage; use lib "../../"; +use ACU::API::Projects; use ACU::Log; use ACU::LDAP; use ACU::Grading; From 81058c9c201806af1dec121538277dba5a77ec76 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:32:50 +0100 Subject: [PATCH 17/36] Change input form of Trce --- process/files/intradata_get.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index 36d2097..c5d3fb5 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -136,7 +136,7 @@ sub grades_generate { open my $xmltrace, "<", "$basedir/$tr_file" or die "$tr_file: $!"; binmode $xmltrace; - my $trace = Trace->new($xmltrace); + my $trace = Trace->new(join '', <$xmltrace>); close $xmltrace; log DEBUG, "Fill from file: $tr_file"; From add1bb5db92fdf7b75e15405ab73ddb5c5f2721a Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:35:34 +0100 Subject: [PATCH 18/36] Change output form of getIds --- ACU/Trace.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index d627b1e..f036e9b 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -111,7 +111,7 @@ sub getIds $ids{$key} = $value; } } - return %ids; + return \%ids; } sub getValue From 62bd5f2d2a0c2f8130684a656a3e03206653ec86 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:37:36 +0100 Subject: [PATCH 19/36] Fix warning --- ACU/Trace.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index f036e9b..33dd018 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -374,7 +374,7 @@ sub getValue my $login = shift; my $value = 0; - if (!$login || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) + if (!$login || !exists $self->{who} || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) { foreach my $key (%{ $self->{values} }) { From fc595e9ee4f580bde310082fa37d2cbf9e54b00d Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:57:44 +0100 Subject: [PATCH 20/36] Fix warning --- ACU/Trace.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index 33dd018..430f9f2 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -354,7 +354,8 @@ sub getIds my $login = shift; my %ids; - if (!$login || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) + log TRACE, $self->{who}; + if (!$login || !exists $self->{who} || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) { while (my ($key, $value) = each %{ $self->{who}{values} }) { From 74f44a836b55da78158443f88514378ea793a759 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 16:59:14 +0100 Subject: [PATCH 21/36] Forgotten use --- ACU/Trace.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index 430f9f2..5eee413 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -284,6 +284,8 @@ use strict; use warnings; use Carp; +use ACU::Log; + sub new ($$;$) { my $class = shift; From 464fcfc879a1625f71752283235dc23d77bce899 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 17:16:03 +0100 Subject: [PATCH 22/36] Fixing grading --- ACU/Trace.pm | 7 +++---- process/files/intradata_get.pl | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index 5eee413..687fe66 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -356,16 +356,15 @@ sub getIds my $login = shift; my %ids; - log TRACE, $self->{who}; if (!$login || !exists $self->{who} || $self->{who}{type} eq "group" || $self->{who}{login} eq $login) { - while (my ($key, $value) = each %{ $self->{who}{values} }) + while (my ($key, $value) = each %{ $self->{values} }) { $ids{$key} = $value if ($key); } - } - $ids{ $self->{id} } = $self->getValue($self->{id}, $login); + $ids{ $self->{id} } = $self->getValue($self->{id}, $login); + } return %ids; } diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index c5d3fb5..f33c895 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -140,7 +140,7 @@ sub grades_generate close $xmltrace; log DEBUG, "Fill from file: $tr_file"; - log TRACE, $trace->getIds; + log TRACE, $trace->getIds($login); $grading->fill($trace->getIds($login)); } From 5d2b1e80fbbe3b8b9f3a3ad182f89a0a73887b45 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 11 Nov 2013 17:57:27 +0100 Subject: [PATCH 23/36] Merge repo.sh with aurier_j version --- migration/repo.sh | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/migration/repo.sh b/migration/repo.sh index be4338a..d022694 100755 --- a/migration/repo.sh +++ b/migration/repo.sh @@ -20,21 +20,26 @@ tex2md() bi=`basename "$i"` echo -e "\e[1;34m>>>\e[1;37m Trying to convert $i to Markdown...\e[0m" - # BEGIN HACK! Need stacking + # BEGIN HACK! Need stacking + sed -Ei 's/\\(lstinline|class|expected|refer)[^{]*\{([^}]*)\}/\\verb+\2+/gi' "$i" sed -Ei 's/\\distribution\{\}/FreeBSD 9/gi' "$i" sed -Ei 's/\\\{/__OPEN_BRACKET_MINIROOT__/gi' "$i" sed -Ei 's/\\\}/__CLOSE_BRACKET_MINIROOT__/gi' "$i" sed -Ei 's/-\{\}-//gi' "$i" - sed -Ei 's/\\_/_/gi' "$i" + #sed -Ei 's/\\_/_/gi' "$i" # DIRTY HACK - sed -Ei 's/\\includegraphics *\{([^}]+)}/\\verb+%%image(\1)+/gi' "$i" sed -Ei 's/\\include *\{([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\\input *\{([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\{\\include *([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\{\\input *([^}]+)}/\\verb+%%scoped-include(\1)+/gi' "$i" + sed -Ei 's/\\lstinputlisting *\{([^}]+)\}/\\verb+%%scoped-include(\1)+/gi' "$i" sed -Ei 's/\\lstinline *\{([^}]+)}/\\verb+\1+/gi' "$i" + sed -Ei 's/\\structure\{([^}]+)}/\1/gi' "$i" + sed -Ei 's/\\struct\{([^}]+)}/\1/gi' "$i" + sed -Ei 's/\\link\{([^}]+)}/\1/gi' "$i" + sed -Ei 's/\\textasciitilde\{\}/~/gi' "$i" sed -Ei 's/\\begin *\{correction\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{correction\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\begin *\{prompt\}/\\begin\{verbatim\}/g' "$i" @@ -46,11 +51,9 @@ tex2md() sed -Ei 's/\\begin *\{cartouche_nospaces\}/\\begin\{verbatim\}/g' "$i" sed -Ei 's/\\end *\{cartouche_nospaces\}/\\end\{verbatim\}/g' "$i" sed -Ei 's/\\verb ([^+]+) /\\verb+\1+/g' "$i" - sed -Ei 's/``/"/g' "$i" - sed -Ei "s/''/\"/g" "$i" # Special macros - sed -Ei 's/\\(file|email|command|code|bcode) *\{([^}]*)\}/\\verb+\2+/gi' "$i" + sed -Ei 's/\\(file|email|command|bcode|code) *\{([^}]*)\}/\\verb+\2+/gi' "$i" sed -Ei 's/\\begin *\{assistant\}/\\verb+%%assistant-begin+/g' "$i" sed -Ei 's/\\end *\{assistant\}/\\verb+%%assistant-end+/g' "$i" From 81fd3a04e2315b33d550f2e49022bbcb43e34fea Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 00:09:54 +0100 Subject: [PATCH 24/36] Trace: can export as string, can addId --- ACU/Grading.pm | 10 ++-- ACU/Trace.pm | 121 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 103 insertions(+), 28 deletions(-) diff --git a/ACU/Grading.pm b/ACU/Grading.pm index 7db43cb..4627024 100644 --- a/ACU/Grading.pm +++ b/ACU/Grading.pm @@ -340,13 +340,15 @@ sub compute ($$$;$$$) my $login = shift; my $ref = $self->{ref}; - if ($login && $ref) { - $ref =~ s/\$LOGIN/$login/; - } + # Handle $LOGIN in ref + $ref =~ s/\$LOGIN/$login/ if ($login && $ref); + + # Handle globbing in ref if (defined $ref) { - eval { + eval + { my $glob = Tinyglob::tinyglob($ref); if ($glob ne $ref) { diff --git a/ACU/Trace.pm b/ACU/Trace.pm index 687fe66..a40929e 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -97,6 +97,38 @@ sub getInfos ($) return $self->{infos}; } +sub addId +{ + my $self = shift; + my $key = shift; + my $value = shift; + + my $e = Trace::Eval->new($key); + $e->addId(undef, $value); + push @{ $self->{groups} }, $e; +} + +sub delId +{ + my $self = shift; + my $key = shift; + my $value = shift; + + foreach my $group (@{ $self->{groups} }) + { + if ($group->{id} eq $key) + { + if (!$value || $value == $group->getValue()) + { + #$self->{groups} = \{ grep { ! } @{ $self->{groups} } }; + } + last; + } + + $group->delId($key, $value); + } +} + sub getIds { my $self = shift; @@ -156,30 +188,19 @@ sub getWhos return $ret; } -sub toString ($;$) +sub toString ($) { my $self = shift; - my $main_grp = shift // "bonus_malus"; my $doc = XML::LibXML::Document->new('1.0'); my $root = $doc->createElement("trace"); - my $group = $doc->createElement("group"); - $group->addChild( $doc->createAttribute("id", $main_grp) ); - - for my $k (keys %{ $self->{ids} }) { - my $e = $doc->createElement("eval"); - my $v = $doc->createElement("value"); - - $e->addChild( $doc->createAttribute("id", $k) ); - $v->appendText( $self->{ids}{$k} ); - - $e->appendChild( $v ); - $group->appendChild( $e ); + foreach my $group (@{ $self->{groups} }) + { + $root->appendChild( $group->toString($doc) ); } - $root->appendChild( $group ); $doc->setDocumentElement( $root ); return $doc->toString(); @@ -214,6 +235,19 @@ sub append ($@) push @{ $self->{groups} }, @_; } +sub delId +{ + my $self = shift; + my $key = shift; + my $value = shift; + + foreach my $item (@{ $self->{groups} }) + { + if ($item->{id} eq ) + $group->delId(@_); + } +} + sub getIds { my $self = shift; @@ -276,6 +310,21 @@ sub getWhos return $ret; } +sub toString($$) +{ + my $self = shift; + my $doc = shift; + + my $gr = $doc->createElement("group"); + + foreach my $item (@{ $self->{groups} }) + { + $gr->appendChild( $item->toString() ); + } + + return $gr; +} + package Trace::Eval; @@ -316,15 +365,8 @@ sub parseEval if ($node->nodeName eq "value") { - my $key; - if ($node->hasAttribute("id")) { - $key = $node->getAttribute("id"); - } else { - $key = ""; - } - - $self->{values}{ $key } = 0 if (!exists $self->{values}{ $key }); - $self->{values}{ $key } += $val; + $self->addValue($node->getAttribute("id"), + $val); } elsif ($node->nodeName eq "name") { @@ -369,6 +411,16 @@ sub getIds return %ids; } +sub addValue +{ + my $self = shift; + my $key = shift // ""; + my $val = shift; + + $self->{values}{ $key } = 0 if (!exists $self->{values}{ $key }); + $self->{values}{ $key } += $val; +} + sub getValue { my $self = shift; @@ -393,4 +445,25 @@ sub getWhos return { $self->{id} => $self->{who} }; } +sub toString($$) +{ + my $self = shift; + my $doc = shift; + + my $e = $doc->createElement("eval"); + + $e->setAttribute("id", $self->{id}); + $e->setAttribute("type", $self->{type}); + + for my $k (keys %{ $self->{values} }) + { + my $v = $doc->createElement("value"); + $v->setAttribute("id", $k) if ($k); + $v->appendTextNode( $self->{values}{$k} ); + $e->appendChild( $v ); + } + + return $e; +} + 1; From 6e3cbe7f04b5c48c42be819701701b83156f981c Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 00:22:19 +0100 Subject: [PATCH 25/36] Fixing syntax --- ACU/Trace.pm | 2 -- 1 file changed, 2 deletions(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index a40929e..af873f9 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -243,8 +243,6 @@ sub delId foreach my $item (@{ $self->{groups} }) { - if ($item->{id} eq ) - $group->delId(@_); } } From 0e92592d17370a73b5d458b07e50f1a692c10ca4 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 00:25:36 +0100 Subject: [PATCH 26/36] Fixing method name --- ACU/Trace.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACU/Trace.pm b/ACU/Trace.pm index af873f9..6252e3a 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -104,7 +104,7 @@ sub addId my $value = shift; my $e = Trace::Eval->new($key); - $e->addId(undef, $value); + $e->addValue(undef, $value); push @{ $self->{groups} }, $e; } From 4e35cabf626a9079b3667b87504b7b36bfb1fb4f Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 01:01:04 +0100 Subject: [PATCH 27/36] Display warnings on process return --- ACU/Process.pm | 4 +++- process/files/intradata_get.pl | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ACU/Process.pm b/ACU/Process.pm index 1c94d27..5aa314a 100644 --- a/ACU/Process.pm +++ b/ACU/Process.pm @@ -62,7 +62,10 @@ sub do_work ($$$@) my $sax_handler = ProcessHandler->new($args); my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler ); + my $ret; eval { + $SIG{'__WARN__'} = sub { log WARN, $_[0]; $ret .= ">>> ".$_[0]."\n"; }; + $parser->parse_string(${ $_[0]{argref} }); }; if ($@) { @@ -71,7 +74,6 @@ sub do_work ($$$@) return $err; } - my $ret; eval { $ret = $subref->($given_args, $args); }; diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index f33c895..2e84c2f 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -215,7 +215,7 @@ sub grades_new_bonus if (-e "$basedir/$year/$project_id/traces/bonus/$login.xml") { open my $xml, "<", "$basedir/$year/$project_id/traces/bonus/$login.xml" or die $!; binmode $xml; - $trace = Trace->new($xml); + $trace = Trace->new(join '', <$xml>); close $xml; } elsif ($delete) { @@ -242,7 +242,7 @@ sub grades_new_bonus close $xml; } else { - log WARN, "Invalid login $line, line skiped"; + warn "Invalid login $line, line skiped"; } } } From c5a1bf89175e07c16cfb0129700b895094c1063e Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 01:12:05 +0100 Subject: [PATCH 28/36] Display important warnings on process return --- ACU/Process.pm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ACU/Process.pm b/ACU/Process.pm index 5aa314a..c5adc7c 100644 --- a/ACU/Process.pm +++ b/ACU/Process.pm @@ -62,9 +62,9 @@ sub do_work ($$$@) my $sax_handler = ProcessHandler->new($args); my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler ); - my $ret; + my @retW; eval { - $SIG{'__WARN__'} = sub { log WARN, $_[0]; $ret .= ">>> ".$_[0]."\n"; }; + $SIG{'__WARN__'} = sub { log WARN, $_[0]; push @retW, $_[0]; }; $parser->parse_string(${ $_[0]{argref} }); }; @@ -74,14 +74,17 @@ sub do_work ($$$@) return $err; } + my $ret; eval { $ret = $subref->($given_args, $args); }; if ($@) { my $err = $@; log ERROR, $err; - return $err; + $ret = $err; } + + $ret .= ">>> ".$_."\n" foreach (@retW); return $ret; } From bdef5a3c691a684117af7f56eb7b6557842475ff Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 01:15:01 +0100 Subject: [PATCH 29/36] New error if project doesn't exists --- process/files/intradata_get.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index 2e84c2f..7ad2c3b 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -169,6 +169,7 @@ sub grades_new_bonus croak "No project_id given" if (! $project_id); + die "No such project $project_id in $year" if (! -d "$basedir/$year/$project_id/"); if (! -e "$basedir/$year/$project_id/traces/") { mkdir "$basedir/$year/$project_id/traces/" or die $!; } From 4a66e85060027000df1f38f37e3ccdc246fb7326 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 01:29:53 +0100 Subject: [PATCH 30/36] Fix warning order in process return --- ACU/Process.pm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ACU/Process.pm b/ACU/Process.pm index c5adc7c..0bd1e4d 100644 --- a/ACU/Process.pm +++ b/ACU/Process.pm @@ -62,10 +62,7 @@ sub do_work ($$$@) my $sax_handler = ProcessHandler->new($args); my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler ); - my @retW; eval { - $SIG{'__WARN__'} = sub { log WARN, $_[0]; push @retW, $_[0]; }; - $parser->parse_string(${ $_[0]{argref} }); }; if ($@) { @@ -74,17 +71,18 @@ sub do_work ($$$@) return $err; } - my $ret; + my $ret = ""; eval { - $ret = $subref->($given_args, $args); + $SIG{'__WARN__'} = sub { log WARN, $_[0]; $ret .= ">>> ".$_[0 ]; }; + + $ret .= $subref->($given_args, $args); }; if ($@) { my $err = $@; log ERROR, $err; - $ret = $err; + $ret .= $err; } - $ret .= ">>> ".$_."\n" foreach (@retW); return $ret; } From ca2c0e8f1318af9110230b65900baa9220b4a06d Mon Sep 17 00:00:00 2001 From: Charlie Noyce Root Date: Wed, 13 Nov 2013 02:33:27 +0100 Subject: [PATCH 31/36] Fix get_csv --- process/projects/get_csv.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/process/projects/get_csv.pl b/process/projects/get_csv.pl index 3626b2b..1735abc 100644 --- a/process/projects/get_csv.pl +++ b/process/projects/get_csv.pl @@ -49,7 +49,7 @@ sub process my $i; for ($i = 0; $i <= $#ugrades; $i++) { - if ($ugrades[$i] == $grade->getAttribute("name")) + if ($ugrades[$i] eq $grade->getAttribute("name")) { $ugrades[$i] = $grade->getAttribute("value"); last; @@ -75,7 +75,8 @@ sub process } $out .= "\n"; - for my $login (keys %grades) { + for my $login (keys %grades) + { $out .= "$login"; my @ugrades = @{ $grades{$login} }; for my $header (@headers) From e2ba0a5e38ee33ca8ab79231aa6186ae067cfe43 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 03:00:55 +0100 Subject: [PATCH 32/36] Remove exception #21858 --- hooks/gl-pre-git | 1 - 1 file changed, 1 deletion(-) diff --git a/hooks/gl-pre-git b/hooks/gl-pre-git index 65c8952..5f6fd16 100755 --- a/hooks/gl-pre-git +++ b/hooks/gl-pre-git @@ -49,7 +49,6 @@ if ($ip->overlaps($labnetwork) == $IP_A_IN_B_OVERLAP) #} exit 0 if (grep { /\Q$repo_login\E/ } @habitent_loin); -exit 0 if ($repo_login eq "bellev_m"); my $schoolnetwork = Net::IP->new('10.41.0.0/16'); #my $vjschoolnetwork = Net::IP->new('10.3.0.0/16'); From bedb084ffed8b52d141df1ee62d96c16505cbe30 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 13 Nov 2013 03:07:56 +0100 Subject: [PATCH 33/36] Add average in cvs --- process/projects/get_csv.pl | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/process/projects/get_csv.pl b/process/projects/get_csv.pl index 1735abc..2e5f24c 100644 --- a/process/projects/get_csv.pl +++ b/process/projects/get_csv.pl @@ -31,6 +31,7 @@ sub process my %grades; my @headers; + my @averages; opendir(my $dh, "$basedir/$year/$project_id/grades/") or croak "can't opendir $basedir/$year/$project_id/grades/: $!"; for my $gfile (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/grades/$_" } readdir($dh)) @@ -52,6 +53,7 @@ sub process if ($ugrades[$i] eq $grade->getAttribute("name")) { $ugrades[$i] = $grade->getAttribute("value"); + $averages[$i] += $grade->getAttribute("value"); last; } } @@ -60,6 +62,7 @@ sub process { push @headers, $grade->getAttribute("name"); push @ugrades, $grade->getAttribute("value"); + push @averages, $grade->getAttribute("value"); } } @@ -70,13 +73,15 @@ sub process # Print CSV my $out = "login"; - for my $header (@headers) { + foreach my $header (@headers) { $out .= ",$header"; } $out .= "\n"; - for my $login (keys %grades) + my $nb = 0; + foreach my $login (keys %grades) { + $nb += 1; $out .= "$login"; my @ugrades = @{ $grades{$login} }; for my $header (@headers) @@ -92,6 +97,13 @@ sub process $out .= "\n"; } + $out .= "Average"; + foreach my $average (@averages) + { + $out .= ",".($average / $nb); + } + $out .= "\n"; + return $out; } From 95c6d77613f908a10b1feddc235725c9e49aa8ab Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Thu, 14 Nov 2013 14:19:45 +0100 Subject: [PATCH 34/36] Fix gen_grading due to lastest modification --- process/projects/gen_grading.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/projects/gen_grading.pl b/process/projects/gen_grading.pl index b365932..fa5c261 100644 --- a/process/projects/gen_grading.pl +++ b/process/projects/gen_grading.pl @@ -80,7 +80,7 @@ sub process open my $xml, "<", "$basedir/$year/$project_id/traces/$dir/$login" or die $!; binmode $xml; - my $trace = Trace->new($xml); + my $trace = Trace->new(join '', <$xml>); my %tids = %{ $trace->getIds() }; for my $kid (keys %tids) From e11d9082da83c0d67965567f403c8472c70d887e Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Thu, 14 Nov 2013 15:26:17 +0100 Subject: [PATCH 35/36] Activate mail_error on grading script --- process/projects/gen_grading.pl | 4 ++-- process/projects/get_csv.pl | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/process/projects/gen_grading.pl b/process/projects/gen_grading.pl index fa5c261..0597c10 100644 --- a/process/projects/gen_grading.pl +++ b/process/projects/gen_grading.pl @@ -7,8 +7,6 @@ use Carp; use Pod::Usage; use Text::ParseWords; -use lib "../../"; - use ACU::Defense; use ACU::Grading; use ACU::Log; @@ -16,6 +14,8 @@ use ACU::LDAP; use ACU::Process; use ACU::Trace; +$ACU::Log::mail_error = 1; + our $basedir = "/intradata"; sub process diff --git a/process/projects/get_csv.pl b/process/projects/get_csv.pl index 2e5f24c..fa21f79 100644 --- a/process/projects/get_csv.pl +++ b/process/projects/get_csv.pl @@ -12,6 +12,8 @@ use ACU::Log; use ACU::LDAP; use ACU::Process; +$ACU::Log::mail_error = 1; + our $basedir = "/intradata"; sub process @@ -23,11 +25,7 @@ sub process my $year = shift @args // LDAP::get_year; # Project existing? - if (! -d "$basedir/$year/$project_id") - { - log ERROR, "Unable to find $project_id in $year"; - return "Unable to find $project_id in $year\n"; - } + croak "Unable to find $project_id in $year" if (! -d "$basedir/$year/$project_id"); my %grades; my @headers; From 54b407fa11d698a3702f9332fe1440aafd503d65 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Thu, 14 Nov 2013 15:47:25 +0100 Subject: [PATCH 36/36] Fix requires Email::Sender::Simple thanks to TIBO --- ACU/Log.pm | 2 +- utils/lpt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ACU/Log.pm b/ACU/Log.pm index 8c67f22..11210d9 100644 --- a/ACU/Log.pm +++ b/ACU/Log.pm @@ -67,7 +67,7 @@ sub log if ($mail_error && $level <= ERROR) { - require "Email::Sender::Simple"; + require Email::Sender::Simple; my $mail = Email::MIME->create( header_str => [ From => "Roots assistants ", diff --git a/utils/lpt b/utils/lpt index c96d936..a3b205f 100755 --- a/utils/lpt +++ b/utils/lpt @@ -1405,7 +1405,7 @@ sub cmd_account_quota_sync($;$) my $quotaSgoinfreBlock = $entry->get_value("quotaSgoinfreBlock") // $def_quota{block}{sgoinfre}; my $quotaSgoinfreFile = $entry->get_value("quotaSgoinfreFile") // $def_quota{file}{sgoinfre}; - require "Quota"; + require Quota; if (Quota::setqlim($dev_quota{home}, $entry->get_value("uidNumber"), int(0.9 * $quotaHomeBlock), $quotaHomeBlock, int(0.9 * $quotaHomeFile), $quotaHomeFile, 1, 0) == 0 and Quota::setqlim($dev_quota{sgoinfre}, $entry->get_value("uidNumber"), int(0.9 * $quotaSgoinfreBlock), $quotaSgoinfreBlock, int(0.9 * $quotaSgoinfreFile), $quotaSgoinfreFile, 1, 0) == 0) { @@ -1429,7 +1429,7 @@ sub cmd_account_quota_sync($;$) sub cmd_sync_quota(@) { - require "Quota"; + require Quota; # Set root quota Quota::setqlim($dev_quota{home}, 0, 0, 0, 0, 0, 1, 0); @@ -1512,7 +1512,7 @@ sub cmd_no_strong_auth_view(@) sub cmd_no_strong_auth_warn(@) { - require "Email::Sender::Simple"; + require Email::Sender::Simple; for my $entry (get_no_strong_auth_user()) { @@ -1553,7 +1553,7 @@ Les roots ACU"; sub cmd_no_strong_auth_close(@) { - require "Email::Sender::Simple"; + require Email::Sender::Simple; for my $entry (get_no_strong_auth_user()) { @@ -1706,7 +1706,7 @@ sub cmd_ssh_keys_without_passphrase_view(@) # warn about unprotected keys sub cmd_ssh_keys_without_passphrase_warn(@) { - require "Email::Sender::Simple"; + require Email::Sender::Simple; my $process = sub() { my $entry = shift; @@ -1760,7 +1760,7 @@ Les roots ACU"; # remove unprotected keys sub cmd_ssh_keys_without_passphrase_remove(@) { - require "Email::Sender::Simple"; + require Email::Sender::Simple; my $process = sub() { my $entry = shift;