@wenshizhang
2016-08-23T17:13:40.000000Z
字数 2254
阅读 480
crmsh
suse实习
python
crm的入口是main模块中的run函数(crm模块调用了./crmsh/main模块的run函数),run函数顺序执行:
--compgen
,如果是,执行compgen函数
(这个函数明白什么意思)设置环境变量PATH
- 查看的当前的环境变量PATH是否包括config中设置的path变量值,
- 如果不包括没修改PATH的值
如果已经有了用户的XX文件,把这些文件移走
初始化一个ui_root.Root
的对象
- 这个对象代表的是,UI层级结构的根。初始化就说明得到了这个根的对象,但是里面的每一个属性都没有被设置
初始化一个context对象
- 该对象用来时刻记录用户的在ui层级结构中当前的level(
level_stack[-1]
代表当前的level,不明白为什么-1代表当前),初始化一个context对象,设置level需要的一些属性——command name
,command argv
,command info
,mark
,stack
等等
加载并执行rc file(不同的场景不同的命令调试到目前为止,还没有哪一个用例执行了rcfile,还是不明白rcfile是什么文件)
- rcfile是什么文件,目前还不清楚,只知道rcfile是一个脚本,路径是
~/.crm.rc
。- 如果用户已经有了配置文件,则什么也不执行退出
- 打开rcfile,把stdin重定向到rcfile中,读一行内容,然后开始调用context.run方法。
- run方法中的操作
- 如果该行是空行或者是以
#
开头(注释),返回- 修改mark(mark代表stack的 栈顶)
- 修改
command_name
和command_argv
变量- 一些判错操作,如:查看command是否存在等等
- 判断读出的数据是command还是level(level表示这并不是一个命令,而是一个子目录形式的level,例如confugure或者resource,并且接下来运行的所有命令都是这个level下的)如果是level就执行
enter_level
,如果不是level,执行execute_command
- enter_level执行流程后面的
main_input_loop
函数中解释。- execute_command执行流程后面的
main_input_loop
函数中解释。
注册程序退出函数,退出函数功能:
- 对cluster的修改写入history_file(
~/.crm_history
)- 删除tmp file
一些安全判断(没看懂)
下面就是目前的重点——main_input_loop
函数。crm tool运行是循环接受用户输入的,并且根据用户的输入命令执行相应操作。如下图中:
如上图所示,crm循环接收用户输入,并执行相应操作。其中configure和resource是level,像是crm的子目录,ls是command。
循环接受用户输入并执行相应操作的函数。
执行流程:
- 虽然调试过了,前面的判断操作还是不明白其意图
- 设置上下文环境(不明白意图)
- 循环开始
- 用户输入命令,记为inp
- 如果inp是None并且此时是在终端运行,执行退出函数。
- 如果inp不是None,执行context模块中的run函数(执行inp对应的操作)
- 如果在run函数执行过程中捕获到value异常,打印出异常
- 如果在整个循环中捕获到keyborad异常(用户输入了ctrl+c),执行退出函数。
run函数执行流程:
- 如果用户输入(参数line)为空或者line以
#
起始,直接返回- 更新栈顶指针(栈中存储的level,因此栈顶指针可以认为指向当前的level)
- line是用户输入的数据(包括了用户想要执行的命令和参数),split参数和命令
- 根据命令去当前的level下查找输入command的information(include function,type和name等等)
- 如果没有查找到,打印出错信息返回
- 如果
command_info.type
是level执行enter_level函数- 如果
command_info.type
是command,执行execute_command函数
enter_level函数就是创建一个新的level,并且压入栈(self.stack)。
enter_level
函数执行:
- 在创建level之前设置interactive(不明白这个标志是做什么用的)
- 调用level函数创建新的level
- 检查新创建的level是不是miss requires(??)
- 调用stack的append函数,压新的level入栈
- 清read缓存
execute_command
函数就是根据输入的命令,调用对应的函数。
执行流程:
* 创建参数列表
* 检查参数是否合法(符合functions函数)
* 调用self.command_info.functions(command_info在main_input_loop函数中已经获取到了)
注意:command_info的functions成员填充的是command对应的处理函数。
1、options.py中的成员分别代表什么意思?总是看到在判断options.interactive和options.batch?