You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
6.5 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
# encoding: utf-8
# Envoi individuel des sujets d'interro + consignes
# Lancement :
# ruby envoie_sujets.rb
# Exécutables nécessaires à installer :
# * unoconv : version 'ligne de commande' de libreoffice.
# Problèmes connus :
# * Classe ou gem ruby manquant : installer le gem correspondant
# --> exemple pour installer le gem 'highline' : sudo gem install highline
# * Erreur de unoconv : "Error: Unable to connect or start own listener. Aborting."
# --> Survient parfois si un fichier .ods est déjà ouvert. Simplement relancer le script.
# Classes et gems ruby nécessaires
#####################################
# pour installer un gem manquant, par exemple le gem 'highline' :
# sudo gem install highline
require 'net/smtp'
require 'mail' # gère tous types de serveurs d'envoi et permet de joindre facilement des fichiers (contrairement à net/smtp où j'ai eu des problèmes).
# https://www.rubydoc.info/github/mikel/mail
# Configuration
#####################################
FileEtud = "assignation.ods"
SujetDir = "Sujets" # emplacement des sujets
NomEnvoi = "Examen.pdf" # nom générique de la pièce jointe à envoyer
ReallySend = false # passer à true pour vraiment procéder à l'envoi
### Paramètres du mail
Who='Pascal Lafourcade'
From='pascal.lafourcade@uca.fr'
MTA='smtp.uca.fr'
Subject="BD P3 -- Sujet Partiel"
InteractivePwd = true
# true -> demande le MDP de la boîte mail lors l'exécution. Plus sécure. Nécessite le gem highline.
# false -> entrer le MDP de la boîte mail en dur, en argument de l'appel. Moins sécure. Ne nécessite pas le gem highline.
# - usage basique dans ce cas : ruby envoie_sujets.rb monmotdepasse
# - permet aussi le scheduling : echo "ruby envoie_sujets.rb monmotdepasse" | at 13h25
require 'highline/import' if InteractivePwd
# Demande de mot de passe pour le serveur mail (fonction)
#####################################
$mail_initialized = false
def initMail
if not $mail_initialized
# récupération du mot de passe
pwd = InteractivePwd ?
ask("Enter your password for connection to the smtp server: ") { |q| q.echo = "*" } :
ARGV[0]
# https://medium.com/derek-gc/sending-emails-in-ruby-with-smtp-3d40bed6c437
Mail.defaults do
delivery_method :smtp, address: MTA, port: 587, password: pwd, authentication: :login, user_name: From
end
$mail_initialized = true
end
end
# Contenu du mail (fonction)
#####################################
def sendMail(adresse,nom,prenom,sujet_pdf)
corps = <<EOF
Bonjour #{prenom} #{nom},
Voici votre sujet individualisé pour le partiel de BD P3. Le sujet est construit à partir d'exercices choisis aléatoirement dont les thématiques contrôlées sont les mêmes pour tous et la difficulté équivalente. En résumé, vous n'aurez pas les mêmes sujets (dommage pour ceux qui pensaient pouvoir échanger, ça ne serait que du temps perdu!)
- La durée du contrôle est de 1h30
- la durée inclut le temps de réflexion, rédaction et dépôt de l'examen.
- Dans le sujet vous allez donc avoir plusieurs exercices. Les solutions seront rédigées à l'aide d'un éditeur de texte.
- La solution de chaque exercice doit être un fichier indépendant nommé EXOn°exo-votreNOM-votrePRENOM-Gn°groupe (exemple EXO1-DUPONT-Pierre-G5).
- Les solutions seront regroupées dans une archive qui sera déposée sur la plateforme Moodle,
Cours: BDD Semestre 2 P3
Section: Dépôt Examen PL/SQL
puis au choix:
Dépôt Exam PL/SQL Groupe 1-2
ou Dépôt Exam PL/SQL Groupe 3-4
ou Dépôt Exam PL/SQL Groupe 5-6
ou Dépôt Exam PL/SQL Groupe 7-8
Vous devez gérer votre temps.
N'hésitez pas à discuter sous TEAMS avec MF. Servajean et F. Glaziou si des questions restent en suspend pendant le partiel.
Bonne journée,
Vos enseignants,
Mmes P. Brigoulet et MF. Servajean,
MM R. Delage, P. Lafourcade et F. Glaziou
Cordialement,
L'équipe enseignante de BD P3
EOF
# Commande d'envoi simplifiée avec le gem Mail
if ReallySend
initMail
Mail.deliver do
#charset='UTF-8' # marche pas ? bref... :(
from From
to adresse
subject Subject
text_part do
content_type "text/plain; charset=utf-8"
body corps
end
add_file :filename => NomEnvoi, :content => File.read(sujet_pdf)
end
else
# simple affichage
puts From
puts adresse
puts Subject
puts corps
end
end
# Lecture du fichier étudiant et envoi des mails
#####################################
### Conversion automatique du fichier ODS (ou XLS) en un fichier CSV
# Options du filtre: voir
# https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
ods2csv_command = "unoconv -f csv -e FilterOptions=58,34,76,3,,2060,true,true"
ext = File.extname(FileEtud)
if ext != ".ods" and ext != ".xls"
puts "ERROR. Wrong file format. Only .ods or .xls accepted"
exit(1)
end
csvfile = ".#{File.basename(FileEtud, ext)}.csv"
if not system(ods2csv_command+" -o #{csvfile} #{FileEtud}")
warn "Unoconv conversion error (arrive souvent, relancer simplement le script)"
exit(1)
end
### Lecture des lignes du CSV et envoi
IO.readlines(csvfile).each_with_index { |l, id|
begin # (permet de récupérer la ligne d'un éventuel problème)
data = l.chomp.split(":"); # chomp vire le \n final
# 5 premières colonnes (toujours les mêmes)
grnum = Integer(data.shift()) rescue nil
next unless grnum && grnum >= 0 # Continue uniquement pour les "vraies" lignes, caractérisées par un "vrai" numéro de groupe en 1ère colonne (entir poitif).
nom = data.shift().tr('"', '')
prenom = data.shift().tr('"', '')
adresse = data.shift().tr('"', '')
pdfname = data.shift().tr('"', '')
sujet_pdf = "#{SujetDir}/#{pdfname}.pdf"
puts "Envoi à #{nom} #{prenom}"
sendMail(adresse, nom, prenom, sujet_pdf)
rescue Exception => e
puts "ERREUR, pendant le traitement de la ligne #{id+1}, du fichier de notes #{csvfile} :"
puts e.message
print "\n"+e.backtrace.join("\n")+"\n"
exit(1)
end
}
puts "Passer ReallySend à true pour vraiment procéder à l'envoi" unless ReallySend