<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Cisco-Asa on network-notes</title><link>/tags/cisco-asa/</link><description>Recent content in Cisco-Asa on network-notes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>brett@network-notes.com (Brett Lykins)</managingEditor><webMaster>brett@network-notes.com (Brett Lykins)</webMaster><copyright>© 2015-2026 Brett Lykins</copyright><lastBuildDate>Tue, 28 Apr 2026 09:00:00 +0000</lastBuildDate><atom:link href="/tags/cisco-asa/feed.xml" rel="self" type="application/rss+xml"/><item><title>CLI Over HTTPS Part 1: The Protocol Tax</title><link>/posts/2026/cli-over-https-1/</link><pubDate>Tue, 28 Apr 2026 09:00:00 +0000</pubDate><author>brett@network-notes.com (Brett Lykins)</author><dc:creator>Brett Lykins</dc:creator><guid>/posts/2026/cli-over-https-1/</guid><description>&lt;p&gt;During my six years at Rackspace, we spent a lot of time thinking about how to interact with network devices faster.
We had tens of thousands of them; firewalls, load balancers, switches, routers and more, all spread across multiple data centers on four continents.&lt;/p&gt;
&lt;p&gt;In the early days, managing devices across these data centers meant running shell scripts, Expect, or Perl from local machines and centralized bastions over the WAN.
It was operationally painful.
SSH connections to devices on other continents were slow enough that teams scheduled automation runs around maintenance windows not just because of the change itself, but because of how long it took to deliver the changes.&lt;/p&gt;
&lt;p&gt;An Erlang-based platform solved this by co-locating the SSH connections with the devices.
They ran inside each data center, talking SSH to devices over local links where the protocol overhead was negligible.
Phil Toland &lt;a href="https://www.infoq.com/presentations/Erlang-Ruby-Rackspace/"&gt;presented the Erlang architecture at Erlang Factory 2012&lt;/a&gt;, detailing Erlang and Ruby managing backups and automation for 20,000+ network devices across 8 data centers.
My team later supplemented it with a Go microservices architecture to provide API-driven access to device CLIs.
Both systems were effective not just because of language capabilities; crucially they were fast because SSH stayed local.&lt;/p&gt;
&lt;p&gt;But, even with co-located endpoints, the Cisco ASA fleet was a special case which tested our capabilities due to the extreme size of some of the Access Lists.
That&amp;rsquo;s when someone discovered that the ASA has an HTTP interface we could use.
Not the ineffective ASA Java-based REST API, but an actual CLI-over-HTTPS endpoint used by the ASDM client.
There was a URL on the device where you could send the same commands you&amp;rsquo;d type into an SSH session, but over an HTTPS request.
We tried it as an experiment, and it was remarkably faster.
What started as a curiosity became a production lifesaver for our ASA fleet.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been thinking about that experience ever since, and I finally decided to quantify it properly.
In this series of posts, I will quantify the performance difference between SSH and HTTPS as CLI transports and explain why the gap exists.&lt;/p&gt;
&lt;h2 id="the-ssh-tax"&gt;The SSH Tax&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;For a deeper look at SSH&amp;rsquo;s protocol layers, channel types, and how NETCONF and RESTCONF fit in, see &lt;a href="../../posts/2026/ssh-under-the-hood/"&gt;What Actually Happens When You SSH Into a Router&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When your automation tool opens an SSH connection to a network device, here&amp;rsquo;s what actually happens on the wire before a single byte of command output comes back.
(Throughout this series, &amp;ldquo;RT&amp;rdquo; means a round trip: one message out, one message back. &amp;ldquo;RTT&amp;rdquo; is the round-trip time in milliseconds for a given network path.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. TCP three-way handshake.&lt;/strong&gt; SYN, SYN-ACK, ACK. One round trip. (The ACK can piggyback on the first data segment, but the connection isn&amp;rsquo;t usable until the handshake completes.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Protocol version exchange.&lt;/strong&gt; Client and server each send an identification string (&lt;code&gt;SSH-2.0-OpenSSH_9.6&lt;/code&gt;). Another round trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Key exchange.&lt;/strong&gt; The client and server negotiate algorithms (encryption, MAC, compression) via KEXINIT, then perform a Diffie-Hellman key exchange. This takes 1-3 round trips depending on whether the KEXINIT messages cross in flight and which DH group is negotiated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Service request.&lt;/strong&gt; The client requests the &lt;code&gt;ssh-userauth&lt;/code&gt; service. One round trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. User authentication.&lt;/strong&gt; Password or public key auth. 1-3 round trips depending on how many methods the server probes (GSSAPI, publickey, then password, each one a round trip).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Channel open.&lt;/strong&gt; SSH multiplexes channels over a single connection. Opening a session channel is another round trip.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s &lt;strong&gt;6-10 round trips&lt;/strong&gt; just to get an authenticated channel. If you&amp;rsquo;re running a single exec-style command, add one more round trip for the request/response and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;But automation tools don&amp;rsquo;t use exec mode. Netmiko, Ansible, and Scrapli open a PTY/shell channel, which adds:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. PTY request.&lt;/strong&gt; Ask the server for a pseudo-terminal. One round trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. Shell request.&lt;/strong&gt; Start an interactive shell on that PTY. One round trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9. Session prep.&lt;/strong&gt; Send &lt;code&gt;terminal length 0&lt;/code&gt;, &lt;code&gt;terminal width 511&lt;/code&gt;, and wait for each prompt. Two to three more round trips.&lt;/p&gt;
&lt;p&gt;Add it up: &lt;strong&gt;10-15 round trips&lt;/strong&gt; before you see the output of &lt;code&gt;show version&lt;/code&gt;, with most real-world automation sessions landing at 10-12. The &lt;a href="https://github.com/francoismichel/ssh3"&gt;SSH3 project&lt;/a&gt; cites similar overhead in their motivation for building SSH over HTTP/3.&lt;/p&gt;
&lt;p&gt;SSH multiplexing (ControlMaster) amortizes the connection setup cost across sessions, but the first connection still pays the full overhead. It helps for repeated connections to the same device, but doesn&amp;rsquo;t solve the problem at scale across thousands of hosts.&lt;/p&gt;
&lt;p&gt;&lt;img src="../../img/2026/ssh-connection-lifecycle.c495d377728639bd46d3e72a152d0060cd70f07f15913d5753113b9d35d43035.svg" alt="SSH connection lifecycle showing 10-12 round trips: TCP handshake, version exchange, key exchange, authentication, channel open, PTY request, shell request, session prep, and first command" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;At zero latency (localhost), nobody cares. At real-world distances, it compounds fast.&lt;/p&gt;
&lt;h2 id="what-this-costs-at-real-distances"&gt;What This Costs at Real Distances&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.verizon.com/business/terms/latency/"&gt;Verizon Enterprise publishes monthly backbone latency measurements&lt;/a&gt; from their global network. Here&amp;rsquo;s what SSH connection setup costs at those measured round-trip times, assuming 10-15 round trips for a typical PTY/shell automation session:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Measured RTT&lt;/th&gt;
&lt;th&gt;SSH setup (10-15 RT)&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US backbone (intra-region)&lt;/td&gt;
&lt;td&gt;30ms&lt;/td&gt;
&lt;td&gt;300-450ms&lt;/td&gt;
&lt;td&gt;Verizon Mar 2026: 29.9ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transatlantic (NYC ↔ London)&lt;/td&gt;
&lt;td&gt;70ms&lt;/td&gt;
&lt;td&gt;700-1,050ms&lt;/td&gt;
&lt;td&gt;Verizon Mar 2026: 70.2ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US ↔ Hong Kong&lt;/td&gt;
&lt;td&gt;146ms&lt;/td&gt;
&lt;td&gt;1,460-2,190ms&lt;/td&gt;
&lt;td&gt;Verizon Mar 2026: 145.5ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US ↔ New Zealand&lt;/td&gt;
&lt;td&gt;174ms&lt;/td&gt;
&lt;td&gt;1,740-2,610ms&lt;/td&gt;
&lt;td&gt;Verizon Mar 2026: 174.2ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That&amp;rsquo;s just connection setup.
You haven&amp;rsquo;t sent a command yet.
And if your automation opens a fresh SSH connection per device, or per task, which is &lt;a href="https://www.howtouselinux.com/post/the-hidden-ssh-setting-that-makes-ansible-playbooks-faster"&gt;Ansible&amp;rsquo;s default behavior without ControlMaster&lt;/a&gt;, you pay this cost repeatedly.&lt;/p&gt;
&lt;p&gt;A thousand devices at 30ms RTT without concurrency: 300-450 seconds of pure SSH handshake overhead. At 150ms RTT: 1,500-2,250 seconds. Concurrency reduces wall time, but every device still pays the full per-connection cost.&lt;/p&gt;
&lt;h2 id="the-screen-scraping-tax"&gt;The Screen-Scraping Tax&lt;/h2&gt;
&lt;p&gt;SSH&amp;rsquo;s round-trip overhead is only half the story. The other half is what happens after you connect.&lt;/p&gt;
&lt;p&gt;SSH gives you a byte stream. A pseudo-terminal. Your automation tool has to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detect the prompt&lt;/strong&gt; to know when command output is complete. Netmiko does this with regex matching on every chunk of bytes received, waiting for a pattern like &lt;code&gt;hostname#&lt;/code&gt;. If the output is large or arrives in small TCP segments, this means multiple read cycles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handle pagination.&lt;/strong&gt; &lt;code&gt;--More--&lt;/code&gt; prompts. Most tools send &lt;code&gt;terminal length 0&lt;/code&gt; first, which is another command round trip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Navigate mode transitions.&lt;/strong&gt; &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;configure terminal&lt;/code&gt;, &lt;code&gt;interface GigabitEthernet0/0&lt;/code&gt;. Each one is a command, a prompt change, and a round trip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait for command completion.&lt;/strong&gt; Netmiko&amp;rsquo;s default &lt;code&gt;read_timeout&lt;/code&gt; adds deliberate delays to avoid reading partial output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is Netmiko&amp;rsquo;s fault. It&amp;rsquo;s doing the best it can with what SSH gives it: an unstructured byte stream with no framing, no content-length, no end-of-message delimiter. The tool has to infer when the device is done talking. Compare that to HTTPS (&lt;code&gt;Content-Length&lt;/code&gt;), NETCONF (&lt;code&gt;]]&amp;gt;]]&amp;gt;&lt;/code&gt; delimiter), or even SSH exec mode (exit codes). PTY is the only mode where the client has to guess when the response is complete.&lt;/p&gt;
&lt;h2 id="the-https-alternative"&gt;The HTTPS Alternative&lt;/h2&gt;
&lt;p&gt;Now consider what happens when you send the same command over HTTPS:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. TCP three-way handshake.&lt;/strong&gt; Same as SSH. One round trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. TLS 1.3 handshake.&lt;/strong&gt; 1 round trip. (TLS 1.2 was 2 round trips; &lt;a href="https://datatracker.ietf.org/doc/html/rfc8446"&gt;TLS 1.3 cut it in half&lt;/a&gt;. With session resumption, it&amp;rsquo;s 0 round trips.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. HTTP request/response.&lt;/strong&gt; Send the command, get the output. 1 round trip.&lt;/p&gt;
&lt;p&gt;Total: &lt;strong&gt;about 3 round trips&lt;/strong&gt; for a fresh connection. With connection reuse (HTTP keep-alive, which every HTTP client library does by default): &lt;strong&gt;1 round trip per command&lt;/strong&gt; after the first.&lt;/p&gt;
&lt;p&gt;&lt;img src="../../img/2026/https-connection-lifecycle.206adeb3f2457d3ce8fd45b460b5abba65003e5869137c9550fa0b9470d9dc67.svg" alt="HTTPS connection lifecycle showing ~3 round trips: TCP handshake, TLS 1.3 handshake, HTTP request and response" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Side by side, the difference is stark.
Here&amp;rsquo;s the same operation (5 commands at 30ms RTT) over both protocols:&lt;/p&gt;
&lt;p&gt;&lt;img src="../../img/2026/ssh-vs-https-timeline.fb4f12e2a561a8f9db9a1635005d7609f99d8ca0eccfa3f9886ebd8f856dee0f.svg" alt="Side-by-side timeline: SSH PTY/shell takes 15 round trips and 523ms, HTTPS batch takes 3 round trips and 102ms" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the part that changes the math entirely: &lt;strong&gt;you can batch commands&lt;/strong&gt;. The Cisco ASA HTTP interface accepts multiple commands in a single request, either slash-separated in the URL or newline-delimited in a POST body. Ten commands, one request, one response. That&amp;rsquo;s 1 round trip for 10 commands, vs SSH where each command requires its own channel-open and exec round trips.&lt;/p&gt;
&lt;p&gt;No prompt detection. No pagination handling. No mode transitions. The response body is the command output, with a proper HTTP &lt;code&gt;Content-Length&lt;/code&gt; header. Your client knows exactly when the response is complete.&lt;/p&gt;
&lt;h2 id="prior-art-the-cisco-asa-http-interface"&gt;Prior Art: The Cisco ASA HTTP Interface&lt;/h2&gt;
&lt;p&gt;This isn&amp;rsquo;t a theoretical proposal. Cisco has shipped an HTTP-based CLI interface on the ASA for years. Their &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/asa/misc/http-interface/asa-http-interface.html"&gt;own documentation&lt;/a&gt; opens with this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One way to interface with most network appliances including ASAs is via CLI. An automated tool could Telnet or SSH into a device, authenticate and execute commands, one at a time. This method has a number of drawbacks, however. The tool must maintain the state of the Telnet and SSH connection, and if that connection is broken, the login process has to be repeated. Using CLI, it is only possible to send one command at a time, so administering many firewalls would be time consuming, &lt;strong&gt;especially when the firewalls are some latency away from the management station&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cisco identified the exact problem and shipped a solution. The interface is straightforward:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Single command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sk -u admin:admin https://asa.example.com/admin/exec/show+version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Multiple commands in one request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sk -u admin:admin https://asa.example.com/admin/exec/show+version/show+ip+interface+brief
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Bulk config push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sk -u admin:admin -X POST --data-binary @config.txt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://asa.example.com/admin/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Basic auth over TLS. URL-encoded commands in the path. Newline-delimited commands in a POST body. No SDK, no client library, no special protocol. Just HTTPS.&lt;/p&gt;
&lt;p&gt;Aaron Hackney, another principal engineer at Rackspace at the time who was dealing with the same fleet of ASAs, went deep on this interface in a &lt;a href="https://community.cisco.com/t5/security-blogs/script-an-asdm-session-part-i/bc-p/3663026"&gt;BRKSEC-2031 session at Cisco Live Orlando 2018&lt;/a&gt;.
The work involved reverse-engineering the ASDM client&amp;rsquo;s HTTP calls and building Python tooling to script against the same interface.
The two-part Cisco community blog series that followed is still one of the best references for anyone looking to automate ASAs over HTTPS instead of SSH.&lt;/p&gt;
&lt;h2 id="great-but-my-switches-dont-have-an-https-cli"&gt;&amp;ldquo;Great, but My Switches Don&amp;rsquo;t Have an HTTPS CLI&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;The network automation community has spent a decade building tooling around SSH.
Netmiko, Paramiko, Ansible&amp;rsquo;s &lt;code&gt;network_cli&lt;/code&gt;, Nornir, NAPALM. All SSH-based for CLI interaction.
That investment is real and valuable. NETCONF and gNMI exist as alternatives, but they require device support for structured data models.
A different paradigm entirely. Many organizations have thousands of CLI commands, templates, and playbooks that work.
They don&amp;rsquo;t need a new data model.
They need a faster pipe.&lt;/p&gt;
&lt;p&gt;And the ASA&amp;rsquo;s HTTP interface is the exception, not the rule.
Most network platforms (IOS, NX-OS, EOS, Junos) don&amp;rsquo;t expose their CLI over HTTPS.
Realistically, that&amp;rsquo;s not going to change across the industry without a major shift in how vendors think about management plane interfaces.
I&amp;rsquo;m not holding my breath.&lt;/p&gt;
&lt;p&gt;But the protocol overhead problem doesn&amp;rsquo;t go away just because the devices don&amp;rsquo;t support the better transport natively.
So what do you do?&lt;/p&gt;
&lt;p&gt;You move the expensive SSH transactions to the edge.
Put a lightweight proxy, an API gateway, a microservice, whatever you want to call it, close to the devices it manages.
That proxy talks SSH to the devices over a low-latency local network where the round-trip overhead is negligible.
Your automation platform talks HTTPS to the proxy over the WAN, where the round-trip savings actually matter.&lt;/p&gt;
&lt;p&gt;The pattern looks like this: your centralized automation (Ansible, Nornir, custom tooling) sends an HTTPS request to a proxy co-located with the devices.
The proxy opens an SSH session to the device on a 1-2ms local link, executes the commands, and returns the output in the HTTP response.
Your automation never touches SSH directly.
It gets the speed of HTTPS over the WAN and the compatibility of SSH on the last hop.&lt;/p&gt;
&lt;p&gt;&lt;img src="../../img/2026/cli-over-https-proxy-concept.ce050a5b98dc507728b570b47f6e8daadd209ff85ebba3533b93cf6be936e078.svg" alt="Edge proxy architecture: automation talks HTTPS over the WAN to a co-located proxy, which talks SSH to devices over a 1-2ms local link" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t hypothetical.
It&amp;rsquo;s the architecture behind tools like my &lt;a href="https://github.com/lykinsbd/naas"&gt;NAAS (Netmiko as a Service)&lt;/a&gt; application, which wraps Netmiko&amp;rsquo;s SSH sessions behind a REST API.
Deploy a NAAS instance in each region or data center, and your automation talks HTTP to the nearest one.
The SSH overhead stays local.
The WAN traffic is pure HTTPS.&lt;/p&gt;
&lt;p&gt;In &lt;a href="../../posts/2026/cli-over-https-2/"&gt;Part 2&lt;/a&gt;, I&amp;rsquo;ll detail a dual-protocol device emulator I built in Go that serves the same commands over both SSH and HTTPS, and a benchmark client that measures the difference at realistic latencies.
The &lt;a href="https://github.com/lykinsbd/clibench"&gt;code is already public&lt;/a&gt; if you want to run ahead.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My take:&lt;/strong&gt; SSH is a fine protocol for interactive terminal sessions.
It&amp;rsquo;s a poor protocol for automation at scale.
The round-trip overhead is baked into the protocol design, and no amount of connection pooling or multiplexing fully eliminates it.
HTTPS with TLS 1.3 is a strictly better transport for the &amp;ldquo;send command, get output&amp;rdquo; pattern that defines CLI automation.
The industry should be building toward it.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>