code for uploading to daisy
This commit is contained in:
parent
e303fab383
commit
ae033101e6
|
@ -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
|
||||
|
|
|
@ -50,6 +50,7 @@ parts:
|
|||
- iso-codes
|
||||
- lsb-release
|
||||
- python3-apport
|
||||
- python3-bson
|
||||
- python3-distutils-extra
|
||||
- python3-urwid
|
||||
- python3-requests
|
||||
|
|
|
@ -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."""
|
||||
|
|
Loading…
Reference in New Issue