Skip to content

Commit

Permalink
Move to using infoconv to modify NFD configuration file
Browse files Browse the repository at this point in the history
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
  • Loading branch information
awlane committed May 1, 2024
1 parent a43c241 commit 593ac19
Showing 1 changed file with 32 additions and 22 deletions.
54 changes: 32 additions & 22 deletions minindn/apps/nfd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <http://www.gnu.org/licenses/>.
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
Expand Down

0 comments on commit 593ac19

Please sign in to comment.