import urllib2
import simplejson
import urllib
import indextasks
from encoders import EmittableEncoder
from api.repositories import Repository
from httpshandler import HTTPSClientAuthHandler
from webtasks import asyncpost
from bugzscout import report_exception
enc = EmittableEncoder()
def httppost(daemon, url, data):
try:
if isinstance(data, dict):
data = urllib.urlencode(data)
key = daemon.conf.read('Daemon', 'ssl_key')
cert = daemon.conf.read('Daemon', 'ssl_cert')
opener = urllib2.build_opener(HTTPSClientAuthHandler(key=key, cert=cert))
opener.open(url, data)
return True
except urllib2.HTTPError, e:
daemon.logger.error('HTTP Error while posting to %s', url)
daemon.logger.error(e)
daemon.logger.debug('Data: %s', data)
if hasattr(e, 'fp'):
daemon.logger.debug('Response:')
daemon.logger.debug(e.fp.read())
return False
except Exception, e:
import traceback
daemon.logger.error('Error while posting to %s', url)
daemon.logger.error(e)
daemon.logger.error(traceback.format_exc())
daemon.logger.debug('Data: %s', data)
return False
httppost.max_fail = 4
def createrepo(daemon, uuid, pingback, site, meta=None, parent=None):
try:
meta = simplejson.loads(meta) if meta else {}
except:
return False
if parent:
r = Repository(parent).cloneto(uuid, meta)
else:
r = Repository(uuid)
r.create(meta)
# Sync new repos, whether they have a parent or not.
r.sync(site=site, peers=dict(r.ui.configitems('peers')))
data = dict(data=enc.encode(r))
# Try to pingback once...
if not httppost(daemon, pingback, data):
# If it doesn't work, queue it up to try again.
asyncpost(pingback, data)
return True
def updaterepo(daemon, repo):
if indextasks.update(repo, daemon.conf):
indextasks.enqueue(daemon, repo)
return True
return False
updaterepo.max_fail = 2
def striprepo(daemon, pingback, uuid, rev, meta, url, parent, ixPerson):
try:
meta = simplejson.loads(meta) if meta else {}
repo = Repository(parent).cloneto(uuid, meta)
repo.strip(rev, url, parent)
r = [repo, ixPerson]
data = dict(data=enc.encode(r))
# Try to pingback once...
if not httppost(daemon, pingback, data):
# If it doesn't work, queue it up to try again.
asyncpost(pingback, data)
return True
except Exception, e:
report_exception(e)
return False
striprepo.max_fail = 1
|
Loading...