code for uploading to daisy

This commit is contained in:
Michael Hudson-Doyle 2019-11-20 23:05:08 +13:00
parent e303fab383
commit ae033101e6
3 changed files with 86 additions and 1 deletions

View File

@ -4,6 +4,6 @@ set -eux
cat /etc/apt/sources.list | sed -n 's/-updates/-proposed/p' > /etc/apt/sources.list.d/proposed.list
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade
apt-get install -y --no-install-recommends libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libsystemd-dev python3-distutils-extra pkg-config python3.5 python3-pip git lsb-release python3-setuptools gcc python3-dev python3-wheel curtin pep8 python3-pyflakes
apt-get install -y --no-install-recommends libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libsystemd-dev python3-distutils-extra pkg-config python3.5 python3-pip git lsb-release python3-setuptools gcc python3-dev python3-wheel curtin pep8 python3-pyflakes python3-bson
pip3 install -r requirements.txt
python3 setup.py build

View File

@ -50,6 +50,7 @@ parts:
- iso-codes
- lsb-release
- python3-apport
- python3-bson
- python3-distutils-extra
- python3-urwid
- python3-requests

View File

@ -23,8 +23,12 @@ import apport
import apport.crashdb
import apport.hookutils
import bson
import attr
import requests
import urwid
from subiquitycore.controller import BaseController
@ -49,6 +53,32 @@ class ErrorReportKind(enum.Enum):
UNKNOWN = _("Unknown error")
@attr.s(cmp=False)
class Upload(metaclass=urwid.MetaSignals):
signals = ['progress']
controller = attr.ib()
bytes_to_send = attr.ib()
bytes_sent = attr.ib(default=0)
pipe_w = attr.ib(default=None)
def start(self):
self.pipe_w = self.controller.loop.watch_pipe(self._progress)
def _progress(self, x):
urwid.emit_signal(self, 'progress')
def _bg_update(self, sent, to_send=None):
self.bytes_sent = sent
if to_send is not None:
self.bytes_to_send = to_send
os.write(self.pipe_w, b'x')
def stop(self):
self.controller.loop.remove_watch_pipe(self.pipe_w)
os.close(self.pipe_w)
@attr.s(cmp=False)
class ErrorReport(metaclass=urwid.MetaSignals):
@ -61,6 +91,7 @@ class ErrorReport(metaclass=urwid.MetaSignals):
_file = attr.ib()
meta = attr.ib(default=attr.Factory(dict))
uploader = attr.ib(default=None)
@classmethod
def new(cls, controller, kind):
@ -160,6 +191,55 @@ class ErrorReport(metaclass=urwid.MetaSignals):
cb()
self.controller.run_in_bg(_bg_load, loaded)
def upload(self):
log.debug("starting upload for %s", self.base)
uploader = self.uploader = Upload(
controller=self.controller, bytes_to_send=1)
url = "https://daisy.ubuntu.com"
if self.controller.opts.dry_run:
url = "https://daisy.staging.ubuntu.com"
chunk_size = 1024
def chunk(data):
for i in range(0, len(data), chunk_size):
yield data[i:i+chunk_size]
uploader._bg_update(uploader.bytes_sent + chunk_size)
def _bg_upload():
for_upload = {}
for k, v in self.pr.items():
if len(v) < 1024 or k in {"Traceback", "ProcCpuinfoMinimal"}:
for_upload[k] = v
else:
log.debug("dropping %s of length %s", k, len(v))
data = bson.BSON().encode(for_upload)
self.uploader._bg_update(0, len(data))
headers = {
'user-agent': 'subiquity/{}'.format(
os.environ.get("SNAP_VERSION", "SNAP_VERSION")),
}
response = requests.post(url, data=chunk(data), headers=headers)
response.raise_for_status()
return response.text.split()[0]
def uploaded(fut):
try:
oops_id = fut.result()
except requests.exceptions.RequestException:
log.exception("upload for %s failed", self.base)
else:
log.debug("finished upload for %s, %r", self.base, oops_id)
self.set_meta("oops-id", oops_id)
uploader.stop()
self.uploader = None
urwid.emit_signal(self, 'changed')
urwid.emit_signal(self, 'changed')
uploader.start()
self.controller.run_in_bg(_bg_upload, uploaded)
def _path_with_ext(self, ext):
return os.path.join(
self.controller.crash_directory, self.base + '.' + ext)
@ -190,6 +270,10 @@ class ErrorReport(metaclass=urwid.MetaSignals):
def seen(self):
return self.meta.get("seen", False)
@property
def oops_id(self):
return self.meta.get("oops-id")
@property
def persistent_details(self):
"""Return fs-label, path-on-fs to report."""