If you’re really in a bind “file get tftp *”.

I agree syncing files between nodes with TFTP activated the way to go.

-Ryan

On Jun 6, 2018, at 11:43 AM, Charles Goldsmith 
<wo...@justfamily.org<mailto:wo...@justfamily.org>> wrote:

filelist doesn't work anymore, correct, and you can file get via the cli as 
well.  Neither is a "bulk" way to download and can be a lot of work.  :)  We 
just need a 1 click button to copy all extra files from one node to another

On Wed, Jun 6, 2018 at 10:35 AM Ryan Ratliff (rratliff) 
<rratl...@cisco.com<mailto:rratl...@cisco.com>> wrote:
If you know the files you can use curl or your favorite http package to get 
them http://tftp.ip:6970/.

On some versions you can get http://tftp.ip:6970/filelist.txt to get an index 
of files. I think that file went away in 11.5 or 12.0 with enhancements made to 
serving static files.

-Ryan

On Jun 6, 2018, at 10:18 AM, Charles Goldsmith 
<wo...@justfamily.org<mailto:wo...@justfamily.org>> wrote:

Thanks very much for this!  Has anyone worked out an easy way to bulk download 
this data?  Say you have to rebuild or add a node to an existing cluster and 
the customer doesn't have all of this info archived properly?


On Mon, Jun 4, 2018 at 1:20 PM Brian Meade 
<bmead...@vt.edu<mailto:bmead...@vt.edu>> wrote:
Now on Github- https://github.com/bmeade90/BulkTFTP

On Mon, Jun 4, 2018 at 8:47 AM, Brian Meade 
<bmead...@vt.edu<mailto:bmead...@vt.edu>> wrote:
Thanks for cleaning that up Anthony!

My main goal with this is to bulk upload entire directories and all the 
sub-directories so I can easily upload all the Desktops directories and such.

Since I'm bulk uploading so many files, I decided to just do a single node at a 
time but your edit should work fine to make this multi-node.

Attached my finalized script I was able to use to upload a few hundred files to 
a 4-node cluster on Friday.

On Sat, Jun 2, 2018 at 3:19 PM, Anthony Holloway 
<avholloway+cisco-v...@gmail.com<mailto:avholloway+cisco-v...@gmail.com>> wrote:
Here's your code re-worked a little Brian, for you or for anyone else, and I 
tested it on 11.5 and it works.  I did not put in any error handling, so I'll 
leave that up to you.  You can do things like Try/Catch or checking for 
resp.status_code == 200, file existence checking, etc.  I figure, knowing how 
to make it work was the challenge, not error handling, so I left that out.

# Install Python 2.7 and choose the option to add to path (off by default)
# Then install two modules
#  C:\>pip install requests
#  C:\>pip install BeautifulSoup
# Then run the program
#  C:\>python tftp.py

import requests
from BeautifulSoup import BeautifulSoup
requests.packages.urllib3.disable_warnings()

tftp_host = ""
tftp_user = ""
tftp_pass = ""
tftp_file = ""
tftp_path = ""

url_base = "https://{}/cmplatform/".format(tftp_host)
url_login = "{}j_security_check".format(url_base)
url_upload = "{}tftpFileUpload.do".format(url_base)

# Allows us to keep track of our login session
print "\nLogging in to {}...".format(tftp_host),
connection = requests.Session()

# Start a new session by simply access a page on the server
resp = connection.get(url_base, verify = False)

# Our login form data
form_data = {
"appNav": "cmplatform",
"j_username": tftp_user,
"j_password": tftp_pass
}

# Our login submission to the server
resp = connection.post(url_login, verify = False, data = form_data)
print "Success!\n"

# We need to grab the token the server gives us, so we can pass it back upon 
upload
print "Grabbing a new token...",
soup = BeautifulSoup(connection.get(url_upload, verify = False).content)

# It's a hidden input element on the upload form with the name of "token"
token = soup.find("input", {"name": "token"}).get("value")
print "Found! [{}]\n".format(token)

# Our upload form submission data
payload = {
"struts.token.name<http://struts.token.name/>": (None, "token"),
"token": (None, token),
"file": (tftp_file, open(tftp_file, "rb"), {"Content-Type": "text/plain"}),
"directory": (None, tftp_path)
}

# Our upload submission to the server
print "Uploading file: {}...".format(tftp_file),
resp = connection.post(url_upload, verify = False, files = payload)
print "Success!\n"

print "Done!"

If you want multiple server/multiple file support, it's really just a small 
modification (highlighted in red):

# Install Python 2.7 and choose the option to add to path (off by default)
# Then install two modules
#  C:\>pip install requests
#  C:\>pip install BeautifulSoup
# Then run the program
#  C:\>python tftp.py

import requests
from BeautifulSoup import BeautifulSoup
requests.packages.urllib3.disable_warnings()

tftp_hosts = [
"host1",
"hostN"
]
tftp_user = ""
tftp_pass = ""

tftp_files = [
"file1",
"fileN"
]
tftp_path = ""

for tftp_host in tftp_hosts:

url_base = "https://{}/cmplatform/".format(tftp_host)
url_login = "{}j_security_check".format(url_base)
url_upload = "{}tftpFileUpload.do".format(url_base)

# Allows us to keep track of our login session
print "\nLogging in to {}...".format(tftp_host),
connection = requests.Session()

# Start a new session by simply access a page on the server
resp = connection.get(url_base, verify = False)

# Our login form data
form_data = {
"appNav": "cmplatform",
"j_username": tftp_user,
"j_password": tftp_pass
}

# Our login submission to the server
resp = connection.post(url_login, verify = False, data = form_data)
print "Success!\n"
for tftp_file in tftp_files:

# We need to grab the token the server gives us, so we can pass it back upon 
upload
print "Grabbing a new token...",
soup = BeautifulSoup(connection.get(url_upload, verify = False).content)

# It's a hidden input element on the upload form with the name of "token"
token = soup.find("input", {"name": "token"}).get("value")
print "Found! [{}]\n".format(token)

# Our upload form submission data
payload = {
"struts.token.name<http://struts.token.name/>": (None, "token"),
"token": (None, token),
"file": (tftp_file, open(tftp_file, "rb"), {"Content-Type": "text/plain"}),
"directory": (None, tftp_path)
}

# Our upload submission to the server
print "Uploading file: {}...".format(tftp_file),
resp = connection.post(url_upload, verify = False, files = payload)
print "Success!\n"

print "Done!"

On Fri, Jun 1, 2018 at 3:38 PM Brian Meade 
<bmead...@vt.edu<mailto:bmead...@vt.edu>> wrote:
So just re-read through everything and sure enough I was sending to the wrong 
IP when running the script.  No wonder it's shown as uploading successfully the 
entire time.

Thanks for you and Stephen's assistance!

Tommy, BTW you can remove a lot of the manual set headers if you want to clean 
yours up.  It seems to work without them.

Thanks,
Brian Meade

On Fri, Jun 1, 2018 at 4:10 PM, Schlotterer, Tommy 
<tschlotte...@presidio.com<mailto:tschlotte...@presidio.com>> wrote:



Just tested on CUCM 11.5, worked just fine.

Thanks

Tommy

From: bmead...@gmail.com<mailto:bmead...@gmail.com> 
[mailto:bmead...@gmail.com<mailto:bmead...@gmail.com>] On Behalf Of Brian Meade
Sent: Friday, June 1, 2018 4:06 PM
To: Schlotterer, Tommy 
<tschlotte...@presidio.com<mailto:tschlotte...@presidio.com>>
Cc: cisco-voip voyp list 
<cisco-voip@puck.nether.net<mailto:cisco-voip@puck.nether.net>>
Subject: Re: [cisco-voip] CUCM Bulk TFTP File Upload

EXTERNAL EMAIL




Thanks Tommy!

Have you tested against CUCM 11.x okay?

I need to build the dependencies to fully run yours.  I tried pulling out the 
important upload code but seeing the same issue I'm having with my code.

Thanks,
Brian Meade

On Fri, Jun 1, 2018 at 1:18 PM, Schlotterer, Tommy 
<tschlotte...@presidio.com<mailto:tschlotte...@presidio.com>> wrote:
Brian,

Here is my really hacky python script to do this.

Thanks

Tommy

From: cisco-voip 
[mailto:cisco-voip-boun...@puck.nether.net<mailto:cisco-voip-boun...@puck.nether.net>]
 On Behalf Of Brian Meade
Sent: Friday, June 1, 2018 9:54 AM
To: cisco-voip voyp list 
<cisco-voip@puck.nether.net<mailto:cisco-voip@puck.nether.net>>
Subject: [cisco-voip] CUCM Bulk TFTP File Upload

EXTERNAL EMAIL




Does anyone have a working script for this?

I put together a script in python to do this but hitting some issues.

Right now I’ve got it to the point that it’s trying to upload a single file.

I used Fiddler to copy what I saw for a working request through a browser.

I first do a Get to the cmplatform page to get a cookie.

I then do a Post to the /cmplatform/j_security_check page to authenticate that 
cookie.

I then do a Get to /cmplatform/tftpFileUpload.do to get a Struts Token.

I then do a Post to /cmplatform/tftpFileUpload.do with the Struts token, 
filename, and directory details.

This looks to be successful as I get a "File uploaded successfully" message 
returned but then I can't find the file on the TFTP File Management page.

I tried using the curl methods I found here ( 
https://communities.cisco.com/docs/DOC-43506 ) but no luck there.  Not sure if 
this works in 11.5 without grabbing the Struts token.   Without a token, I get 
an error message saying something to the affect of I hit the Submit button 
twice.

Here's what it looks like when my script runs in Fiddler:
[X]


This looks almost exactly like the real example through a browser I captured 
minus a few headers I tried manually adding with no luck.

Python script attached.


Tommy Schlotterer | Systems Engineer - Collaboration
Presidio (NASDAQ: PSDO) | presidio.com<http://presidio.com/>
20 N Saint Clair 3rd Floor, Toledo, OH 
43604<https://maps.google.com/?q=20+N+Saint+Clair+3rd+Floor,+Toledo,+OH+43604&entry=gmail&source=g>
D: 419.214.1415<tel:(419)%20214-1415> | C: 419.706.0259<tel:(419)%20706-0259> | 
tschlotte...@presidio.com<mailto:tschlotte...@presidio.com>


[Future. Built.]<http://www.presidio.com/>

Follow us:

[Follow Presidio on Twitter]<http://www.twitter.com/presidio>


This message w/attachments (message) is intended solely for the use of the 
intended recipient(s) and may contain information that is privileged, 
confidential or proprietary. If you are not an intended recipient, please 
notify the sender, and then please delete and destroy all copies and 
attachments. Please be advised that any review or dissemination of, or the 
taking of any action in reliance on, the information contained in or attached 
to this message is prohibited.




[Future. Built.]<http://www.presidio.com/>




Follow us:

[Follow Presidio on Twitter]<http://www.twitter.com/presidio>







_______________________________________________
cisco-voip mailing list
cisco-voip@puck.nether.net<mailto:cisco-voip@puck.nether.net>
https://puck.nether.net/mailman/listinfo/cisco-voip


_______________________________________________
cisco-voip mailing list
cisco-voip@puck.nether.net<mailto:cisco-voip@puck.nether.net>
https://puck.nether.net/mailman/listinfo/cisco-voip
_______________________________________________
cisco-voip mailing list
cisco-voip@puck.nether.net<mailto:cisco-voip@puck.nether.net>
https://puck.nether.net/mailman/listinfo/cisco-voip


_______________________________________________
cisco-voip mailing list
cisco-voip@puck.nether.net
https://puck.nether.net/mailman/listinfo/cisco-voip

Reply via email to