<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="../../../gus_xslt.xsl"?>
<howto
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://starling.ws/XML/howto.xsd">&#160;        
    <head>
        <cgi img="no" img_action="../../../cgi-bin/gus_web_photo.pl" img_path="../tet/gus_xml-rpc_pl" />
        <navigation ToC="Tabel of Contents:" 
            section="yes" topic="yes" subtopic="no" subsubtopic="no" links="yes"/>
        <syndication atom="http://starling.us/starling_us_atom.xml" />
        <pdfmarks body="no" section="no" topic="no" subtopic="no" subsubtopic="no"/>
        <title>XML-RPC à la Perl</title>
        <description>An XML-RPC Client/Server Pair with Encryption that will even bridge most firewalls.</description>
        <keywords>starling, perl/tk, XML-RPC, client, server, firewall, security</keywords>
        <author>Gan Uesli Starling</author>
        <copyright>2005, Gan Uesli Starling</copyright>
    </head>
    <body>
        <title>XML-RPC Client/Server Pair with Encryption</title>
        <p class="center"><a class="button" href="http://starling.us/tet/gus_perl">&#160;home: http://starling.us/tet&#160;</a>
        <br/>
        <br/>by &#284;an &#364;esli Starling
        <br/>copyright 2005-2006</p>
        <p><b>Purpose: </b>My own reason for writing these scripts is so that I might, with reasonable security, remotely trigger routine tasks on a group of PCs running servo-hydraulic machines in an automotive test lab. On weekdays those PCs are often attended by operators whom I should interupt but seldom during their tasks. Neither<code> RAdmin </code>nor<code> VNC </code>fill this particular need since they both wrest away control over the mouse and keyboard.</p>
        <p>The scripts which I remotely trigger on those PCs do harmless, routine things like back up the latest configuration and tuning data, transfer current status logs back to me, etc. In short, an array of mundane little tasks best fulfilled unobtrusively in the background. Some I might relegate to a fixed schedule. But others not, hence the origin of the Perl scripts presented here. I wrote them for me and you get them free but wholly without any guarantee. The same deal as always...</p>
        <p>How they work is by XML-RPC. And what is that? In short it&#8217;s a simple protocol for sending remote procedure calls over the Internet using XML and HTTP. For a closer look into this ultra-simple protocol, read here: <a class="button" title="All about XML-RPC" href="http://www.xmlrpc.com/"><code>&#160;XML-RPC&#160;</code></a></p>

    <!-- SECTION DELIMITER -->
        
        <section>
            <title>XML-RPC à la Perl</title><inlink>xml-rpc</inlink>
            <p>With this XML-RPC Server/Client pair you can trigger remote PCs to do almost anything. Anything, at least, for which you have written a script in advance. Some example scripts (for testing &amp; backup) are herewith provided.</p>
            <topic>
                <title>XML-RPC Server</title>
                <p><b>Description: </b>Whatever tasks you need to have remote PCs perform routinely, script them in your language of choice: CSh, MS-DOS&#160;Batch, Perl, Python, Ruby, TCL, or whatever. Then propagate however many such scripts you like among those PCs which run this server. Whenever the client so requests, the server shall be run. As easy as that. 
                 <br/><b>Stable: </b>Last modified <code>2006-06-20</code>, lines of code <code>1351</code>, comment lines <code>358</code>.</p>

<p style="line-height: 125%;"><code>&#160;&#160;&#160;&#160;Info:&#160;</code>
<a class="button" href="./gus_xml-rpc_server.html">
<code>&#160;POD&#160;as&#160;HTML&#160;</code></a>&#160;
<br/><code>Download:&#160;</code>
<a class="button" href="./gus_xml-rpc_server.txt">
<code>&#160;&#160;Perl *.pl&#160;&#160;</code></a>
<!--
<a class="button" href="http://starling.ws/gus_perl_exe/gus_xml-rpc_server.exe">
<code>&#160;Win32 *.exe&#160;&#160;</code></a>
-->
</p>
            </topic>
            <topic>
                <title>XML-RPC Client GUI</title>
                <p><b>Description: </b>Run this client from any PC. On demand it will connect to one or more of the servers, requesting each one in turn to execute your script of choice. Be sure to peruse the pull-down<code> Help </code>and<code> Examples </code>menus for setup info.
                <br/><b>Extras: </b>Built-in SQL-client relay functioinality to access your favorite DB from behind most firewalls.
                <br/><b>Stable: </b>Last modified <code>2006-06-20</code>, lines of code <code>3361</code>, comment lines <code>708</code>.</p>

<p style="line-height: 125%;"><code>&#160;&#160;&#160;&#160;Info:&#160;</code>
<a class="button" href="./gus_xml-rpc_client_tk.html">
<code>&#160;POD&#160;as&#160;HTML&#160;</code></a>&#160;
<a class="button" href="./gus_xml-rpc_client_tk.png">
<code>&#160;Screenshot&#160;1&#160;</code></a>&#160;   
<a class="button" href="./sql_client_panel.png">
<code>&#160;Screenshot&#160;2&#160;</code></a>&#160;           
<br/><code>Download:&#160;</code>
<a class="button" href="./gus_xml-rpc_client_tk.txt">
<code>&#160;&#160;Perl *.pl&#160;&#160;</code></a>
</p>
            </topic>
            <topic>
                <title>External Scripts</title>
                <p>For use with the <code>execute_script</code> method of the XML-RPC client/server pair.</p>
                <subtopic>
                    <title>Safe Scripts</title>
                    <p><b>Description: </b>Three utterly harmless example scripts purely for purposes of testing the <code>execute_script</code> method with multiple server/client pairs. Rightmost is an ASCII text file listing the three scripts (used as config by client/server pair).
                    <br/><b>Stable: </b>Last modified <code>2005-09-05</code></p>

<p style="line-height: 125%;"><code>Download:&#160;</code>
<a class="button" href="./gus_xml-rpc_pl/safe_script_bat.txt" title="DOS Batch Script for Win32">
<code>&#160;&#160;DOS *.bat&#160;&#160;</code></a>
<a class="button" href="./gus_xml-rpc_pl/safe_script_pl.txt" title="Perl Script for Any OS">
<code>&#160;&#160;Perl *.pl&#160;&#160;</code></a>
<a class="button" href="./gus_xml-rpc_pl/safe_script_csh.txt" title="CSH Script for UNIX">
<code>&#160;&#160;Unix *.csh&#160;&#160;</code></a>
<a class="button" href="./gus_xml-rpc_pl/safe_list.txt" title="Config file listing 3 scripts.">
<code>&#160;&#160;Text *.txt&#160;&#160;</code></a>
</p>
                </subtopic>
                <subtopic>
                    <title>Remote Server Update</title>
                    <p><b>Description: </b>When placed same directory as other scripts on the server, allows client to remotely reboot selected servers. Principally useful only after transfering an update of the server script itself via the<code> add_new_script </code>method. Tested successfully on Win2K OS and UNIX OS NetBSD 2.0.2. 
                    <br/><b>Stable: </b>Last modified <code>2005-09-05</code>, lines of code <code>43</code>, comment lines <code>36</code>.</p>

<p style="line-height: 125%;">
<code>Download:&#160;</code>
<a class="button" href="./gus_xml-rpc_reboot.txt">
<code>&#160;&#160;Perl *.pl&#160;&#160;</code></a>
</p>
                </subtopic>
            </topic>
        </section>
        <!-- SECTION DELIMITER -->
        <section>
            <title>Installation</title>
            <p>Initial installation and configuration is simple enough. The client and server scripts are designed to fire up and work even without configuration. Create a new directory anywhere you like and copy the client and server there. Do whatever is usual for your own OS make them executable:<code> chmod 755 </code>on Unix; map to<code> C:\Perl\bin\wperl.exe </code>on Win32. Then execute them in place.</p>
            <p>The best way to execute them the first few times is via command line. On Win32 this means a DOS screen. The reason is so that any startup errors will remain up long enough for you to read them. Else they may flash and disappear in an instant. If you should happen to get such an error, the most likely cause is that your installation of Perl lacks for this or that module:<code> Crypt::CBC</code>,<code> Crypt::Blowfish</code>, etc. These will have to be installed in whatever way is usual for your own OS:<code> perl -e shell -MCPAN </code>on Unix (see this link: <a class="button" title="Howto for Unix" href="http://starling.us/gus_netbsd/gus_netbsd_perl_module.html">&#160;MCPAN&#160;</a>);<code> PPM </code>on Win32.</p>
            <p>Unconfigured, the client/server pair will fall back to built-in defaults for the crypto key and password. This would ordinarily be an unsafe condition. But for the initial trial, you&#8217;ll not have any other scripts available for execution. So all you&#8217;ll be able to do are maintenance tasks: query status, changing passwords and cipher keys, reboot and/or kill the server.</p>
        </section>
        <!-- SECTION DELIMITER -->
        <section>
            <title>First Use</title>
            <p>Before putting to any real use, edit the head of both the server and client scripts for your own, unique cipher key and password. This will set your startup conditions to be unique. But don&#8217;t rely upon that, of course. Change both yet again via the client to something not anywhere written down.</p>
            <p>Thas done, you may next copy down into that same directory the three harmless executable Perl scripts herewith provided...the<code> *.txt </code>list also. I trust that you examined their contents before copying them down, did you not? Tell me you did. If not, <i>Bad user! No bisquet! Bad user!</i> Always, always examine a script most carefully before copying it into the XML-RPC server&#8217;s directory of executable scripts. Doing so is and shall ever remain <i>at your hazard!</i></p>
            <p>But not to worry about which catagory of scripts they might be. The server knows which OS it is on and will not try to run a<code> *.csh </code>script on Win32 nor a<code> *.bat </code>on Unix.</p>
            <p>That done, now query the server&#8217;s status again via the client. Note that the server fails to acknowledge any scripts yet exist. You will first have to add them via the client&#8217;s pull-down menu. This is appropriately titled:<code> At your hazard!</code>. Alternately you may kill and restart the server. The reason is that the server will not admit the existence of any scripts which were not there at startup unless they were more recently added via the client. It will also refuse to execute scripts which were modified either since startup or additon via the client. Nor will it run any binary files at all. Scripts only, composed in pure ASCII text, so that you might examine them first. This is the most important thing. I cannot stress it highly enough.</p>
            <p>Once any of the three harmless scripts are successfully executed by the server at request of the client, then you&#8217;ll know the system is working. Any further scripts you add, or any updates to the server, will similarly be:<code> At your hazard</code>. Enough said...</p>
        </section>
        <!-- SECTION DELIMITER -->
        <section>
            <title>Encryption</title>
            <p>Fairly strong security is provided for via passwords and Blowfish encryption which may be different for every server and changed on the fly. Do take note, however, that only the content data are encrypted...not the TCP/IP socket nor yet the container XML nodes. It is not therefor equal to SSL or a VPN. More like sending strongly coded messages on postcards like so...</p>
            <p>The client sends a postcard which says:<code> To:&#160;X, From:&#160;Y, Subj:&#160;32-chars-of-gibberish. Request:&#160;random-string-of-gibberish. </code> Then the server fires back its own postcard saying:<code> To:&#160;Y, Fm:&#160;X, Reply:&#160;random-string-of-gibberish. </code></p>
            <p>Just like that, each and every single time. Given enough exchanges (all encrypted by the same key) an expert could possibly make something of it. But such an effort is onerous, even futile should the user change their key periodically.</p>
            
            <topic>
                <title>Client Call</title>
                <p>Below is a captured example of an actual XML-RPC client call. As is evident, the XML structure is in exposed as cleartext. The method name and parameters, however, are strongly encrypted.</p>
<code><pre>&lt;?xml version="1.0"?&gt;
&lt;methodCall&gt;
&lt;methodName&gt;da32UcqEoHQd40YzATcustVZeMhMiEgP&lt;/methodName&gt;
&lt;params&gt;
&lt;param&gt;&lt;value&gt;&lt;string&gt;
UmFuZG9tSVZDOHY+MzBRciRXPFRun5amoX4evLusiHjXV7Uv2ZRcqSdUdKlvk6CR+6c7IoLukCNN
SvgSEk/9/A==
&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;
&lt;param&gt;&lt;value&gt;&lt;string&gt;UmFuZG9tSVZDOHY+MzBRcv/vqdXt3n+F
&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;
&lt;/params&gt;
&lt;/methodCall&gt;
</pre></code>
            </topic>           
            
            <topic>
                <title>Server Response</title>
                <p>Below is a captured example of the actual XML-RPC server response to the client call above. Again the actual data parameters are strongly encrypted, but with their surrounding shell of XML structure exposed.</p>
<code><pre>&lt;?xml version="1.0"?&gt;
&lt;methodResponse&gt;
&lt;params&gt;
&lt;param&gt;&lt;value&gt;&lt;string&gt;
UmFuZG9tSVZDOHY+MzBRcgsS90/x1/BRmZ/hCsCk2p0gIPBhbtCU8KleOnfOP/EuI9TUZFfkR5fw
+HXjy9ycmQFSC1Q4Z0YcpqdWL8rlM7OFlbwj2hsVR0xgK7VITdPteUfqGskRtRe1MBtFgagDL60c
N0VxF0MNRCiTHdjGfjlsFlqnq9dMg1xs41Lo6xLyb4DW3/n2EkBqXmVFZqN7fmkzVi3hGsIxv2Pg
kmkx/wHdYJfVmuZGs3YlFnUrxDIAQo1tFNzEY1mYpTVPW72ZK1JTz024ncrXsGXmNQr+S25Ek+qk
zzsehYmFKCnxBU8hVuun2w2B+3njgbuUFeXOmexNd5pnK5QHjB7x31VbUkwne0jZ/03jQ9ny0J2l
zD6W261ex8lzGWDE56NY9lGK9c/KPtEb4rfkSvFFO9bZoHYQJQFmfypFapOrXPsd57hpQBcc7xnt
Q9qo6LnKZmhXOjfPT0zXZ9xASNh3QgwOWmoAiO7qeIzEyy3aaCOyVJ/L/mShAWW1uH8Q1Yu/ostq
S2gfEzlvKZo4H4C7laTItHGvA+kZ1JAQp7lwqGCNfxyf7QGLCb+TdX7eriYc1NFXRMP3jwiOt2pW
5opYE6VodGoqzZVi5xMU7D1rvwZ5a7He1A/ST1+CXll5h/OTkVUXEDSUKVHu9GFh2xN3AjdpiwkV
mqWmJysHpmtMuQFDtgqqpiuaS5YQjoGYCA5PX0XgGszAg5OX+4GtYyxwhZsu04nGRDaLy3JMMzcO
pO9aRgKJn/RSPqbKXhZ01wDXKf5dtz5I/TSRI6SqaC/CMct6qlt1I3aBMvvVe/OMLmqQd/fi2e1i
0cPd1o6+BBqjchHKTVDlE/hTODgMrv1+bzerJ2pgDvkS2Y/Zqj7YG8/dCFme
&lt;/string&gt;&lt;/value&gt;&lt;/param&gt;
&lt;/params&gt;
&lt;/methodResponse&gt;
</pre></code>
            </topic>
            <topic>
                <title>Security Tradeoffs</title>
                <p>The scenario described above is clearly open to derrogation as something of a half measure. I admit this. But know that it was done that way for a couple of reasons.</p>
                <p>Firstly, my own purposes, as detailed at the top of this page, do not really envision a host of dedicated adversaries from the government alphabet agencies. This degree of security is more than adequate to my purposes. More security than this would impede them.</p>
                <p>More highly secure, wholly encrypted virtual private networks must of course use a different port and wholly other protocols. Thus the automatic advantages of an already-open protocol and port in nearly every coporate firewall would be lost. This way is simpler by far in terms of both cost and politics. Yet still the security is very good. Add to this the consideration of how little encrypted traffic you are likely to generate during your very occasioinal use. Surely insufficient for crypto-analysis...even if you change the key but rarely.</p>
                <p>And as an aside, the XML structure of these exchanges is always the same. It never changes in the slightest. While no cryptographer myself, what little reading I have done on the topic does inform that professional code breakers love few things better than to obtain a large sample of exchanges which all begin identically. It simplifies their analysis...or so I have read. Thus it follows that in a way, this poor half-measure quite incidentally denies our theoretical adversary a small advantage.</p>
            </topic>
        </section>
        <!-- SECTION DELIMITER -->
        <section>
            <title>Script Safety</title>
            <p>Worse than the dread of foreign intruders, beware even more what you yourself may write into scripts for remote execution. In the realm of networking tools, an XML-RPC Client/Server pair such as mine are hammer and tongs. Simple tools, but ones having great utility and power. Deftly employed, nothing else compares for versatility. Flail about clumsily, however, and the potential for <i>wholly accidental</i> disaster is manifest. So always test new scripts thoroughly before you propagate them. Enough said? Not by half...but I trust you get the idea.</p>
            <topic>
                <title>Script Executables</title>
                <p>This refers to pure ASCII text files which are executed by languages such as Perl, Python, Ruby, DOS Batch, etc. The main advantage of a script is that you can always be certain what sort of instructions it contains. When asked to execute a script, the XML-RPC server takes these few precautions only: 1)&#160;The filename is stripped of its path, if any; 2)&#160;This filename must then match a list; 3)&#160;Lastly, the server&#8217;s own copy is verified against modification. Passing these, and only these, the script will execute quite as if you had typed it on the command line.</p>
            </topic>
            <topic>
              <title>Binary Executables</title>
              <p>The server will, on its own accord, refuse to directly execute any binary files. This for the aforementioned reason of not being able to easily verify them. Nevertheless, some few among you might still hazard to do so. In that case, you will have to call that out in an ASCII script of your own devising:<code> *.bat</code>,<code> *.csh</code>,<code> *.pl</code>, or whatever. In my own example script (<code>safe_script.bat</code>) I perform the least dangerous of such feats: calling up the MSIE browser and opening it to a pair of web pages.</p>
              <p>So it is possible. How you will verify the safety of binary files thus executed by script is entirely up to you. You might check the modification date at minimum. But know that this is easily spoofed. It is child&#8217;s play to pre-date a file ex-post-facto, provided you own it. I therfor suggest that you first insure they be owned at the highest level (<code>root </code>or<code> admin</code>) and not writable by any lesser user whatever. That at a minimum. Actually executing any such remains, as always, at your own hazard!</p>
            </topic>
        </section>        
        <!-- SECTION DELIMITER -->
        <section>
            <title>Bridging Firewalls</title>    
                <p>I also have occasional need to keep tabs on those same PCs when they are left to run unattended overnight and on weekends. Not a pressing regular need, but only an occasional one. Ordinarily to facilitate this a political accomodation would have to be made with one&#8217;s IT department, a long, tedious, uphill affair. For such an occasional need, hardly worth the headaches and exapsiration. Nor would it likely succeed to best result. Experience fortells of an almost-certain probability of my own very modest proposal being set aside in favor of some extravagantly expensive commercial software by you-know-who which overshot my every requirement and would further prove utterly useless on my UNIX box at home.</p>
                <p>A more skillful approach from every standpoint is to first demonstrate a cost-free, IT-maintenance-free, already-working solution. Then seek corporate gratitude for a fait acompli. All quite easily achieved, as happens, because the way already lay open. How so? XML-RPC routes its own traffic using the same protocol as the World Wide Web. Thus any part of the Internet which a desktop web browser can see, an XML-RPC client can see it too. This is a deliberate feature of XML-RPC...an intentional dual use which some few experts deride on various grounds. Yet it works most admirably.</p>
                <p>Thus an XML-RPC server resident somewhere, out there on the Internet, can be communicated with by an XML-RPC client safely ensconsed behind a firewall...provided they do it using port 80. In my own case I already had an Apache server sitting astride port 80 on my home PC. But even that is not a problem as easy workarounds exist. What I did was to write a CGI script in Perl (<code>gus_xml-rpc_bridge.pl</code>) to forward XML-RPC calls incoming on port 80 out to port 8080 on the same PC where my XML-RPC server usually listens.</p>
                <p>Nothing is thereby forced open or breached, nothing infected, impeded or in any way harmed. All that happens is a very slightly different kind of traffic shares an existing, wide-open pathway which everyone, the IT department most of all, is fully aware of. This is an opportunity to be exploited only with the greatest of care, lest it and another privilege besides be taken away. All the IT department need do is close port 80 to your PC alone and no more Internet for you. Hence the need of presenting your little fait accompli as soon as it is demonstrable to powers-that-be which your IT department must respect. Don&#8217;t you just utterly lothe corporate politics? All of that out of the way, here is a solution which works. I wrote it for me and you get it free. And, as always, quite without any guarantee.</p>
            <topic>
                <title>XML-RPC CGI Bridge</title>
                <p><b>Description: </b>Used to bridge firewalls where only port 80 is open to the Internet. When installed in the<code> cgi-bin </code>of an Apache web server, XML-RPC calls arriving via the Internet as HTTP on port 80 are forwarded to a designated URL and port on the LAN. The latter&#8217;s response is passed back to the originating XML-RPC client.
                <br/><b>Stable: </b>Last modified <code>2005-09-10</code>, lines of code <code>77</code>, comment lines <code>20</code>.</p>

<p style="line-height: 125%;"><code>&#160;&#160;&#160;&#160;Info:&#160;</code>
<a class="button" href="./gus_xml-rpc_bridge.html">
<code>&#160;POD&#160;as&#160;HTML&#160;</code></a>&#160;
<br/><code>Download:&#160;</code>
<a class="button" href="./gus_xml-rpc_bridge.txt">
<code>&#160;&#160;Perl *.pl&#160;&#160;</code></a>
</p>
            </topic>
            <topic>                  
                <title>Secure Socket Layer</title>
                <p>The security of bridging firewalls can be increased dramatically. This has to do, not with XML-RPC, but with the Apache server and with Perl. Chances are very good that port 443 is every bit as open as port 80, and for the same reason. Thus you may equip your web server with SSL and thereby obtain a fully encrypted tunnel for every XML-RPC call.</p>

                <subtopic>
                    <title>SSL for Apache</title>
                    <p>In your configuration file<code> httpd.conf </code>for Apache, version 2, include one or more of the very slight modifications shown below. At the very tail end of mine, I have tacked on the following...</p>

<p><code><pre># Custom changes by GUS
DirectoryIndex index.html index.xml index.html.var
ScriptAlias /cgi-bin/ "/usr/pkg/libexec/cgi-bin/"
ScriptAlias /RPC2 "/usr/pkg/libexec/cgi-bin/gus_xml-rpc_bridge.pl"
AddType text/xml *.xml
AddType text/xml *.xsl
AddType text/plain *.log
AddType text/plain *.dat
</pre></code></p>

                    <p>Strictly speaking, only the second<code> ScriptAlias </code>line directly pertains, but the others are generally useful also, so that I like to recommend them. Those two<code> ScriptAlias </code>lines are path redirections. They serve to translate elements of the URL to directories on the web server. The paths shown are right and proper for NetBSD OS. For Linux, Mac OS X or Win32 they will vary. So edit as appropriate for your own OS.</p>
                </subtopic>
                <subtopic>
                    <title>SSL for Perl</title>
                    <p>So that your XML-RPC client will not reject a URL which has<code> https: </code>for its protocol and<code> :443 </code>for its port, install one further Perl module<code> Crypt::SSLeay </code>in the same way as you did for all the other Perl modules. Then restart your client and it should work!</p>
                </subtopic>
            </topic>
                        
            <topic>
                <title>SQL Relay</title>
                <p>When need arose to create a database for tracking sensor calibration, I wanted to do it the best way possible...which, of course, meant employing PostgreSQL. But, as expected, my first attempt to access the server from my desktop PC at work was blocked by the corporate firewall.</p>
                <p>Rather than beg and plead my case with the powers that be, it was easier by far to add yet a further method into my already working XML-RPC CGI bridge. And, so...violla! Look to the pull-down menu<code> Relays </code> in versions later than 2005-10-15 to enjoy this feature.</p>
                <p>Now I can happily slave away from my home on nights and weekends to prototype the ideal SQL table structure. My time at work can then be devoted to parsing records and tweaking experimental search queries. When at long last these prove satisfactory, then I can put together a GUI exactly suited to the purpose whereupon I shall enjoy a free, open source, fait accompli for presentation to management. Joy!</p>
            </topic>
   
        </section>        
        <!-- SECTION DELIMITER -->
        <section>
          <title>Updates</title>
          <p>Updates to this suite of programs and their reasons are described below.</p>
          <topic>
            <title>2006-05-27</title>
            <p>The subroutine<code> brew_cipher </code>in embeded module<code> GUS::Crypt </code>modified by the addition of pass-through argument<code> head&#160;=>&#160;'randomiv' </code>to accomodate change in default behavior of Perl module<code> Crypt::CBC </code>versions 2.17 and later.</p>
          </topic>
        </section>
    </body>
</howto>    

