blob: 1e2fd96866ac4d361f84d1ac014efc7467b9706e [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# TODO: keep track of stat when it was loaded? So we don't clobber manual file changes...
class Config(object):
'''
Class to represent a config file
'''
def __init__(self, filename):
self.filename = filename
self.load()
def add_lines(self, lines):
for line in lines:
self.add_line(line)
def load(self):
with open(self.filename, 'r') as fh:
self.contents = fh.read()
def write(self):
'''
Write contents to disk
'''
with open(self.filename, 'w') as fh:
fh.write(self.contents)
def add_line(self, line):
if not line.endswith('\n'):
line += '\n'
self.contents += line
class RecordsConfig(Config, dict):
'''
Create a "dict" representation of records.config
This can be accessed as a multi-level dictionary
such as:
rc['CONFIG']['proxy.config.log.hostname']
'''
kind_map = {'STRING': str,
'INT': int,
'FLOAT': float,
}
reverse_kind_map = {str: 'STRING',
int: 'INT',
float: 'FLOAT',
}
line_template = '{top_kind} {name} {kind} {val}\n'
def __init__(self, filename):
dict.__init__(self)
self.filename = filename
self.load()
def _load_line(self, line):
line = line.strip()
# skip comments
if not line or line.startswith('#'):
return
top_kind, name, kind, val = line.split(' ', 3)
if top_kind not in self:
self[top_kind] = {}
self[top_kind][name] = self.kind_map[kind](val)
def load(self):
with open(self.filename, 'r') as fh:
for line in fh:
self._load_line(line)
def add_line(self, line):
self._load_line(line)
def write(self):
with open(self.filename, 'w') as fh:
for top_kind, config_map in self.iteritems():
for name, val in config_map.iteritems():
fh.write(self.line_template.format(top_kind=top_kind,
name=name,
kind=self.reverse_kind_map[type(val)],
val=val))
if __name__ == '__main__':
rc = RecordsConfig('/etc/trafficserver/records.config')
rc['CONFIG']['proxy.config.log.hostname']
rc['CONFIG'].update({'proxy.config.log.hostname': 'foo'})
rc.filename = '/tmp/recordstest.config'
rc.write()