条件表达式 if elseif switch case
if else 语句:
if option dhcp-user-class = "accounting" {
max-lease-time 17600;
option domain-name "accounting.example.org";
option domain-name-servers ns1.accounting.example.org,
ns2.accounting.example.org;
} elsif option dhcp-user-class = "sales" {
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
} elsif option dhcp-user-class = "engineering" {
max-lease-time 17600;
option domain-name "engineering.example.org";
option domain-name-servers ns1.engineering.example.org,
ns2.engineering.example.org;
} else {
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
ns2.misc.example.org;
}
Shell
if not 语句:
if not option domain-name = "example.org" {
prepend domain-name-servers 127.0.0.1;
}
说明:if elseif 语句用bool类型的作为参数,如果表达式值为true,就执行大括号里面的内容,表达式结果为null,当做false处理。
swtich case 语句类似:可以接收一个数据表达式或者数字表达式
switch 表达式和case 表达式类型要一直:
switch (option dhcp-user-class) {
case "accounting":
max-lease-time 17600;
option domain-name "accounting.example.org";
option domain-name-servers ns1.accounting.example.org,
ns2.accounting.example.org;
case "sales":
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
break;
default:
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
ns2.misc.example.org;
break;
}
bool表达式
data-expression-1 = data-expression-2
= 当两边表达式结果相等是返回true,不相等是返回false,左右或者右边有一遍为空是,返回null
data-expression-1 ~= data-expression-2
data-expression-1 ~~ data-expression-2
~= 操作符,表达式1用表达式2的规则去匹配,(dhcpd 采用regex(7)方式),如果结果为真,则表达式为真,如果结果不匹配或者出现错误或者有一端为空字符串,都当false处理。
~~和~= 的唯一区别就是~~不区分大小写,~=区分大小写。
boolean-expression-1 and boolean-expression-2
and 语句,如果两边的表达式结果都为真,则结果为真,否则为假,如果两边的结果都为空,则表达式的结果为空。
boolean-expression-1 or boolean-expression-2
or 语句,只要有一边为真,则结果为真,否则为false,两边结果都为null,则结果为null
not boolean-expression
not 语句, 如果布尔表达式的值是假的,not操作符就会评估为真,如果布尔表达式的值是真,则返回假。如果布尔表达式求值为空,则结果也为空。
exists option-name
exists 语句, 如果传入的dhcp 报文存在指定的option,则结果为真。
known
known 语句,如果处理的客户端在配置文件中已经有声明,则结果为真。
static
static 语句,如果分配给客户端的租约是静态租约,则为真。
数据表达式
bool表达式依赖于数据表达式,以下是常用的数据表达式的列表。
substring (data-expr, offset, length)
从data-expr表达式中截取对应的字符串,offset标识从第几个字节开始,length标识要截取的长度。
suffix (data-expr, length)
后缀匹配,从data-expr 字符串结尾处开始匹配,截取长度为length的字符串,与substring作用相反。
lcase (data-expr)
lcase 将表达式data-expr转换为小写。
ucase (data-expr)
ucase 将表达式data-expr转换为大写
option option-name
匹配对应的option内容。
hardware
硬件操作符返回一个链路层地址的数据字符串,其中第一个字节数据为硬件类型,目前支持的有(ethernet (1), token-ring (6), and fddi (8).)
packet (offset, length)
packet 操作符返回数据包中指定的部门, offset偏移值,从哪儿开始,length,需要截取的长度。
concat (data-expr1, ..., data-exprN)
将表达式结果一次链接起来。任何一个表达式为空,则结果为空。
reverse (numeric-expr1, data-expr2)
翻转表达式dada-expr2的评估结果,numeric-expr1指定翻转的长度。
举个例子:如果num值为4,表达式最后计算的结果为12,则翻转后的顺序为:后四个字节+中间四字节+前四个字节
leased-address
如果请求被处理的客户已经被分配了一个IP地址,这个数据表达式将返回该IP地址,如果该客户没有被分配一个IP地址,如果在代表该客户执行的可执行语句中发现这个数据表达式,则会输出一条语句信息到日志文件“there is no lease associated with this client"
binary-to-ascii (numeric-expr1, numeric-expr2, data-expr1, data-expr2)
将二进制数据转换为文本字符串表示。
numeric-expr1:指定转换数字的进制,2进制,8进制,16进制(取值2-16)
numeric-expr2:指定每个数字所占的位宽,8,16,32
data-expr1:表示输出字符串中每个转换后的数字之间的分隔符。
data-expr2:被转换的数据。
//将lease-address转换为10进制,每个数字占8bit,用.隔开binary-to-ascii(10, 8, ".", leased-address);
Plain Text
生成一个客户单ptr的记录的表达式规则:
concat (binary-to-ascii (10, 8, ".",
reverse (1, leased-address)),
".in-addr.arpa.");
Plain Text
pick-first-value (data-expr1 [ ... exprn ] )
从第一个表达式开始评估,遇到不为空的表达式就返回。