啟動方式
$ ryu-manager ofctl_rest.py simple_siwtch_13.py
$ whereis ryu-manager
ryu-manager: /usr/local/bin/ryu-manager
$ vim /usr/local/bin/ryu-manager
#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'ryu==4.32','console_scripts','ryu-manager'
__requires__ = 'ryu==4.32'
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('ryu==4.32', 'console_scripts', 'ryu-manager')()
)
# 說明
# load_entry_point 方法根據(jù) ryu-4.3.2.dist-info/entry_points.txt 文件加載
# ryu-manager 是 ryu.cmd.manager.py 中main方法的short name袋马,
# 所以最終執(zhí)行的是 ryu.cmd.manager.py 的main方法
ryu.cmd.manager.py 的 main方法
def main(args=None, prog=None):
# 解析 命令行 $ ryu-manager ofctl_rest.py simple_siwtch_13.py
# 中的參數(shù)
_parse_user_flags()
try:
CONF(args=args, prog=prog,
project='ryu', version='ryu-manager %s' % version,
# 配置文件的位置
default_config_files=['/usr/local/etc/ryu/ryu.conf'])
except cfg.ConfigFilesNotFoundError:
CONF(args=args, prog=prog,
project='ryu', version='ryu-manager %s' % version)
log.init_log()
logger = logging.getLogger(__name__)
if CONF.enable_debugger:
msg = 'debugging is available (--enable-debugger option is turned on)'
logger.info(msg)
else:
hub.patch(thread=True)
if CONF.pid_file:
with open(CONF.pid_file, 'w') as pid_file:
pid_file.write(str(os.getpid()))
app_lists = CONF.app_lists + CONF.app
# keep old behavior, run ofp if no application is specified.
if not app_lists:
app_lists = [
'ryu.controller.ofp_handler', # 默認必須加載的文件
# 我們可以自己把需要加載的文件寫在這里,
# 這樣啟動里可以直接執(zhí)行 python3 ryu.cmd.manager.py
'../app/simple_switch_13.py'
]
app_mgr = AppManager.get_instance()
app_mgr.load_apps(app_lists)
contexts = app_mgr.create_contexts()
services = []
services.extend(app_mgr.instantiate_apps(**contexts))
webapp = wsgi.start_service(app_mgr)
if webapp:
thr = hub.spawn(webapp)
services.append(thr)
try:
hub.joinall(services)
except KeyboardInterrupt:
logger.debug("Keyboard Interrupt received. "
"Closing RYU application manager...")
finally:
app_mgr.close()