Fix for tickets #45 & #47
[htsworkflow.git] / gaworkflow / pipeline / retrieve_config.py
1 #!/usr/bin/env python
2
3 from optparse import OptionParser, IndentedHelpFormatter
4 from ConfigParser import SafeConfigParser
5
6 import os
7 import sys
8 import urllib
9
10 CONFIG_SYSTEM = '/etc/ga_frontend/ga_frontend.conf'
11 CONFIG_USER = os.path.expanduser('~/.ga_frontend.conf')
12
13 #Disable or enable commandline arg parsing; disabled by default.
14 DISABLE_CMDLINE = True
15
16 class FlowCellNotFound(Exception): pass
17 class WebError404(Exception): pass
18
19 class DummyOptions:
20   """
21   Used when command line parsing is disabled; default
22   """
23   def __init__(self):
24     self.url = None
25     self.output_filepath = None
26     self.flowcell = None
27
28 class PreformattedDescriptionFormatter(IndentedHelpFormatter):
29   
30   #def format_description(self, description):
31   #  
32   #  if description:
33   #      return description + "\n"
34   #  else:
35   #     return ""
36       
37   def format_epilog(self, epilog):
38     """
39     It was removing my preformated epilog, so this should override
40     that behavior! Muhahaha!
41     """
42     if epilog:
43         return "\n" + epilog + "\n"
44     else:
45         return ""
46
47
48 def constructOptionParser():
49   """
50   returns a pre-setup optparser
51   """
52   global DISABLE_CMDLINE
53   
54   if DISABLE_CMDLINE:
55     return None
56   
57   parser = OptionParser(formatter=PreformattedDescriptionFormatter())
58
59   parser.set_description('Retrieves eland config file from ga_frontend web frontend.')
60   
61   parser.epilog = """
62 Config File:
63   * %s (System wide)
64   * %s (User specific; overrides system)
65   * command line overrides all config file options
66   
67   Example Config File:
68   
69     [config_file_server]
70     base_host_url=http://somewhere.domain:port
71 """ % (CONFIG_SYSTEM, CONFIG_USER)
72   
73   #Special formatter for allowing preformatted description.
74   ##parser.format_epilog(PreformattedDescriptionFormatter())
75
76   parser.add_option("-u", "--url",
77                     action="store", type="string", dest="url")
78   
79   parser.add_option("-o", "--output",
80                     action="store", type="string", dest="output_filepath")
81   
82   parser.add_option("-f", "--flowcell",
83                     action="store", type="string", dest="flowcell")
84
85   parser.add_option("-g", "--genome_dir",
86                     action="store", type="string", dest="genome_dir")
87   
88   #parser.set_default("url", "default")
89   
90   return parser
91
92 def constructConfigParser():
93   """
94   returns a pre-setup config parser
95   """
96   parser = SafeConfigParser()
97   parser.read([CONFIG_SYSTEM, CONFIG_USER])
98   if not parser.has_section('config_file_server'):
99     parser.add_section('config_file_server')
100   if not parser.has_section('local_setup'):
101     parser.add_section('local_setup')
102   
103   return parser
104
105
106 def getCombinedOptions():
107   """
108   Returns optparse options after it has be updated with ConfigParser
109   config files and merged with parsed commandline options.
110   """
111   cl_parser = constructOptionParser()
112   conf_parser = constructConfigParser()
113   
114   if cl_parser is None:
115     options = DummyOptions()
116   else:
117     options, args = cl_parser.parse_args()
118   
119   if options.url is None:
120     if conf_parser.has_option('config_file_server', 'base_host_url'):
121       options.url = conf_parser.get('config_file_server', 'base_host_url')
122
123   if options.genome_dir is None:
124     if conf_parser.has_option('local_setup', 'genome_dir'):
125       options.genome_dir = conf_parser.get('local_setup', 'genome_dir')
126   
127   print 'USING OPTIONS:'
128   print ' URL:', options.url
129   print ' OUT:', options.output_filepath
130   print '  FC:', options.flowcell
131   print 'GDIR:', options.genome_dir
132   print ''
133   
134   return options
135
136
137 def saveConfigFile(flowcell, base_host_url, output_filepath):
138   """
139   retrieves the flowcell eland config file, give the base_host_url
140   (i.e. http://sub.domain.edu:port)
141   """
142   url = base_host_url + '/eland_config/%s/' % (flowcell)
143   
144   f = open(output_filepath, 'w')
145   #try:
146   web = urllib.urlopen(url)
147   #except IOError, msg:
148   #  if str(msg).find("Connection refused") >= 0:
149   #    print 'Error: Connection refused for: %s' % (url)
150   #    f.close()
151   #    sys.exit(1)
152   #  elif str(msg).find("Name or service not known") >= 0:
153   #    print 'Error: Invalid domain or ip address for: %s' % (url)
154   #    f.close()
155   #    sys.exit(2)
156   #  else:
157   #    raise IOError, msg
158
159   data = web.read()
160
161   if data.find('Hmm, config file for') >= 0:
162     msg = "Flowcell (%s) not found in DB; full url(%s)" % (flowcell, url)
163     raise FlowCellNotFound, msg
164
165   if data.find('404 - Not Found') >= 0:
166     msg = "404 - Not Found: Flowcell (%s); base_host_url (%s);\n full url(%s)\n " \
167           "Did you get right port #?" % (flowcell, base_host_url, url)
168     raise FlowCellNotFound, msg
169   
170   f.write(data)
171   web.close()
172   f.close()
173   print 'Wrote config file to %s' % (output_filepath)
174
175