Bartender.pm 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package Bartender;
  2. use Dancer2;
  3. use Data::Dumper;
  4. use POSIX ();
  5. use URI::Encode ();
  6. our $VERSION = '0.1';
  7. die "config.yml not loaded" unless defined config->{appname};
  8. get '/' => sub {
  9. return "Welcome on " . config->{appname};
  10. };
  11. get '/shake' => sub {
  12. my %param = params;
  13. my $error = {};
  14. my $opt_dossier = $param{dossier};
  15. my $opt_base = $param{projetPadPrincipal};
  16. my $opt_garde = $param{projetPadGarde};
  17. my $opt_projet = $param{projetId};
  18. for($opt_dossier, $opt_projet) {
  19. if( m{[^a-zA-Z0-9_-]} ) {
  20. $error->{message} .= qq{"$_" est incorrect.};
  21. }
  22. }
  23. for($opt_base, $opt_garde) {
  24. if(not m/^https?:\/\/pad\.exegetes\.eu\.org\/(?:p|group\.html\/\d+\/pad\.html)\/g\./i ) {
  25. $error->{message} .= qq{"$_" est incorrect.};
  26. }
  27. }
  28. my $cocktail_binary = config->{cocktail}{binary};
  29. if(not defined $cocktail_binary) {
  30. $error->{message} .= qq{"cocktail:binary" n'est pas configuré dans config.yml};
  31. }
  32. elsif(not -x $cocktail_binary) {
  33. $error->{message} .= qq{"cocktail:binary" "$cocktail_binary" n'est pas executable};
  34. }
  35. if($error->{message}) {
  36. return template 'error', $error;
  37. }
  38. my $uri_encode_opts = {
  39. encode_reserved => 1,
  40. double_encode => 0,
  41. };
  42. $opt_base = URI::Encode::uri_encode($opt_base, $uri_encode_opts);
  43. $opt_garde = URI::Encode::uri_encode($opt_garde, $uri_encode_opts);
  44. system("$cocktail_binary -d $opt_dossier -b '$opt_base' -g '$opt_garde' -p $opt_projet &");
  45. redirect request->referer;
  46. };
  47. get '/status' => sub {
  48. my %param = params;
  49. my $error = {};
  50. my $opt_dossier = $param{dossier};
  51. my $opt_projet = $param{projetId};
  52. my $cocktail_store = config->{cocktail}{store};
  53. if(not defined $cocktail_store) {
  54. $error->{message} .= qq{"cocktail:store" n'est pas configuré dans config.yml};
  55. }
  56. if(not defined $opt_projet) {
  57. $error->{message} .= qq{arg:projetId est incorrect};
  58. }
  59. if($error->{message}) {
  60. return template 'error', $error;
  61. }
  62. my $lock_filename = "$cocktail_store/$opt_dossier/$opt_projet.lock";
  63. my $pdf_filename = "$cocktail_store/$opt_dossier/$opt_projet.pdf";
  64. my ($compilation_status, $compilation_text);
  65. if(-e $lock_filename) {
  66. my $date_time = _get_datetime_for($lock_filename);
  67. $compilation_text = "En cours de compilation depuis $date_time";
  68. $compilation_status = 'IN PROGRESS';
  69. }
  70. elsif(-e $pdf_filename) {
  71. my $date_time = _get_datetime_for($pdf_filename);
  72. $compilation_text = $date_time;
  73. $compilation_status = 'COMPLETED';
  74. }
  75. else {
  76. $compilation_text = "Aucune compilation.";
  77. $compilation_status = 'NONE';
  78. }
  79. header 'Content-Type' => 'application/json';
  80. return to_json { text => $compilation_text, status => $compilation_status };
  81. };
  82. sub _get_datetime_for {
  83. my $filename = shift;
  84. return unless -e $filename;
  85. my @stat = stat $filename;
  86. my $ctime = $stat[10];
  87. my $date_time = POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($ctime) );
  88. return $date_time;
  89. }
  90. true;