saltstack源码-启动2-parsers.py选项初始化1
class MasterOptionParser(OptionParser, ConfigDirMixIn, MergeConfigMixIn,
LogLevelMixIn, RunUserMixin, DaemonMixIn,
PidfileMixin):#这些差不多全是salt初始化的类,有的minion也会调用 __metaclass__ = OptionParserMeta #指定他的元类 description = 'The Salt master, used to control the Salt minions.' # ConfigDirMixIn config filename attribute
_config_filename_ = 'master'#默认配置文件名
# LogLevelMixIn attributes
_default_logging_logfile_ = os.path.join(syspaths.LOGS_DIR, 'master') #这里是得到他的日志文件路径/var/log/salt/master def setup_config(self):
return config.master_config(self.get_config_file_path())
接下来就是查找他的元类
python类在初始化的时候,经历了两个阶段,第一个阶段是分配空间__new__(),第二个阶段是初始化值__init__()。当类被创建时,python会首先寻找__metaclass__是否存在,
如果存在则调用__metaclass__。如果此类没定义__metaclass__就去看父类,父类没有就去模块里找(全局变量__metaclass__),
模块里再没有就把__metaclass__ = type作为类的metaclass。
mcs代表调用__new__函数的class,name代表对象的__name__值,也就是名称,bases代表对象的父类元组,attrs代表类的属性字典.
class MixInMeta(type):
# This attribute here won't actually do anything. But, if you need to
# specify an order or a dependency within the mix-ins, please define the
# attribute on your own MixIn
_mixin_prio_ = 0 def __new__(mcs, name, bases, attrs):
instance = super(MixInMeta, mcs).__new__(mcs, name, bases, attrs)
if not hasattr(instance, '_mixin_setup'):
raise RuntimeError(
'Don\'t subclass {0} in {1} if you\'re not going to use it '
'as a salt parser mix-in.'.format(mcs.__name__, name)
)
return instance class OptionParserMeta(MixInMeta):
def __new__(mcs, name, bases, attrs):
instance = super(OptionParserMeta, mcs).__new__(mcs,
name,
bases,
attrs)
#上面调用父类的MinInMeta.__new__方法
if not hasattr(instance, '_mixin_setup_funcs'):
instance._mixin_setup_funcs = []
if not hasattr(instance, '_mixin_process_funcs'):
instance._mixin_process_funcs = []
if not hasattr(instance, '_mixin_after_parsed_funcs'):
instance._mixin_after_parsed_funcs = []
#这条语句分别创建了3个空列表 for base in _sorted(bases + (instance,)):
#这里是把基类和子类进行排序
func = getattr(base, '_mixin_setup', None)#得到所有类_mixin_setup属性方法,没有就赋值为None
if func is not None and func not in instance._mixin_setup_funcs:
instance._mixin_setup_funcs.append(func)
#for循环过后得到的列表 _mixin_setup_funcs[ConfigDirMixIn._mixin_setup,
# LogLevelMixIn._mixin_setup,
# RunUserMixin._mixin_setup,
# DaemonMixIn_mixin_setup,
# PidfileMixin._mixin_setup,
# ]
#这些类方法是初始化salt的选项命令 func = getattr(base, '_mixin_after_parsed', None)##得到所有类_mixin_after_parsed属性方法,没有就赋值为None
if func is not None and func not in \
instance._mixin_after_parsed_funcs:
instance._mixin_after_parsed_funcs.append(func)
#这个列表如果是启动的话在这是空列表,不过会在OptionParser的parse_args方法里面实现添加 # Mark process_<opt> functions with the base priority for sorting
for func in dir(base):
if not func.startswith('process_'):
continue func = getattr(base, func)
if getattr(func, '_mixin_prio_', None) is not None:
# Function already has the attribute set, don't override it
continue func.__func__._mixin_prio_ = getattr(
base, '_mixin_prio_', 1000
)
#这个for循环把所有没_mixin_prio属性的基类 设置属性值1000 return instance #返回实例
接下来就是调用OptionParser的__init__()方法来初始化了
接着调用的OptionParser的parse_args方法
def parse_args(self, args=None, values=None):
options, args = optparse.OptionParser.parse_args(self, args, values)
#上面这句options的值是{'daemon': False, 'log_level': None, 'versions_report': None, 'user': None, 'log_file': None, 'config_dir': '/etc/salt', 'pidfile': '/var/run/salt.pid', 'log_level_logfile': None}
#惭愧 到现在都还没找到这些值是怎么来的,找了好久都没找到,后来干脆就不找了,现往下看完再说,别吊死在这
if options.versions_report:
self.print_versions_report() self.options, self.args = options, args # Let's get some proper sys.stderr logging as soon as possible!!!
# This logging handler will be removed once the proper console or
# logfile logging is setup.
log.setup_temp_logger(
getattr(self.options, 'log_level', 'error')
) # Gather and run the process_<option> functions in the proper order
process_option_funcs = []
for option_key in options.__dict__.keys():
process_option_func = getattr(
self, 'process_{0}'.format(option_key), None
)
if process_option_func is not None:
process_option_funcs.append(process_option_func)
#下面分别执行这3个方法process_config_dir process_log_level process_log_file for process_option_func in _sorted(process_option_funcs):
try:
process_option_func()
except Exception as err:
logging.getLogger(__name__).exception(err)
self.error(
'Error while processing {0}: {1}'.format(
process_option_func, traceback.format_exc(err)
)
)
#首先看一下ConfigDirMixIn.process_config_dir 方法
def process_config_dir(self):
if not os.path.isdir(self.options.config_dir):
# No logging is configured yet
sys.stderr.write(
'WARNING: {0!r} directory does not exist.\n'.format(
self.options.config_dir
)
) # Make sure we have an absolute path
self.options.config_dir = os.path.abspath(self.options.config_dir) if hasattr(self, 'setup_config'):
try:
self.config = self.setup_config()
#这里调用子类的MasterOptionParser.setup_config 方法,其方法原型如下:
#def setup_config(self):
# return config.master_config(self.get_config_file_path())
except (IOError, OSError) as exc:
self.error(
'Failed to load configuration: {0}'.format(exc)
)
那个get_config_file_path()返回配置文件的绝对路径然后作为参数传至config.py里面的master_config()方法
草!又调到config.py了,4个编辑器完全不够我用的...妈的继续往下去看
saltstack源码-启动2-parsers.py选项初始化1的更多相关文章
- saltstack源码-启动1
决定看salt的源码了.干脆就从最基本的看起来,先看它的启动过程开始第一步用/etc/init.d/salt-master start 启动找到那个文件,发现有3种启动方式,suse,debian,c ...
- saltstack源码-启动3-config.py配置文件加载
#目标文件位置/usr/lib/python2.6/site-packages/salt/config.py#这个文件加载配置文件的模块.master和minion的配置文件加载都是在这个模块里面完成 ...
- saltstack源码详解一
目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...
- [源码解析] PyTorch分布式(6) -------- DistributedDataParallel -- 初始化&store
[源码解析] PyTorch分布式(6) ---DistributedDataParallel -- 初始化&store 目录 [源码解析] PyTorch分布式(6) ---Distribu ...
- JVM源码分析之堆内存的初始化
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十五篇. 今天呢!灯塔君跟大家讲: JVM源码分析之堆内存的初始化 堆初始化 Java堆的初始化入口位于Univ ...
- Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式
上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...
- Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...
- django源码分析 python manage.py runserver
django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...
- saltstack源码安装
环境 centos6.3,python2.7.5. 1.install libzmq-master $ git clone git://github.com/zeromq/libzmq.git $ c ...
随机推荐
- hdu 1325数据弱
#include<stdio.h>//判断是否有环,判断是否有点,判断是否是一个父节点 #include<string.h> #define N 1000000 int pre ...
- Hankson 的趣味题(codevs 1172)
题目描述 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在 ...
- 51nod1184 第N个质数
如题.$n \leq 1e9$. 方法零:二分,然后洲阁筛.要魔改一下的洲阁筛.跑得慢.卡卡能过.没意思. //#include<iostream> #include<cstring ...
- linux 报错:E: Package 'libmemcached' has no installation candidate
linux 报错:E: Package 'libmemcached' has no installation candidate 网上查资料说是软件安装源没有这个软件,需要添加软件源. 1.备份源列表 ...
- POJ 2109 Power of Cryptography【高精度+二分 Or double水过~~】
题目链接: http://poj.org/problem?id=2109 参考: http://blog.csdn.net/code_pang/article/details/8263971 题意: ...
- [Bzoj4260]Codechef REBXOR(trie树)
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1534 Solved: 669[Submit][Stat ...
- Spring4MVC 请求参数映射和Content-type
目录 前言 不使用注解(不传则为null) 基本数据类型和日期类型 自定义类型POJO @PathVariable注解 @RequestParam 注解 @RequestBody注解 复杂对象Arra ...
- poj 2965 The Pilots Brothers' refrigerator(dfs 枚举 +打印路径)
链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...
- Xpath—解决这个问题的良药
何为良药? 因为在XML中存在一些问题和缺陷,针对这些问题就产生了响应的解决方式.如: getElementById方法在解析XML时因为一些原因适不适合的: 首先XML中每一个元素节点不一定有id属 ...
- crm使用soap删除下拉框
//C# 代码: //DeleteOptionSetRequest request = new DeleteOptionSetRequest(); //request.Name = "new ...