Last active
August 29, 2015 13:59
-
-
Save coderanger/10804335 to your computer and use it in GitHub Desktop.
Unfinished apt-s3 replacement.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# | |
# Author:: Noah Kantrowitz <noah@coderanger.net> | |
# | |
# Copyright 2013-2014, Balanced, Inc. | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
# | |
import hashlib | |
import hmac | |
import json | |
import sys | |
import urllib2 | |
import urlparse | |
class Message(object): | |
CODES = { | |
100: 'Capabilities', | |
102: 'Status', | |
200: 'URI Start', | |
201: 'URI Done', | |
600: 'URI Acquire', | |
601: 'Configuration', | |
} | |
def __init__(self, code, headers, **kwargs): | |
if code not in self.CODES: | |
raise ValueError('Unknown code {0}'.format(code)) | |
self.code = code | |
self.headers = headers + kwargs.items() | |
@classmethod | |
def from_lines(cls, lines): | |
status_line = lines.pop(0) | |
code = int(status_line.split()[0]) | |
headers = [] | |
for line in lines: | |
line = line.strip() | |
if not line: | |
continue | |
parts = [p.strip() for p in line.split(':', 1)] | |
if len(parts) != 2: | |
continue | |
headers.append(parts) | |
return cls(code, headers) | |
@property | |
def message(self): | |
return self.CODES[self.code] | |
def encode(self): | |
buf = ['{0} {1}\n'.format(self.code, self.message)] | |
for key, value in self.headers: | |
buf.append('{0}: {1}\n'.format(key, value)) | |
buf.append('\n') | |
return ''.join(buf) | |
def __getitem__(self, header): | |
for key, value in self.headers: | |
if key == header: | |
return value | |
class AptS3(object): | |
MessageClass = Message | |
def __init__(self, inf=sys.stdin, outf=sys.stdout): | |
self.inf = inf | |
self.outf = outf | |
self.apt_config = {} | |
self.access_key_id = '' | |
self.secret_access_key = '' | |
self.token = None | |
def read_config(self, path): | |
try: | |
data = json.load(open(path, 'wb')) | |
except (IOError, ValueError): | |
pass | |
else: | |
self.access_key_id = data.get('access_key_id') | |
self.secret_access_key = data.get('secret_access_key') | |
self.token = data.get('token') | |
def send(self, msg, *args, **kwargs): | |
if not isinstance(msg, self.MessageClass): | |
msg = self.MessageClass(msg, *args, **kwargs) | |
self.outf.write(msg.encode()) | |
def send_capabilities(self): | |
self.send(100, [ | |
('Version', '1.2'), | |
('Send-Config', 'true'), | |
]) | |
def read_messages(self): | |
buf = [] | |
for line in sys.stdin: | |
if line == '\n': | |
if buf: | |
# Decode and handle a message | |
msg = self.MessageClass.from_lines(buf) | |
buf = [] | |
self.handle(msg) | |
else: | |
buf.append(line) | |
def handle(self, msg): | |
fn = getattr(self, 'handle_{0}'.format(msg.code), None) | |
if not fn: | |
raise ValueError('No handler for code {0}'.format(msg.code)) | |
return fn(msg) | |
def handle_600(self, msg): | |
"""Handle a 600 URI Acquire message.""" | |
def handle_601(self, msg): | |
"""Handle a 600 Configuration message.""" | |
for key, value in msg.headers: | |
if key != 'Config-Item': | |
continue | |
sub_key, sub_value = value.split('=', 1) | |
self.apt_config[sub_key] = sub_value | |
def s3_request(self, url): | |
pass | |
if __name__ == '__main__': | |
apt_s3 = AptS3() | |
apt_s3.read_config('/etc/apt/s3.json') | |
apt_s3.send_capabilities() | |
apt_s3.read_messages() | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
601 Configuration | |
Config-Item: APT::Architecture=amd64 | |
Config-Item: APT::Build-Essential::=build-essential | |
Config-Item: APT::Install-Recommends=1 | |
Config-Item: APT::Install-Suggests=0 | |
Config-Item: APT::Authentication::TrustCDROM=true | |
Config-Item: APT::NeverAutoRemove::=^firmware-linux.* | |
Config-Item: APT::NeverAutoRemove::=^linux-firmware$ | |
Config-Item: APT::NeverAutoRemove::=^kfreebsd-image.* | |
Config-Item: APT::NeverAutoRemove::=^gnumach$ | |
Config-Item: APT::NeverAutoRemove::=^gnumach-image.* | |
Config-Item: APT::NeverAutoRemove::=^linux-image-3.5.0-23-generic$ | |
Config-Item: APT::NeverAutoRemove::=^linux-image-extra-3.5.0-23-generic$ | |
Config-Item: APT::NeverAutoRemove::=^linux-signed-image-3.5.0-23-generic$ | |
Config-Item: APT::NeverAutoRemove::=^linux-backports-modules-.*-3.5.0-23-generic$ | |
Config-Item: APT::NeverAutoRemove::=^linux-headers-3.5.0-23-generic$ | |
Config-Item: APT::Never-MarkAuto-Sections::=metapackages | |
Config-Item: APT::Never-MarkAuto-Sections::=restricted/metapackages | |
Config-Item: APT::Never-MarkAuto-Sections::=universe/metapackages | |
Config-Item: APT::Never-MarkAuto-Sections::=multiverse/metapackages | |
Config-Item: APT::Never-MarkAuto-Sections::=oldlibs | |
Config-Item: APT::Never-MarkAuto-Sections::=restricted/oldlibs | |
Config-Item: APT::Never-MarkAuto-Sections::=universe/oldlibs | |
Config-Item: APT::Never-MarkAuto-Sections::=multiverse/oldlibs | |
Config-Item: APT::Periodic::Update-Package-Lists=1 | |
Config-Item: APT::Periodic::Unattended-Upgrade=1 | |
Config-Item: APT::Changelogs::Server=http://changelogs.ubuntu.com/changelogs | |
Config-Item: Dir=/ | |
Config-Item: Dir::State=var/lib/apt/ | |
Config-Item: Dir::State::lists=lists/ | |
Config-Item: Dir::State::cdroms=cdroms.list | |
Config-Item: Dir::State::mirrors=mirrors/ | |
Config-Item: Dir::State::extended_states=extended_states | |
Config-Item: Dir::State::status=/var/lib/dpkg/status | |
Config-Item: Dir::Cache=var/cache/apt/ | |
Config-Item: Dir::Cache::archives=archives/ | |
Config-Item: Dir::Cache::srcpkgcache=srcpkgcache.bin | |
Config-Item: Dir::Cache::pkgcache=pkgcache.bin | |
Config-Item: Dir::Etc=etc/apt/ | |
Config-Item: Dir::Etc::sourcelist=sources.list | |
Config-Item: Dir::Etc::sourceparts=sources.list.d | |
Config-Item: Dir::Etc::vendorlist=vendors.list | |
Config-Item: Dir::Etc::vendorparts=vendors.list.d | |
Config-Item: Dir::Etc::main=apt.conf | |
Config-Item: Dir::Etc::netrc=auth.conf | |
Config-Item: Dir::Etc::parts=apt.conf.d | |
Config-Item: Dir::Etc::preferences=preferences | |
Config-Item: Dir::Etc::preferencesparts=preferences.d | |
Config-Item: Dir::Etc::trusted=trusted.gpg | |
Config-Item: Dir::Etc::trustedparts=trusted.gpg.d | |
Config-Item: Dir::Bin::methods=/usr/lib/apt/methods | |
Config-Item: Dir::Bin::solvers::=/usr/lib/apt/solvers | |
Config-Item: Dir::Bin::dpkg=/usr/bin/dpkg | |
Config-Item: Dir::Media::MountPath=/media/cdrom | |
Config-Item: Dir::Log=var/log/apt | |
Config-Item: Dir::Log::Terminal=term.log | |
Config-Item: Dir::Log::History=history.log | |
Config-Item: Dir::Ignore-Files-Silently::=~$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.disabled$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.bak$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.dpkg-[a-z]+$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.save$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.orig$ | |
Config-Item: Dir::Ignore-Files-Silently::=\.distUpgrade$ | |
Config-Item: Acquire::cdrom::mount=/media/cdrom | |
Config-Item: Aptitude::Get-Root-Command=sudo:/usr/bin/sudo | |
Config-Item: Aptitude::Keep-Unused-Pattern=^linux-image.*$%20|%20^linux-restricted-modules.*$%20|%20^linux-ubuntu-modules.*$ | |
Config-Item: Unattended-Upgrade::Allowed-Origins::=${distro_id}:${distro_codename}-security | |
Config-Item: DPkg::Pre-Install-Pkgs::=/usr/sbin/dpkg-preconfigure%20--apt%20||%20true | |
Config-Item: CommandLine::AsString=apt-get%20update | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_Release.gpg | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_Release | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-amd64/Packages.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_binary-amd64_Packages | |
Index-File: true | |
Fail-Ignore: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-i386/Packages.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_binary-i386_Packages | |
Index-File: true | |
Fail-Ignore: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Index | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Index | |
Index-File: true | |
Fail-Ignore: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en%5fUS | |
Index-File: true | |
Fail-Ignore: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.xz | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en%5fUS | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.xz | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.lzma | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en%5fUS | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.lzma | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.gz | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en%5fUS | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.gz | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en%5fUS | |
Fail-Ignore: true | |
Index-File: true | |
600 URI Acquire | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_i18n_Translation-en | |
Fail-Ignore: true | |
Index-File: true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 Capabilities | |
Version: 1.2 | |
Pipeline: true | |
Send-Config: true | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Connecting to extras.ubuntu.com | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Connecting to extras.ubuntu.com (91.189.92.152) | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Waiting for headers | |
root@balanced-apt-berkshelf:/usr/lib/apt/methods# (cat /tmp/foo && cat) | ./http | |
100 Capabilities | |
Version: 1.2 | |
Pipeline: true | |
Send-Config: true | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Connecting to extras.ubuntu.com | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Connecting to extras.ubuntu.com (91.189.92.152) | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Message: Waiting for headers | |
200 URI Start | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Size: 72 | |
Last-Modified: Mon, 20 Jan 2014 16:01:02 GMT | |
Resume-Point: 71 | |
201 URI Done | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release.gpg | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_Release.gpg | |
Size: 72 | |
Last-Modified: Mon, 20 Jan 2014 16:01:02 GMT | |
MD5-Hash: 947d0e7cba203ac7cf1255995428dfd2 | |
MD5Sum-Hash: 947d0e7cba203ac7cf1255995428dfd2 | |
SHA1-Hash: c29199d25b5cad0691bc75fe9477130d38c96ea5 | |
SHA256-Hash: c74d3b367cc9a6eb68823555e25d0f97530c07a7f7edcf2e1dbe35a74f4263ea | |
SHA512-Hash: 2df39c219508c6cc274c993fafe6515a3f605cfe85013a91b80dfd16569c3f1cb2586e004df794267ee9c7c68f038009e053940c40e4d5669f09ce7347a2e7d3 | |
Resume-Point: 71 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release | |
Message: Waiting for headers | |
200 URI Start | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release | |
Size: 11875 | |
Last-Modified: Fri, 15 Feb 2013 15:05:55 GMT | |
201 URI Done | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/Release | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_Release | |
Size: 11875 | |
Last-Modified: Fri, 15 Feb 2013 15:05:55 GMT | |
MD5-Hash: 5518a6c60c415380f37fc64ecb069904 | |
MD5Sum-Hash: 5518a6c60c415380f37fc64ecb069904 | |
SHA1-Hash: 5771f2c92b2e5c38487722950a1cdcfc8f82b405 | |
SHA256-Hash: a3ea54a7f398ce1b4f8f271f34349cc89c9423e3acab7fcabf8204acf1d17439 | |
SHA512-Hash: dda4564733e9463dc48b7e0cf4a37ecb414b3a10dd201b63f303b68e8c94adc5b5845f01a2764dcd8898010615be43b9c374bedcac279341ec583f0f98694c15 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-amd64/Packages.bz2 | |
Message: Waiting for headers | |
200 URI Start | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-amd64/Packages.bz2 | |
Size: 10788 | |
Last-Modified: Fri, 15 Feb 2013 16:01:01 GMT | |
201 URI Done | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-amd64/Packages.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_binary-amd64_Packages | |
Size: 10788 | |
Last-Modified: Fri, 15 Feb 2013 16:01:01 GMT | |
MD5-Hash: 4019d042f1f2fe7644056a366b3364f1 | |
MD5Sum-Hash: 4019d042f1f2fe7644056a366b3364f1 | |
SHA1-Hash: 807d780e437efcd456ec9302504b04f1edfdb13f | |
SHA256-Hash: 41bb5837826fd66d37b5c520a948f5f50a9abf1e317d1d53f46d506260b85db7 | |
SHA512-Hash: 92438637ce9e1c072c48a7ad2793c9255a6126ce5fb7f719f7d21db14b52b8d3a74c8656de184c64d7fa362893dddf30784f642e0b2d78f67ab81a3cda1b6f8a | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-i386/Packages.bz2 | |
Message: Waiting for headers | |
200 URI Start | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-i386/Packages.bz2 | |
Size: 10788 | |
Last-Modified: Fri, 15 Feb 2013 16:01:01 GMT | |
201 URI Done | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/binary-i386/Packages.bz2 | |
Filename: /var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_precise_main_binary-i386_Packages | |
Size: 10788 | |
Last-Modified: Fri, 15 Feb 2013 16:01:01 GMT | |
MD5-Hash: a7111e0bc5e918b8ef316ef933bf6e23 | |
MD5Sum-Hash: a7111e0bc5e918b8ef316ef933bf6e23 | |
SHA1-Hash: 3556d8d91cf3c102dd7e338e447df4c5d820ecb7 | |
SHA256-Hash: 203da9b31b1bae2e808bd68b5fdee7ee2c09c6d18ea00e191c683459f3fa772e | |
SHA512-Hash: 561471fab19d21b15f3f1d3ce87e854604cb50d2f367eb8d0b7373787ad0fda32d9fe7f44a750376b9cac3b6113df400afbd47b44a88b66170c12250d8e1c989 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Index | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Index | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.bz2 | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.bz2 | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.bz2 | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.bz2 | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.xz | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.xz | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.xz | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.xz | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.lzma | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.lzma | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.lzma | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.lzma | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.gz | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US.gz | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.gz | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en.gz | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en_US | |
Message: 404 Not Found | |
FailReason: HttpError404 | |
102 Status | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en | |
Message: Waiting for headers | |
400 URI Failure | |
URI: foo://extras.ubuntu.com/ubuntu/dists/precise/main/i18n/Translation-en | |
Message: 404 Not Found | |
FailReason: HttpError404 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment