blob: 8296ac3d243ced89495094d8b8d2454f4e12ee94 [file] [log] [blame]
#!/usr/bin/env python3
#
# 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.
#
import re
import sys
try:
src_dir = sys.argv[1]
except IndexError:
print("Usage: %s [trafficserver_source_dir]" % sys.argv[0])
print("Compares values in RecordsConfig.cc with the default records.config file")
sys.exit(1)
# We expect these keys to differ between files, so ignore them
ignore_keys = {
"proxy.config.ssl.server.cert.path": 1,
"proxy.config.admin.user_id": 1,
"proxy.config.ssl.client.cert.path": 1,
"proxy.config.log.logfile_dir": 1,
"proxy.config.ssl.CA.cert.path": 1,
"proxy.config.ssl.client.CA.cert.path": 1,
"proxy.config.ssl.server.private_key.path": 1,
"proxy.config.proxy_name": 1,
"proxy.config.ssl.client.private_key.path": 1,
"proxy.config.net.defer_accept": 1 # Specified in RecordsConfig.cc funny
}
rc_cc = {} # RecordsConfig.cc values
rc_in = {} # records.config.in values
rc_doc = {} # documented values
# Process RecordsConfig.cc
with open("%s/mgmt/RecordsConfig.cc" % src_dir) as fh:
cc_re = re.compile(r'\{RECT_(?:CONFIG|LOCAL), "([^"]+)", RECD_([A-Z]+), (.+?), ')
for line in fh:
m = cc_re.search(line)
if m:
value = m.group(3)
value = value.lstrip('"')
value = value.rstrip('"')
rc_cc[m.group(1)] = (m.group(2), value)
# Process records.config.default.in
with open("%s/configs/records.config.default.in" % src_dir) as fh:
in_re = re.compile(r'(?:CONFIG|LOCAL) (\S+)\s+(\S+)\s+(\S+)')
for line in fh:
m = in_re.match(line)
if m:
rc_in[m.group(1)] = (m.group(2), m.group(3))
# Process records.config documentation.
# eg. .. ts:cv:: CONFIG proxy.config.proxy_binary STRING traffic_server
with open("%s/doc/admin-guide/files/records.config.en.rst" % src_dir) as fh:
doc_re = re.compile(r'ts:cv:: CONFIG (\S+)\s+(\S+)\s+(\S+)')
for line in fh:
m = doc_re.search(line)
if m:
rc_doc[m.group(1)] = (m.group(2), m.group(3))
rc_doc[m.group(1)] = (m.group(2), m.group(3))
# Compare the two
# If a value is in RecordsConfig.cc and not records.config.default.in, it is
# ignored right now.
print("# Comparing RecordsConfig.cc -> records.config.default.in")
for key in rc_in:
if key in ignore_keys:
continue
if key not in rc_cc:
print("%s missing -> %s" % (key, "%s %s" % rc_in[key]))
continue
if rc_cc[key] != rc_in[key]:
print("%s : %s -> %s" % (key, "%s %s" % rc_cc[key], "%s %s" % rc_in[key]))
# Search for undocumented variables ...
missing = [k for k in rc_cc if k not in rc_doc]
if len(missing) > 0:
print()
print("Undocumented configuration variables:")
for m in sorted(missing):
print("\t%s %s" % (m, "%s %s" % rc_cc[m]))
# Search for incorrectly documented default values ...
defaults = [k for k in rc_cc if k in rc_doc and rc_cc[k] != rc_doc[k]]
if len(defaults) > 0:
print()
print("Incorrectly documented defaults:")
for d in sorted(defaults):
print("\t%s %s -> %s" % (d, "%s %s" % rc_cc[d], "%s %s" % rc_doc[d]))
# Search for stale documentation ...
stale = [k for k in rc_doc if k not in rc_cc]
if (len(stale) > 0):
print()
print("Stale documentation:")
for s in sorted(stale):
print("\t%s" % (s))