这个ini开头的函数在devstack的启动配置中用的非常多,他主要负责.ini文件的配置,这个过程包括对相关ini文件的添加,注释,删除,获取信息,多行信息获取等。

这里主要说的iniset和iniget函数在devstack/inc/ini-config文件里面。

iniset具体函数内容:

  1. # Set an option in an INI file
  2. # iniset [-sudo] config-file section option value
  3. # - if the file does not exist, it is created
  4. function iniset {
  5. local xtrace=$(set +o | grep xtrace)
  6. set +o xtrace
  7. local sudo=""
  8. if [ $ == "-sudo" ]; then
  9. sudo="sudo "
  10. shift
  11. fi
  12. local file=$
  13. local section=$
  14. local option=$
  15. local value=$
  16.  
  17. if [[ -z $section || -z $option ]]; then
  18. $xtrace
  19. return
  20. fi
  21.  
  22. if ! grep -q "^\[$section\]" "$file" >/dev/null; then
  23. # Add section at the end
  24. echo -e "\n[$section]" | $sudo tee --append "$file" > /dev/null
  25. fi
  26. if ! ini_has_option "$file" "$section" "$option"; then
  27. # Add it
  28. $sudo sed -i -e "/^\[$section\]/ a\\
  29. $option = $value
  30. " "$file"
  31. else
  32. local sep=$(echo -ne "\x01")
  33. # Replace it
  34. $sudo sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('${option}'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
  35. fi
  36. $xtrace
  37. }

上面28-29两行,表示在以[$section]开头的行后面添加一行,这行的内容为"$option = $value"。注意,这里要用真实值替换,即$option和$value的真实值。主要是 a\选项的使用。

第34行,表示替换当前以后的section中option对应的值。具体含义是在$file文件中,将[$section]与下一个“[”开头的任意section(“]"结尾)之间的内容中,$option = 任意值,替换为$option = $value. 注意,$option与=号之间可以有任意多个空格,这个空格可以是space或者tab产生的。

下面说说iniget函数,代码如下:

  1. # Get an option from an INI file
  2. # iniget config-file section option
  3. function iniget {
  4. local xtrace=$(set +o | grep xtrace)
  5. set +o xtrace
  6. local file=$
  7. local section=$
  8. local option=$
  9. local line
  10.  
  11. line=$(sed -ne "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ p; }" "$file")
  12. echo ${line#*=}
  13. $xtrace
  14. }

这个函数的主要内容,就是将$file中,找到[$section]与下一个方括号代表的section之间以$option =开头的行的内容,并打印输出给变量line,注意,$option与=号之间可以有任意多个space或tab空格。然后echo输出line中=之后的内容。

理解上面两个函数后,就很容易了解ini配置文件的操作了。比如/etc/neutron/dhcp_agent.ini。ini文件的操作,重要的是要有一些sed的相关知识。

sed使用格式:

Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

option内容如下

-n, --quiet, --silent
  suppress automatic printing of pattern space
-e script, --expression=script
  add the script to the commands to be executed
-f script-file, --file=script-file
  add the contents of script-file to the commands to be executed
--follow-symlinks
  follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX]
  edit files in place (makes backup if SUFFIX supplied)
-c, --copy
  use copy instead of rename when shuffling files in -i mode
-b, --binary
  does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
  open files in binary mode (CR+LFs are not treated specially))
-l N, --line-length=N
  specify the desired line-wrap length for the `l' command
--posix
  disable all GNU extensions.
-r, --regexp-extended
  use extended regular expressions in the script.
-s, --separate
  consider files as separate rather than as a single continuous
  long stream.
-u, --unbuffered
  load minimal amounts of data from the input files and flush
  the output buffers more often
-z, --null-data
  separate lines by NUL characters
--help
  display this help and exit
--version
  output version information and exit

下面备注一些主要的sed命令,这些命令可以用在script中,请参考上面两个函数:

命令  功能
 a\

在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

 c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
 i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
 d  删除行
 h  把模式空间里的内容复制到暂存缓冲区
 H  把模式空间里的内容追加到暂存缓冲区
 g  把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
 G  把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
 l  列出非打印字符
 p  打印行
 n  读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
 q  结束或退出sed
 r  从文件中读取输入行
 !  对所选行以外的所有行应用命令
 s  用一个字符串替换另一个
 g  在行内进行全局替换
   
 w  将所选的行写入文件
 x  交换暂存缓冲区与模式空间的内容
 y  将字符替换为另一字符(不能对正则表达式使用y命令)

openstack(liberty): devstack中的iniset/iniget函数分析的更多相关文章

  1. [译] OpenStack Liberty 版本中的53个新变化

    一个新的秋季,一个新的OpenStack 版本.OpenStack 的第12个版本,Liberty,在10月15日如期交付,而且目前发行版本已经备好了.那么我们期望能从过去六个月时间的开发中获得些什么 ...

  2. openstack(liberty): devstack之screen

    在devstack的stack.sh文件中,可以看到所有配置的service启动方式有两种,根据是否USE_SCREEN进行是在screen window中启动,还是直接起. 默认情况,USE_SCR ...

  3. Java中String的hash函数分析

    转载自:http://blog.csdn.net/hengyunabc/article/details/7198533 JDK6的源码: [java] view plaincopy /** * Ret ...

  4. C++中的内联函数分析

    1,本节课学习 C++ 中才引入的新的概念,内联函数: 2,常量与宏回顾: 1,C++ 中的 const 常量可以替代宏常数定义,如: 1,const int A = 3; <==> #d ...

  5. HashMap中的哈希函数分析

    首先我们要知道,在理想情况下的哈希表中,哈希函数生成的哈希值是value在数组中的下标,其范围是分布于负无穷到正无穷的整个实整数轴的.而在现实情况下,是不可能存在这么大的一个数组的.接下来分析Hash ...

  6. [OpenStack] [Liberty] Neutron单网卡桥接模式访问外网

    环境配置: * Exsi一台 * Exsi创建的单网卡虚拟机一台 * Ubuntu 14LTS 64位操作系统 * OpenStack Liberty版本 * 使用Neutron网络而非Nova网络 ...

  7. [译] OpenStack Kilo 版本中 Neutron 的新变化

    OpenStack Kilo 版本,OpenStack 这个开源项目的第11个版本,已经于2015年4月正式发布了.现在是个合适的时间来看看这个版本中Neutron到底发生了哪些变化了,以及引入了哪些 ...

  8. openstack(liberty): 简单网络连接图

    openstack起初的网络部分是和计算核心nova合在一起的,后来被拆分出来,独立成为一个模块, 现在名为Neutron. 本博文是学习记录,记录的是基于GRE tunnel技术的neutron和计 ...

  9. CentOS7.4安装部署openstack [Liberty版] (二)

    继上一篇博客CentOS7.4安装部署openstack [Liberty版] (一),本篇继续讲述后续部分的内容 一.添加块设备存储服务 1.服务简述: OpenStack块存储服务为实例提供块存储 ...

随机推荐

  1. Selenium Grid原理

    转载: http://blog.csdn.net/five3/article/details/9428655 Selenium-Grid版本 selenium-grid分为版本1和版本2,其实它的2个 ...

  2. Smart210学习记录------paltform总线

    转自http://blog.csdn.net/xiaochongtou123/article/details/7752328 1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2 ...

  3. busybox reboot 无效

    /*********************************************************************** * busybox reboot 无效 * 说明: * ...

  4. 《JS高程》实现继承的6种方式(完整版)

    许多OO语言都支持 两种继承方式: (1)接口继承:只继承方法签名: (2)实现继承:继承实际的方法. ECMAScript 由于函数没有签名,无法实现接口继承,因此只支持实现继承,而且主要是依靠原型 ...

  5. js对数组的操作函数

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多, 自以为js高手的自己居然无从下手, ...

  6. 关于cocos2d-x 与 cocos2d-html5 资源预加载的思考

    移动端资源预加载,可以做到需要加载的时候,从本地磁盘加载到内存,当纹理不需要的时候,都是强制清理内存里的纹理占用: cc.TextureCache.getInstance().removeAllTex ...

  7. elfutils-libelf由于依赖而安装失败

    在Redhat安装Oracles前需要按照依赖包,但是在安装elfutils-libelf遇到了两个包相互依赖的情况 [root@rhvm1 /]# rpm -i elfutils-libelf-de ...

  8. Centos搭建openvpn+mysql数据库认证

    服务器环境说明 1.系统版本 CentOS release 5.10 (Final) 64bits 2.软件版本 openvpn-2.3.6-1.el5 lzo-2.02-2.el5.1 lzo-d ...

  9. 3-1 rpm包命名规则

    1.RPM包的来源 <1>RPM包在系统光盘中 ---------------------------------------------------------------------- ...

  10. Git 基础应用

    Git 学习 1.git工具基本含义 git最大的用处就是记录每个版本的变动.比较每个版本的不同,以及多人维护和开发同一个项目.支持版本回退. 2.git基本命令 a.创建版本库 $ mkdir le ...