Initial commit
[mining-tools:gitdm.git] / ConfigFile.py
1 #
2 # Stuff for dealing with configuration files.
3 #
4 import sys, re, datetime
5 import database
6
7 #
8 # Read a line and strip out junk.
9 #
10 def ReadConfigLine (file):
11     line = file.readline ()
12     if not line:
13         return None
14     line = line.split('#')[0] # Get rid of any comments
15     line = line.strip () # and extra white space
16     if len (line) == 0: # we got rid of everything
17         return ReadConfigLine (file)
18     return line
19
20 #
21 # Give up and die.
22 #
23 def croak (message):
24     sys.stderr.write (message + '\n')
25     sys.exit (1)
26
27 #
28 # Read a list of email aliases.
29 #
30 def ReadEmailAliases (name):
31     try:
32         file = open (name, 'r')
33     except IOError:
34         croak ('Unable to open email alias file %s' % (name))
35     line = ReadConfigLine (file)
36     while line:
37         sline = line.split ()
38         if len (sline) != 2:
39             croak ('Funky email alias line "%s"' % (line))
40         if sline[0].index ('@') <= 0 or sline[1].index ('@') <= 0:
41             croak ('Non-addresses in email alias "%s"' % (line))
42         database.AddEmailAlias (sline[0], sline[1])
43         line = ReadConfigLine (file)
44     file.close ()
45
46 #
47 # The Email/Employer map
48 #
49 EMMpat = re.compile (r'^([^\s]+)\s+([^<]+)\s*(<\s*(\d+-\d+-\d+)\s*)?$')
50
51 def ReadEmailEmployers (name):
52     try:
53         file = open (name, 'r')
54     except IOError:
55         croak ('Unable to open email/employer file %s' % (name))
56     line = ReadConfigLine (file)
57     while line:
58         m = EMMpat.match (line)
59         if not m:
60             croak ('Funky email/employer line "%s"' % (line))
61         email = m.group (1)
62         company = m.group (2).strip ()
63         enddate = ParseDate (m.group (4))
64         database.AddEmailEmployerMapping (email, company, enddate)
65         line = ReadConfigLine (file)
66     file.close ()
67
68 def ParseDate (cdate):
69     if not cdate:
70         return None
71     sdate = cdate.split ('-')
72     return datetime.date (int (sdate[0]), int (sdate[1]), int (sdate[2]))
73
74
75 def ReadGroupMap (fname, employer):
76     try:
77         file = open (fname, 'r')
78     except IOError:
79         croak ('Unable to open group map file %s' % (fname))
80     line = ReadConfigLine (file)
81     while line:
82         database.AddEmailEmployerMapping (line, employer)
83         line = ReadConfigLine (file)
84     file.close ()
85
86 #
87 # Read an overall config file.
88 #
89 def ConfigFile (name):
90     try:
91         file = open (name, 'r')
92     except IOError:
93         croak ('Unable to open config file %s' % (name))
94     line = ReadConfigLine (file)
95     while line:
96         sline = line.split ()
97         if len (sline) < 2:
98             croak ('Funky config line: "%s"' % (line))
99         if sline[0] == 'EmailAliases':
100             ReadEmailAliases (sline[1])
101         elif sline[0] == 'EmailMap':
102             ReadEmailEmployers (sline[1])
103         elif sline[0] == 'GroupMap':
104             if len (sline) != 3:
105                 croak ('Funky group map line "%s"' % (line))
106             ReadGroupMap (sline[1], sline[2])
107         else:
108             croak ('Unrecognized config line: "%s"' % (line))
109         line = ReadConfigLine (file)
110