1
2
3
4 """Config module for reading an NPSGD config file.
5
6 This module is meant to be a singleton. It is shared across all modules
7 in the NPSGD package. The particular daemon will call config.loadConfig("...")
8 on the config object contained in this module and then we will be ready to go
9 thereafter.
10 """
11 import os
12 import sys
13 import logging
14 import ConfigParser
15 import tornado.template
16 import datetime
17
20 """Internal class for handling NPSGD configs."""
23
25 """Helper method for setting up logging across daemons."""
26 lLevel = logging.DEBUG
27 lFormat = format="%(asctime)s - %(levelname)s - %(message)s"
28
29 if logPath == "-":
30 logging.basicConfig(level=lLevel, format=lFormat)
31 else:
32 logging.basicConfig(filename=logPath, level=lLevel, format=lFormat)
33
35 """Reads config file and loads templates using Tornado's template module."""
36
37 config = ConfigParser.SafeConfigParser()
38 config.read(configPath)
39
40 self.matlabPath = config.get('Matlab', 'matlabPath')
41 self.matlabRequired = config.getboolean('Matlab', 'required')
42 self.pdfLatexPath = config.get('Latex', 'pdfLatexPath')
43 self.latexNumRuns = config.getint("Latex", "numRuns")
44 self.queueFile = config.get("npsgd", "queueFile")
45 self.resultsEmailBodyPath = config.get("npsgd", "resultsEmailBodyPath")
46 self.resultsEmailSubjectPath = config.get("npsgd", "resultsEmailSubjectPath")
47 self.confirmEmailTemplatePath = config.get("npsgd", "confirmEmailTemplatePath")
48 self.confirmEmailSubjectPath = config.get("npsgd", "confirmEmailSubjectPath")
49 self.failureEmailTemplatePath = config.get("npsgd", "failureEmailTemplatePath")
50 self.failureEmailSubjectPath = config.get("npsgd", "failureEmailSubjectPath")
51 self.confirmationFailedEmailSubjectPath = config.get("npsgd", "confirmationFailedEmailSubjectPath")
52 self.confirmationFailedEmailTemplatePath = config.get("npsgd", "confirmationFailedEmailTemplatePath")
53 self.lostTaskEmailSubjectPath = config.get("npsgd", "lostTaskEmailSubjectPath")
54 self.lostTaskEmailTemplatePath = config.get("npsgd", "lostTaskEmailTemplatePath")
55 self.latexResultTemplatePath = config.get('Latex', 'resultTemplate')
56 self.modelTemplatePath = config.get('npsgd', 'modelTemplatePath')
57 self.modelErrorTemplatePath = config.get('npsgd', 'modelErrorTemplatePath')
58 self.confirmTemplatePath = config.get('npsgd', 'confirmTemplatePath')
59 self.confirmedTemplatePath = config.get('npsgd', 'confirmedTemplatePath')
60 self.confirmTimeout = datetime.timedelta(minutes=config.getint('npsgd', 'confirmTimeout'))
61 self.maxJobFailures = config.getint("npsgd", "maxJobFailures")
62 self.keepAliveInterval = config.getint("npsgd", "keepAliveInterval")
63 self.keepAliveTimeout = config.getint("npsgd", "keepAliveTimeout")
64 self.modelScanInterval = config.getint("npsgd", "modelScanInterval")
65 self.queueServerAddress = config.get("npsgd", "queueServerAddress")
66 self.queueServerPort = config.getint("npsgd", "queueServerPort")
67 self.modelDirectory = config.get("npsgd", "modelDirectory")
68 self.htmlTemplateDirectory = config.get("npsgd", "htmlTemplateDirectory")
69 self.emailTemplateDirectory = config.get("npsgd", "emailTemplateDirectory")
70 self.latexTemplateDirectory = config.get("npsgd", "latexTemplateDirectory")
71 self.requestSecret = config.get("npsgd", "requestSecret")
72
73 self.alreadyConfirmedTemplatePath = config.get('npsgd', 'alreadyConfirmedTemplatePath')
74
75
76 if not os.path.exists(self.htmlTemplateDirectory):
77 raise ConfigError("HTML template directory '%s' does not exist" % self.htmlTemplateDirectory)
78
79 if not os.path.exists(self.emailTemplateDirectory):
80 raise ConfigError("Email template directory '%s' does not exist" % self.emailTemplateDirectory)
81
82 if not os.path.exists(self.latexTemplateDirectory):
83 raise ConfigError("Latex template directory '%s' does not exist" % self.latexTemplateDirectory)
84
85 if not os.path.exists(self.modelDirectory):
86 raise ConfigError("Model directory '%s' does not exist" % self.modelDirectory)
87
88 tLoader = tornado.template.Loader(self.emailTemplateDirectory)
89 self.resultsEmailBodyTemplate = tLoader.load(self.resultsEmailBodyPath)
90 self.confirmEmailTemplate = tLoader.load(self.confirmEmailTemplatePath)
91 self.failureEmailTemplate = tLoader.load(self.failureEmailTemplatePath)
92 self.confirmationFailedEmailTemplate = tLoader.load(self.confirmationFailedEmailTemplatePath)
93 self.lostTaskEmailTemplate = tLoader.load(self.lostTaskEmailTemplatePath)
94 self.resultsEmailSubject = tLoader.load(self.resultsEmailSubjectPath)
95 self.confirmEmailSubject = tLoader.load(self.confirmEmailSubjectPath)
96 self.failureEmailSubject = tLoader.load(self.failureEmailSubjectPath)
97 self.confirmationFailedEmailSubject = tLoader.load(self.confirmationFailedEmailSubjectPath)
98 self.lostTaskEmailSubject = tLoader.load(self.lostTaskEmailSubjectPath)
99
100 tLoader = tornado.template.Loader(self.latexTemplateDirectory)
101 self.latexResultTemplate = tLoader.load(self.latexResultTemplatePath)
102
103 self.loadEmail(config)
104 self.checkIntegrity()
105
107 self.smtpUsername = config.get("email", "smtpUsername")
108 self.smtpPassword = config.get("email", "smtpPassword")
109 self.smtpServer = config.get("email", "smtpServer")
110 self.smtpPort = config.getint("email", "smtpPort")
111 self.smtpUseTLS = config.getboolean("email", "smtpUseTLS")
112 self.smtpUseAuth = config.getboolean("email", "smtpUseAuth")
113 self.fromAddress = config.get("email", "fromAddress")
114 self.bcc = [e.strip() for e in config.get("email", "bcc").split(",") if e.strip() != ""]
115 self.cc = [e.strip() for e in config.get("email", "cc").split(",") if e.strip() != ""]
116
117
119 if self.matlabRequired and not os.path.exists(self.matlabPath):
120 raise ConfigError("Matlab executable does not exist at '%s'" % self.matlabPath)
121
122 if not os.path.exists(self.pdfLatexPath):
123 raise ConfigError("pdflatex executable does not exist at '%s'" % self.pdfLatexPath)
124
125
126 config = Config()
127