libslax 默认扩展库:bit、curl、db、OS 和 xutil
libslax 位扩展库
libslax 位扩展库包含创建和操作 位 字符串的函数。这些函数支持 64 位整数参数。若要将 位 扩展库中的函数合并到 SLAX 脚本中,请在脚本中包含该库的命名空间语句。
ns bit extension = "http://xml.libslax.org/bit";
使用前缀和函数名称调用 bit
位扩展函数。例如:
version 1.1; ns bit extension = "http://xml.libslax.org/bit"; var $a = 63; var $b = { expr "10111"; } match / { <out> { <bit-and> { <a1> bit:and("101100", "100101"); <a2> bit:and($a, $b); <a3> bit:and($a, number($b)); } <bit-or> { <a1> bit:or("101100", "100101"); <a2> bit:or($a, $b); <a3> bit:or($a, number($b)); } <bit-mask> { <a1> bit:mask(0); <a2> bit:mask(8, 32); } <ops> { <a1> bit:to-int("10101"); } } }
表 1 列出了位扩展库中可用的函数,Junos OS 12.2 版及更高版本的 SLAX 1.1 脚本支持该函数。
函数和参数 |
描述 |
例子 |
---|---|---|
|
返回两位字符串的逻辑 AND。 |
|
|
将位字符串中的指定位设置为零,并返回新的位字符串。位从零开始编号。如果整数参数大于位字符串长度,则扩展位字符串。 |
|
|
比较两个值,如果发现第一个参数分别小于、等于或大于第二个参数,则返回一个小于、等于或大于零的整数。 |
|
|
以位字符串形式返回十六进制参数的值。可选的第二个参数用前导零 (0) 填充位字符串,直到达到指定的长度。 |
|
|
以位字符串形式返回整数参数的值。可选的第二个参数用前导零填充位字符串,直到达到指定的长度。 |
|
|
返回将指定低阶位数设置为 1 的位字符串。可选的第二个参数用前导零填充位字符串,直到达到指定的长度。 |
|
|
返回两位字符串的逻辑 NAND。 |
|
|
返回两位字符串的逻辑 NOR。 |
|
|
返回位字符串的反转 (NOT)。 |
|
|
返回两位字符串的逻辑 OR。 |
|
|
在位字符串中设置指定的位并返回新的位字符串。位从零开始编号。如果整数参数大于位字符串长度,则扩展位字符串。 |
|
|
以整数形式返回位字符串参数的值。 |
|
|
将位字符串参数的值作为十六进制值的字符串表示形式返回。 |
|
|
返回两位字符串的逻辑 XOR。 |
|
|
返回两位字符串的逻辑 XNOR。 |
|
libslax curl 扩展库
了解 libslax curl 扩展库
cURL 是一个命令行工具,它使用 libcurl 库并支持使用多种协议的数据传输,包括 FTP、FTPS、HTTP、HTTPS、SCP 和 SMTP。有关 cURL 的详细信息,请参阅 cURL 网站 http://curl.haxx.se/。
libslax发行版包括 curl 扩展库,其中包含执行cURL操作的函数。要将 libslax curl 扩展库中的函数合并到 SLAX 脚本中,请在脚本中包含该库的命名空间语句。
ns curl extension = "http://xml.libslax.org/curl";
然后,curl
可以使用前缀和函数名称调用 curl 扩展函数。 cURL 操作使用传递给扩展函数的一组元素进行定向。
表 2 列出了 curl 扩展库中支持的操作,并包含每个函数的说明。表 3 和表 4 列出了支持的元素,并包括每个元素的语法和说明。更具体地说,表 3 列出了用于 Web 服务操作的元素,表 4 列出了用于电子邮件操作的元素。有关使用 curl 扩展库的示例和其他信息,请参阅 curl 扩展库。
功能 |
描述 |
---|---|
|
关闭打开的连接。无法通过连接执行进一步的操作。请参阅 卷曲:关闭。 |
|
打开与远程服务器的连接,允许通过单个连接执行多个操作。请参阅 curl:open。 |
|
使用 提供的 |
|
记录一组在连接生命周期内持续存在的参数。请参阅 curl:set。 |
|
在不使用持久连接的情况下执行传输操作。请参阅卷曲:单。 |
元素 |
描述 |
语法 |
---|---|---|
|
连接尝试被视为失败之前的秒数。 |
|
|
传输有效负载的 MIME 类型。 |
|
|
控制如何处理 HTML 和 XML 分析错误。 |
请参阅 处理错误 |
|
指示如果检测到任何错误(包括无关紧要的错误),传输应失败。 |
|
|
指定返回结果的预期格式,允许 curl 扩展名自动使内容以本机格式提供。格式包括“html”、“name”、“text”、“url-encoded”和“xml”。 |
|
|
为请求提供其他标头字段。 |
|
|
表示愿意容忍不安全的通信操作。具体而言,允许 SSL 证书而不检查公用名。 |
|
|
用于传输数据的方法。这控制 HTTP 请求类型,以及触发其他传输机制。 可接受的方法名称包括“获取”、“发布”、“删除”、“头”、“电子邮件”、“放置”和“上传”。“get”是默认值。 |
|
|
为请求提供其他参数值。这些参数通常编码到 URL 中。 |
|
|
用于传输的用户密码。 |
|
|
请求使用协议的安全版本,包括 HTTPS 和 FTPS。 |
|
|
打开的连接被视为失败之前的秒数。 |
|
|
指示这是文件上传请求。 |
|
|
请求的基本 URL。 |
|
|
用于转移的用户名。 |
|
|
请求有关传输操作和通信的详细调试信息。 |
|
元素 |
描述 |
语法 |
---|---|---|
|
电子邮件 (SMTP) 请求的“抄送”地址。对于多个地址,请使用多个 <cc> 元素。 |
|
|
要传输的内容。 |
|
|
电子邮件 (SMTP) 请求的“发件人”地址。 |
|
|
用于电子邮件 (SMTP) 请求的本地主机名。 |
|
|
传出 SMTP 服务器名称。目前,不处理 MX 记录。 |
|
|
电子邮件 (SMTP) 请求的“主题”字段。 |
|
|
电子邮件 (SMTP) 请求的“收件人”地址。对于多个地址,请使用多个 <to> 元素。 |
|
libcurl 元素非常模仿 libcurl curl_easy_setopt()
函数中本机 C libcurl API 使用的选项。设置选项后,调用 将 curl_easy_perform()
执行请求的传输。有关该 curl_easy_setopt()
函数的详细信息,请参阅 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html 。
在 libslax curl 扩展库中,libcurl API 选项表示为单个元素。例如, <url>
元素映射到 CURLOPT_URL 选项 ,元素映射到 CURLOPT_CUSTOMREQUEST 选项, <method>
等等。
这些元素可以通过三种方式使用:
curl:single()
扩展函数支持在没有持久连接句柄的单个传输操作中使用一组选项。curl:perform()
扩展函数支持使用一组具有持久连接句柄的选项。句柄从curl:open()
扩展函数返回,可以使用扩展函数关闭curl:close()
。curl:set()
扩展函数记录连接句柄的一组选项,并在连接的生存期内使这些选项保持活动状态。例如,如果脚本需要传输大量文件,它可以记录<username>
和<password>
选项,并避免在每次curl:perform()
调用中重复它们。
卷曲:关闭
curl:close()
扩展功能关闭打开的连接。连接关闭后,无法对连接执行进一步的操作。
语法为:
node-set[empty] curl:close(node-set[connection]);
参数是要关闭的连接句柄。
卷曲:打开
curl:open()
扩展功能打开与远程服务器的连接,允许通过单个连接执行多个操作。
语法为:
node-set[connection] curl:open();
返回的对象是可以传递给 curl:perform()
或 curl:close()
的连接句柄。
卷曲:执行
curl:perform()
扩展功能使用 提供的curl:open()
持久连接句柄执行简单传输。
语法为:
node-set[object] curl:perform(node-set[connection], node-set[options])
参数是连接句柄和一组选项元素。表 3 和表 4 中定义了支持的 curl 扩展库元素。
返回的对象是包含传输结果的 XML 层次结构。表 5 列出了答复中可能的元素, 表 6 列出了元素中包含的 <header>
可能元素。
元素 |
内容 |
---|---|
|
表示成功的空元素 |
|
解析的数据 |
|
错误消息文本(如果有) |
|
分析的标头字段 |
|
来自回复的原始数据 |
|
回复中的原始标头字段 |
|
请求的网址 |
元素 |
内容 |
---|---|
|
HTTP 回复代码 |
|
HTTP 回复字段(带@name和值) |
|
HTTP 回复消息 |
|
HTTP 回复版本字符串 |
以下示例显示了 <header>
将标头字段解析为元素的 <field>
元素:
<header> <version>HTTP/1.1</version> <code>404</code> <message>Not Found</message> <field name="Content-Type">text/html</field> <field name="Content-Length">345</field> <field name="Date">Mon, 08 Aug 2011 03:40:21 GMT</field> <field name="Server">lighttpd/1.4.28 juisebox</field> </header>
卷曲:设置
curl:set()
扩展函数记录一组参数,这些参数在连接的生命周期内持续存在。
语法为:
node-set[empty] curl:set(node-set[handle], node-set[options]);
卷曲:单曲
扩展函数在 curl:single()
不使用持久连接的情况下执行传输操作。
语法为:
node-set[result] curl:single(node-set[options]);
返回的对象在结构上与 返回 curl:perform()
的对象相同。有关其他信息,请参阅 curl:perform 。
支持的格式元素
从 Junos OS 14.2 版及更高版本中支持的 SLAX 语言版本 1.2 开始,除了 format
“html”、“text”和“xml”之外,该元素还支持两种新格式:“name”和“url-encoded”。“name”编码用于由换行符分隔的名称=值对,而“url编码”编码用于名称=值对由与号 (&) 分隔。
解析的数据使用元素在<name>
元素中<data>
返回。在以下示例中,format
设置为“url-encoded”:
<results> <url>http://api.example.com/request_token</url> <curl-success/> <raw-headers>HTTP/1.1 200 OK
 Server: XXXX
 Date: Tue, 18 Jun 2013 18:56:31 GMT
 Content-Type: application/x-www-form-urlencoded
 Transfer-Encoding: chunked
 Connection: keep-alive
 x-server-response-time: 69
 x-example-request-id: 123456
 pragma: no-cache
 cache-control: no-cache
 x-http-protocol: None
 x-frame-options: SAMEORIGIN
 X-RequestId: 12345
 
 </raw-headers> <headers> <version>HTTP/1.1</version> <code>200</code> <message>OK</message> <header name="Server">XXXXX</header> <header name="Date">Tue, 18 Jun 2013 18:56:31 GMT</header> <header name="Content-Type" >application/x-www-form-urlencoded</header> <header name="Transfer-Encoding">chunked</header> <header name="Connection">keep-alive</header> <header name="x-server-response-time">69</header> <header name="x-example-request-id">123456</header> <header name="pragma">no-cache</header> <header name="cache-control">no-cache</header> <header name="x-http-protocol">None</header> <header name="x-frame-options">SAMEORIGIN</header> <header name="X-RequestId">12345</header> </headers> <raw-data>oauth_token_secret=s&oauth_token=t</raw-data> <data format="url-encoded"> <name name="oauth_token_secret">s</name> <name name="oauth_token">t</name> </data> </results>
curl 示例
以下示例显示了使用 libslax curl
扩展库函数来执行操作的 SLAX 脚本。
以下 SLAX 脚本执行简单的 GET 操作来检索网页。该脚本指定 HTTP 标头的标头字段以及合并到请求的 URL 中的参数。
version 1.1; ns curl extension = "http://xml.libslax.org/curl"; param $url = "http://www.juniper.net"; match / { <op-script-results> { var $options = { <header name="client"> "slaxproc"; <param name="smokey"> "bandit"; } var $results = curl:single($url, $options); message "completed: " _ $results/headers/message; <curl> { copy-of $results; } } }
以下 SLAX 脚本通过服务器发送电子邮件,该服务器作为参数提供:
version 1.1; ns curl extension = "http://xml.libslax.org/curl"; param $server; match / { <out> { var $info = { <method> "email"; <server> $server; <from> "muffin@example.com"; <to> "phil@example.net"; <subject> "Testing..."; <contents> "Hello, This is an email. Thanks, Phil "; } var $res = curl:single($info); <res> { copy-of $res; } } }
以下 SLAX 操作脚本使用提供的凭据连接并登录到 Web 应用程序:
version 1.2; ns curl extension = "http://xml.libslax.org/curl"; param $url = "http://198.51.100.10:4000/login"; param $username = "admin"; param $password = "password"; var $params := { <url> $url; <method> "post"; <insecure>; <param name="username"> $username; <param name="password"> $password; } main <top> { var $curl = curl:open(); var $data = curl:perform($curl, $params); copy-of $data; expr curl:close($curl); }
您可以使用 Flask 创建一个简单的 Web 应用程序来测试脚本。Flask在 PyPI上可用,是一个轻量级的Web服务器网关接口(WSGI)Web应用程序框架。 以下来自 https://pythonspot.com/login-authentication-with-flask 的 Python 脚本创建了一个带有登录页面的简单 Web 应用程序。
from flask import Flask from flask import Flask, flash, redirect, render_template, request, session, abort import os app = Flask(__name__) @app.route('/') def home(): if not session.get('logged_in'): return render_template('login.html') else: return "Hello Boss!" @app.route('/login', methods=['POST']) def do_admin_login(): if request.form['password'] == 'password' and request.form['username'] == 'admin': session['logged_in'] = True else: flash('wrong password!') return home() if __name__ == "__main__": app.secret_key = os.urandom(12) app.run(debug=True,host='0,0.0.0', port=4000)
要测试操作脚本,请先在远程设备上启动 Web 应用程序脚本。
user@nms:~$ python3 app.py * Serving Flask app "app" (lazy loading) ...
然后在运行 Junos OS 的设备上启用并运行操作脚本。结果将记录到 op-script.log 文件中。
user@router> op curl-test user@router> show log op-script.log | last 100 ... <?xml version="1.0"?> <top> <results> <url>http://198.51.100.10:4000/login</url> <curl-success/> <raw-headers>HTTP/1.0 200 OK
 Content-Type: text/html; charset=utf-8
 Content-Length: 11
 Vary: Cookie
 Set-Cookie: session=eyJsb2dnZWRfaW4iOnRydWV9.XzxdUg.wm2A58ct6twASerlHjuQ64nwaiI; HttpOnly; Path=/
 Server: Werkzeug/1.0.1 Python/3.6.9
 Date: Tue, 18 Aug 2020 22:59:30 GMT
 
 </raw-headers> <headers> <version>HTTP/1.0</version> <code>200</code> <message>OK</message> <header name="Content-Type">text/html; charset=utf-8</header> <header name="Content-Length">11</header> <header name="Vary">Cookie</header> <header name="Set-Cookie">session=eyJsb2dnZWRfaW4iOnRydWV9.XzxdUg.wm2A58ct6twASerlHjuQ64nwaiI; HttpOnly; Path=/</header> <header name="Server">Werkzeug/1.0.1 Python/3.6.9</header> <header name="Date">Tue, 18 Aug 2020 22:59:30 GMT</header> </headers> <raw-data>Hello Boss!</raw-data> </results>Aug 18 15:59:31 end dump </top> ...
处理错误
从 Junos OS 14.2 版及更高版本中支持的 SLAX 语言 1.2 版开始,您可以使用该 <errors>
元素来控制 HTML 和 XML 解析错误的处理。默认行为是在标准错误输出流 (stderr) 中显示错误。通过为 <errors>
元素提供不同的值,还可以选择忽略、记录或记录错误。 表 7 列出了可用于元素的值 errors
。
价值 |
特殊行为 |
---|---|
默认 |
错误显示在标准上 |
忽略 |
错误将被丢弃 |
日志 |
记录错误(通过 slaxLog()) |
记录 |
记录错误 |
当 的值 <errors>
设置为“record”时,所有错误都显示在 XML 节点中元素下的 <errors>
字符串中(例如由 返回 curl:perform
)。如果未生成任何错误,则该元素不存在, <errors>
这可以用作错误的测试。
var $opt = { <url> $url; <format> "html"; <errors> "record"; } var $res = curl:single($opts); if ($res/errors) { terminate "failure: " _ $res/errors; }
libslax db 扩展库
Junos OS 17.4R1 版及更高版本支持的 libslax 数据库 扩展库为 SLAX 脚本提供了一种存储、操作、检索和删除数据库中存储的数据的方法。要在 SLAX 脚本中使用 数据库扩展库中 的函数,请在脚本中包含该库的命名空间语句。
ns db extension = "http://xml.libslax.org/db";
表 8 汇总了 数据库 扩展库中可用的函数。有关 数据库 扩展函数的示例和其他信息,请参阅 db 扩展函数。
功能 |
描述 |
---|---|
|
关闭数据库连接并释放与以前对此句柄执行的操作关联的所有结构。 |
|
使用给定字段信息在与打开的数据库句柄关联的数据库中创建一个集合。 |
|
删除集合中与数据库中与打开的数据库句柄关联的给定条件匹配的实例。 |
|
使用从或 |
|
将游标返回到与给定条件匹配的实例的结果集。 |
|
查找并读取符合给定条件的所有实例。 |
|
将数据插入到与打开的数据库句柄关联的数据库中的集合中。 |
|
使用提供的选项打开数据库连接,其中包括后端数据库引擎和数据库名称。 |
|
运行自定义查询。 |
|
使用提供的实例更新一组符合给定条件的实例。 |
表 9 总结了可以在 数据库 扩展函数的选项和数据中使用的元素。有关 db 元素的示例和其他信息,请参阅 db 元素。
元素 |
描述 |
例子 |
---|---|---|
|
指定要对其执行操作的数据收集。这对应于 SQL 数据库表。 |
<collection> "employee"; |
|
指定使用数据存储中的数据实例进行操作时必须满足的条件。这构成了在使用 SQL 数据存储进行操作时与 WHERE 子句一起使用的条件。强制性元素包括:
|
<condition> { <selector> "id; <operator> "in"; <value> "(1, 10)"; } |
|
指定具有父节点或作为父 |
<conditions> { <and> { <condition> { ... /* c1 */ } <condition> { ... /* c2 */ } <or> { <condition> { ... /* c3 */ } <condition> { ... /* c4 */ } } } } |
|
指定要对其进行操作的数据库的名称。 |
<database> "test.db"; |
|
指定用于存储和访问数据的后端数据库引擎。 |
<engine> "sqlite"; |
|
定义集合中每个字段的元数据。 |
<field> { <name> "name"; <type> "integer"; <primary>; } |
|
使用子元素指定 |
<fields> { <field> { ... } } |
|
在数据存储中插入或操作数据时,表示集合中的单个实例。该元素包含该记录中的字段及其相应的值。 |
<instance> { <id> 5; <name> "John"; } |
|
在数据存储中插入或操作数据时,在集合中定义多个实例。 |
<instances> { <instance> { ... ... } ... } |
|
限制结果可以包含的实例数。 |
<limit> 10; |
|
从大多数 数据库 扩展函数返回的输出节点。此节点包含一个 |
<result> { <status> { <ok> } } |
|
仅指定在查询数据存储时应显示为结果集一部分的字段。 |
<retrieve> { <id>; <name>; } |
|
跳过结果集中指定数量的实例,然后再返回给用户。 |
<skip> 5; |
|
指定字段和结果集的排序顺序。 通过包含 |
<sort> { <by> "id"; <by> "age"; <order> "desc"; } |
libslax OS 扩展库
libslax os
扩展库提供了一组函数来调用本地主机上与操作系统相关的操作。若要在 SLAX 脚本中使用扩展库中的函数,请在脚本中包含该库的 os
命名空间语句。
ns os extension = "http://xml.libslax.org/os";
表 10 汇总了 OS 扩展库中可用的函数。许多 os
扩展函数的返回值由一组零个或多个错误节点组成。每个节点都可以包含一个 <error>
具有附加子元素的元素。有关扩展函数的示例 os
和其他信息,请参阅 os 扩展函数。
功能 |
描述 |
首个受支持的 Junos OS 版本 |
---|---|---|
|
更改一个或多个文件的权限。 |
17.4 |
|
更改一个或多个文件的文件所有者和组。 |
17.4 |
|
设置运行脚本的进程的退出代码。 |
14.1 |
|
创建具有指定名称、路径和权限的新目录。
|
14.1 |
|
删除文件或空目录。 |
17.4 |
|
返回有关元素节点 |
14.1 |
|
返回一个元素, |
17.4 |
libslax xutil 扩展库
libslax xutil 扩展库包含在字符串和 XML 节点集之间进行转换的函数。要将 xutil 扩展库中的函数合并到 SLAX 脚本中,请在脚本中包含该库的命名空间语句。
ns xutil extension = "http://xml.libslax.org/xutil";
使用 xutil 前缀和函数名称调用 xutil 扩展函数。表 11 列出了 xutil 扩展库中可用的函数,SLAX 1.1 及更高版本的脚本支持这些函数。有关 xutil 扩展函数的示例和其他信息,请参阅 xutil 扩展函数。
函数和参数 |
描述 |
首个受支持的 Junos OS 版本 |
---|---|---|
|
将包含 JSON 数据的字符串转换为该数据在 XML 中的本机表示形式。 |
14.2 |
|
限制递归调用的深度。默认限制为 3000。 |
14.1 |
|
将包含 XML 数据的字符串转换为该数据的本机表示形式。 |
12.2 |
|
将 XML 数据转换为包含 JSON 数据的字符串。此函数将标记编码为字符串中的 JSON 对象。 |
14.2 |
|
将 XML 数据转换为字符串。 |
12.2 |