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的更多相关文章

  1. saltstack源码-启动1

    决定看salt的源码了.干脆就从最基本的看起来,先看它的启动过程开始第一步用/etc/init.d/salt-master start 启动找到那个文件,发现有3种启动方式,suse,debian,c ...

  2. saltstack源码-启动3-config.py配置文件加载

    #目标文件位置/usr/lib/python2.6/site-packages/salt/config.py#这个文件加载配置文件的模块.master和minion的配置文件加载都是在这个模块里面完成 ...

  3. saltstack源码详解一

    目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...

  4. [源码解析] PyTorch分布式(6) -------- DistributedDataParallel -- 初始化&store

    [源码解析] PyTorch分布式(6) ---DistributedDataParallel -- 初始化&store 目录 [源码解析] PyTorch分布式(6) ---Distribu ...

  5. JVM源码分析之堆内存的初始化

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十五篇. ​ 今天呢!灯塔君跟大家讲: JVM源码分析之堆内存的初始化   堆初始化 Java堆的初始化入口位于Univ ...

  6. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

  7. Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean

    Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...

  8. django源码分析 python manage.py runserver

    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...

  9. saltstack源码安装

    环境 centos6.3,python2.7.5. 1.install libzmq-master $ git clone git://github.com/zeromq/libzmq.git $ c ...

随机推荐

  1. Atlantis(hdu1542)

    题意:求n个矩阵的面积并. /* 线段树维护扫描线 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1. 并且如果这条线段 ...

  2. 【ZJOI2017 Round1练习&BZOJ4766】D1T2 文艺计算姬(Prufer编码)

    题意:给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},求其生成树个数 mod p. 100%的数据:1 <= n,m,p <= 10^18 思路:这是 ...

  3. hdu3622:Bomb Game

    给n<=100对点,从每对点里面挑一个并以这些挑出的点为圆心画圆,并且这些圆不能互相覆盖,找出一种方案使得这些圆半径中最小的那个最大. “最小值最大”就是二分答案啦!考虑现在每个点都画出半径x的 ...

  4. Xcode waring: no rule to process file *** 警告提示

    在编译程序的时候,Xcode给出了警告:warning: no rule to process file *** 类似的警告, 解决方法: 在[build Phases] -> [Compile ...

  5. 个人网站开发***云服务器+Linux+域名***

    作为一个改变世界的程序猿,我们不应该只会埋头写程序修bug还得会点别的, 当然如果要是自己搞个网站玩玩,既可以锻炼技术,没事也可以和圈外的朋友吹吹 牛.因为水平有限,就弄一些最基础的看看喽,不喜勿喷. ...

  6. 通过k8s(Kubernetes)搭建jmeter的压测环境master-slave架构,实现弹性伸缩

    在k8s上部署jmeter的mater和slave,根据压测需求动态增减master和slave节点数量,即可以完成压测任务,又可以是资源利用最大化 https://blog.kubernauts.i ...

  7. &quot;What&#39;s New&quot; WebPart in SharePoint

    "What's New" WebPart in SharePoint 项目描写叙述         这是一个自己定义WebPart,能够显示一个列表,这个列表项目是在SharePo ...

  8. VMware虚拟机上安装linux和克隆

    虚拟机上安装好一台linux 系统后.为了高速搭建hadoop集群.须要再安装几个linux系统,比較笨的办法能够又一次用ios 镜像文件进行安装.可是又一次安装须要又一次配置一些信息并且安装时间比較 ...

  9. :>/dev/null 2>&1 的作用

    shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 /dev/null 代表空设备文件 > 代表重定向到哪里,例如:ec ...

  10. VS自己定义project向导开发(Custom Wizard)

     在vs2010中定制VC++project向导有例如以下两种方式: 改动现有向导.以满足自己的须要: 使用"自己定义向导"来产生一个向导骨架,并设计自己的向导. 本文档仅仅讨 ...