Archived
1
0
Fork 0

Compare commits

...

248 commits

Author SHA1 Message Date
Charlie Noyce Root
b8d4ff1a58 Revert "Multi-thread grades generation"
This reverts commit 2e5b2af4d8.
2014-01-17 02:17:41 +01:00
Mercier Pierre-Olivier
2e5b2af4d8 Multi-thread grades generation 2014-01-17 01:52:20 +01:00
Mercier Pierre-Olivier
8ddca7c49a Fix format of who tags 2014-01-17 00:05:44 +01:00
Mercier Pierre-Olivier
767a4f9be2 Trace printer handles <who/> tags 2014-01-16 23:32:52 +01:00
Mercier Pierre-Olivier
24df9247e7 Bonus/malus are now individual by default 2014-01-16 23:25:03 +01:00
Mercier Pierre-Olivier
4877749a76 Implement delId method for traces 2014-01-15 19:43:22 +01:00
Mercier Pierre-Olivier
b38f15b0b6 Allow negative bonus 2014-01-15 00:40:41 +01:00
Mercier Pierre-Olivier
aa3b69f5b3 Grades: fix globing exponentiation 2014-01-14 00:58:44 +01:00
Mercier Pierre-Olivier
6e70dc24ff lpt: new command account add to import account information from passwd like file. Closes #22244 2014-01-12 06:27:12 +01:00
Mercier Pierre-Olivier
e9ea5fc3a5 Solve #22243 2014-01-12 05:54:35 +01:00
Mercier Pierre-Olivier
cb9bf00da4 check_ssh_key: now check file content before type validity 2014-01-12 05:02:00 +01:00
Mercier Pierre-Olivier
6dca90348a New git_str format: allow moulettes to push tags begining by ACU- 2014-01-12 05:01:29 +01:00
Mercier Pierre-Olivier
1a25069726 New moulette command: can send a tarball (e.g.: for exam) 2014-01-12 05:00:57 +01:00
Mercier Pierre-Olivier
5e174fc053 New moulette command: can set max_memory variable 2014-01-12 05:00:24 +01:00
Mercier Pierre-Olivier
8170216edc Add debug 2014-01-09 21:44:47 +01:00
Mercier Pierre-Olivier
f5ff3c83b3 Grades from defenses are now the same for the group 2014-01-09 18:00:29 +01:00
Mercier Pierre-Olivier
ea711bc7bc Ticket #22238 2013-12-22 11:44:22 +01:00
Mercier Pierre-Olivier
c6352b8897 Set a default ID on eval without id 2013-12-20 17:35:22 +01:00
Mercier Pierre-Olivier
5b1382fc71 pizzin_a allowed to push erlear 2013-12-19 09:04:57 +01:00
Mercier Pierre-Olivier
3a5dbc55a8 Add new APPING3 for TC 2013-12-18 21:22:38 +01:00
Mercier Pierre-Olivier
3e5a587dd1 Allow LSE to connect to project-lse repo 2013-12-18 19:13:06 +01:00
Mercier Pierre-Olivier
65e2f61319 Fix connection to gearman server 2013-12-15 18:31:46 +01:00
Mercier Pierre-Olivier
929d146770 Ticket #22220: Two new habitent_loin 2013-12-15 12:17:33 +01:00
Mercier Pierre-Olivier
700002396b Add Apping2/3 to habitent_loin exception 2013-12-12 10:19:01 +01:00
Mercier Pierre-Olivier
33222d78c5 Fix defense_id generation 2013-12-12 05:42:57 +01:00
Mercier Pierre-Olivier
744c3db27c Fix account creation 2013-12-09 22:53:42 +01:00
Mercier Pierre-Olivier
531864ef8d Allow . in defense filename 2013-12-09 18:48:52 +01:00
Mercier Pierre-Olivier
cdb64f192f Mark ACU- and YAKA- as reserved tag 2013-12-08 08:28:49 +01:00
Mercier Pierre-Olivier
0e3fe1fd1c Exception, ticket #22149 2013-12-06 16:33:56 +01:00
Mercier Pierre-Olivier
737a12d443 Excpetion 2013-12-06 00:10:03 +01:00
Mercier Pierre-Olivier
eb8c74d465 Add action flush to stats 2013-12-05 07:19:20 +01:00
Mercier Pierre-Olivier
4482f47eec Fix set_workers 2013-12-05 06:48:42 +01:00
Mercier Pierre-Olivier
874c6bc482 Fix moulette/launch: can pass more than one login 2013-12-05 06:44:50 +01:00
Mercier Pierre-Olivier
4d003d6626 Add new moulette command: set_workers 2013-12-05 06:44:43 +01:00
Mercier Pierre-Olivier
3c60afe6e9 Fix stats 2013-12-05 06:05:24 +01:00
Mercier Pierre-Olivier
81150b41fe Fix stats 2013-12-05 06:03:28 +01:00
Mercier Pierre-Olivier
0e0a93789e Add new command for moulette: stats 2013-12-05 06:01:52 +01:00
Mercier Pierre-Olivier
973bc3f7b1 send_git: fix ACU- 2013-12-05 05:59:06 +01:00
Mercier Pierre-Olivier
95f945f963 send_git: ACU- 2013-12-05 05:55:35 +01:00
Mercier Pierre-Olivier
ba19732a47 post-update hook: ACU- 2013-12-05 05:00:09 +01:00
Mercier Pierre-Olivier
4af0617cae Receive ACU-* tags 2013-12-05 01:09:55 +01:00
Mercier Pierre-Olivier
d1b027a3ff Autoflush log filehandles 2013-12-05 00:54:30 +01:00
Mercier Pierre-Olivier
4e1e73f284 Add intradmin-hamano to gen_git_str for send_git process 2013-12-05 00:54:04 +01:00
Mercier Pierre-Olivier
6d294dbcf6 Save witch person push or clone to a repo 2013-12-03 01:08:47 +01:00
Mercier Pierre-Olivier
15408c1144 Remove INFO submission 2013-12-02 23:33:39 +01:00
Mercier Pierre-Olivier
45ba55a416 New hooks version: allow ACU-* tags 2013-12-02 21:11:17 +01:00
Mercier Pierre-Olivier
868324e6e2 Remove git access from VJ 2013-12-02 18:21:06 +01:00
Mercier Pierre-Olivier
f6a96399c2 New gen_git_str 2013-12-02 18:20:10 +01:00
Mercier Pierre-Olivier
2520bf59a3 Fix gearmand server destination 2013-12-01 17:37:09 +01:00
Mercier Pierre-Olivier
1e9e89656d Add DEBUG string 2013-12-01 06:16:51 +01:00
Mercier Pierre-Olivier
aef2b7d71e Add part for guantanamo.tar.gz 2013-12-01 06:12:27 +01:00
Mercier Pierre-Olivier
bbde682896 Try a fix 2013-12-01 06:04:37 +01:00
Mercier Pierre-Olivier
d077a5933f Try a fix 2013-12-01 05:58:19 +01:00
Mercier Pierre-Olivier
faf03232f4 Tiny fixes 2013-12-01 04:21:04 +01:00
Mercier Pierre-Olivier
05c7f4b9c6 Add DEBUG log 2013-12-01 03:40:12 +01:00
Mercier Pierre-Olivier
810c589ec0 Git hook exception (VJ + #22077) 2013-12-01 01:44:20 +01:00
Mercier Pierre-Olivier
24170b0b4e CPP is now the guantanamo master 2013-12-01 01:14:35 +01:00
Mercier Pierre-Olivier
415b5c81fd Use multiple Gearman servers 2013-12-01 01:12:02 +01:00
Mercier Pierre-Olivier
16f3dbfecb New guantanomo_list command 2013-11-30 22:32:21 +01:00
Mercier Pierre-Olivier
9de4ca25b0 Guantanamo: add list action to master process 2013-11-30 22:24:34 +01:00
Mercier Pierre-Olivier
971851633d Add execution right to lpt 2013-11-29 18:17:42 +01:00
Root Cpp Charlie
67d851658c Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-29 18:14:08 +01:00
Mercier Pierre-Olivier
55bec752b5 Really close account when strong-auth close 2013-11-29 17:37:52 +01:00
Mercier Pierre-Olivier
ad2748650b Guantanamo: avoid deadlock by sending register action in background 2013-11-28 20:32:49 +01:00
Mercier Pierre-Olivier
a0f9002efd Guantanamo: use sh to parse command 2013-11-28 20:28:52 +01:00
Mercier Pierre-Olivier
5fe1d4c80d Fix utf-8 2013-11-27 15:26:13 +01:00
Mercier Pierre-Olivier
dfb66035eb New hook post-update 2013-11-26 19:17:19 +01:00
Mercier Pierre-Olivier
84c34f8fea Fix guantanamo syntax 2013-11-25 19:20:03 +01:00
Root Cpp Charlie
605007fb56 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-24 01:08:20 +01:00
Mercier Pierre-Olivier
9c3ebb5139 Ok 2013-11-24 01:08:11 +01:00
Root Cpp Charlie
b69c30d3d0 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-24 01:05:32 +01:00
Mercier Pierre-Olivier
db6814f4de Only last directory is repo_name 2013-11-24 01:05:08 +01:00
Mercier Pierre-Olivier
8929aba28d Add dufour_h exception 2013-11-23 23:20:34 +01:00
Mercier Pierre-Olivier
cddafdf0ad Exceptions 2013-11-23 21:13:11 +01:00
Mercier Pierre-Olivier
3a00d6344a Faster grading 2013-11-23 20:30:20 +01:00
Mercier Pierre-Olivier
6e655751d4 Ok :) 2013-11-23 20:11:53 +01:00
Mercier Pierre-Olivier
be336da8d6 Try to fix grades 2013-11-23 20:08:03 +01:00
Mercier Pierre-Olivier
b4fc037a06 glob_to_regex 2013-11-23 17:31:16 +01:00
Mercier Pierre-Olivier
f271f36203 Use Text::Glob instead of ACU::Tinyglob 2013-11-23 17:21:46 +01:00
Mercier Pierre-Olivier
f8e5d1b5c0 Fix grades generation 2013-11-23 04:18:32 +01:00
Mercier Pierre-Olivier
37dde8ce57 Fix API::Projects::get_groups 2013-11-23 03:09:53 +01:00
Mercier Pierre-Olivier
ce15c69841 Habitent loin : molini_v 2013-11-22 21:11:36 +01:00
Mercier Pierre-Olivier
a02ed70d5d Trace: fix warnings 2013-11-21 21:28:45 +01:00
Mercier Pierre-Olivier
7f418a06fe Fix API call 2013-11-21 21:01:14 +01:00
Mercier Pierre-Olivier
44722fdd93 Fix denfense publication 2013-11-21 14:47:36 +01:00
Mercier Pierre-Olivier
b25a862650 Fix condition 2013-11-20 01:45:30 +01:00
Mercier Pierre-Olivier
1d0d92b040 Add traces for debug 2013-11-20 01:13:54 +01:00
Mercier Pierre-Olivier
26f58dcaa6 Add log 2013-11-20 01:04:30 +01:00
Mercier Pierre-Olivier
49e5dcddf4 Remove old .ft 2013-11-20 00:54:01 +01:00
Mercier Pierre-Olivier
f02f484cb8 gen_grades: better resolution of names 2013-11-18 22:28:10 +01:00
Mercier Pierre-Olivier
555c922786 send_git: Year can be omitted 2013-11-18 18:57:30 +01:00
Mercier Pierre-Olivier
dcb6033caa Add new scripts for moulettes 2013-11-16 21:45:25 +01:00
Mercier Pierre-Olivier
db62048be2 Hook: Use GL_USER instead of repo_login 2013-11-16 13:32:39 +01:00
Root Cpp Charlie
58f77270c2 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-15 12:41:49 +01:00
Mercier Pierre-Olivier
2f6b3a9812 Fix LDAP search 2013-11-15 12:40:29 +01:00
Root Cpp Charlie
3d3dfc47c0 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-15 09:22:00 +01:00
Mercier Pierre-Olivier
984cb050fa Allow .google-authenticator under 100b 2013-11-15 09:21:33 +01:00
Root Cpp Charlie
f38abe3547 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-15 09:07:31 +01:00
Mercier Pierre-Olivier
77bee709ed LDAP name convert to IPv6 2013-11-15 09:04:45 +01:00
Root Cpp Charlie
628dd6ab5c Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-15 08:50:09 +01:00
Mercier Pierre-Olivier
a809c4ff8d COnvert to UTF8 lpt 2013-11-15 08:49:59 +01:00
Root Cpp Charlie
e48f136bca Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-15 08:48:49 +01:00
Mercier Pierre-Olivier
1d5562b073 New repo.sh migration 2013-11-15 08:39:52 +01:00
Root Cpp Charlie
239a636167 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-14 20:34:20 +01:00
Mercier Pierre-Olivier
9bcf8c7c2d Update gl-pre-git exceptions 2013-11-14 20:34:12 +01:00
Root Cpp Charlie
8c50d5954b Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-14 17:35:23 +01:00
Mercier Pierre-Olivier
b959187718 Fix sendmail 2013-11-14 17:35:14 +01:00
Root Cpp Charlie
dd01b53d68 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-14 16:20:32 +01:00
Mercier Pierre-Olivier
5247d4db53 Add sendmail option 2013-11-14 16:20:13 +01:00
Mercier Pierre-Olivier
947aebd490 Add sendmail option 2013-11-14 16:09:24 +01:00
Mercier Pierre-Olivier
33e32d2916 Add charset to sended log email 2013-11-14 16:03:30 +01:00
Root Cpp Charlie
a02881f42e Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-14 15:58:34 +01:00
Mercier Pierre-Olivier
a4076fe953 Add Email::Sender::Simple as require deb pkg 2013-11-14 15:56:48 +01:00
Root Cpp Charlie
5a83714dad Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-14 15:50:54 +01:00
Mercier Pierre-Olivier
54b407fa11 Fix requires Email::Sender::Simple thanks to TIBO 2013-11-14 15:47:25 +01:00
Mercier Pierre-Olivier
e11d9082da Activate mail_error on grading script 2013-11-14 15:26:17 +01:00
Mercier Pierre-Olivier
95c6d77613 Fix gen_grading due to lastest modification 2013-11-14 14:19:45 +01:00
Mercier Pierre-Olivier
bedb084ffe Add average in cvs 2013-11-13 03:07:56 +01:00
Mercier Pierre-Olivier
e2ba0a5e38 Remove exception #21858 2013-11-13 03:00:55 +01:00
Charlie Noyce Root
ca2c0e8f13 Fix get_csv 2013-11-13 02:33:27 +01:00
Mercier Pierre-Olivier
4a66e85060 Fix warning order in process return 2013-11-13 01:29:53 +01:00
Mercier Pierre-Olivier
bdef5a3c69 New error if project doesn't exists 2013-11-13 01:15:01 +01:00
Mercier Pierre-Olivier
c5a1bf8917 Display important warnings on process return 2013-11-13 01:12:05 +01:00
Mercier Pierre-Olivier
4e35cabf62 Display warnings on process return 2013-11-13 01:01:04 +01:00
Mercier Pierre-Olivier
0e92592d17 Fixing method name 2013-11-13 00:25:36 +01:00
Mercier Pierre-Olivier
6e3cbe7f04 Fixing syntax 2013-11-13 00:22:19 +01:00
Mercier Pierre-Olivier
81fd3a04e2 Trace: can export as string, can addId 2013-11-13 00:09:54 +01:00
Mercier Pierre-Olivier
5d2b1e80fb Merge repo.sh with aurier_j version 2013-11-11 17:57:27 +01:00
Mercier Pierre-Olivier
464fcfc879 Fixing grading 2013-11-11 17:16:03 +01:00
Mercier Pierre-Olivier
74f44a836b Forgotten use 2013-11-11 16:59:14 +01:00
Mercier Pierre-Olivier
fc595e9ee4 Fix warning 2013-11-11 16:57:44 +01:00
Mercier Pierre-Olivier
62bd5f2d2a Fix warning 2013-11-11 16:37:36 +01:00
Mercier Pierre-Olivier
add1bb5db9 Change output form of getIds 2013-11-11 16:35:34 +01:00
Mercier Pierre-Olivier
81058c9c20 Change input form of Trce 2013-11-11 16:32:50 +01:00
Mercier Pierre-Olivier
ddb8788eb6 Import API 2013-11-11 16:23:23 +01:00
Mercier Pierre-Olivier
440ace2654 Fix syntax 2013-11-11 16:15:59 +01:00
Mercier Pierre-Olivier
15f89a5e39 New parser for traces 2013-11-11 16:09:53 +01:00
Mercier Pierre-Olivier
1de1b9a221 New exception 2013-11-09 17:42:59 +01:00
Mercier Pierre-Olivier
584fbf9895 Add APPING1 to exception 2013-11-08 21:05:05 +01:00
Mercier Pierre-Olivier
cda7b5b026 LPT: fix grant-lab and add delete account capability 2013-11-07 14:46:28 +01:00
Mercier Pierre-Olivier
de88e60fa5 Fix too much kill of ssh-agent 2013-11-06 18:22:07 +01:00
Mercier Pierre-Olivier
8a4b545da6 chdir before remove dir 2013-11-06 18:13:08 +01:00
Mercier Pierre-Olivier
90727e48d5 Fix errors 2013-11-06 18:11:17 +01:00
Mercier Pierre-Olivier
0af1174ca8 Replace croak by die when unexpected error 2013-11-05 18:03:54 +01:00
Mercier Pierre-Olivier
fe9cc480a1 Add install procedure into manage-server 2013-11-05 17:41:12 +01:00
Mercier Pierre-Olivier
3c0e0f09be Migration: migrate also .ltx files 2013-11-05 17:41:12 +01:00
Nicolas Geniteau
92a222d346 hook dump-help 2013-11-05 17:37:03 +01:00
Nicolas Geniteau
dfbd4e69ba ACU::Jail 2013-11-05 17:29:06 +01:00
Nicolas Geniteau
691a724061 adding otto as server 2013-11-05 17:26:56 +01:00
Nicolas Geniteau
90d22c3af0 Add Knuth in servers list 2013-11-05 03:45:35 +01:00
Root Cpp Charlie
45bae3f39b Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-04 02:24:12 +01:00
Mercier Pierre-Olivier
ed0edaf9f3 Change unlink to remove_tree in ordre to clean git_manage_ temporary directories 2013-11-04 02:23:47 +01:00
Mercier Pierre-Olivier
9dbf492046 Check Fact is already running after call it 2013-11-03 03:39:43 +01:00
Mercier Pierre-Olivier
b5a8b5f5f9 Launch send_git in background 2013-11-03 03:12:57 +01:00
Mercier Pierre-Olivier
801d59d860 FreeBSD.. 2013-11-03 01:52:05 +01:00
Mercier Pierre-Olivier
89167d47d2 FreeBSD... 2013-11-03 01:51:34 +01:00
Mercier Pierre-Olivier
aa71e36f8b FreeBSD... 2013-11-03 01:47:15 +01:00
Mercier Pierre-Olivier
995fbdedd1 Launch send_git with ssh-agent 2013-11-03 01:42:44 +01:00
Mercier Pierre-Olivier
5b78698a5c Try to die 2013-11-03 01:30:09 +01:00
Mercier Pierre-Olivier
48bad8dca9 Try to die 2013-11-03 01:27:01 +01:00
Mercier Pierre-Olivier
7584473a76 Try to die 2013-11-03 01:25:49 +01:00
Mercier Pierre-Olivier
b38a5514e5 Fix presence of @ 2013-11-03 01:23:07 +01:00
Root Cpp Charlie
2f7839952c Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-03 01:19:26 +01:00
Mercier Pierre-Olivier
61d523c7c3 Fix send_git 2013-11-03 01:18:58 +01:00
Mercier Pierre-Olivier
4ba4f34993 Clone via ssh instead of filesystem 2013-11-03 01:15:49 +01:00
Mercier Pierre-Olivier
6d9af44499 FreeBSD ... 2013-11-03 01:06:51 +01:00
Mercier Pierre-Olivier
edcb3adf6d Fix for FreeBSD 2013-11-03 01:01:25 +01:00
Mercier Pierre-Olivier
731ca526f6 Add log 2013-11-03 00:57:58 +01:00
Mercier Pierre-Olivier
490d4109b9 No ref.ft require for ref 2013-11-03 00:52:15 +01:00
Root Cpp Charlie
7fc46ddbd4 Merge branch 'master' of ssh://cpp/liblerdorf 2013-11-03 00:37:04 +01:00
Mercier Pierre-Olivier
651c63fd38 Fix use of search_dns 2013-11-03 00:36:40 +01:00
Mercier Pierre-Olivier
fe067d847b Fix syntax 2013-11-03 00:12:23 +01:00
Mercier Pierre-Olivier
92b61213c6 Add email-mime to package list 2013-11-03 00:10:07 +01:00
Mercier Pierre-Olivier
df27747cbc Fix repository address 2013-11-03 00:06:58 +01:00
Mercier Pierre-Olivier
384a336851 croak instead of return 2013-11-03 00:06:36 +01:00
Mercier Pierre-Olivier
5c3309d042 New state: PENDING 2013-10-31 16:50:04 +01:00
Root Cpp Charlie
da5683bb5c Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-31 16:16:09 +01:00
Mercier Pierre-Olivier
ae330ab897 Fix multiple inclusion of Email::Sender::Simple 2013-10-31 16:15:27 +01:00
Mercier Pierre-Olivier
80d3352b78 Fix 0 2013-10-30 17:19:31 +01:00
Mercier Pierre-Olivier
d44ffa7153 Fix launch on GNU/Linux 2013-10-30 17:14:41 +01:00
Mercier Pierre-Olivier
e327bf0c80 Print 0 instead of nothing 2013-10-30 17:10:36 +01:00
Mercier Pierre-Olivier
67f5f78f85 require QUota 2013-10-30 14:51:02 +01:00
Mercier Pierre-Olivier
784c7cfb55 Last moulette_get 2013-10-30 14:45:21 +01:00
Mercier Pierre-Olivier
e009942a7c Fix quota use in lpt 2013-10-30 08:41:47 +01:00
Mercier Pierre-Olivier
24c6ed57e0 New package to install 2013-10-30 03:17:32 +01:00
Mercier Pierre-Olivier
cda080ce72 Prefer use of require instead of eval 2013-10-30 02:46:17 +01:00
Mercier Pierre-Olivier
1f61b7a144 Interact with new intranet group API 2013-10-30 02:38:50 +01:00
Mercier Pierre-Olivier
27f7b7c9ce Fix screen launch on FreeBSD 2013-10-30 02:36:12 +01:00
Mercier Pierre-Olivier
e5a23dc3e8 LPT v2 finalized 2013-10-30 02:34:11 +01:00
Root Cpp Charlie
9ff6402d87 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-28 15:13:24 +01:00
Mercier Pierre-Olivier
5857719f94 LDAP: Fix for stabilization 2013-10-28 15:11:04 +01:00
Mercier Pierre-Olivier
2d7c59694a Manual things 2013-10-26 17:46:46 +02:00
Mercier Pierre-Olivier
37c02fedb2 Fix LDAP attribute suppression 2013-10-25 00:18:15 +02:00
Root Cpp Charlie
7214b54053 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-23 06:57:22 +02:00
Mercier Pierre-Olivier
b5806fac12 Add hook for conferences repository 2013-10-23 06:57:13 +02:00
Mercier Pierre-Olivier
ddd63ece67 New Habitent loin 2013-10-23 06:54:14 +02:00
Mercier Pierre-Olivier
9add1cf2f5 Find test.ft in $submitdir 2013-10-21 23:45:05 +02:00
Mercier Pierre-Olivier
279b9ea07e Typo in API/Projects.pm 2013-10-21 18:44:30 +02:00
Mercier Pierre-Olivier
8e3d6e5464 Pass the flavour to the Intranet when creating project 2013-10-21 00:40:41 +02:00
Mercier Pierre-Olivier
ef85ae2708 Fix gl-pre-git 2013-10-20 09:47:13 +02:00
Mercier Pierre-Olivier
ff9c3a5ad2 Introduce Habitent loin people 2013-10-20 02:15:52 +02:00
Kevin Houdebert
73b1552199 Update repo.sh script 2013-10-19 19:29:29 +02:00
Kevin Houdebert
caa5ff9243 Fix brackets in \command latex 2013-10-19 17:52:39 +02:00
Root Cpp Charlie
49bbc958a5 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-18 18:33:52 +02:00
Mercier Pierre-Olivier
4c55167314 hooks/subjects: Fix concatenation error 2013-10-18 18:33:34 +02:00
Root Cpp Charlie
6a81847871 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-18 18:31:33 +02:00
Mercier Pierre-Olivier
791dfe65f6 gen_grading: fix compilation errors 2013-10-18 18:21:44 +02:00
Mercier Pierre-Olivier
cea68aa7a7 gen_grading: checck if there is a defense or trace before generate 2013-10-18 18:15:11 +02:00
Mercier Pierre-Olivier
63c2543fc1 Fix IP displayed in gl-pre-init is now correct 2013-10-18 09:24:49 +02:00
Mercier Pierre-Olivier
a9b720b355 Fix IP displayed in gl-pre-init is now correct 2013-10-18 09:22:15 +02:00
Mercier Pierre-Olivier
51257dd34b New process to send a trace to Intranet 2013-10-18 09:13:13 +02:00
Mercier Pierre-Olivier
37db6f3256 Launch send_git process on hamano 2013-10-18 09:12:24 +02:00
Mercier Pierre-Olivier
9866ecde45 moulette_get: Merge receive_tar and receive_git 2013-10-18 09:11:43 +02:00
Mercier Pierre-Olivier
9fa9251590 hooks/submission: send git to moulette 2013-10-18 09:11:04 +02:00
Mercier Pierre-Olivier
b297e386d6 Add Sys::Gamin to required packages 2013-10-18 09:09:31 +02:00
Mercier Pierre-Olivier
18608fe325 hooks/subject: * not allowed in tag 2013-10-18 09:08:59 +02:00
Mercier Pierre-Olivier
72800c21cc New command to send a directory to moulette 2013-10-18 08:50:30 +02:00
Mercier Pierre-Olivier
0e35a1a2e9 send_git: new process to send a student repository to moulette 2013-10-18 08:48:43 +02:00
Mercier Pierre-Olivier
335b03768d moulette_get: Add jexec statements, monitor filesystem to send traces to intranet 2013-10-18 07:34:33 +02:00
Mercier Pierre-Olivier
4bff8d88eb Error message if unable to write to the trace directory 2013-10-18 04:57:37 +02:00
Mercier Pierre-Olivier
15790db577 intradata_get: croak instead of log+return 2013-10-18 04:54:28 +02:00
Mercier Pierre-Olivier
adb450343f LPT: handle intra groups: can create, remove, change known attribute, view, ... 2013-10-18 04:18:38 +02:00
Mercier Pierre-Olivier
aab3e767c0 Migration: handle subdirectory form for big projects 2013-10-18 04:16:18 +02:00
Mercier Pierre-Olivier
ad866e3a57 Add trace_update 2013-10-18 04:15:17 +02:00
Nicolas Geniteau
a3fca0f622 Change hook to send a specific action for ref 2013-10-17 15:00:34 +02:00
Root Cpp Charlie
578b4ac41b Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-07 20:19:31 +02:00
Root Cpp Charlie
814d3ba2ef Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-07 16:42:17 +02:00
Root Cpp Charlie
be18f40353 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-04 19:08:49 +02:00
Root Cpp Charlie
25008035eb Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 22:08:48 +02:00
Root Cpp Charlie
4c53e2ad06 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 22:02:48 +02:00
Root Cpp Charlie
5ab6774a69 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 20:12:53 +02:00
Root Cpp Charlie
25d57a260f Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 19:45:54 +02:00
Root Cpp Charlie
d3444fac41 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 18:31:29 +02:00
Root Cpp Charlie
f26a78b252 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-02 18:26:22 +02:00
Root Cpp Charlie
e2a3babac6 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-01 05:30:47 +02:00
Root Cpp Charlie
11812fc1f6 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-01 04:57:58 +02:00
Root Cpp Charlie
e06bfc5f72 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-01 04:37:25 +02:00
Root Cpp Charlie
e9cc885e05 Merge branch 'master' of ssh://cpp/liblerdorf 2013-10-01 00:08:52 +02:00
Root Cpp Charlie
879b6890a5 Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-30 13:13:02 +02:00
Root Cpp Charlie
757733176b Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-30 13:08:55 +02:00
Mercier Pierre-Olivier
7a192c4732 Globbing in grading is not critical 2013-09-30 13:08:38 +02:00
Root Cpp Charlie
98efe85166 Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-30 10:53:35 +02:00
Root Cpp Charlie
c6b1936cb2 Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-30 10:28:07 +02:00
Root Cpp Charlie
d29eb9a33e Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-28 19:01:40 +02:00
Root Cpp Charlie
f3cfbf6dbb Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-28 13:47:19 +02:00
Root Cpp Charlie
3fceded838 Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-28 13:44:31 +02:00
Root Cpp Charlie
ccf622c98e Merge branch 'master' of ssh://cpp/liblerdorf 2013-09-28 11:16:48 +02:00
Mercier Pierre-Olivier
a1e0e62b9c Check IP in gl-pre-git hook 2013-09-28 11:15:31 +02:00
45 changed files with 3527 additions and 1363 deletions

View file

@ -46,6 +46,7 @@ sub parse($$)
$sax_handler = ProjectHandler->new($parsed);
}
$sax_handler = ProjectMemberHandler->new($parsed) if ($mod eq "ProjectMemberHandler");
$sax_handler = ProjectGroupHandler->new($parsed) if ($mod eq "ProjectGroupHandler");
my $parser = XML::SAX::ParserFactory->parser( Handler => $sax_handler );
@ -104,8 +105,10 @@ sub send($$$)
log(DEBUG, 'POST Request to ', API_URL, $url);
my $req = POST API_URL . $url, shift;
my $cnt = $ua->request($req)->content;
my $res = $ua->request($req);
log TRACE, $res;
my $cnt = $res->content();
log TRACE, $cnt;
return parse($next, $cnt);
@ -234,4 +237,84 @@ sub end_element
}
}
package ProjectGroupHandler;
use v5.10.1;
use strict;
use warnings;
sub new ($$)
{
my $class = shift;
my $self = {
parsed => shift,
savValue => 0,
lastGroup => {},
values => ""
};
bless $self, $class;
return $self;
}
sub start_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "student")
{
$self->{values} = "";
$self->{savValue} = 1;
push @{ $self->{lastGroup}{stds} }, {
id => $element->{Attributes}{"{}id"}{Value},
chief => $element->{Attributes}{"{}chief"}{Value},
login => "",
};
}
elsif ($element->{Name} eq "group")
{
$self->{lastGroup}{id} = $element->{Attributes}{"{}id"}{Value};
$self->{lastGroup}{stds} = [];
}
elsif ($element->{Name} eq "result")
{
$self->{values} = "";
$self->{savValue} = 1;
}
}
sub characters
{
my ($self, $characters) = @_;
if ($self->{savValue}) {
$self->{values} .= $characters->{Data};
}
}
sub end_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "result")
{
$self->{parsed}{result} = $self->{values};
$self->{savValue} = 0;
}
elsif ($element->{Name} eq "group")
{
push @{ $self->{parsed}{groups} }, $self->{lastGroup};
$self->{lastGroup} = {};
$self->{savValue} = 0;
}
elsif ($element->{Name} eq "student")
{
my $size = @{ $self->{lastGroup}{stds} };
(@{ $self->{lastGroup}{stds} })[$size - 1]{login} = $self->{values};
$self->{values} = "";
}
}
1;

View file

@ -10,18 +10,22 @@ use Carp;
use ACU::API::Base;
use ACU::LDAP;
sub add($;$)
sub add($$;$)
{
my $project_name = shift;
my $flavor = shift;
my $year = shift;
if ($year and $year != LDAP::get_year) {
if ($year and $year ne LDAP::get_year) {
croak "Impossible d'ajouter un projet d'une autre année : non implémenté";
}
my $res = API::Base::send('ResultHandler',
"projects/projects/add.xml",
[ project_name => $project_name ]);
[
project_name => $project_name,
flavor => $flavor,
]);
if ($res->{result} ne '0') {
croak "Erreur durant l'ajout : ".$res->{message};
@ -72,12 +76,36 @@ sub get_users($;$)
return $res;
}
sub get_groups($;$)
{
my $project_name = shift;
my $year = shift;
my $url;
if ($year) {
$url = "projects/groups/groups/$project_name/$year.xml";
} else {
$url = "projects/groups/groups/$project_name.xml";
}
my $res = API::Base::get('ProjectGroupHandler', $url);
if ($res->{result} ne '0') {
croak "Erreur durant la récupération : " . $res->{message};
}
return $res;
}
sub add_grades($;$)
{
my %data = (
project_name => shift
);
$data{year} = $_ if (shift);
my $y = shift;
if ($y) {
$data{year} = $y;
}
my $res = API::Base::send('ResultHandler', "projects/notes/add.xml", \%data);
@ -94,7 +122,10 @@ sub add_traces($$;$)
project_name => shift,
trace_name => shift,
);
$data{year} = $_ if (shift);
my $y = shift;
if ($y) {
$data{year} = $y;
}
my $res = API::Base::send('ResultHandler', "projects/traces/add.xml", \%data);

View file

@ -134,23 +134,24 @@ sub genIds ($;$)
for my $group (@{ $self->{groups} })
{
my $cur_gid;
if (! $group->{id} || grep { /^\Q$group->{id}\E$/ } @ids)
if (! $group->{id} || grep { $_ == $group->{id} } @ids)
{
do {
$cur_gid = "def".$def_i."g".$grp_i;
$cur_gid = "def_".$def_i."g".$grp_i;
$grp_i += 1;
} while (grep {$_ eq $cur_gid} @ids);
$group->{id} = $cur_gid;
}
else {
$grp_i += 1;
$cur_gid = $group->{id};
}
my $qst_i = 0;
for my $question (@{ $group->{questions_list} })
{
my $cur_qid;
if (! $question->{id} || grep { /^\Q$question->{id}\E$/ } @ids)
if (! $question->{id} || grep { $_ == $question->{id} } @ids)
{
do {
$cur_qid = $cur_gid."q".$qst_i;
@ -160,12 +161,13 @@ sub genIds ($;$)
}
else {
$qst_i += 1;
$cur_qid = $question->{id};
}
my $ans_i = 0;
for my $answer (@{ $question->{answers} })
{
if (! $answer->{id} || grep { /^\Q$answer->{id}\E$/ } @ids)
if (! $answer->{id} || grep { $_ == $answer->{id} } @ids)
{
my $cur_aid;
do {

View file

@ -7,8 +7,6 @@ use strict;
use warnings;
use XML::LibXML;
use ACU::Tinyglob;
sub new
{
my $class = shift;
@ -111,7 +109,7 @@ sub insert ($$$)
$self->{ids}{$_[0]} = $_[1];
}
sub fill ($$)
sub fill
{
my $self = shift;
my $ids = shift;
@ -288,6 +286,7 @@ package Point;
use v5.10.1;
use strict;
use warnings;
use Text::Glob qw( glob_to_regex match_glob );
use Term::ANSIColor qw(:constants);
use ACU::Log;
@ -340,21 +339,23 @@ 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 {
my $glob = Tinyglob::tinyglob($ref);
if ($glob ne $ref)
eval
{
if ($ref =~ /\?|\*/)
{
my $value = 0;
for my $r (grep { /^$glob$/ } keys %$ids) {
$value += $ids->{ $r };
for my $r (grep { match_glob($ref, $_); } keys %$ids) {
$value += $ids->{ $r } if ($ref != $r);
}
$ids->{ $ref } = $value;
$ids->{ $ref } = $value if ($value);
log DEBUG, "New globbing identifier caculated $ref: $value";
}
};
if ($@) {

71
ACU/Jail.pm Normal file
View file

@ -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;

View file

@ -8,16 +8,22 @@ use warnings;
use Carp;
use Net::LDAPS;
use Net::LDAP::Filter;
use Net::LDAP::Util qw(ldap_error_text);
use ACU::Password;
use ACU::Right;
use ACU::Log;
use constant {
BASE_DN => "dc=acu,dc=epita,dc=fr",
YEAR_DN => "cn=year,dc=acu,dc=epita,dc=fr",
};
## Connection functions
our $ldaphost = "ldap.acu.epita.fr";
our $binddn = "cn=intra,dc=acu,dc=epita,dc=fr";
our $binddn = "cn=intra," . BASE_DN;
my $bindsecret = "";
sub ldap_get_password
@ -42,10 +48,7 @@ sub ldap_connect()
log(DEBUG, "Connect to LDAP with $binddn");
if ($mesg->code) {
log(ERROR, "An error occurred: " .ldap_error_text($mesg->code));
croak "An error occurred: " .ldap_error_text($mesg->code);
}
croak ldap_error_text($mesg->code) if ($mesg->code);
return $ldap;
}
@ -57,10 +60,7 @@ sub ldap_connect_anon()
log(DEBUG, "Connect to LDAP anonymously");
if ($mesg->code) {
log(ERROR, "An error occurred: " .ldap_error_text($mesg->code));
croak "An error occurred: " .ldap_error_text($mesg->code);
}
croak ldap_error_text($mesg->code) if ($mesg->code);
return $ldap;
}
@ -75,7 +75,7 @@ sub add_group($$$;$)
my $year = shift // get_year();
my $ou = shift // "intra"; # expected roles or intra
my $dn = "cn=$cn,ou=$year,ou=$ou,ou=groups,dc=acu,dc=epita,dc=fr";
my $dn = "cn=$cn,ou=$year,ou=$ou,ou=groups," . BASE_DN;
log(DEBUG, "Add group $dn");
@ -94,7 +94,7 @@ sub get_year(;$)
{
my $ldap = shift // ldap_connect_anon();
return get_attribute($ldap, "cn=year,dc=acu,dc=epita,dc=fr", "year");
return get_attribute($ldap, YEAR_DN, "year");
}
sub get_rights($)
@ -105,8 +105,8 @@ sub get_rights($)
my $ldap = ldap_connect_anon();
my $mesg = $ldap->search( # search
base => "ou=roles,ou=groups,dc=acu,dc=epita,dc=fr",
filter => "&(memberUid=$login)(objectClass=intraGroup)",
base => "ou=roles,ou=groups," . BASE_DN,
filter => Net::LDAP::Filter->new("&(memberUid=$login)(objectClass=intraGroup)"),
attrs => [ 'intraRight' ],
scope => "sub"
);
@ -127,8 +127,8 @@ sub get_rights($)
$mesg = $ldap->search( # search
base => "ou=intra,ou=groups,dc=acu,dc=epita,dc=fr",
filter => "&(memberUid=$login)(objectClass=intraGroup)",
base => "ou=intra,ou=groups," . BASE_DN,
filter => Net::LDAP::Filter->new("&(memberUid=$login)(objectClass=intraGroup)"),
attrs => [ 'intraRight' ],
scope => "sub"
);
@ -144,8 +144,8 @@ sub get_rights($)
$mesg = $ldap->search( # search
base => "ou=users,dc=acu,dc=epita,dc=fr",
filter => "&(uid=$login)(objectClass=intraAccount)",
base => "ou=users," . BASE_DN,
filter => Net::LDAP::Filter->new("&(uid=$login)(objectClass=intraAccount)"),
attrs => [ 'intraRight' ],
scope => "sub"
);
@ -189,13 +189,16 @@ sub get_dn($$@)
my $ldap = shift // ldap_connect();
my $dn = shift;
my $base = BASE_DN;
$dn = "$dn," . BASE_DN if ($dn !~ /$base$/);
my $mesg = $ldap->search( # search
base => "$dn",
filter => "(objectClass=*)",
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);
@ -261,7 +264,7 @@ sub delete_attribute($$$@)
{
log(DEBUG, "Remove attribute $what ($value) from $dn");
@data = grep { ! $value eq $_ } @data;
@data = grep { $value ne $_ } @data;
$mod = 1;
}
else {
@ -321,18 +324,19 @@ sub search_dn($$@)
my $base = shift;
my $filter = shift;
if ($base) {
$base .= ","
}
$base .= "," if ($base);
log (DEBUG, "Looking for $filter in $base" . BASE_DN);
my $mesg = $ldap->search( # search
base => $base."dc=acu,dc=epita,dc=fr",
filter => $filter,
base => $base . BASE_DN,
filter => Net::LDAP::Filter->new($filter),
attrs => [ ],
scope => "sub"
);
if ($mesg->code != 0) { log(WARN, $mesg->error); return undef; }
if ($mesg->count != 1) { log(WARN, "$filter not found or multiple entries match"); return undef; }
return undef if ($mesg->code != 0);
croak("$filter not found") if ($mesg->count == 0);
croak("$filter not unique") if ($mesg->count > 1);
return $mesg->entry(0)->dn;
}
@ -343,17 +347,15 @@ sub search_dns($$$@)
my $base = shift;
my $filter = shift;
if ($base) {
$base .= ","
}
$base .= "," if ($base);
my $mesg = $ldap->search( # search
base => $base."dc=acu,dc=epita,dc=fr",
filter => $filter,
attrs => @_,
base => $base . BASE_DN,
filter => Net::LDAP::Filter->new($filter),
attrs => \@_,
scope => "sub"
);
if ($mesg->code != 0) { log(WARN, $mesg->error); return undef; }
if ($mesg->code != 0) { log(WARN, $mesg->error); return []; }
return $mesg->entries;
}

View file

@ -4,6 +4,10 @@ use v5.10.1;
use strict;
use warnings;
use Carp;
use utf8;
use open IO => ':utf8';
use open ':std';
use Data::Dumper;
use Exporter 'import';
use POSIX qw(strftime);
@ -16,21 +20,26 @@ use constant {
WARN => 4,
DONE => 5,
USAGE => 6,
PENDING => 6.5,
INFO => 7,
DEBUG => 8,
TRACE => 9,
};
our @EXPORT = qw(log FATAL ALERT ERROR WARN DONE USAGE INFO DEBUG TRACE);
our @EXPORT = qw(log FATAL ALERT ERROR WARN DONE USAGE PENDING INFO DEBUG TRACE);
our $display_level = 7;
our $save_level = 9;
our $fatal_error = 1;
our $fatal_warn = 0;
our $mail_error = 0;
our $log_file = $0.".log";
my $log_fd;
my $HOSTNAME = `hostname`;
chomp($HOSTNAME);
sub log
{
my $level = shift;
@ -43,23 +52,72 @@ sub log
if (!$log_fd && $log_file) {
open ($log_fd, ">>", $log_file) or croak("Unable to open log ($log_file) file for writing");
# Enable autoflush for the log file
my $previous_default = select($log_fd);
$|++;
select($previous_default);
say $log_fd strftime("%a %b %e %H:%M:%S %Y", localtime), " START new logging session ";
}
if ($level <= $save_level and $log_fd)
{
local $| = 1;
print $log_fd strftime("%a %b %e %H:%M:%S %Y", localtime), " ", levelstr($level), " ";
if ($level >= TRACE) {
if ($level == TRACE) {
print $log_fd Dumper(@_);
}
else {
say $log_fd @_;
}
}
if ($level <= $display_level) {
say STDERR (leveldisp($level), @_, RESET);
if ($mail_error && $level <= ERROR)
{
require Email::MIME;
require Email::Sender::Simple;
Email::Sender::Simple->import(qw(sendmail));
my $mail = Email::MIME->create(
header_str => [
From => "Roots assistants <root\@$HOSTNAME.acu.epita.fr>",
To => "Roots assistants <ml-root\@acu.epita.fr>",
Subject => "[LERDORF][ERROR] ".join(' ', @_)
],
attributes => {
encoding => 'quoted-printable',
charset => 'utf-8',
format => 'flowed',
},
body_str => "Bonjour,
Une erreur de niveau $level est survenue sur la machine $HOSTNAME.
Cette erreur est survenue lors de l'exécution du script :
$0.
Voici le contenu du message d'erreur :
".join(' ', @_)."
Cordialement,
--
The lerdorf project",
);
sendmail($mail);
}
if ($level <= $display_level)
{
$|++; # Autoflush STDOUT
if ($level == PENDING) {
print STDERR (leveldisp($level), @_, RESET, "\r");
} else {
say STDERR (leveldisp($level), @_, RESET);
}
$|--; # Disable autoflush
}
if ($fatal_warn && $level <= WARN){
@ -80,14 +138,14 @@ sub levelstr($)
{
my $level = shift;
return "FATAL" if ($level == 1);
return "ALERT" if ($level == 2);
return "ERROR" if ($level == 3);
return "WARN " if ($level == 4);
return "DONE " if ($level == 5);
return "USAGE" if ($level == 6);
return "INFO " if ($level == 7);
return "DEBUG" if ($level == 8);
return "FATAL" if ($level <= 1);
return "ALERT" if ($level <= 2);
return "ERROR" if ($level <= 3);
return "WARN " if ($level <= 4);
return "DONE " if ($level <= 5);
return "USAGE" if ($level <= 6);
return "INFO " if ($level <= 7);
return "DEBUG" if ($level <= 8);
return "TRACE";
}
@ -95,14 +153,15 @@ sub leveldisp($)
{
my $level = shift;
return BOLD, ON_RED, YELLOW, "/!\\", RESET, " ", BOLD if ($level == 1);
return BOLD, ON_RED, ">>>", RESET, " ", BOLD if ($level == 2);
return BOLD, RED, ">>>", RESET, " ", BOLD if ($level == 3);
return BOLD, YELLOW, ">>>", RESET, " ", BOLD if ($level == 4);
return BOLD, GREEN, ">>>", RESET, " ", BOLD if ($level == 5);
return BOLD, MAGENTA, " * ", RESET, " ", BOLD if ($level == 6);
return BOLD, ON_RED, YELLOW, "/!\\", RESET, " ", BOLD if ($level <= 1);
return BOLD, ON_RED, ">>>", RESET, " ", BOLD if ($level <= 2);
return BOLD, RED, ">>>", RESET, " ", BOLD if ($level <= 3);
return BOLD, YELLOW, ">>>", RESET, " ", BOLD if ($level <= 4);
return BOLD, GREEN, ">>>", RESET, " ", BOLD if ($level <= 5);
return BOLD, MAGENTA, " * ", RESET, " ", BOLD if ($level <= 6);
return BOLD, CYAN, ">>>", RESET, " " if ($level < 7);
return BOLD, CYAN, " * ", RESET, " " if ($level == 7);
return BOLD, BLUE, " % ", RESET, " " if ($level == 8);
return BOLD, BLUE, " % ", RESET, " " if ($level <= 8);
return BOLD, BLUE, "#", RESET, " ";
}

View file

@ -22,6 +22,18 @@ our $nb_cpus = 0;
$nb_cpus = grep {/^processor\s/} <$cpuinfo>;
close $cpuinfo;
our @servers = ("gearmand-srv:4730");
sub add_server
{
push @servers, @_;
}
sub set_servers
{
@servers = @_;
}
sub check_load ($)
{
my $priority = shift;
@ -71,15 +83,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;
return $err;
$ret .= $err;
}
return $ret;
}
@ -91,7 +106,9 @@ sub register_no_parse ($$;$)
my $worker = Gearman::Worker->new;
$worker->job_servers('gearmand:4730');
log INFO, "Registering function $funcname on ", join(", ", @servers);
$worker->job_servers( @servers );
$worker->register_function($funcname => sub
{
my $ret;
@ -124,7 +141,9 @@ sub register ($$;$$)
my $worker = Gearman::Worker->new;
$worker->job_servers('gearmand:4730');
log INFO, "Registering function $funcname on ", join(", ", @servers);
$worker->job_servers( @servers );
$worker->register_function($funcname => sub { return do_work($subref, $given_arg, $priority, @_); });
# Disable exit on warning or error
@ -193,7 +212,7 @@ sub launch ($$;$$)
my $funcname = shift;
my $client = Gearman::Client->new;
$client->job_servers('gearmand:4730');
$client->job_servers( @servers );
log DEBUG, "Launching $funcname...";
@ -216,7 +235,7 @@ sub paralaunch ($$;$)
my $xml = build_task_xml(shift, shift);
my $client = Gearman::Client->new;
$client->job_servers('gearmand:4730');
$client->job_servers( @servers );
my $taskset = $client->new_task_set;
for my $task (@{ $funcsname })

View file

@ -1,61 +0,0 @@
#! /usr/bin/env perl
package Tinyglob;
use v5.10.1;
use strict;
use warnings;
use Carp;
use Exporter 'import';
our @EXPORT = qw(tinyglob);
sub tinyglob
{
my $orig = shift;
my @str = split("", quotemeta($orig));
my $res = "";
my $metaescape = 0;
for (my $i = 0; $i <= $#str; $i++)
{
if ($str[$i] eq '\\')
{
$i += 1;
if ($str[$i] eq '\\')
{
$metaescape = ! $metaescape;
$res .= $str[$i];
}
elsif ($metaescape && ($str[$i] eq '*' || $str[$i] eq '?')) {
$res .= $str[$i];
$metaescape = 0;
}
elsif ($str[$i] eq '?') {
$res .= '.';
}
elsif ($str[$i] eq '*') {
$res .= '.*';
}
else {
croak "Invalid number of \\ in '$orig'";
}
}
else {
$res .= $str[$i];
}
}
return $res;
}
sub match
{
my $glob = tinyglob(shift);
my $str = shift;
return $str =~ /$glob/;
}
1;

View file

@ -9,16 +9,15 @@ use Carp;
use utf8;
use open qw(:encoding(UTF-8) :std);
use XML::LibXML;
use XML::SAX::ParserFactory;
use ACU::Log;
sub new
{
my $class = shift;
my $self = {
ids => {},
infos => {},
comments => {},
who => {},
groups => [],
};
bless $self, $class;
@ -33,10 +32,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,113 +99,148 @@ sub getInfos ($)
return $self->{infos};
}
sub getComment ($$)
sub addId
{
my $self = shift;
return $self->{comments}{$_[0]};
my $key = shift;
my $value = shift;
my $e = Trace::Eval->new($key);
$e->addValue(undef, $value);
push @{ $self->{groups} }, $e;
return $e;
}
sub getComments ($)
sub delId
{
my $self = shift;
return $self->{comments};
my $key = shift;
my $value = shift;
foreach my $group (@{ $self->{groups} })
{
if ($group->{id} eq $key)
{
if (!$value || $value == $group->getValue())
{
$self->{groups} = [ grep { $_->{id} ne $key } @{ $self->{groups} } ];
}
last;
}
$group->delId($key, $value);
}
}
sub getIds
{
my $self = shift;
my $login = shift;
my $onlyNonZero = shift // 0;
my %ids;
foreach my $group (@{ $self->{groups} })
{
my %tmp;
if ($self->{type} eq "defense")
{
# For a defense, we consider that this is a group grade, so don't consider login filtering
%tmp = $group->getIds();
} else {
%tmp = $group->getIds($login);
}
while (my ($key, $value) = each %tmp)
{
$ids{$key} = $value if !$onlyNonZero || $value;
}
}
return \%ids;
}
sub getNonZeroIds
{
return getIds($_[0], $_[1], 1);
}
sub getValue
{
my $self = shift;
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 = {};
foreach my $group (@{ $self->{groups} })
{
my $whos = $group->getWhos();
foreach my $who (keys %{ $whos }) {
$ret->{ $who } = $whos->{$who};
}
}
return $ret;
}
sub getValue ($$)
sub toString ($)
{
my $self = shift;
return $self->{ids}{$_[0]};
}
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};
}
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();
}
package TraceHandler;
package Trace::Group;
use v5.10.1;
use strict;
use warnings;
use Carp;
use constant NO_ID_VALUE => "__#";
use ACU::Log;
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 +248,273 @@ 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 delId
{
my ($self, $characters) = @_;
my $self = shift;
my $key = shift;
my $value = 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")
foreach my $group (@{ $self->{groups} })
{
if ($self->{values} =~ /([-+]?[0-9]+(.[0-9]+)?)/)
if ($group->{id} eq $key)
{
$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;
if (!$value || $value == $group->getValue())
{
$self->{groups} = \{ grep { $_->{id} ne $key } @{ $self->{groups} } };
}
last;
}
$self->{inValue} = "";
$group->delId($key, $value);
}
elsif ($element->{Name} eq "eval")
}
sub getIds
{
my $self = shift;
my $login = shift;
my %ids;
foreach my $group (@{ $self->{groups} })
{
# 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;
my %tmp = $group->getIds($login);
while (my ($key, $value) = each %tmp)
{
$ids{$key} = $value;
}
$self->{inComment} = "";
}
elsif ($element->{Name} eq "who")
$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})
{
if ($self->{values} =~ /([^\s].*[^\s]|[^\s])/) {
$self->{parsed}{who}{ $self->{inWho} } = $1;
my $value = 0;
foreach my $group (@{ $self->{groups} })
{
$value += $group->getValue(undef, $login);
}
$self->{inComment} = "";
return $value;
}
elsif ($element->{Name} eq "info")
else
{
if ($self->{values} =~ /([^\s].*[^\s]|[^\s])/) {
$self->{parsed}{infos}{ $self->{inInfo} } = $1;
my $value = 0;
foreach my $group (@{ $self->{groups} })
{
$value += $group->getValue($id, $login);
}
$self->{inInfo} = "";
return $value;
}
elsif ($element->{Name} eq "group")
}
sub getWhos
{
my $self = shift;
my $ret = {};
foreach my $group (@{ $self->{groups} })
{
my $key = pop @{ $self->{groups} };
# Remove empty identifier
delete $self->{parsed}{ids}{ $key } if ($key && !$self->{parsed}{ids}{ $key });
my $whos = $group->getWhos();
foreach my $who (keys %{ $whos }) {
$ret->{ $who } = $whos->{$who};
}
}
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;
use v5.10.1;
use strict;
use warnings;
use Carp;
use ACU::Log;
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")
{
$self->addValue($node->getAttribute("id"),
$val);
}
elsif ($node->nodeName eq "name")
{
$self->{name} = $val;
}
elsif ($node->nodeName eq "status")
{
$self->{status} = $val;
}
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"
};
}
}
}
sub delId
{
# Do nothing here, just an abstract method
}
sub changeWho
{
my $self = shift;
$self->{who} = {
login => shift,
type => shift // "login"
};
}
sub getIds
{
my $self = shift;
my $login = shift;
my %ids;
if (!$login || !exists $self->{who} || $self->{who}{type} eq "group" || $self->{who}{login} eq $login)
{
while (my ($key, $value) = each %{ $self->{values} })
{
$ids{$key} = $value if ($key);
}
$ids{ $self->{id} } = $self->getValue($self->{id}, $login);
}
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;
my $id = shift // $self->{id};
my $login = shift;
my $value = 0;
if (!$login || !exists $self->{who} || $self->{who}{type} eq "group" || $self->{who}{login} eq $login)
{
foreach my $key (keys %{ $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} };
}
sub toString($$)
{
my $self = shift;
my $doc = shift;
my $e = $doc->createElement("eval");
$e->setAttribute("id", $self->{id});
$e->setAttribute("type", $self->{type});
if (defined $self->{who})
{
my $w = $doc->createElement("who");
$w->setAttribute("type", $self->{who}{type}) if (defined $self->{who}{type});
$w->appendTextNode( $self->{who}{login} );
$e->appendChild( $w );
}
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;

View file

@ -5,7 +5,7 @@ package Git;
use v5.10.1;
use strict;
use warnings;
use File::Path;
use File::Path qw(remove_tree);
use File::Temp;
use ACU::LDAP;
@ -27,11 +27,11 @@ 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";
system ("git clone $git_user\@$git_server:$git_adminrepo $gitolite_directory");
qx(git clone $git_user\@$git_server:$git_adminrepo $gitolite_directory);
chdir($gitolite_directory);
@ -43,12 +43,13 @@ sub save_conf(;$)
chdir($gitolite_directory);
my $commit = shift;
system ("git commit -am '$commit'") if ($commit);
qx(git commit -am '$commit') if ($commit);
log INFO, "Saving repositories configuration";
system ("git push");
unlink ($gitolite_directory);
qx(git push);
chdir("/");
remove_tree($gitolite_directory);
$gitolite_directory = undef;
}
@ -213,7 +214,7 @@ sub user_add
user_delete($login, 1, $multiple);
# Then, extract user keys
my @entries = LDAP::search_dns(undef, "ou=users", "&(uid=$login)(sshPublicKey=*)", [ "uid", "sshPublicKey" ]);
my @entries = LDAP::search_dns(undef, "ou=users", "&(uid=$login)(sshPublicKey=*)", "uid", "sshPublicKey");
if ($#entries > 1 && !$multiple) { log WARN, "Found multiple user $login, aborting keys update."; return 0; }
@ -235,7 +236,7 @@ sub user_add
print $kf $key;
close $kf;
system("git add $gitolite_directory/keydir/$i/$login.pub");
qx(git add $gitolite_directory/keydir/$i/$login.pub);
$i += 1;
}
}
@ -271,7 +272,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

View file

@ -1,52 +0,0 @@
use v5.10.1;
use strict;
use warnings;
use Test::More;
use lib "../";
BEGIN {
diag("Testing Tinyglob on perl $]");
use_ok('ACU::Tinyglob');
}
use ACU::Tinyglob;
is(Tinyglob::tinyglob("test"), "test");
is(Tinyglob::tinyglob("\\*"), "\\*");
is(Tinyglob::tinyglob("\\\\*"), "\\\\.*");
is(Tinyglob::tinyglob("\\?"), "\\?");
is(Tinyglob::tinyglob("\\\\?"), "\\\\.");
ok(! Tinyglob::match("?", ""));
ok(! Tinyglob::match("b", "a"));
ok(! Tinyglob::match("b*", "a"));
ok(! Tinyglob::match("b?", "a"));
ok(Tinyglob::match("*", ""));
ok(Tinyglob::match("a", "a"));
ok(Tinyglob::match("?", "a"));
ok(Tinyglob::match("*", "a"));
ok(Tinyglob::match("ab", "ab"));
ok(Tinyglob::match("?b", "ab"));
ok(Tinyglob::match("*b", "ab"));
ok(Tinyglob::match("*", "ab"));
ok(Tinyglob::match("b?", "ba"));
ok(Tinyglob::match("b*", "ba"));
ok(Tinyglob::match("*", "abcdef"));
ok(Tinyglob::match("a?b", "acb"));
ok(Tinyglob::match("a*b", "acb"));
ok(Tinyglob::match("a*b", "acdefb"));
ok(Tinyglob::match("a*b*", "acdefblkjgd"));
ok(! Tinyglob::match("a?b*", "acdefblkjgd"));
ok(Tinyglob::match("a?b*", "acblkjgd"));
ok(Tinyglob::match("a?b*", "abblkjgd"));
ok(! Tinyglob::match("a*b?", "abblkjgd"));
ok(Tinyglob::match("a*b?", "aasdasbd"));
done_testing();

View file

@ -1,10 +1,13 @@
COPY?=cp -v
CURL?=curl
DEST?=/usr/local/share/perl/`ls -1 /usr/local/share/perl/ | grep "^5." | tail -1`/
GIT?=/usr/bin/git
GITOLITE_DEST?=/usr/share/gitolite/hooks/common
MAKEDIR?=mkdir
PERL?=/usr/bin/env perl
PROVER?=prove -f
RM?=rm
RMTREE?=rm -r
TESTDIR?=t
SHELL?=/bin/sh
@ -17,9 +20,20 @@ install:
$(COPY) -r ACU/ $(DEST)
! test -d $(GITOLITE_DEST) || $(MAKEDIR) -p $(GITOLITE_DEST)/update.secondary.d
! test -d $(GITOLITE_DEST) || $(COPY) hooks/gl-pre-git $(GITOLITE_DEST)/
! test -d $(GITOLITE_DEST) || $(COPY) hooks/post-update $(GITOLITE_DEST)/
! test -d $(GITOLITE_DEST) || $(COPY) hooks/subjects.pl $(GITOLITE_DEST)/update.secondary.d/
! test -d $(GITOLITE_DEST) || $(COPY) hooks/conferences.pl $(GITOLITE_DEST)/update.secondary.d/
! test -d $(GITOLITE_DEST) || $(COPY) hooks/submissions.pl $(GITOLITE_DEST)/update.secondary.d/
guantanamo.tar.gz:
$(MAKEDIR) -p guantanamo/ACU
$(COPY) process/exec/guantanamo_node.pl guantanamo/
$(COPY) ACU/Log.pm ACU/Process.pm process/exec/guantanamo_node.pl guantanamo/ACU/
$(COPY) process/exec/run.sh.not-here guantanamo/run.sh
chmod +x guantanamo/run.sh
tar czf guantanamo.tar.gz guantanamo/
$(RMTREE) guantanamo
update:
$(GIT) pull
$(SHELL) commands/first-install.sh
@ -32,6 +46,16 @@ unstall:
! test -d $(GITOLITE_DEST) || $(RM) -rf $(GITOLITE_DEST)/update.secondary.d
! test -d $(GITOLITE_DEST) || $(MAKEDIR) -p $(GITOLITE_DEST)/update.secondary.d
regen-objects:
$(MAKEDIR) -p ACU/dtd
$(CURL) -o ACU/dtd/defense.dtd http://acu.epita.fr/dtd/defense.dtd
$(CURL) -o ACU/dtd/grading.dtd http://acu.epita.fr/dtd/grading.dtd
$(CURL) -o ACU/dtd/groups.dtd http://acu.epita.fr/dtd/groups.dtd
$(CURL) -o ACU/dtd/project.dtd http://acu.epita.fr/dtd/project.dtd
$(CURL) -o ACU/dtd/traces.dtd http://acu.epita.fr/dtd/traces.dtd
$(PERL) -I baldr baldr/Baldr.pl --import="ACU/Objects/basecode/*.pm" --path=ACU/Objects ACU/dtd/defense.dtd ACU/dtd/grading.dtd ACU/dtd/groups.dtd ACU/dtd/project.dtd ACU/dtd/traces.dtd
$(RMTREE) ACU/dtd
test:
$(PROVER) $(TESTDIR)

View file

@ -1,10 +1,10 @@
#! /bin/bash
# Install missing packages
DEB_PACKAGES_LIST="screen libnet-ldap-perl libxml-libxml-perl libgearman-client-perl libmailtools-perl libmail-sendmail-perl libdatetime-format-iso8601-perl libnet-ip-perl"
ARCH_PACKAGES_LIST="screen perl-io-socket-ssl perl-email-simple perl-email-mime perl-term-readkey perl-ldap perl-lwp-protocol-https perl-datetime-format-iso8601 perl-net-ip"
GENTOO_PACKAGES_LIST="app-misc/screen dev-perl/IO-Socket-SSL dev-perl/Email-Simple dev-perl/Email-MIME dev-perl/TermReadKey dev-perl/perl-ldap dev-perl/LWP-Protocol-https dev-perl/DateTime-Format-ISO8601 dev-perl/Net-IP"
FBSD_PACKAGES_LIST="screen p5-IO-Socket-SSL p5-Email-Simple p5-Email-MIME p5-Term-ANSIColor p5-Term-ReadKey p5-LWP-Protocol-https p5-DateTime-Format-ISO8601 p5-Net-IP"
DEB_PACKAGES_LIST="screen libnet-ldap-perl libxml-libxml-perl libgearman-client-perl libmailtools-perl libdatetime-format-iso8601-perl libnet-ip-perl libsys-gamin-perl libdigest-sha-perl libemail-mime-perl libemail-sender-perl libtext-glob-perl"
ARCH_PACKAGES_LIST="screen perl-io-socket-ssl perl-email-mime perl-term-readkey perl-ldap perl-lwp-protocol-https perl-datetime-format-iso8601 perl-net-ip" # aur/perl-sys-gamin aur/perl-text-glob
GENTOO_PACKAGES_LIST="app-misc/screen dev-perl/XML-LibXML dev-perl/IO-Socket-SSL dev-perl/Email-MIME dev-perl/TermReadKey dev-perl/perl-ldap dev-perl/LWP-Protocol-https dev-perl/DateTime-Format-ISO8601 dev-perl/Net-IP dev-perl/Email-Sender dev-perl/Text-Glob"
FBSD_PACKAGES_LIST="screen p5-XML-LibXML p5-Gearman p5-IO-Socket-SSL p5-Email-MIME p5-Term-ANSIColor p5-Term-ReadKey p5-LWP-Protocol-https p5-DateTime-Format-ISO8601 p5-Net-IP p5-Sys-Gamin p5-Text-Glob"
KERNEL=`uname -s`

14
commands/guantanamo_list.sh Executable file
View file

@ -0,0 +1,14 @@
#!/bin/sh
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
cat <<EOF | gearman -h gearmand -p 4730 -f guantanamo
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="action">list</param>
</process>
EOF

View file

@ -1,12 +1,12 @@
#! /bin/bash
#! /usr/bin/env bash
cd $(dirname "$0")
WKS_LIST="apl"
SRV_LIST="moore noyce hamano cpp"
SCP_LIST="ksh"
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 ..

45
commands/moulette/launch.sh Executable file
View file

@ -0,0 +1,45 @@
#!/bin/sh
if [ -z "$2" ]
then
echo "Usage: $0 [year] <project> <submission> [login ...]"
exit 1
fi
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
if [ "x${1:0:2}" = "x20" ]
then
YEAR="$1"
shift
else
YEAR=`ldapsearch -x -b "cn=year,dc=acu,dc=epita,dc=fr" | grep "^year" | cut -d " " -f 2`
fi
PROJECT_ID=$1
RENDU=$2
shift 2
LOGINS=
while [ $# -gt 0 ]
do
LOGINS="$LOGINS <param>$1</param>
"
shift
done
cat <<EOF | gearman -h gearmand-srv -p 4730 -f moulette_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">moulette</param>
<param name="year">$YEAR</param>
<param name="id">$PROJECT_ID</param>
<param name="rendu">$RENDU</param>
$LOGINS</process>
EOF
echo

View file

@ -0,0 +1,83 @@
#!/bin/bash
usage()
{
echo "Usage: $0 [-d] [year] <project> <submission> <login> <tarball>"
}
if [ -z "$4" ]
then
usage
exit 1
fi
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
if [ "x$1" = "x-d" ]
then
BACKGROUD=
shift
else
BACKGROUD="-b"
fi
if [ "x${1:0:2}" = "x20" ]
then
YEAR=" <param name=\"year\">$1</param>"
shift
else
YEAR=
fi
PROJECT_ID=$1
RENDU=$2
LOGIN=$3
if ! [ -f "$4" ]
then
usage
exit 2
fi
MIME=`file -b -i "$4" | cut -d ';' -f 1`
if [ "$MIME" = "application/x-bzip2" ]
then
FILE=`bzip2 --decompress --stdout "$4" | gzip --stdout | base64`
elif [ "$MIME" = "application/x-gzip" ]
then
FILE=`gzip --decompress --stdout "$4" | gzip --stdout | base64`
elif [ "$MIME" = "application/x-xz" ]
then
FILE=`xz --decompress --stdout "$4" | gzip --stdout | base64`
elif [ "$MIME" = "application/x-tar" ]
then
FILE=`tar cz "$4" | base64`
elif [ "$MIME" = "inode/directory" ]
then
FILE=`tar xf "$4" | tar cz | base64`
else
echo "I don't know how to treat $4" >&2
exit 3
fi
cat <<EOF | gearman -h gearmand-srv -p 4730 -f moulette_get $BACKGROUD
<?xml version="1.0"?>
<process>
<param name="type">std</param>
$YEAR
<param name="id">$PROJECT_ID</param>
<param name="rendu">$RENDU</param>
<param name="login">$LOGIN</param>
<param name="file">rendu.tgz</param>
<file name="rendu.tgz">$FILE</file>
</process>
EOF

59
commands/moulette/sendgit.sh Executable file
View file

@ -0,0 +1,59 @@
#!/bin/sh
usage()
{
echo "Usage: $0 [-d] [year] <project> <submission> <login> [login ...]"
}
if [ -z "$3" ]
then
usage
exit 1
fi
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
if [ "x$1" = "x-d" ]
then
BACKGROUD=
shift
else
BACKGROUD="-b"
fi
if [ "x${1:0:2}" = "x20" ]
then
YEAR=" <param name=\"year\">$1</param>"
shift
else
YEAR=
fi
PROJECT_ID=$1
RENDU=$2
shift 2
if [ $# -le 0 ]
then
usage
exit 1
fi
while [ $# -gt 0 ]
do
LOGIN=$1
cat <<EOF | gearman -h gearmand -p 4730 -f send_git $BACKGROUD
<?xml version="1.0"?>
<process>
$YEAR
<param name="id">$PROJECT_ID</param>
<param name="rendu">$RENDU</param>
<param name="login">$LOGIN</param>
</process>
EOF
shift
done

View file

@ -0,0 +1,23 @@
#!/bin/sh
if [ -z "$1" ]
then
echo "Usage: $0 <memory>"
exit 1
fi
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
cat <<EOF | gearman -h gearmand-srv -p 4730 -f moulette_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">set_memory</param>
<param name="to">$1</param>
</process>
EOF
echo

View file

@ -0,0 +1,23 @@
#!/bin/sh
if [ -z "$1" ]
then
echo "Usage: $0 <nb_worker>"
exit 1
fi
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
cat <<EOF | gearman -h gearmand-srv -p 4730 -f moulette_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">set_workers</param>
<param name="to">$1</param>
</process>
EOF
echo

29
commands/moulette/stats.sh Executable file
View file

@ -0,0 +1,29 @@
#!/bin/sh
if ! which gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
ACTION=
if [ -n "$1" ]
then
if [ "$1" = "flush" ]
then
ACTION=" <param name=\"action\">flush</param>
"
else
echo "Unknown action '$1'"
exit 1
fi
fi
cat <<EOF | gearman -h gearmand-srv -p 4730 -f moulette_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">stats</param>
$ACTION</process>
EOF
echo

View file

@ -4,15 +4,13 @@ use v5.10.1;
use strict;
use warnings;
use lib "../../";
use ACU::API::Base;
use ACU::API::Projects;
if ($#ARGV == 0)
{
API::Projects::add($ARGV[0]);
API::Projects::add($ARGV[0], "");
}
else
{

View file

@ -0,0 +1,40 @@
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use Data::Dumper;
use ACU::API::Projects;
my $projid = $ARGV[0];
my $year = $ARGV[1] // LDAP::get_year;
my $res = API::Projects::get_groups($projid, $year);
map {
my $chief;
# First, found the chief
for my $member (@{ $_->{stds} })
{
if ($member->{chief} eq "true" or $member->{chief} eq "1" or $member->{chief} eq "chief")
{
$chief = $member;
last;
}
}
my @members;
for my $member (@{ $_->{stds} }) {
push @members, $member->{login};
}
say "repo $year/$projid/$chief->{login}";
say " - ACU-moulette = ", join(" ", @members);
say " - refs/tags/ACU- = ", join(" ", @members);
say ' RW+ = @admins ', join(" ", @members);
say ' RW ACU-moulette = @moulettes';
say ' RW+ refs/tags/ACU- = @moulettes';
say " R = \@chefs \@resp-$year-$projid \@soutenance-$year-$projid \@moulettes intradmin-hamano";
} @{ $res->{groups} };

View file

@ -0,0 +1,39 @@
#!/bin/sh
if [ "$#" -ne 3 ]
then
echo "Usage: $0 project rendu git_repo"
exit 1
fi
project_id="$1"
rendu="$2"
git_repo="$3"
if ! whereis gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
if [ ! -d "$git_repo" ]; then
ls "$git_repo"
echo "$git_repo: file not found"
exit 2
fi
FILENAME=$(basename "$git_repo")
FILE="<file name=\"$FILENAME\">$(tar -czf - -C "$git_repo" . | base64 )</file>"
cat <<EOF | gearman -h gearmand -p 4730 -f moulette_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">std</param>
<param name="id">$project_id</param>
<param name="year">2016</param>
<param name="rendu">$rendu</param>
<param name="login">$FILENAME</param>
<param name="file">$FILENAME</param>
$FILE
</process>
EOF

View file

@ -0,0 +1,50 @@
#!/bin/sh
if [ "$#" -ne 3 ]
then
echo "Usage: $0 project rendu [login] file"
exit 1
fi
project_id="$1"
rendu="$2"
if [ -z "$4" ]
then
login=`basename $3`
login="${login%%.xml}"
file="$3"
else
login="$3"
file="$4"
fi
if ! whereis gearman > /dev/null 2> /dev/null
then
echo "gearman isn't installed on this machine. Please try another one."
exit 1
fi
if ! [ -f "$file" ]; then
echo "$file: File not found"
exit 2
fi
if [ -z "$login" ]
then
FILENAME=$(basename "$file")
else
FILENAME="$login.xml"
fi
FILE="<file name=\"$FILENAME\">$(base64 $file)</file>"
cat <<EOF | gearman -h gearmand -p 4730 -f intradata_get
<?xml version="1.0" encoding="UTF-8"?>
<process>
<param name="type">trace</param>
<param name="id">$project_id</param>
<param name="year">2016</param>
<param name="rendu">$rendu</param>
<param name="login">$login</param>
$FILE
</process>
EOF

49
hooks/conferences.pl Normal file
View file

@ -0,0 +1,49 @@
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use Digest::SHA qw(sha1_base64);
use File::Basename;
use utf8;
use ACU::API::Projects;
use ACU::Defense;
use ACU::LDAP;
use ACU::Log;
$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log";
use ACU::Process;
# First, check if the repository is in the conferences/ directory
exit 0 if ($ENV{GL_REPO} !~ /^conferences\//);
my ($ref, $oldsha, $newsha) = @ARGV;
log DONE, "This is a conference repository!";
my %known_tags = (
"subject" => \&tag_document,
);
if ($ref =~ m<^refs/tags(/.+)$>)
{
my $tag = $1;
my @args;
while ($tag =~ m<[,/]([^,]*)>g) {
push @args, $1;
}
my $create = ($newsha ne '0' x 40);
if (exists $known_tags{$args[0]}) {
exit $known_tags{$args[0]}($create, @args);
}
}
exit 0;
sub tag_document
{
}

40
hooks/dump-help.pl Executable file
View file

@ -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;

View file

@ -5,6 +5,7 @@ use warnings;
use v5.10;
use File::Basename;
use Net::IP;
use utf8;
use ACU::Log;
$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log";
@ -13,27 +14,55 @@ my $ip = $1 if ($ENV{'SSH_CLIENT'} =~ m/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-
exit 0 if (!$ip);
log DEBUG, "Connection to $ENV{GL_REPO} from $ip";
log DEBUG, "Connection by $ENV{GL_USER} with $ARGV[0] to $ENV{GL_REPO} from $ip";
my $promo = qx(git config hooks.promo);
my $id_project = qx(git config hooks.idproject);
my $repo_login = qx(git config hooks.repologin);
my @apping3 = qw(saadi_n lucas_e jawhar_s france_b roux_m bamba_m boudje_s gillot_l le-pen_m gimene_a nguye_d marin_c piedno_j salmon_b);
my @habitent_loin = qw(amed_m bellev_m freima_m ikouna_l simon_j faure_n abdelm_a habri_z trang_d henrie_p verbec_y molini_v marti_o colin_j);
# First, check if the repository is in the YYYY/ directory
exit 0 if ($ENV{GL_REPO} !~ /^2[0-9]{3}\/.+\/.+/);
exit 0 if (($promo && $id_project && $repo_login) || $ENV{GL_REPO} !~ /^2[0-9]{3}\/.+\/.+/);
my ($ref, $oldsha, $newsha) = @ARGV;
$promo = $1 if (!$promo && $ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
$id_project = $1 if (!$id_project && $ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
$repo_login = $1 if (!$repo_login && $ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);
my $read = ($ARGV[0] =~ /R/);
my $write = ($ARGV[0] =~ /W/);
my $promo = $1 if ($ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
my $id_project = $1 if ($ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
my $repo_login = $1 if ($ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);
$ip = Net::IP->new($ip) or die ("IP invalide");
my $schoolnetwork = Net::IP->new('10.41.0.0/16');
my $labnetwork = Net::IP->new('192.168.0.0/16');
if ($ip->overlaps($schoolnetwork) != $IP_A_IN_B_OVERLAP)
if ($ip->overlaps($labnetwork) == $IP_A_IN_B_OVERLAP)
{
say "Votre IP est : $ip.";
exit 0;
}
#else
#{
# log ERROR, "Les dépôts Git sont en cours de maintenance, veuillez réessayer dans quelques minutes.";
# exit 1;
#}
exit 0 if ($id_project eq "lse-project" && $ip->ip() eq "10.224.4.1");
exit 0 if (grep { /\Q$ENV{GL_USER}\E/ } @habitent_loin, @apping3, "icaza_fact");
my $schoolnetwork = Net::IP->new('10.41.0.0/16');
my $vjschoolnetwork = Net::IP->new('10.3.0.0/16');
if (
$ip->overlaps($schoolnetwork) != $IP_A_IN_B_OVERLAP
# && $ip->overlaps($vjschoolnetwork) != $IP_A_IN_B_OVERLAP
)
{
say "Votre IP est : ".$ip->ip();
log ERROR, "Vous n'êtes pas autorisé à envoyer vos modifications depuis cette IP." if ($write);
log ERROR, "Vous n'êtes pas autorisé à accéder à ce dépôt depuis cette IP." if ($read);
@ -44,7 +73,7 @@ my $sshnetwork = Net::IP->new('10.41.253.0/24');
if ($ip->overlaps($sshnetwork) == $IP_A_IN_B_OVERLAP)
{
say "Votre IP est : $ip.";
say "Votre IP est : ".$ip->ip();
log ERROR, "Vous n'êtes pas autorisé à envoyer vos modifications depuis cette IP." if ($write);
log ERROR, "Vous n'êtes pas autorisé à accéder à ce dépôt depuis cette IP." if ($read);

116
hooks/post-update Executable file
View file

@ -0,0 +1,116 @@
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use File::Basename;
use utf8;
use ACU::API::Projects;
use ACU::API::Submission;
use ACU::LDAP;
use ACU::Log;
$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log";
use ACU::Process;
my $promo;
my $id_project;
my $repo_login;
# 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; }
if (my $tmp = `git config hooks.login`) { chomp $tmp; $repo_login = $tmp; }
$promo = $1 if (!$promo && $ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
$id_project = $1 if (!$id_project && $ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
$repo_login = $1 if (!$repo_login && $ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);
exit(0) if (!$promo || !$id_project || !$repo_login);
for my $ref (@ARGV)
{
my $tag;
my $tag_for;
if ($ref =~ m<^refs/tags/(ACU-(.+))$>)
{
$tag = $1;
$tag_for = $2;
}
elsif ($ref =~ m<^refs/tags/(.+)$>)
{
$tag = $1;
$tag_for = $1;
}
else {
next;
}
log DEBUG, "Tag $tag ($tag_for) on repository $ENV{GL_REPO} from IP $ENV{'SSH_CLIENT'} updated.";
my $project = get_project_info($tag_for);
# Extract matching tag
my @rendus = grep {
exists $_->{vcs} and $_->{vcs}{tag} eq $tag_for;
} @{ $project->{submissions} };
if (@rendus)
{
eval
{
Process::Client::launch("send_git",
{
"year" => $promo,
"id" => $id_project,
"rendu" => $tag,
"login" => $repo_login,
# "path" => "ssh://git\@localhost/".$ENV{GL_REPO}, # Optional
},
undef, # Don't give any file
1 # Launch in background
);
};
if ($@)
{
my $err = $@;
log DEBUG, "ERROR: ".$err;
}
# Send data to API
my $last_commit = `git log "refs/tags/$tag" -1 --decorate --tags`;
eval {
API::Submission::add($promo, $id_project, $tag_for, $repo_login, $last_commit);
};
if ($@)
{
my $err = $@;
log DEBUG, "ERROR: ".$err;
log DONE, "Tag '$tag' effectué avec succès !";
}
else {
log DONE, "Tag '$tag' effectué avec succès ! Vérifiez-le sur l'intranet.";
}
}
}
exit 0;
sub get_project_info
{
my $project;
eval {
$project = API::Projects::get($id_project, $promo);
};
if ($@ or !$project)
{
my $err = $@;
log TRACE, $err;
log ERROR, "Impossible d'envoyer de tags ; si le problème persiste, passez au laboratoire.";
exit(1);
}
#log TRACE, $project;
return $project;
}

View file

@ -69,7 +69,7 @@ sub check_xml
sub repository_name
{
my $repo = $ENV{GL_REPO};
$repo =~ s#^subjects/(.*)#$1#;
$repo =~ s#subject.*/([^/]+)$#$1#;
return $repo;
}
@ -97,7 +97,7 @@ sub tag_defense
my $path;
if ($_[3])
{
if ($_[3] =~ /^(?:defenses\/)?([a-zA-Z0-9_.\/-]+)(?:.xml)?$/) {
if ($_[3] =~ /^(?:defenses\/)?([a-zA-Z0-9_.\/-]+?)(?:.xml)?$/) {
$path = "defenses/".$1.".xml";
} else {
$path = $_[3];
@ -119,12 +119,11 @@ sub tag_defense
chomp($path);
}
my $defense_id;
if ($path =~ /^(?:defenses\/)?([a-zA-Z0-9\/]+)(?:.xml)?$/) {
$defense_id = $1;
} else {
log ERROR, "Déplacez votre soutenance dans le dossier defenses ou simplifiez le nom du fichier.";
}
log WARN, "Placez votre soutenance dans le dossier defenses/." if ($path !~ /^defenses/);
my $defense_id = basename($path);
$defense_id =~ s/\.xml$//;
$defense_id =~ s/[^a-zA-Z0-9_.-]/_/g;
my $year;
if ($_[4])
@ -169,7 +168,7 @@ sub tag_defense
# Generate questions and answer id
my $defense = Defense->new(\$content);
$defense->genIds();
$defense->genIds($defense_id);
# Send data to intradata
log INFO, "Attente d'un processus de publication...";
@ -307,6 +306,7 @@ sub tag_project
# 2: $year
my $project_id = repository_name();
my $flavour = "";
if ($_[1]) {
# Check on ID/flavour_id
@ -315,6 +315,7 @@ sub tag_project
}
$project_id .= "-" . $_[1];
$flavour = $_[1];
}
$project_id = lc $project_id;
$project_id =~ s/[^a-z0-9-_]/_/g;
@ -375,17 +376,22 @@ sub tag_project
my $mod = 0;
for my $vcs ($dom->documentElement()->getElementsByTagName("vcs"))
{
if (! $vcs->hasAttribute("tag") || $vcs->getAttribute("tag") =~ /^(ACU|YAKA)-/) {
log ERROR, "Un tag de rendu ne peut pas commencer par ACU- ou YAKA-."; # C'est réservé pour les moulettes
}
if (! $vcs->hasAttribute("token"))
{
if ($project)
{
# Looking for an old token
my @rendus = grep {
exists $_->{vcs} and $_->{vcs}{tag} eq $vcs->hasAttribute("tag");
exists $_->{vcs} and $_->{vcs}{tag} eq $vcs->getAttribute("tag");
} @{ $project->{submissions} };
if (@rendus == 1) {
log INFO, "Use existing token: ".$rendus[0]->{vcs}{token};
if (@rendus == 1)
{
log DEBUG, "Use existing token: ".$rendus[0]->{vcs}{token};
$vcs->setAttribute("token", substr($rendus[0]->{vcs}{token}, 2, 23));
$mod = 1;
next;
@ -419,7 +425,7 @@ sub tag_project
log INFO, "Information de l'intranet...";
# Call API
eval {
API::Projects::add($project_id, $year);
API::Projects::add($project_id, $flavour, $year);
};
if ($@)
{
@ -490,7 +496,7 @@ sub tag_ref
$rendu = $_[2];
}
else {
$rendu = "*";
$rendu = "";
}
my $year;
@ -533,8 +539,7 @@ sub tag_ref
# Send data to moulette
log INFO, "Attente d'un processus de compilation...";
if (my $err = Process::Client::launch("moulette_get", {
type => "tar",
login => "ref",
type => "ref",
id => $project_id,
"year" => $year,
"rendu" => $rendu,
@ -597,13 +602,7 @@ sub tag_tests
$project_id = lc $project_id;
$project_id =~ s/[^a-z0-9-_]/_/g;
my $rendu;
if ($_[2]) {
$rendu = $_[2];
}
else {
$rendu = "";
}
my $rendu = $_[2] // "";
my $year;
if ($_[3])

View file

@ -8,6 +8,7 @@ use File::Basename;
use Net::IP;
use POSIX qw(strftime);
use Socket;
use utf8;
use ACU::API::Projects;
use ACU::API::Submission;
@ -16,21 +17,90 @@ use ACU::Log;
$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log";
use ACU::Process;
# First, check if the repository is in the YYYY/ directory
exit 0 if ($ENV{GL_REPO} !~ /^2[0-9]{3}\/.+\/.+/);
my ($ref, $oldsha, $newsha) = @ARGV;
my $promo = $1 if ($ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
my $id_project = $1 if ($ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
my $repo_login = $1 if ($ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);
my $promo;
my $id_project;
my $repo_login;
if ($ref =~ m<^refs/tags/(.+)$>)
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);
my @expcep = qw(azerno_t baudry_v dechen_g drouin_n dupuis_a fenech_a hamdao_y lanclu_j langre_m manuel_c palson_c trang_d wajntr_a);
my @salonD = qw(aniss_i bogalh_j boulea_b cloare_l elhach_h gabrie_j kaplan_p manuel_c palson_c pizzin_a wajntr_a);
my @salonS = qw(allio_a cadet_l digius_p drouin_n dubois_d dupuis_a langre_m lim_j);
# 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; }
if (my $tmp = `git config hooks.login`) { chomp $tmp; $repo_login = $tmp; }
$promo = $1 if (!$promo && $ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
$id_project = $1 if (!$id_project && $ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
$repo_login = $1 if (!$repo_login && $ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);
exit(0) if (!$promo || !$id_project || !$repo_login);
if ($ref =~ m<^refs/tags/ACU-(.+)$>)
{
my $tag = $1;
log DEBUG, "Pushed tag for repository $ENV{GL_REPO}: $tag with IP $ENV{'SSH_CLIENT'}";
# Get project informations
# Disallow no ACU
if ($ENV{GL_USER} ne "frotti_b" && $ENV{GL_USER} ne "chen_a" && $ENV{GL_USER} ne "boisse_r" && $ENV{GL_USER} ne "genite_n" && $ENV{GL_USER} ne "mercie_d")
{
log ERROR, "Vous n'êtes pas autorisé à envoyer ce tag.";
exit(9);
}
my $project = get_project_info($tag);
# Extract matching tag
my @rendus = grep {
exists $_->{vcs} and $_->{vcs}{tag} eq $tag;
} @{ $project->{submissions} };
if (! @rendus)
{
log ERROR, "$tag n'est pas un tag valide.";
exit(8);
}
}
elsif ($ref =~ m<^refs/tags/(.+)$>)
{
my $tag = $1;
log DEBUG, "Pushed tag for repository $ENV{GL_REPO}: $tag with IP $ENV{'SSH_CLIENT'}";
my $project = get_project_info($tag);
# Extract matching tag
my @rendus = grep {
exists $_->{vcs} and $_->{vcs}{tag} eq $tag;
} @{ $project->{submissions} };
if (@rendus)
{
if ($newsha eq '0' x 40)
{
log USAGE, "Mais pour quelle raison voudriez-vous supprimer un tag ?!";
exit(7);
}
chomp (my $tokengiven = `git cat-file tag $newsha 2> /dev/null | sed -e '1,/^\$/d'`);
if (! check_submission_date($tokengiven, @rendus))
{
exit (9);
}
}
else
{
log ERROR, "$tag n'est pas un tag valide.";
exit(8)
}
}
exit 0;
sub get_project_info
{
my $project;
eval {
$project = API::Projects::get($id_project, $promo);
@ -40,15 +110,17 @@ if ($ref =~ m<^refs/tags/(.+)$>)
my $err = $@;
log TRACE, $err;
log ERROR, "Impossible d'envoyer de tags ; si le problème persiste, passez au laboratoire.";
exit 1;
exit(1);
}
log TRACE, $project;
# Extract lot of data
my @rendus = grep {
exists $_->{vcs} and $_->{vcs}{tag} eq $tag;
} @{ $project->{submissions} };
return $project;
}
sub check_submission_date
{
my $tokengiven = shift;
my $glts = DateTime::Format::ISO8601->parse_datetime(
do {
@ -57,13 +129,17 @@ if ($ref =~ m<^refs/tags/(.+)$>)
$t
});
chomp (my $tokengiven = `git cat-file tag $newsha 2> /dev/null | sed -e '1,/^\$/d'`);
for my $rendu (@rendus)
for my $rendu (@_)
{
my $open = DateTime::Format::ISO8601->parse_datetime($rendu->{period}{begin});
my $close = DateTime::Format::ISO8601->parse_datetime($rendu->{period}{end});
# TODO: check exceptions by login/group
if (($id_project eq "bistromathique" || $id_project eq "pthl") && grep { $_ eq $repo_login } @expcep)
# if (($id_project eq "bistromathique" || $id_project eq "pthl") && "pizzin_a" eq $repo_login)
{
# $open = DateTime::Format::ISO8601->parse_datetime("2013-12-19T18:00:00");
$close = DateTime::Format::ISO8601->parse_datetime("2013-12-22T19:42:00");
}
say "Date courante : ", $glts->strftime("%d/%m/%Y %H:%M:%S");
@ -90,25 +166,5 @@ if ($ref =~ m<^refs/tags/(.+)$>)
}
}
if ($newsha eq '0' x 40) {
log USAGE, "Mais pour quelle raison voudriez-vous supprimer un tag ?!";
}
else
{
# Send data to API
my $last_commit = `git log $newsha -1 --decorate --tags`;
eval {
API::Submission::add($promo, $id_project, $tag, $repo_login, $last_commit);
};
if ($@) {
my $err = $@;
log DEBUG, "ERROR: ".$err;
log DONE, "Tag '$tag' effectué avec succès !";
}
else {
log DONE, "Tag '$tag' effectué avec succès ! Vérifiez-le sur l'intranet.";
}
}
return 1;
}
exit 0;

View file

@ -6,31 +6,40 @@ then
exit 1
fi
clean_tex()
tex2md()
{
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 *.cls *.sty *.tex
do
if [ -f "$f" ]
then
git rm -f "$f" > /dev/null
elif [ -d "$f" ]
then
git rm -fr "$f" > /dev/null
fi
done
if [ -z "$1" ]
then
echo "tex2md: No argument given"
exit 2
fi
DEST="$1"
cd include
for i in `find -type f -name '*.tex'`
do
bi=`basename "$i"`
echo -e "\e[1;34m>>>\e[1;37m Trying to convert $i to Markdown...\e[0m"
# 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"
# 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"
@ -44,7 +53,7 @@ clean_tex()
sed -Ei 's/\\verb ([^+]+) /\\verb+\1+/g' "$i"
# Special macros
sed -Ei 's/\\(file|email|command) *\{([^{]*\{[^}]*\})*([^}]*)}/\\verb+\2\3+/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"
@ -64,22 +73,24 @@ clean_tex()
sed -Ei 's/\\frame//g' "$i"
sed -Ei 's/\\item( *)<[^>]+>/\\item\1/g' "$i"
if pandoc -o ../${bi%%.tex}.md $i
# END HACK!
sed -Ei 's/__OPEN_BRACKET_MINIROOT__/\{/gi' "$i"
sed -Ei 's/__CLOSE_BRACKET_MINIROOT__/\}/gi' "$i"
if pandoc -o "$DEST"/${bi%%.tex}.md $i
then
git add ../${bi%%.tex}.md
git add "$DEST"/${bi%%.tex}.md
git checkout "$i"
git rm -f "$i" > /dev/null
fi
sed -Ei 's/`%%([a-z-])\(([^)]+)\)`/%%\1(\2)/gi' "../${bi%%.tex}.md"
sed -Ei 's/\\$/\n/' "../${bi%%.tex}.md"
sed -Ei 's/`%%([a-z-]+)\(([^)]+)\)`/%%\1(\2)/gi' "$DEST/${bi%%.tex}.md"
sed -Ei 's/\\$/\n/' "$DEST/${bi%%.tex}.md"
done
if [ `find | wc -l` -gt 1 ]
then
git mv * ..
fi
cd - > /dev/null
}
maintex2md()
{
if [ -f "mySubject.md" ]
then
git mv "mySubject.md" "main.md"
@ -93,8 +104,76 @@ clean_tex()
then
git mv "myTutorial.md" "main.md"
fi
}
rmdir include
clean_tex()
{
if [ -z "$1" ] || ! [ -d "$1" ]
then
echo "NON"
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 images/acu_2012_logo_hd.png *.cls *.sty *.toc
do
if [ -f "$f" ]
then
git rm -f "$f" > /dev/null
elif [ -d "$f" ]
then
git rm -fr "$f" > /dev/null
fi
done
for file in `find -name "*.ltx"`
do
git mv "$file" "${file%%.ltx}.tex"
done
if [ -d "include" ]
then
cd include
tex2md ..
if [ `find | wc -l` -gt 1 ]
then
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
rmdir include 2> /dev/null
elif [ `find -mindepth 1 -maxdepth 1 -name '*.tex' | wc -l` -gt 0 ]
then
tex2md .
else
for i in *
do
if [ -d "$i" ]
then
echo -e "\e[1;32m>>>\e[1;37m Subsubject found: $i\e[0m"
cd "$i"
clean_tex "$1/$i" "$1"
fi
done
fi
cd "$2"
}
TMPDIR=`mktemp -d`
@ -152,7 +231,7 @@ if ls | grep "moulette"
then
echo -e "\e[1;34m>>>\e[1;37m Creating moulette branch...\e[0m"
git checkout -b moulette
find -mindepth 1 -maxdepth 1 ! -name moulette ! -name tests ! -name .git -exec git rm -rf {} \;
git rm -f moulette/DESC 2> /dev/null
@ -242,8 +321,7 @@ do
then
echo -e "\e[1;32m##\e[1;37m Find directory $DIR with some .tex files \e[1;32m##\e[0m"
cd "$DIR"
clean_tex "$DIR"
cd ..
clean_tex `pwd` `readlink -f "$(pwd)/.."`
echo -e "\e[1;32m## ## ## ## ##\e[0m"
echo
@ -270,6 +348,18 @@ do
git rm -rf "$f" > /dev/null
fi
done
# Append Fact lines
if [ -f "Makefile" ]
then
cat <<EOF >> Makefile
fact:
rm -rf ref.ff
\${FACT} package create ../ref ref.ff
\${FACT} make make ref.ff ref.ff
EOF
fi
cd - > /dev/null
fi
done

View file

@ -14,6 +14,7 @@ use ACU::Process;
my %master_actions =
(
"launch" => \&master_launch,
"list" => \&master_list,
"register" => \&master_register,
);
@ -23,17 +24,40 @@ sub master_register
{
my $args = shift;
if ($args->{param}{nodename}) {
if ($args->{param}{nodename})
{
my $nodename = $args->{param}{nodename};
log INFO, "New node: $nodename";
push @nodes, "$nodename";
if (! grep { $_ eq $nodename } @nodes)
{
log INFO, "New node: $nodename";
push @nodes, "$nodename";
}
else {
log WARN, "Node $nodename alredy registered";
}
}
else {
log WARN, "nodename empty, cannot register new node";
}
}
sub master_list
{
my $doc = XML::LibXML::Document->new('1.0');
my $root = $doc->createElement("process");
for my $target (@nodes)
{
my $t = $doc->createElement("target");
$t->setAttribute("name", $target);
$root->appendChild($t);
}
$doc->setDocumentElement( $root );
return $doc->toString();
}
sub build_task_xml
{
my $files = shift;
@ -121,13 +145,13 @@ sub master_launch
}
for my $node (@lnodes) {
my $o = $ret{$node}->documentElement->getElementsByTagName("out");
if ($o) {
my @o = $ret{$node}->documentElement->getElementsByTagName("out");
if (@o) {
$output .= $o[0]->firstChild->nodeValue;
}
$e = $ret{$node}->documentElement->getElementsByTagName("err");
if ($e) {
my @e = $ret{$node}->documentElement->getElementsByTagName("err");
if (@e) {
$output .= $e[0]->firstChild->nodeValue;
}
$output .= $e[0]->firstChild->nodeValue;
@ -172,4 +196,5 @@ sub process_master
log INFO, "Starting guantanamo.pl as master process";
Process::add_server("gearmand:4730");
Process::register("guantanamo", \&process_master);

View file

@ -9,7 +9,6 @@ use File::Temp qw/tempfile tempdir/;
use IPC::Open3;
use XML::LibXML;
use ACU::LDAP;
use ACU::Log;
use ACU::Process;
@ -53,10 +52,18 @@ sub node_launch
$command->appendText($c->{nodeValue});
$cmd->appendChild($command);
my($wtr, $rdr, $stderr);
my $pid = open3($wtr, $rdr, $stderr, $c->{nodeValue});
waitpid( $pid, 0 );
my $rv = $? >> 8;
my($wtr, $rdr, $rv);
my $stderr = "";
eval {
my $pid = open3($wtr, $rdr, $stderr, "sh", "-c", $c->{nodeValue});
waitpid( $pid, 0 );
$rv = $? >> 8;
};
if ($@)
{
$stderr = $@ . $stderr;
$rv = -1;
}
my $out = $doc->createElement("out");
my $str = "";
@ -93,7 +100,7 @@ sub process_node
my $action = $args->{param}{action} // "launch";
if (! exists $node_actions{$action}) {
log WARN, "Unknown action '$action' for guantanamo node process.";
warn "Unknown action '$action' for guantanamo node process.";
}
return $node_actions{$action}($args);
}
@ -102,7 +109,7 @@ if ($#ARGV == 0)
{
log INFO, "Starting guantanamo.pl as node process";
Process::Client::launch("guantanamo", {"action" => "register", "nodename" => $ARGV[0]});
Process::Client::launch("guantanamo", {"action" => "register", "nodename" => $ARGV[0]}, undef, 1);
Process::register("guantanamo_".$ARGV[0], \&process_node);
}

View file

@ -0,0 +1,138 @@
#!/usr/bin/env sh
cd $(dirname "$0")
GREP='/usr/bin/env grep -E'
SCREEN='/usr/bin/env screen'
SED='/usr/bin/env sed -E'
if [ `uname -s` = "FreeBSD" ]; then
SU="/usr/bin/env su"
else
SU='/usr/bin/env su -s /bin/sh'
fi
PERL='/usr/bin/env perl'
# Install missing packages
DEB_PACKAGES_LIST="screen libxml-libxml-perl libgearman-client-perl"
ARCH_PACKAGES_LIST="screen"
GENTOO_PACKAGES_LIST="app-misc/screen dev-perl/XML-LibXML"
FBSD_PACKAGES_LIST="screen p5-XML-LibXML p5-Gearman p5-Term-ANSIColor"
KERNEL=`uname -s`
if [ "$KERNEL" = "FreeBSD" ]
then
for PK in `echo $FBSD_PACKAGES_LIST`
do
if ! pkg info "$PK" > /dev/null 2> /dev/null
then
if ! PACKAGESITE="http://canon.acu.epita.fr/repo-lab" pkg install "$PK"
then
echo "Error during installation of $PK"
exit 1
fi
fi
done
if ! getent passwd | grep "guantanamo:" > /dev/null 2> /dev/null
then
pw useradd guantanamo -u 941 -d /home/guantanamo -s /bin/false
fi
elif [ "$KERNEL" = "Linux" ]
then
if [ -f "/etc/debian_version" ]
then
if ! whereis dpkg > /dev/null 2> /dev/null
then
if ! aptitude install dpkg
then
echo "Error during installation of $PK"
exit 1
fi
fi
for PK in $DEB_PACKAGES_LIST
do
if ! dpkg -l | grep "^ii" | grep "$PK" > /dev/null 2> /dev/null
then
aptitude install "$PK"
fi
done
elif [ -f "/etc/arch-release" ]
then
for PK in $ARCH_PACKAGES_LIST
do
if ! pacman -Qi "$PK" > /dev/null 2> /dev/null
then
if ! pacman -S "$PK"
then
echo "Error during installation of $PK"
exit 1
fi
fi
done
elif [ -f "/etc/gentoo-release" ]
then
for PK in $GENTOO_PACKAGES_LIST
do
if ! equery list "$PK" > /dev/null 2> /dev/null
then
if ! emerge "$PK"
then
echo "Error during installation of $PK"
exit 1
fi
fi
done
else
echo "Unsupported GNU/Linux distribution :("
exit 1;
fi
# Add guantanamo user if missing
if ! getent passwd | grep "guantanamo:" > /dev/null 2> /dev/null
then
useradd --shell /bin/false --uid 941 guantanamo &&
mkdir -p /home/guantanamo
fi
chown -R guantanamo:guantanamo /home/guantanamo
else
echo "Unsupported operating system :("
exit 1;
fi
chown -R guantanamo .
if [ $# -gt 0 ]
then
ARCHNAME=$1
else
echo "Expected at first argument: node name. For example: hurd-ia64"
exit 1
fi
CMD="$SCREEN -S 'guantanamo_$ARCHNAME' -d -m sh -c 'while true; do perl guantanamo_node.pl $ARCHNAME; done'"
if [ "x$UID" = "x0" ]
then
echo "$CMD" | $SU guantanamo
else
$CMD
fi

View file

@ -8,6 +8,7 @@ use Pod::Usage;
use lib "../../";
use ACU::API::Projects;
use ACU::Log;
use ACU::LDAP;
use ACU::Grading;
@ -28,7 +29,10 @@ my %actions = (
"create" => \&update_project,
"update" => \&update_project,
"delete" => \&delete_project,
}
},
"trace" => {
"update" => \&update_trace,
},
);
sub create_tree($$)
@ -36,16 +40,11 @@ sub create_tree($$)
my $year = shift;
my $project_id = shift;
if (! -d "$basedir/$year/") {
log ERROR, "No directory for year $year. Ask a root to create it.";
return "No directory for year $year. Ask a root to create it.";
}
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/";
mkdir "$basedir/$year/$project_id/" or die $!;
}
return 0;
}
@ -56,17 +55,17 @@ sub grades_generate
my $project_id = $args->{param}{id};
my $year = $args->{param}{year} // LDAP::get_year;
if (! $project_id) {
log ERROR, "No project_id given.";
return "No project_id given";
}
croak "No project_id given." if (! $project_id);
if (! -e "$basedir/$year/$project_id/grades/") {
mkdir "$basedir/$year/$project_id/grades/";
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})
@ -77,22 +76,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;
@ -102,10 +90,7 @@ sub grades_generate
if (exists $args->{files}{"grading.xml"}) {
$grading = $args->{files}{"grading.xml"};
}
if (! $grading) {
log ERROR, "Invalid grading.xml received!";
return "Invalid grading.xml received!";
}
croak "Invalid grading.xml received!" if (! $grading);
$grading = Grading->new($grading);
@ -115,27 +100,57 @@ sub grades_generate
for my $login (@logins)
{
my @files;
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, "Will fetch identifiers from $dir";
# Looking for a group traces first
for my $grp (@{ $groups->{groups} })
{
open my $xmltrace, "<", "$basedir/$year/$project_id/traces/$dir/$login.xml" or croak "traces/$dir/$login.xml: $!";
binmode $xmltrace;
my $trace = Trace->new($xmltrace);
close $xmltrace;
log DEBUG, "Fill from file: traces/$dir/$login.xml";
log TRACE, $trace->getIds;
$grading->fill($trace->getIds);
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)
{
if (-f "$basedir/$year/$project_id/traces/$dir/".$chief->{login}.".xml") {
push @files, "$basedir/$year/$project_id/traces/$dir/".$chief->{login}.".xml";
}
last;
}
}
if (-f "$basedir/$year/$project_id/traces/$dir/$login.xml") {
push @files, "$basedir/$year/$project_id/traces/$dir/$login.xml";
}
}
for my $path (@files)
{
open my $xmltrace, "<", "$path" or die "$path: $!";
binmode $xmltrace;
my $trace = Trace->new(join '', <$xmltrace>);
close $xmltrace;
log DEBUG, "Fill from file: $path";
log TRACE, $trace->getIds($login);
$grading->fill($trace->getNonZeroIds($login));
}
log DEBUG, "Computed grades: ".$grading->compute($login);
open my $xmlgrade, ">", "$basedir/$year/$project_id/grades/$login.xml" or croak "grades/$login.xml";
open my $xmlgrade, ">", "$basedir/$year/$project_id/grades/$login.xml" or croak "grades/$login.xml: $!";
binmode $xmlgrade;
print $xmlgrade $grading->computeXML($login);
close $xmlgrade;
@ -143,7 +158,7 @@ sub grades_generate
$grading->reset();
}
return "Ok";
return 1;
}
sub grades_new_bonus
@ -154,16 +169,14 @@ sub grades_new_bonus
my $delete = $args->{param}{delete};
my $year = $args->{param}{year} // LDAP::get_year;
if (! $project_id) {
log ERROR, "No project_id given.";
return "No project_id given";
}
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/";
mkdir "$basedir/$year/$project_id/traces/" or die $!;
}
if (! -e "$basedir/$year/$project_id/traces/bonus/") {
mkdir "$basedir/$year/$project_id/traces/bonus/";
mkdir "$basedir/$year/$project_id/traces/bonus/" or die $!;
}
for my $kfile (keys %{ $args->{files} })
@ -190,7 +203,7 @@ sub grades_new_bonus
for my $line (@lines)
{
if ($line =~ /^([a-z0-9_-]+)(?:\s*:\s*([0-9.]+))?$/)
if ($line =~ /^([a-z0-9_-]+)(?:\s*:\s*(-?[0-9.]+))?$/)
{
my $login = $1;
my $tvalue = $2 // $value;
@ -203,9 +216,9 @@ 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);
$trace = Trace->new(join '', <$xml>);
close $xml;
}
elsif ($delete) {
@ -222,22 +235,23 @@ sub grades_new_bonus
$trace->delId($kbonus);
}
} else {
$trace->addId($kbonus, $tvalue);
my $e = $trace->addId($kbonus, $tvalue);
$e->changeWho($login, "login");
}
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;
}
else {
log WARN, "Invalid login $line, line skiped";
warn "Invalid login $line, line skiped";
}
}
}
return "Ok";
return 1;
}
sub update_defense
@ -247,47 +261,38 @@ sub update_defense
my $project_id = $args->{param}{id};
my $year = $args->{param}{year} // LDAP::get_year;
if (! $project_id) {
log ERROR, "No project_id given.";
return "No project_id given";
}
croak "No project_id given" if (! $project_id);
my $defense_id = $args->{param}{defense_id};
if (! $defense_id) {
log ERROR, "No defense_id given.";
return "No defense_id given";
}
croak "No defense_id given" if (! $defense_id);
my $defense;
if (exists $args->{files}{"$defense_id.xml"}) {
$defense = $args->{files}{"$defense_id.xml"};
}
if (! $defense) {
log ERROR, "Invalid $defense_id.xml received!";
return "Invalid $defense_id.xml received!";
}
croak "Invalid $defense_id.xml received!" if (! $defense);
log INFO, "Update $year/$project_id/defenses/$defense_id.xml";
if (! -e "$basedir/$year/$project_id/defenses/") {
mkdir "$basedir/$year/$project_id/defenses/";
mkdir "$basedir/$year/$project_id/defenses/" or die $!;
}
if (! -e "$basedir/$year/$project_id/traces/") {
mkdir "$basedir/$year/$project_id/traces/";
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/";
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/";
chmod 0775, "$basedir/$year/$project_id/traces/defense_$defense_id/";
chown $uid, $gid, "$basedir/$year/$project_id/traces/defense_$defense_id/";# or die $!; #FIXME
chmod 0775, "$basedir/$year/$project_id/traces/defense_$defense_id/" or die $!;
}
open my $out, ">", "$basedir/$year/$project_id/defenses/$defense_id.xml";
open my $out, ">", "$basedir/$year/$project_id/defenses/$defense_id.xml" or die $!;
print $out $defense;
close $out;
return "Ok";
return 1;
}
sub update_project
@ -297,29 +302,63 @@ sub update_project
my $project_id = $args->{param}{id};
my $year = $args->{param}{year} // LDAP::get_year;
if (! $project_id) {
log ERROR, "No project_id given.";
return "No project_id given";
}
croak "No project_id given" if (! $project_id);
my $butler;
if (exists $args->{files}{"butler.xml"}) {
$butler = $args->{files}{"butler.xml"};
}
if (! $butler) {
log ERROR, "Invalid butler.xml received!";
return "Invalid butler.xml received!";
}
croak "Invalid butler.xml received!" if (! $butler);
log INFO, "Update $year/$project_id/butler.xml";
return $_ if (create_tree($year, $project_id));
create_tree($year, $project_id);
open my $out, ">", "$basedir/$year/$project_id/butler.xml";
print $out $butler;
close $out;
return "Ok";
return 1;
}
sub update_trace
{
my $args = shift;
my $project_id = $args->{param}{id};
my $year = $args->{param}{year} // LDAP::get_year;
croak "No project_id given" if (! $project_id);
my $rendu_id = $args->{param}{rendu};
croak "No rendu_id given" if (! $rendu_id);
my $login = $args->{param}{login};
croak "No login given" if (! $login);
my $trace;
if (exists $args->{files}{"$login.xml"}) {
$trace = $args->{files}{"$login.xml"};
}
croak "Invalid $login.xml received!" if (! $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 die $!;
}
if (! -e "$basedir/$year/$project_id/traces/$rendu_id/") {
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");
print $out $trace;
close $out;
return 1;
}
sub delete_project
@ -335,12 +374,18 @@ sub process_get
my $type = $args->{param}{type};
my $action = $args->{param}{action} // "update";
if (! exists $actions{$type}{$action}) {
log WARN, "Unknown action '$action' for $type.";
return "Unknown action '$action' for $type.";
}
croak "Unknown action '$action' for $type." if (! exists $actions{$type}{$action});
eval {
$actions{$type}{$action}($args);
};
if ($@) {
my $err = $@;
log ERROR, $err;
return $err;
}
return "Ok";
return $actions{$type}{$action}($args);
}
Process::register("intradata_get", \&process_get);

View file

@ -3,89 +3,134 @@
use v5.10.1;
use strict;
use warnings;
use threads;
use threads::shared;
use Carp;
use Pod::Usage;
use File::Basename;
use File::Compare;
use File::Copy;
use File::Path qw(remove_tree);
use File::Path qw(remove_tree mkpath);
use File::Temp qw/tempfile tempdir/;
use Sys::Gamin;
use ACU::Log;
use ACU::Process;
my %actions = (
"tar" => \&receive_tar,
"git" => \&receive_git,
"std" => \&receive_std, #STuDent
"ref" => \&receive_ref,
"tests" => \&create_testsuite,
"moulette" => \&moulette,
);
my %monitored_dir = ();
sub jail_exec
{
my $cmd = shift;
qx(jexec moulette1 /bin/sh -c "FACT='/usr/local/bin/mono /usr/local/fact/FactExe.exe' $cmd");
croak "Erreur while executing '$cmd'" if ($?);
}
sub fact_exec
{
my $cmd = shift;
my $rundir = shift;
# Check that Fact is running
qx/pgrep mono/;
while ($?)
{
log ERROR, "Fact is not running ... waiting for respawn";
sleep(10);
qx/pgrep mono/;
}
jail_exec("cd '$rundir' && /usr/local/bin/mono /usr/local/fact/FactExe.exe $cmd");
}
sub prepare_dir
{
my $year = shift;
my $project_id = shift;
my $rendu = shift;
# TODO: replace ~calvair by the destination directory
my $dir = "~calvair/$year-$project_id-$rendu/";
my @dirs = ("/data/work/$year-$project_id-$rendu/", "/data/output/$year-$project_id-$rendu/", "/data/files/$year-$project_id-$rendu/");
if (! -d $dir) {
mkpath($destdir) or croak "An error occurs while creating directory: $!";
for my $dir (@dirs)
{
if (! -d $dir) {
mkpath($dir) or croak "An error occurs while creating directory: $!";
}
my ($login, $pass, $uid, $gid) = getpwnam("intradmin");
chown $uid, $gid, $dir;
chmod 0770, $dir;
}
return $dir;
return @dirs;
}
sub receive_tar
sub receive_ref
{
my $args = shift;
my $project_id = $args->{param}{id};
my $year = $args->{param}{year};
my $rendu = $args->{param}{rendu};
my $file = $args->{param}{file};
my $login = $args->{param}{login} // "ref";
croak "No file named '$file' given" if (!exists $args->{files}{$file});
my ($fh, $filename) = tempfile(SUFFIX => $file);
binmode($fh);
print $fh $args->{files}{$file};
close $fh;
my $tempdir = tempdir(DIR => '/data/tmp');
my $destdir = prepare_dir($year, $project_id, $file);
# TODO: Call Fact for create .ff
# qx(Fact package create $filename $destdir/$login.ff)
croak "Cannot create $login.ff" if ($?);
# Clean
unlink $filename;
}
sub receive_git
{
my $args = shift;
my $project_id = $args->{param}{id};
my $year = $args->{param}{year};
my $rendu = $args->{param}{rendu};
my $file = $args->{param}{file};
my $login = $args->{param}{login} // "ref";
croak "No file named '$file' given" if (!exists $args->{files}{$file});
my $tempdir = tempdir();
open my $fh, "|tar -xz -C '$tempdir'";
open my $fh, "|tar -xz -f - -C '$tempdir'";
print $fh $args->{files}{$file};
close $fh;
croak "An error occurs while extracting the tarball" if ($?);
my $destdir = prepare_dir($year, $project_id, $file);
# TODO: Call Fact for create .ff
# qx(Fact package create $tempdir $destdir/$login.ff)
croak "Cannot create $login.ff" if ($?);
jail_exec("gmake -C $tempdir/ref/ fact");
croak "An error occurs while making the testsuite" if ($?);
my $destdir = ( prepare_dir($year, $project_id, $rendu) )[2];
copy("$tempdir/ref/ref.ff", "$destdir/ref.ff") or croak "An error occurs while coping ref.ff: $!";
# Clean
remove_tree($tempdir);
run_moulette($project_id, $year, $rendu);
}
sub receive_std
{
my $args = shift;
my $project_id = $args->{param}{id};
my $year = $args->{param}{year};
my $rendu = $args->{param}{rendu};
my $file = $args->{param}{file};
my $login = $args->{param}{login} // "ref";
log INFO, "Receiving student tarball: $login, for $year-$project_id-$rendu";
croak "No file named '$file' given" if (!exists $args->{files}{$file});
my $tempdir = tempdir(DIR => '/data/tmp');
open my $fh, "|tar -xz -f - -C '$tempdir'";
print $fh $args->{files}{$file};
close $fh;
croak "An error occurs while extracting the tarball" if ($?);
my $destdir = ( prepare_dir($year, $project_id, $rendu) )[2];
fact_exec("package create '$tempdir' '$destdir/$login.ff'", $destdir);
croak "Cannot create $login.ff" if ($?);
chmod 0666, "$destdir/$login.ff";
# Clean
remove_tree($tempdir);
run_moulette($project_id, $year, $rendu, $login);
}
sub create_testsuite
@ -98,52 +143,216 @@ sub create_testsuite
croak "No file named '$file' given" if (!exists $args->{files}{$file});
my $tempdir = tempdir();
open my $fh, "|tar -xz -C '$tempdir'";
my $tempdir = tempdir(DIR => '/data/tmp');
open my $fh, "|tar -xz -f - -C '$tempdir'";
print $fh $args->{files}{$file};
close $fh;
croak "An error occurs while extracting the tarball" if ($?);
qx(make -C $tempdir/tests/);
jail_exec("gmake -C $tempdir/tests/");
croak "An error occurs while making the testsuite" if ($?);
my $destdir = prepare_dir($year, $project_id, $rendu);
my ($workdir, $outputdir, $destdir) = prepare_dir($year, $project_id, $rendu);
copy("$tempdir/tests/tests.ff", "$destdir/tests.ff") or croak "An error occurs while coping the testsuite: $!";
copy("$tempdir/tests/test.ft", "$destdir/test.ft") or croak "An error occurs while coping test.ft: $!";
chmod 0660, "$destdir/tests.ff";
# Check if test.ft has changed
if (-f "$tempdir/tests/test.ft")
{
if (! -f "$destdir/test.ft" || compare("$tempdir/tests/test.ft", "$destdir/test.ft"))
{
log DEBUG, "test.ft has changed, UPDATE students ones.";
copy("$tempdir/tests/test.ft", "$destdir/test.ft") or croak "An error occurs while coping test.ft: $!";
chmod 0660, "$destdir/test.ft";
opendir(my $dh, $workdir) or die "Can't list files in $workdir: $!";
while (readdir($dh))
{
if (/([a-zA-Z0-9_-]+).ft$/)
{
log DEBUG, "Remove $1.ft";
unlink "$workdir/$1.ft";
}
}
closedir $dh;
}
else
{
log DEBUG, "test.ft hasn't changed, KEEP students ones.";
}
}
else {
remove_tree($tempdir);
croak "tests/test.ft not found.";
}
# Clean
remove_tree($tempdir);
run_moulette($project_id, $year, $rendu);
}
sub run_moulette
{
my $project_id = shift;
my $year = shift;
my $rendu = shift;
my @logins = @_;
my ($workdir, $outputdir, $filesdir) = prepare_dir($year, $project_id, $rendu);
if ($#logins == -1)
{
# Get all submissions
opendir(my $dh, $filesdir) or die "Can't list files in $filesdir: $!";
while (readdir($dh))
{
if (/([a-zA-Z0-9_-]+).ff$/ && -f "$filesdir/$_" && ! /^tests\.ff$/) {
push @logins, $1;
}
}
closedir $dh;
}
for my $login (@logins)
{
my $fhin;
if (-f "$filesdir/test.ft") {
open $fhin, "<", "$filesdir/test.ft" or croak "Unable to open $filesdir/test.ft: $!";
}
if ($fhin)
{
open my $fhout, ">", "$workdir/$login.ft" or croak "Unable to update $workdir/$login.ft file: $!";
while (<$fhin>)
{
$_ =~ s/#LOGIN_X/$login/g;
$_ =~ s%#GLOBAL%/data/global/%g;
$_ =~ s/#PROJECT/$filesdir/g;
$_ =~ s/#SUBMIT/$workdir/g;
$_ =~ s/#OUTPUT/$outputdir/g;
print $fhout $_;
}
close $fhin;
close $fhout;
}
copy("$filesdir/$login.ff", "$workdir/$login.ff") or croak "Cannot copy $login.ff";
next if ($login eq "ref" && ! -f "$workdir/$login.ft");
croak "Unable to find a relevant $login.ft, abort moulette start." if (! -f "$workdir/$login.ft");
log WARN, "There is no ref for $project_id $rendu" if (! -f "$filesdir/ref.ff");
log WARN, "There is no $login.ff for $project_id $rendu" if (! -f "$workdir/$login.ff");
unlink "$outputdir/$login.xml" if ( -f "$outputdir/$login.xml");
monitor_dir($outputdir, $project_id, $year, $rendu);
log INFO, "$workdir/$login.ft append to Fact manager";
fact_exec("system manager $workdir/$login.ft", $workdir);
log ERROR, "An error occurs while starting tests for $login on $year-$project_id-$rendu" if ($?);
}
}
sub moulette
{
my $args = shift;
my $project_id = $args->{param}{id};
my $year = $args->{param}{year};
my $rendu = $args->{param}{rendu};
my $testdir = prepare_dir($year, $project_id, $rendu);
chdir($testdir);
for (my $i = $args->{unamed}; $i > 0; $i--)
if ($args->{unamed} == 0)
{
my $login = $args->{param}{$i}
open my $fhin, "<", "$testdir/test.ft";
open my $fhout, ">", "$testdir/$login.ft";
print $fhout s/#LOGIN_X/$login/g while (<$fhin>);
close $fhin;
close $fhout;
# TODO: Call Fact to launch student tarball
# qx(Fact system manager $login.ft)
log WARN, "An error occurs while starting tests for $login on $year-$project_id-$rendu" if ($?);
# Run on all submissions
run_moulette($args->{param}{id},
$args->{param}{year},
$args->{param}{rendu});
}
else
{
for (my $i = $args->{unamed}; $i > 0; $i--)
{
run_moulette($args->{param}{id},
$args->{param}{year},
$args->{param}{rendu},
$args->{param}{$i});
}
}
}
sub trace_send
{
my $path = shift;
my $filename = shift;
my $login = shift;
my $id = shift;
my $year = shift;
my $rendu = shift;
return if (! -f "$path/$filename");
my $file_content;
open my $fh, "<", "$path/$filename" or croak("Unable to read $path/$filename: $!");
$file_content .= $_ while(<$fh>);
close $fh;
log INFO, "Send trace from $path/$filename to intranet ...";
# Send trace over Gearman
Process::Client::launch(
"intradata_get",
{ "type" => "trace",
"action" => "update",
"id" => $id,
"year" => $year,
"rendu" => $rendu,
"login" => $login },
{ "$login.xml" => $file_content },
1
);
# Remove transfered trace
unlink "$path/$filename";
}
sub monitor_start
{
my $dir = shift;
my $id = shift;
my $year = shift;
my $rendu = shift;
my $fm = new Sys::Gamin;
log INFO, "Monitoring $dir";
$fm->monitor($dir);
while (1) {
my $event=$fm->next_event;
if (($event->type eq "create" || $event->type eq "change" || $event->type eq "exist") &&
$event->filename =~ /([^\/\\]+)\.xml$/ ) {
my $login = $event->filename;
$login =~ s/\.xml$//;
trace_send($dir, $event->filename, $login, $id, $year, $rendu);
}
}
monitor_traces( $fm->next_event ) while (1);
}
sub monitor_dir
{
my $dir = shift;
my $id = shift;
my $year = shift;
my $rendu = shift;
return if (exists ($monitored_dir{$dir}));
$monitored_dir{$dir} = threads->create(\&monitor_start, $dir, $id, $year, $rendu);
}
sub process_get
{
my ($given_args, $args) = @_;
@ -157,7 +366,7 @@ sub process_get
eval {
$actions{$type}($args);
}
};
if ($@) {
my $err = $@;
log ERROR, $err;

60
process/files/send_git.pl Normal file
View file

@ -0,0 +1,60 @@
#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
use v5.10;
use File::Path qw(remove_tree);
use File::Temp qw/tempfile tempdir/;
use ACU::LDAP;
use ACU::Log;
use ACU::Process;
sub process
{
my ($given_args, $args) = @_;
my $year = $args->{param}{year} // LDAP::get_year();
my $project_id = $args->{param}{id};
my $rendu = $args->{param}{rendu};
my $login = $args->{param}{login};
my $rendu_for = $rendu;
if ($rendu =~ /^(ACU|YAKA)-(.*)$/) {
$rendu_for = $2;
}
my $path = $args->{param}{path} // "ssh://git\@localhost/$year/$project_id/$login.git";
my $tempdir = tempdir();
qx/git clone -b '$rendu' '$path' '$tempdir'/ or croak "$path is not a valid repository.";
croak "$path is not a valid repository." if ($?);
my $tar;
open my $fh, "tar -czf - -C '$tempdir' . |" or die ("Error during tar: " . $!);
$tar .= $_ while(<$fh>);
close $fh;
die "Unable to tar: $!" if ($?);
# Clean
remove_tree($tempdir);
return Process::Client::launch("moulette_get",
{
"type" => "std",
"id" => $project_id,
"year" => $year,
"rendu" => $rendu_for,
"login" => $login,
"file" => "rendu.tgz"
},
{
"rendu.tgz" => $tar
});
}
Process::register("send_git", \&process);

View file

@ -6,25 +6,34 @@ GREP='/usr/bin/env grep -E'
SCREEN='/usr/bin/env screen'
SED='/usr/bin/env sed -E'
if [ `uname -s` = "FreeBSD" ]; then
SU='/usr/bin/env su'
SU="/usr/bin/env su"
else
SU='/usr/bin/env su -s /bin/sh'
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"
fi
echo "$SCREEN -S '$1' -d -m bash -c '$CMD'" | $SU intradmin
if [ "$HOSTNAME" = "ksh" ]
then
$SCREEN -S "$1" -d -m sh -c "$CMD"
else
echo "$SCREEN -S '$1' -d -m sh -c '$CMD'" | $SU intradmin
fi
if [ -f "$TMP" ]
then
@ -50,12 +59,23 @@ fi
if [ "$ACTION" = "stop" ] || [ "$ACTION" = "restart" ]
then
# Kill old liblersorf screen sessions
echo "$SCREEN -ls" | $SU intradmin | $GREP '[0-9]+\.lerdorf_[a-zA-Z0-9_-]+' |
while read LINE
do
SNAME=`echo $LINE | $SED "s/^[^0-9]*([0-9]+\.[^ \t]+).*$/\1/"`
echo "$SCREEN -S \"$SNAME\" -X kill" | $SU intradmin
done
if [ "$HOSTNAME" = "ksh" ]
then
for i in `pgrep sh`
do
if [ "$$" != "$i" ]
then
pkill "$i"
fi
done
else
echo "$SCREEN -ls" | $SU intradmin | $GREP '[0-9]+\.lerdorf_[a-zA-Z0-9_-]+' |
while read LINE
do
SNAME=`echo $LINE | $SED "s/^[^0-9]*([0-9]+\.[^ \t]+).*$/\1/"`
echo "$SCREEN -S \"$SNAME\" -X kill" | $SU intradmin
done
fi
fi
@ -64,11 +84,15 @@ then
case $HOSTNAME in
cpp)
launch_screen "lerdorf_process_exec_guantanamo" "while true; do $PERL ~/liblerdorf/process/exec/guantanamo.pl; done"
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
;;
moore)

View file

@ -17,8 +17,16 @@ use ACU::Log;
sub check_key($)
{
my $filename = shift;
# Check file content format
open my $fh, "<", $filename;
my $fcnt = <$fh>;
close $fh;
chomp($fcnt);
# Call ssh-keygen
if (`ssh-keygen -l -f $filename 2> /dev/null` =~ /^([0-9]+) +[0-9a-f:]+ +.+ +\(([A-Z]+)\)$/)
if ($fcnt =~ /^(ssh|ecdsa)-[a-z0-9-]+ [a-zA-Z0-9+=\/]+( .*)?$/ &&
`ssh-keygen -l -f $filename 2> /dev/null` =~ /^([0-9]+) +[0-9a-f:]+ +.+ +\(([A-Z]+)\)$/)
{
log INFO, "Receive valid key: type $2, size $1";
if ($2 eq "RSA") {

View file

@ -7,8 +7,6 @@ use File::Basename;
use Mail::Internet;
use Pod::Usage;
use lib "../../";
use ACU::Log;
use ACU::LDAP;
use ACU::Process;

View file

@ -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
@ -27,72 +27,75 @@ 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 $grade = Grading->new();
my @defenses;
# Create defenses groups
opendir(my $dh, "$basedir/$year/$project_id/defenses/") or croak "can't opendir $basedir/$year/$project_id/defenses/: $!";
for my $sout (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/defenses/$_" } readdir($dh))
{
my $sid;
($sid = $sout) =~ s/\.xml$//;
push @defenses, $sid;
open my $xml, "<", "$basedir/$year/$project_id/defenses/$sout" or die $!;
binmode $xml;
my $str;
$str .= $_ while (<$xml>);
my $defense = Defense->new($str);
my $ids = $defense->getIds();
my @keys = keys %$ids;
my $def_i = $keys[0];
$def_i =~ s/^(.+)g.*$/$1/;
$ids->{$def_i.'_end_$LOGIN'} = undef;
$ids->{$def_i.'_end_group'} = undef;
$grade->create_from_ids($sid, $ids);
}
closedir $dh;
# Create traces groups
opendir($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))
if (-d "$basedir/$year/$project_id/defenses/")
{
next if (grep { $dir eq "defense_$_" } @defenses);
# Create defenses groups
opendir(my $dh, "$basedir/$year/$project_id/defenses/") or croak "can't opendir $basedir/$year/$project_id/defenses/: $!";
for my $sout (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/defenses/$_" } readdir($dh))
{
my $sid;
($sid = $sout) =~ s/\.xml$//;
push @defenses, $sid;
my $ids = {};
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))
{
open my $xml, "<", "$basedir/$year/$project_id/traces/$dir/$login" or die $!;
open my $xml, "<", "$basedir/$year/$project_id/defenses/$sout" or die $!;
binmode $xml;
my $trace = Trace->new($xml);
my $str;
$str .= $_ while (<$xml>);
my %tids = %{ $trace->getIds() };
for my $kid (keys %tids)
{
$ids->{ $kid } = $tids{ $kid };
}
my $defense = Defense->new($str);
my $ids = $defense->getIds();
my @keys = keys %$ids;
my $def_i = $keys[0];
$def_i =~ s/^(.+)g.*$/$1/;
$ids->{$def_i.'_end_$LOGIN'} = undef;
$ids->{$def_i.'_end_group'} = undef;
$grade->create_from_ids($sid, $ids);
}
$grade->create_from_ids($dir, $ids);
closedir $dh;
}
if (-d "$basedir/$year/$project_id/traces/")
{
# Create traces groups
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))
{
next if (grep { $dir eq "defense_$_" } @defenses);
my $ids = {};
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))
{
open my $xml, "<", "$basedir/$year/$project_id/traces/$dir/$login" or die $!;
binmode $xml;
my $trace = Trace->new(join '', <$xml>);
my %tids = %{ $trace->getIds() };
for my $kid (keys %tids)
{
$ids->{ $kid } = $tids{ $kid };
}
}
$grade->create_from_ids($dir, $ids);
}
closedir $dh;
}
closedir $dh;
return $grade->toString;
}
Process::set_servers("gearmand:4730");
Process::register_no_parse("gen_grading", \&process);

View file

@ -12,6 +12,8 @@ use ACU::Log;
use ACU::LDAP;
use ACU::Process;
$ACU::Log::mail_error = 1;
our $basedir = "/intradata";
sub process
@ -23,14 +25,11 @@ 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;
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))
@ -49,9 +48,10 @@ 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");
$averages[$i] += $grade->getAttribute("value");
last;
}
}
@ -60,6 +60,7 @@ sub process
{
push @headers, $grade->getAttribute("name");
push @ugrades, $grade->getAttribute("value");
push @averages, $grade->getAttribute("value");
}
}
@ -70,24 +71,39 @@ 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)
{
my $g = shift @ugrades;
$out .= ",";
$out .= $g if ($g && $g ne $header);
if ($g && $g ne $header) {
$out .= $g;
} else {
$out .= "0";
}
}
$out .= "\n";
}
$out .= "Average";
foreach my $average (@averages)
{
$out .= ",".($average / $nb);
}
$out .= "\n";
return $out;
}
Process::set_servers("gearmand:4730");
Process::register_no_parse("get_csv", \&process);

1907
utils/lpt

File diff suppressed because it is too large Load diff