70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
#
|
|
# CORE
|
|
# Copyright (c)2010-2012 the Boeing Company.
|
|
# See the LICENSE file included in this distribution.
|
|
#
|
|
# authors: core-dev@pf.itd.nrl.navy.mil
|
|
#
|
|
'''
|
|
netgraph.py: Netgraph helper functions; for now these are wrappers around
|
|
ngctl commands.
|
|
'''
|
|
|
|
import subprocess
|
|
from core.misc.utils import *
|
|
from core.constants import *
|
|
|
|
checkexec([NGCTL_BIN])
|
|
|
|
def createngnode(type, hookstr, name=None):
|
|
''' Create a new Netgraph node of type and optionally assign name. The
|
|
hook string hookstr should contain two names. This is a string so
|
|
other commands may be inserted after the two names.
|
|
Return the name and netgraph ID of the new node.
|
|
'''
|
|
hook1 = hookstr.split()[0]
|
|
ngcmd = "mkpeer %s %s \n show .%s" % (type, hookstr, hook1)
|
|
cmd = [NGCTL_BIN, "-f", "-"]
|
|
cmdid = subprocess.Popen(cmd, stdin = subprocess.PIPE,
|
|
stdout = subprocess.PIPE,
|
|
stderr = subprocess.PIPE)
|
|
cmdid.stdin.write(ngcmd)
|
|
cmdid.stdin.close()
|
|
result = cmdid.stdout.read()
|
|
result += cmdid.stderr.read()
|
|
cmdid.stdout.close()
|
|
cmdid.stderr.close()
|
|
status = cmdid.wait()
|
|
if status > 0:
|
|
raise Exception, "error creating Netgraph node %s (%s): %s" % \
|
|
(type, ngcmd, result)
|
|
results = result.split()
|
|
ngname = results[1]
|
|
ngid = results[5]
|
|
if name:
|
|
check_call([NGCTL_BIN, "name", "[0x%s]:" % ngid, name])
|
|
return (ngname, ngid)
|
|
|
|
def destroyngnode(name):
|
|
''' Shutdown a Netgraph node having the given name.
|
|
'''
|
|
check_call([NGCTL_BIN, "shutdown", "%s:" % name])
|
|
|
|
def connectngnodes(name1, name2, hook1, hook2):
|
|
''' Connect two hooks of two Netgraph nodes given by their names.
|
|
'''
|
|
node1 = "%s:" % name1
|
|
node2 = "%s:" % name2
|
|
check_call([NGCTL_BIN, "connect", node1, node2, hook1, hook2])
|
|
|
|
def ngmessage(name, msg):
|
|
''' Send a Netgraph message to the node named name.
|
|
'''
|
|
cmd = [NGCTL_BIN, "msg", "%s:" % name] + msg
|
|
check_call(cmd)
|
|
|
|
def ngloadkernelmodule(name):
|
|
''' Load a kernel module by invoking kldstat. This is needed for the
|
|
ng_ether module which automatically creates Netgraph nodes when loaded.
|
|
'''
|
|
mutecall(["kldload", name])
|