From 593ac19a2a89d2b249fafe549e7988217b0fc5cb Mon Sep 17 00:00:00 2001 From: awlane Date: Thu, 4 Apr 2024 13:15:55 -0500 Subject: [PATCH] Move to using infoconv to modify NFD configuration file This also resolves issue #5316, which was causing crashes due to PPAs not being up to date with changes to the default socket path. Refs #5318 Change-Id: I02ccfe1698f2a07c501c400a8de80e52be3ddead --- minindn/apps/nfd.py | 54 +++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/minindn/apps/nfd.py b/minindn/apps/nfd.py index 084dcf4..44978e7 100644 --- a/minindn/apps/nfd.py +++ b/minindn/apps/nfd.py @@ -20,52 +20,62 @@ # You should have received a copy of the GNU General Public License # along with Mini-NDN, e.g., in COPYING.md file. # If not, see . +import json +import os from minindn.apps.application import Application from minindn.util import copyExistentFile from minindn.minindn import Minindn class Nfd(Application): - def __init__(self, node, logLevel='NONE', csSize=65536, - csPolicy='lru', csUnsolicitedPolicy='drop-all', - defaultSocketLocation='/run/nfd'): + csPolicy='lru', csUnsolicitedPolicy='drop-all'): Application.__init__(self, node) - self.logLevel = node.params['params'].get('nfd-log-level', logLevel) self.confFile = '{}/nfd.conf'.format(self.homeDir) self.logFile = 'nfd.log' - self.sockFile = '{}/{}.sock'.format(defaultSocketLocation, node.name) self.ndnFolder = '{}/.ndn'.format(self.homeDir) self.clientConf = '{}/client.conf'.format(self.ndnFolder) - # Copy nfd.conf file from /usr/local/etc/ndn or /etc/ndn to the node's home directory # Use nfd.conf as default configuration for NFD, else use the sample - possibleConfPaths = ['/usr/local/etc/ndn/nfd.conf.sample', '/usr/local/etc/ndn/nfd.conf', - '/etc/ndn/nfd.conf.sample', '/etc/ndn/nfd.conf'] + possibleConfPaths = ['/usr/local/etc/ndn/nfd.conf', '/usr/local/etc/ndn/nfd.conf.sample', + '/etc/ndn/nfd.conf', '/etc/ndn/nfd.conf.sample'] copyExistentFile(node, possibleConfPaths, self.confFile) + # Using infoconv, we convert the local nfd.conf file to JSON and parse it into an object + conf_file = json.loads(node.cmd("infoconv info2json < {}".format(self.confFile))) + # Set log level - node.cmd('infoedit -f {} -s log.default_level -v {}'.format(self.confFile, self.logLevel)) - # Open the conf file and change socket file name - node.cmd('infoedit -f {} -s face_system.unix.path -v {}'.format(self.confFile, self.sockFile)) + conf_file["log"]["default_level"] = self.logLevel + + # Set socket file name and path + # Retrieve the default socket path from the conf file; this avoids issues from #5316 + default_socket_path = os.path.dirname(conf_file["face_system"]["unix"]["path"]) + self.sockFile = '{}/{}.sock'.format(default_socket_path, node.name) + # Set socket path in conf file to new socket + conf_file["face_system"]["unix"]["path"] = self.sockFile + # Create client configuration for host to ensure socket path is consistent + # Suppress error if working directory exists from prior run + os.makedirs(self.ndnFolder, exist_ok=True) + # This will overwrite any existing client.conf files, which should not be an issue + with open(self.clientConf, "w") as client_conf_file: + client_conf_file.write("transport=unix://{}\n".format(self.sockFile)) # Set CS parameters - node.cmd('infoedit -f {} -s tables.cs_max_packets -v {}'.format(self.confFile, csSize)) - node.cmd('infoedit -f {} -s tables.cs_policy -v {}'.format(self.confFile, csPolicy)) - node.cmd('infoedit -f {} -s tables.cs_unsolicited_policy -v {}'.format(self.confFile, csUnsolicitedPolicy)) + conf_file["tables"]["cs_max_packets"] = csSize + conf_file["tables"]["cs_policy"] = csPolicy + conf_file["tables"]["cs_unsolicited_policy"] = csUnsolicitedPolicy - # Make NDN folder - node.cmd('mkdir -p {}'.format(self.ndnFolder)) + # To avoid complicated Bash piping, we write the JSON to a temporary file + with open("{}/temp_nfd_conf.json".format(self.homeDir), "w") as temp_file: + json.dump(conf_file, temp_file) - # Copy client configuration to host - possibleClientConfPaths = ['/usr/local/etc/ndn/client.conf.sample', '/etc/ndn/client.conf.sample'] - copyExistentFile(node, possibleClientConfPaths, self.clientConf) + # Convert our modified intermediate file and write to the new conf file + node.cmd("infoconv json2info < {}/temp_nfd_conf.json > {}".format(self.homeDir, self.confFile)) - # Change the unix socket - node.cmd('sudo sed -i "s|;transport|transport|g" {}'.format(self.clientConf)) - node.cmd('sudo sed -i "s|nfd.sock|{}.sock|g" {}'.format(node.name, self.clientConf)) + # Remove the intermediate JSON file + os.remove("{}/temp_nfd_conf.json".format(self.homeDir)) if not Minindn.ndnSecurityDisabled: # Generate key and install cert for /localhost/operator to be used by NFD