add webdavsync-tool.py
first draft of a small tool to simulate a TB calendar syncpull/12/head
parent
6de689bbe2
commit
b654ffb806
|
@ -0,0 +1,106 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import getopt
|
||||
import sys
|
||||
import urlparse
|
||||
import webdavlib
|
||||
import xml.dom.minidom
|
||||
|
||||
def usage() :
|
||||
msg ="""Usage:
|
||||
%s [-h] [-s sync-token] -u uri\n""" % sys.argv[0]
|
||||
|
||||
sys.stderr.write(msg);
|
||||
|
||||
def getAllCollections(client, uri):
|
||||
collections = []
|
||||
depth = 1
|
||||
|
||||
propfind = webdavlib.WebDAVPROPFIND(uri, ["allprop"], depth)
|
||||
client.execute(propfind)
|
||||
client.conn.close()
|
||||
doc = propfind.response["document"]
|
||||
for response in doc.iter("{DAV:}response"):
|
||||
propstat = response.find("{DAV:}propstat")
|
||||
if propstat is not None:
|
||||
prop = propstat.find("{DAV:}prop")
|
||||
if prop is not None:
|
||||
resourcetype = prop.find("{DAV:}resourcetype")
|
||||
if resourcetype.find("{DAV:}collection") is not None:
|
||||
href = prop.find("{DAV:}href")
|
||||
if href is not None and href.text != uri:
|
||||
collections.append(href.text)
|
||||
return collections
|
||||
|
||||
def changedItemsFromCollection(client, collection, synctoken=None):
|
||||
# get all changed hrefs since synctoken
|
||||
hrefs = []
|
||||
syncquery = webdavlib.WebDAVSyncQuery(collection, synctoken, [ "getcontenttype", "getetag" ])
|
||||
client.execute(syncquery)
|
||||
client.conn.close()
|
||||
if (syncquery.response["status"] != 207):
|
||||
raise Exception("Bad http response code: %d" % syncquery.response["status"])
|
||||
doc = syncquery.response["document"]
|
||||
|
||||
# extract all hrefs
|
||||
for syncResponse in doc.iter("{DAV:}sync-response"):
|
||||
href = syncResponse.find("{DAV:}href")
|
||||
if href is not None:
|
||||
hrefs.append(href.text)
|
||||
|
||||
return hrefs
|
||||
|
||||
|
||||
def main():
|
||||
depth = 1
|
||||
synctoken = "1"
|
||||
url = None
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt (sys.argv[1:], "hs:u:", \
|
||||
("sync-token=", "url="));
|
||||
except getopt.GetoptError:
|
||||
usage()
|
||||
exit(1)
|
||||
|
||||
for o, v in opts :
|
||||
if o == "-h" :
|
||||
usage()
|
||||
exit(1)
|
||||
elif o == "-s" or o == "--sync-token" :
|
||||
synctoken = v
|
||||
elif o == "-u" or o == "--url" :
|
||||
url = v
|
||||
|
||||
if url is None:
|
||||
usage()
|
||||
exit(1)
|
||||
|
||||
o = urlparse.urlparse(url)
|
||||
hostname = o.hostname
|
||||
port = o.port
|
||||
username = o.username
|
||||
password = o.password
|
||||
uri = o.path
|
||||
|
||||
client = webdavlib.WebDAVClient(hostname, port, username, password)
|
||||
|
||||
collections = getAllCollections(client, uri)
|
||||
if len(collections) == 0:
|
||||
print "No collections found!"
|
||||
sys.exit(1)
|
||||
|
||||
for collection in collections:
|
||||
changedItems = changedItemsFromCollection(client, collection)
|
||||
# fetch the href data
|
||||
if len(changedItems) > 0:
|
||||
multiget = webdavlib.CalDAVCalendarMultiget(collection,
|
||||
["getetag", "{%s}calendar-data" % webdavlib.xmlns_caldav],
|
||||
changedItems, depth)
|
||||
client.execute(multiget)
|
||||
client.conn.close()
|
||||
if (multiget.response["status"] != 207):
|
||||
raise Exception("Bad http response code: %d" % multiget.response["status"])
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue