<div dir="ltr"><div>Here's a quick sample node.js app that will toggle a DN CFA setting between 2500 and Off, every time it's accessed, and display output as XML the IP Phone can render (though, your browser will show it too).</div><div><br></div><div>You will need to install node.js and then using the node package manager (npm) install both request and xml2js.</div><div><br></div><div>You will need to change the info for CUCM, DN and Node.  The PKID for the DN can be found in your browser location bar while looking at the DN (alternative to using DN + Partition).  The Node info is where you're running Node and on what port.</div><div><br></div><div>To start node, use C:\>node yourfilename.js<br></div><div><br></div><div>You will see the URL to use in CUCM printed to the screen like this:</div><div><br></div><div><div><img src="cid:ii_k6iigbsv0" alt="image.png" style="margin-right: 0px;"><br></div></div><div><br></div><div>--- save the below output to a file with .js file extension...don't save this line</div><div><br></div><div><font face="monospace">// CUCM Info<br>var axl_host = '10.1.1.1';<br>var axl_user = 'node_axl';<br>var axl_pass = '!axl4node!';<br><br>// DN Info<br>var target_dn_pkid = '1ebe1462-9af3-8899-863b-af84ec591e4b';<br>var target_cfa_dest = '2500';<br><br>// Node Info<br>var node_server = '10.2.2.2';<br>var node_port = 8080;<br>var node_url = '/toggle';<br><br>// Required Libraries<br>var url = require('url');<br>var http = require('http');<br>var request = require('request');<br>var parseString = require('xml2js').parseString;</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">// Ignore Cert Warnings<br>process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;<br><br>// Node HTTP Server Setup<br>var server = http.createServer(function (req, res) {<br>    res.setHeader('Content-Type', 'text/xml');<br><br>    // Only do anything on HTTP GET requests to our URL<br>    if (req.method === 'GET' && req.url === node_url) {<br>        var current_value = '';<br>        var new_value = '';<br><br>        // Ask AXL what the current forwarding status is<br>        request.post({<br>            url: 'https://' + axl_user + ':' + axl_pass + '@' + axl_host + ':8443/axl/',<br>            headers: {<br>                'Content-Type': 'text/xml;charset=UTF-8',<br>                'SOAPAction': 'CUCM:DB ver=11.5 getLine',<br>            },<br>            body: `<soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:ns="<a href="http://www.cisco.com/AXL/API/11.5">http://www.cisco.com/AXL/API/11.5</a>"><soapenv:Header/><soapenv:Body><ns:getLine><uuid>{${target_dn_pkid}}</uuid><returnedTags><callForwardAll><destination>true</destination></callForwardAll></returnedTags></ns:getLine></soapenv:Body></soapenv:Envelope>`<br>        },<br>        function(error, response, body) {<br>            parseString(body, function(error, result) {<br><br>                // Set the new forwarding status opposite of its current value (toggle it)<br>                current_value = result['soapenv:Envelope']['soapenv:Body'][0]['ns:getLineResponse'][0]['return'][0]['line'][0]['callForwardAll'][0]['destination'][0];<br>                new_value = (current_value !== target_cfa_dest) ? target_cfa_dest : '';<br><br>                // Tell AXL to change the forwarding status<br>                request.post({<br>                    url: 'https://' + axl_user + ':' + axl_pass + '@' + axl_host + ':8443/axl/',<br>                    headers: {<br>                        'Content-Type': 'text/xml;charset=UTF-8',<br>                        'SOAPAction': 'CUCM:DB ver=11.5 updateLine',<br>                    },<br>                    body: `<soapenv:Envelope xmlns:soapenv="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:ns="<a href="http://www.cisco.com/AXL/API/11.5">http://www.cisco.com/AXL/API/11.5</a>"><soapenv:Header/><soapenv:Body><ns:updateLine><uuid>{${target_dn_pkid}}</uuid><callForwardAll><destination>${new_value}</destination></callForwardAll></ns:updateLine></soapenv:Body></soapenv:Envelope>`<br>                },<br>                function(error, response, body) {<br><br>                    // Tell the requesting device what we did<br>                    console.log(`flipped value from "${current_value}" to "${new_value}"`);<br>                    res.write(`<?xml version="1.0" encoding="utf-8" ?><CiscoIPPhoneText><Title>Informational Message</Title><Prompt></Prompt><Text>flipped value from "${current_value}" to "${new_value}"</Text></CiscoIPPhoneText>`);<br>                    res.end();<br>                });<br>            });<br>        });<br>    }<br>});<br><br>// Open Port and Listen<br>server.listen(node_port, node_server, () => {<br>    console.log(`Use this URL: http://${node_server}:${node_port}${node_url}`);<br>});</font><br></div><div><br></div><div>--- this is the end...don't save this line either</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Feb 10, 2020 at 9:03 AM Anthony Holloway <<a href="mailto:avholloway%2Bcisco-voip@gmail.com">avholloway+cisco-voip@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I have done that before.  Kind of like a night mode button.  You could just use a single button, and make it like a toggle, and as a part of the action, change the line label for the SURL you're pressing.  E.g., It would say Turn On / Turn Off.<div><br></div><div>It requires a third server in the middle of the phone and the CUCM though.  The tech in the middle is unimportant, as long as it can accept and send HTTP requests.  E.g., node.js, EasyPHP, Python SimpleHTTPServer, etc.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Feb 10, 2020 at 12:17 AM Dana Tong <<a href="mailto:dana.tong@yellit.com.au" target="_blank">dana.tong@yellit.com.au</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-AU">
<div>
<p class="MsoNormal">Hi all,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Has anyone done an phone button that they can use to update a CTI Route Point and another button to change it back?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">For example, update a CTI RP Call-Forward-All destination and then another button to turn it off?<u></u><u></u></p>
<p class="MsoNormal">Or if easier, update a Translation Pattern CalledPartyTransformation?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Cheers<u></u><u></u></p>
<p class="MsoNormal">Dana<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

_______________________________________________<br>
cisco-voip mailing list<br>
<a href="mailto:cisco-voip@puck.nether.net" target="_blank">cisco-voip@puck.nether.net</a><br>
<a href="https://puck.nether.net/mailman/listinfo/cisco-voip" rel="noreferrer" target="_blank">https://puck.nether.net/mailman/listinfo/cisco-voip</a><br>
</blockquote></div>
</blockquote></div>