SONiC show 命令调用流程协助调用接口命令错误定位

查看show命令文件路径:
在这里插入图片描述

/usr/local/bin/show
查看内容:
在这里插入图片描述

从pkg_resources库中调用入口函数load_entry_point来执行命令行,从而启动程序。此框架将命令的调用和具体实现的功能进行隔离,只需要指明入口entry即可调用实际功能。

其中,sonic-utilities==1.2指向路径/usr/lib/python2.7/dist-packages/sonic_utilities-1.2.egg-info/,可以在该路径下找到entry_points.txt

在这里插入图片描述

查看内容:
在这里插入图片描述

首先,第一行的[console_scripts]定义了group的名称,show = show.main:cli这句,show代表name参数的值,实际它指向的是show.main:cli模块中的cli函数。所以cli函数是响应我们实际操作的函数,也是程序的实际入口。在/usr/lib/python2.7/dist-packages/有show模块的整个目录,/show目录下可以找到main.pyc,在主函数中找到cli的定义。
在这里插入图片描述

首先pyc文件是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,需要经过反编译才能查看python源码,而不显示如下的乱码。

在这里插入图片描述

可以使用在线反编译工具https://tool.lu/pyc/ 打开pyc文件,

在这里插入图片描述

@click.group装饰器把cli方法装饰为可以拥有多个子命令的Group对象。

以syseeprom为例,该命令挂在再group “platform”中,CLI命令为【show platform syseeprom】。
在这里插入图片描述

即可看到show命令实际调用的命令是sudo decode-syseeprom,这里附件main.pyc文件,以供查阅。

main.pyc

其他常用的show platform命令定义示例如下:

在这里插入图片描述

继续以show platform syseeprom命令为例,实际调用的命令是sudo decode-syseeprom,py文件的调用过程为decode-syseeprom → eeprom.py → sonic_eeprom

def main(): if not os.geteuid() == 0: 获取当前用户是否是root不是的话抛出错误信息(“must be root to run”) raise RuntimeError(“must be root to run”) # Get platform name platform = get_platform_info(get_machine_info())platform_path = ‘/’.join([PLATFORM_ROOT, platform])
将PLATFORM_ROOT与 platform用/连接成路径 platform=x86_64-alibaba_as13-32h-rj-r0
PLATFORM_ROOT= ‘/usr/share/sonic/device’
在这里插入图片描述

# # Currently we only support board eeprom decode.# (opts, args) = get_cmdline_opts() ## load the target class file and instantiate the object#try:m = imp.load_source(‘eeprom’,’/’.join([platform_path, ‘plugins’, ‘eeprom.py’]))
所生成的路径。
在这里插入图片描述

imp.load_source 加载了eeprom.py文件 ‘eeprom’相当于重命名了后面路径so所加载的py文件
用法可以是 m.XXX(XXX为eeprom.py的函数)或者 import eeprom(重命名后的名称)Eeprom.XXX(XXX也为eeprom.py的函数) except IOError: raise IOError("cannot load module: " + ‘/’.join([platform_path, ‘plugins’, ‘eeprom.py’]))class_ = getattr(m, ‘board’) 返回了 eeprom.py中的 board对象 t = class_(‘board’, ‘’,’’,’’) 初始化了一个board类型的t run(t, opts, args) !!!重点

查看eeprom.py文件,继续深入定位设备eeprom的读取路径,以阿里AS13-48F设备为例,eeprom的读取路径定义为/sys/bus/i2c/devices/0-0056/eeprom
在这里插入图片描述

到这里,show命令的调用流程结束,当show命令返回值异常时,可以从每一层调用的py文件中,找到调用方法与路径,精确定位到问题原因。

猜你喜欢

转载自blog.csdn.net/weixin_39094034/article/details/115189258