# 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. """ A script to use nodetool to generate documentation for nodetool """ from __future__ import print_function import os import re import sys import subprocess from subprocess import PIPE from subprocess import Popen if(os.environ.get("SKIP_NODETOOL") == "1"): sys.exit(0) nodetool = "../bin/nodetool" outdir = "source/tools/nodetool" helpfilename = outdir + "/nodetool.txt" command_re = re.compile("( )([_a-z]+)") commandRSTContent = ".. _nodetool_{0}:\n\n{0}\n{1}\n\nUsage\n---------\n\n.. include:: {0}.txt\n :literal:\n\n" # create the documentation directory if not os.path.exists(outdir): os.makedirs(outdir) # create the base help file to use for discovering the commands def create_help_file(): with open(helpfilename, "w+") as output_file: try: subprocess.check_call([nodetool, "help"], stdout=output_file) except subprocess.CalledProcessError as cpe: print( 'ERROR: Nodetool failed to run, you likely need to build ' 'cassandra using ant jar from the top level directory' ) raise cpe # for a given command, create the help file and an RST file to contain it def create_rst(command): if command: cmdName = command.group(0).strip() cmdFilename = outdir + "/" + cmdName + ".txt" rstFilename = outdir + "/" + cmdName + ".rst" with open(cmdFilename, "w+b") as cmdFile: proc = Popen([nodetool, "help", cmdName], stdin=PIPE, stdout=PIPE) (out, err) = proc.communicate() cmdFile.write(out) with open(rstFilename, "w+") as rstFile: rstFile.write(commandRSTContent.format(cmdName, '-' * len(cmdName))) # create base file create_help_file() # create the main usage page with open(outdir + "/nodetool.rst", "w+") as output: with open(helpfilename, "r+") as helpfile: output.write(".. _nodetool\n\nNodetool\n--------\n\nUsage\n---------\n\n") for commandLine in helpfile: command = command_re.sub(r'\n\1:doc:`\2` - ',commandLine) output.write(command) # create the command usage pages with open(helpfilename, "r+") as helpfile: for commandLine in helpfile: command = command_re.match(commandLine) create_rst(command)