├── .gitignore ├── .pylintrc ├── README.md ├── apt2ostree ├── __init__.py ├── apt.py ├── keyrings │ ├── debian │ │ ├── bullseye │ │ │ ├── debian-archive-buster-automatic.gpg │ │ │ ├── debian-archive-buster-security-automatic.gpg │ │ │ ├── debian-archive-buster-stable.gpg │ │ │ ├── debian-archive-jessie-automatic.gpg │ │ │ ├── debian-archive-jessie-security-automatic.gpg │ │ │ ├── debian-archive-jessie-stable.gpg │ │ │ ├── debian-archive-stretch-automatic.gpg │ │ │ ├── debian-archive-stretch-security-automatic.gpg │ │ │ └── debian-archive-stretch-stable.gpg │ │ ├── buster │ │ │ ├── debian-archive-buster-automatic.gpg │ │ │ ├── debian-archive-buster-security-automatic.gpg │ │ │ ├── debian-archive-buster-stable.gpg │ │ │ ├── debian-archive-jessie-automatic.gpg │ │ │ ├── debian-archive-jessie-security-automatic.gpg │ │ │ ├── debian-archive-jessie-stable.gpg │ │ │ ├── debian-archive-stretch-automatic.gpg │ │ │ ├── debian-archive-stretch-security-automatic.gpg │ │ │ └── debian-archive-stretch-stable.gpg │ │ └── sid │ │ │ ├── debian-archive-buster-automatic.gpg │ │ │ ├── debian-archive-buster-security-automatic.gpg │ │ │ ├── debian-archive-buster-stable.gpg │ │ │ ├── debian-archive-jessie-automatic.gpg │ │ │ ├── debian-archive-jessie-security-automatic.gpg │ │ │ ├── debian-archive-jessie-stable.gpg │ │ │ ├── debian-archive-stretch-automatic.gpg │ │ │ ├── debian-archive-stretch-security-automatic.gpg │ │ │ └── debian-archive-stretch-stable.gpg │ ├── ubuntu │ │ ├── bionic │ │ │ ├── ubuntu-keyring-2012-archive.gpg │ │ │ ├── ubuntu-keyring-2012-cdimage.gpg │ │ │ └── ubuntu-keyring-2018-archive.gpg │ │ ├── eoan │ │ │ ├── ubuntu-keyring-2012-archive.gpg │ │ │ ├── ubuntu-keyring-2012-cdimage.gpg │ │ │ └── ubuntu-keyring-2018-archive.gpg │ │ ├── focal │ │ │ ├── ubuntu-keyring-2012-archive.gpg │ │ │ ├── ubuntu-keyring-2012-cdimage.gpg │ │ │ └── ubuntu-keyring-2018-archive.gpg │ │ ├── jammy │ │ │ ├── ubuntu-keyring-2012-cdimage.gpg │ │ │ └── ubuntu-keyring-2018-archive.gpg │ │ └── xenial │ │ │ └── ubuntu-keyring.gpg │ └── update_keyrings.py ├── multistrap.py ├── ninja.py ├── ninja_syntax.py ├── ostree.py └── quirks │ ├── apt │ └── apt-auto-removal │ ├── pylint │ └── pylint.bcep │ └── usrmerge │ └── usrmerge.postinst ├── examples ├── multistrap │ ├── .gitignore │ ├── multistrap.conf │ ├── multistrap.conf.lock │ └── multistrap.py └── nginx │ ├── .gitignore │ ├── Packages.lock │ └── configure.py └── tests └── multistrap_compare ├── .gitignore ├── apt-bootstrap └── apt-bootstrap ├── configure.py ├── multistrap.conf ├── multistrap.conf.lock └── ubuntu-archive-keyring.gpg /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | __pycache__ 3 | TAGS 4 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MASTER] 2 | persistent=no 3 | 4 | [REPORTS] 5 | msg-template={path}:{line}:{column}: [{msg_id}({symbol}), {obj}] {msg} 6 | output-format=colorized 7 | reports=no 8 | 9 | [MESSAGES CONTROL] 10 | disable= 11 | invalid-name, 12 | missing-docstring, 13 | no-else-return, 14 | too-few-public-methods, 15 | too-many-arguments, 16 | too-many-branches, 17 | too-many-instance-attributes, 18 | too-many-locals, 19 | too-many-variables, 20 | 21 | [VARIABLES] 22 | dummy-variables-rgx=_ 23 | 24 | [FORMAT] 25 | ignore-long-lines=https?:// 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | apt2ostree 2 | ========== 3 | 4 | Homepage: http://github.com/stb-tester/apt2ostree 5 | 6 | apt2ostree is used for building Debian/Ubuntu based ostree images. It performs 7 | the same task as debootstrap/multistrap but the output is an ostree tree rather 8 | than a rootfs in a directory. 9 | 10 | Unlike other similar tools, apt2ostree is fast, reproducible, space-efficient, 11 | doesn't depend on apt/dpkg being installed on the host, is well suited to 12 | building multiple similar but different images, and it allows you to 13 | version-control package updates as you do with your source code. 14 | 15 | Features 16 | ======== 17 | 18 | * Reproducibility 19 | * From a list of packages we perform dependency resolution and generate a 20 | "lockfile" that contains the complete list of all packages, their 21 | versions and their SHAs. You can commit this lockfile to git. Builds from 22 | this lockfile are functionally reproducible. 23 | * Speed - apt2ostree is fast because: 24 | * We only download and extract any given deb once. If that deb is used in 25 | multiple images it doesn't need to be extracted again. This saves disk 26 | space too because the contents of the debs are committed to ostree so they 27 | will share disk space with the built images. 28 | * Builds happen in parallel (because we use [ninja]). We can be downloading 29 | one deb at the same time as compiling a second image, or performing other 30 | build tasks within your larger build system. 31 | * We don't repeat work that we've already done between builds - another 32 | benefit of using ninja. 33 | * Combining the contents of the debs is fast because it only touches ostree 34 | metadata - it doesn't need to read the contents of the files (see also 35 | [ostreedev/ostree#1643]). 36 | 37 | [ninja]: https://ninja-build.org/ 38 | [ostreedev/ostree#1643]: https://github.com/ostreedev/ostree/pull/1643 39 | 40 | Lockfiles 41 | ========= 42 | 43 | We store all our source in git. Reproducibility is an important requirement for 44 | us - when doing a build from the same source we want to end up with an image 45 | with the same packages and versions of packages installed no matter what machine 46 | we run it on or whether we run it sooner rather than later. This is complicated 47 | with apt because it's more geared to keeping a traditional system up-to-date and 48 | the apt-mirrors don't keep the old packages in their indices. 49 | 50 | To fix this we took a leaf from modern programming language package managers. 51 | We use the lockfile concept as used by rust's cargo package manager 52 | ([cargo.lock]) or nodejs's npm ([package-lock.json]). The idea is that you have 53 | two files, one that is written by hand and lists the packages you want to 54 | install, and a second one generated from the first that lists all the versions 55 | of the packages and all their transitive dependencies. This second file is the 56 | lockfile. 57 | 58 | The key is that you check both files into your git repository. The lockfile is 59 | a complete description of the packages you want to be installed on the target 60 | system. This determinism has a few advantages: 61 | 62 | 1. You can go back to a particular revision in the past and build a functionally 63 | identical image. 64 | 2. Updates to the lockfiles are recorded in git so we can diff between source 65 | revisions to investigate any changes in behavior seen. 66 | 3. Security updates are now recorded in your git history and can be managed and 67 | deployed explicitly. 68 | 69 | [cargo.lock]: https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html 70 | [package-lock.json]: https://docs.npmjs.com/files/package-lock.json 71 | 72 | Updating lockfiles 73 | ------------------ 74 | 75 | We have a CI job that runs every night updating the lockfiles - this is the 76 | equivalent of an apt-get update. The CI command looks like: 77 | 78 | git checkout -b update-lockfiles 79 | ninja update-lockfiles 80 | git commit -a -m "Updated lockfiles as of $(date --iso-8601)" 81 | git push origin updated-lockfiles 82 | 83 | This kicks off builds and in the morning we can see exactly what packages 84 | changed and we have a fresh build with CI passing or failing so we have 85 | confidence that the image still works after applying the security updates. We 86 | can then choose to roll it out to our devices in the field. 87 | 88 | It turns out that the lockfile is a kind of snapshot of the package metadata 89 | from the debian mirrors filtered by the top-level list of packages you want 90 | installed - and we implement it in exactly this way. The format of the lockfile 91 | is a [Debian Package index] as used by apt. This has a number of benefits over 92 | a plain list of package names and versions: 93 | 94 | 1. It contains MD5, SHA1 and SHA256 fields so we can be certain we're using 95 | exactly the package we want to be. This is nice and secure without having to 96 | faff around with gpg. 97 | 2. It (indirectly) contains the URL of the package so we can implement the 98 | downloading of the packages external to the chroots where they will be 99 | installed. 100 | 101 | [Debian Package index]: https://wiki.debian.org/DebianRepository/Format#A.22Packages.22_Indices 102 | 103 | Example 104 | ======= 105 | 106 | See an example project under `examples/nginx` which builds an image containing 107 | nginx and its dependencies. The list of packages is defined at the top of 108 | `configure.py`. 109 | 110 | Usage: 111 | 112 | cd examples/nginx 113 | 114 | # Create an ostree to build images into: 115 | mkdir -p _build/ostree 116 | ostree init --mode=bare-user --repo=_build/ostree 117 | 118 | # Creates build.ninja 119 | ./configure.py 120 | 121 | # Build image with ref deb/images/Packages.lock/configured 122 | ninja 123 | 124 | Update the lockfile (equivalent to `apt update`): 125 | 126 | ninja update-lockfiles 127 | 128 | Make the rootfs a part of a normal ostree branch with history, etc.: 129 | 130 | ostree commit --tree=ref=deb/images/Packages.lock/configured \ 131 | -b mybranch -s "My message" 132 | 133 | Usage 134 | ===== 135 | 136 | `apt2ostree` is a Python library that helps write ninja build files. It is 137 | intended to be used by a `configure` script written in Python. This is a very 138 | flexible albeit unconventional approach. See the `examples/` directory for 139 | examples. Currently Python API documentation is a little lacking. 140 | 141 | If you don't want to use it as a library you can create a `multistrap` - style 142 | configuration file and use our `multistrap` example under `examples/multistrap`. 143 | See the comments at the top of the file for usage. 144 | 145 | Dependencies 146 | ============ 147 | 148 | * [ostree](https://ostree.readthedocs.io/) 149 | * [aptly](https://www.aptly.info/) - You'll need a patched version of this 150 | adding lockfiles. Fortunately aptly is quick and easy to build. See 151 | https://github.com/stb-tester/aptly/tree/lockfile. To build run: 152 | 153 | $ mkdir -p $GOPATH/src/github.com/aptly-dev/aptly 154 | $ git clone https://github.com/stb-tester/aptly $GOPATH/src/github.com/aptly-dev/aptly 155 | $ cd $GOPATH/src/github.com/aptly-dev/aptly 156 | $ make install 157 | 158 | and add `$GOPATH/bin` to your `$PATH` 159 | * [ninja](https://ninja-build.org/) build tool. 160 | * [Python](https://www.python.org/) - should support Python 2 & 3. 161 | 162 | Second stage building also requires: 163 | 164 | * [bubblewrap](https://github.com/projectatomic/bubblewrap) sandboxing and 165 | chroot tool. 166 | 167 | Second stage building 168 | ===================== 169 | 170 | Much like `multistrap` there are two stages: 171 | 172 | 1. The debs are unpacked. This will be stored in ostree under ref 173 | `deb/$lockfile_name/unpacked`. 174 | 2. The unpacked images is checked out and `dpkg --configure -a` is run within 175 | a chroot before checking the results back in again. 176 | 177 | Building stage 1 is fast and is currently the primary focus of this tool. 178 | `apt2ostree` contains a naive implementation of stage 2 which should be 179 | reliable, but has various issues: 180 | 181 | * It requires superuser privileges - we use `sudo` to check the files out as 182 | root. A production implementation might prefer to run this using `fakeroot` or 183 | user-namespaces. 184 | * It's slow - we check out all the files from ostree by copying rather than 185 | hard-linking. An optimised implmentation might prefer to use `rofiles-fuse` 186 | or `overlayfs` to protect the links from modification and `fakeroot` to get 187 | the permissions/ownership right. 188 | * It's slow - we check all the files back into ostree by piping through tar 189 | back into ostree. This allows tar to be running as root, while ostree still 190 | runs as a normal user. If we used `ostree checkout --require-hardlinks` then 191 | we could use `ostree commit --link-checkout-speedup` during checkin to speed 192 | things up. Further speedups might be possible with `overlayfs`. 193 | * I've not tested it building for foreign architectures with qemu binfmt-misc 194 | support. It might work, it might not. 195 | 196 | All this is a long-winded way of saying that much like with multistrap you 197 | should implement your own stage 2 where you call `dpkg --configure -a`. 198 | 199 | Integration within build-systems 200 | ================================ 201 | 202 | apt2ostree is intended for use within a larger build-system. Typically you'll 203 | want to install additional packages into the rootfs, make custom modifications 204 | or add rules for publishing the built images. There are different ways of doing 205 | this: 206 | 207 | * Use `apt2sotree` as a standalone tool embedding the shell script: 208 | 209 | ./configure.py 210 | ninja 211 | 212 | within your buildsystem. This is the simplest integration, but will miss out 213 | on the fine-grained concurrency and notification of whether the images were 214 | rebuilt or not. 215 | 216 | * Use `apt2ostree` to generate a `build.ninja` and then use the ninja 217 | [`subninja` keyword](https://ninja-build.org/manual.html#ref_scope) to include 218 | the build rules. Depending on `ostree/refs/heads/deb/xxx/configured` will 219 | then cause the various images to be built. 220 | 221 | * Extend `configure.py` to add all the other build rules you have. This may be 222 | simpler if you don't already have a build system you're integrating with. 223 | 224 | Comparison to related tools 225 | =========================== 226 | 227 | debootstrap/multistrap 228 | ---------------------- 229 | 230 | debootstrap and multistrap can both be used to create rootfses that can later 231 | be committed to ostree. debootstrap is used as part of the official debian 232 | installer. multistrap is more targetted toward creating rootfses for embedded 233 | systems. 234 | 235 | Similar to multistrap, apt2ostree was designed for building embedded systems 236 | to be booted on a seperate machine than the build host. 237 | 238 | For dependency resolution during package selection apt2ostree uses `aptly` 239 | rather than `apt`/`dpkg`. This makes deployment easier because aptly is a 240 | single statically linked go binary. The dependency resolution may not be as 241 | robust as `multistrap`. 242 | 243 | Unlike multistrap, but like debootstrap, apt2ostree doesn't require apt/dpkg to 244 | be installed on the build host. 245 | 246 | apt2ostree is faster - particuarly in the case where you're building multiple 247 | variants of images or building an updated image because upstream packages have 248 | been updated. 249 | 250 | apt2ostree uses less disk space because it doesn't cache downloaded debs - it 251 | unpacks them and commits them directly to ostree after downloading. The disk 252 | space will be shared with the built images. 253 | 254 | apt2ostree doesn't currently support generating lockfiles with packages from 255 | multiple repositories. This means you can't build an image that pulls from both 256 | trusty and trusty-updates. This is a major missing feature that is a high 257 | priority. 258 | 259 | Similar to `multistrap`, and to some extent `debootstrap`, apt2ostree is 260 | generally used as part of a larger build system. 261 | 262 | Unlike `debootstrap` (and `multistrap`?) apt2ostree is not officially supported 263 | nor is it affiliated with either the Debian or Ubuntu projects. 264 | 265 | `apt2ostree` contains a multistrap configuration compatibility script so you 266 | can use your existing multistrap configuration files. See 267 | `examples/multistrap/multistrap.py` for more information. 268 | 269 | `debootstrap` and `multistrap` don't use lockfiles: you get whatever versions 270 | of the packages are available at the time you ran the tool. To update you must 271 | rerun the tool and see what the difference is in the committed image, so you 272 | don't have a record of package versions in source control. 273 | 274 | endless-ostree-builder (EOB) 275 | ---------------------------- 276 | 277 | See https://github.com/dbnicholson/deb-ostree-builder . 278 | 279 | **Disclaimer: I've not used EOB**, so the following are educated guesses based 280 | on available documentation and source. Please correct any mistakes or 281 | misunderstandings by editing this and opening a pull-request. 282 | 283 | Both apt2ostree and EOB were written to create deb-based ostree images. Unlike 284 | apt2ostree EOB uses `debootstrap` to create a rootfs on disk and then checks 285 | that rootfs into `ostree`. 286 | 287 | Both systems were originally built into a company's private build-system, and 288 | has since been separated from that and published publically. These companies are 289 | [Endless](https://endlessos.com/) and [stb-tester.com](https://stb-tester.com). 290 | 291 | apt2ostree is narrower in scope than EOB. It doesn't handle publishing, 292 | device-tree files, among other features. 293 | 294 | apt2ostree is likely much faster than EOB with its incremental building. 295 | 296 | apt2ostree is intended to be used as a python library within a larger 297 | build-system - more like debootstrap. It seems that EOB is designed to be a 298 | larger system complete with hooks. It is customisable with hooks and 299 | configuration files. It may be possible to replace EOB's use of `debootstrap` 300 | with `apt2ostree`. 301 | 302 | EOB doesn't use lockfiles. You get whatever versions of the packages that are 303 | available at the time you ran the tool. To update you must rerun the tool and 304 | see what the difference is in the committed image, so you don't have a record 305 | of package versions in source control. 306 | 307 | History 308 | ======= 309 | 310 | apt2ostree was started at [stb-tester.com] as a way of building images for 311 | their stb-tester HDMI product. Our approach of using ninja and creating 312 | intermediate build images came up in a discussion on the ostree mailing list 313 | which motivated @wmanley to tidy-up and publish what we've built. 314 | 315 | ostree mailing list posts threads here: 316 | 317 | * https://mail.gnome.org/archives/ostree-list/2018-October/msg00005.html 318 | * https://mail.gnome.org/archives/ostree-list/2018-November/msg00000.html 319 | 320 | [stb-tester.com]: https://stb-tester.com 321 | -------------------------------------------------------------------------------- /apt2ostree/__init__.py: -------------------------------------------------------------------------------- 1 | from .apt import Apt, AptSource, ubuntu_apt_sources 2 | from .ninja import Ninja, Rule 3 | 4 | __all__ = ['Apt', 'AptSource', 'Ninja', 'Rule', 'ubuntu_apt_sources'] 5 | -------------------------------------------------------------------------------- /apt2ostree/apt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import errno 4 | import glob 5 | import hashlib 6 | import os 7 | import pipes 8 | import platform 9 | import sys 10 | if sys.version_info[0] >= 3: 11 | from urllib.parse import unquote 12 | else: 13 | from urllib import unquote 14 | from collections import namedtuple 15 | 16 | from .ninja import Rule 17 | from .ostree import ostree_addfile, ostree_combine, OstreeRef 18 | 19 | 20 | DEB_POOL_MIRRORS = [] 21 | 22 | 23 | update_lockfile = Rule("update_lockfile", """\ 24 | set -ex; 25 | export tmpdir="_build/tmp/update_lockfile/$$(systemd-escape $out)"; 26 | rm -rf $$tmpdir; 27 | mkdir -p $$tmpdir; 28 | export HOME=$$tmpdir; 29 | $create_mirrors; 30 | aptly lockfile create 31 | -mirrors "$mirrors" 32 | -architectures=$architecture 33 | $keyring_arg -gpg-provider=internal 34 | $packages >$lockfile~; 35 | if cmp $lockfile~ $lockfile; then 36 | rm $lockfile~; 37 | else 38 | mv $lockfile~ $lockfile; 39 | fi; 40 | rm -rf "$$tmpdir"; 41 | """, inputs=['.FORCE'], outputs=['update-lockfile-$lockfile']) 42 | 43 | dpkg_base = Rule( 44 | "dpkg_base", """\ 45 | set -ex; 46 | tmpdir=_build/tmp/apt/dpkg-base/$architecture; 47 | rm -rf "$$tmpdir"; 48 | mkdir -p $$tmpdir; 49 | cd $$tmpdir; 50 | mkdir -p etc/apt/preferences.d 51 | etc/apt/sources.list.d 52 | etc/apt/trusted.gpg.d 53 | etc/network 54 | usr/share/info 55 | var/lib/dpkg/info 56 | var/cache/apt/archives/partial 57 | var/lib/apt/lists/auxfiles 58 | var/lib/apt/lists/partial; 59 | echo 1 >var/lib/dpkg/info/format; 60 | echo "$architecture" >var/lib/dpkg/arch; 61 | touch etc/shells 62 | var/cache/apt/archives/lock 63 | var/lib/dpkg/diversions 64 | var/lib/dpkg/lock 65 | var/lib/dpkg/lock-frontend 66 | var/lib/dpkg/statoverride 67 | var/lib/apt/lists/lock 68 | usr/share/info/dir; 69 | chmod 0640 var/cache/apt/archives/lock 70 | var/lib/apt/lists/lock 71 | var/lib/dpkg/lock 72 | var/lib/dpkg/lock-frontend; 73 | chmod 0700 var/cache/apt/archives/partial 74 | var/lib/apt/lists/partial; 75 | cd -; 76 | ostree --repo=$ostree_repo commit -b "deb/dpkg-base/$architecture" 77 | --tree=dir=$$tmpdir 78 | --no-bindings --orphan --timestamp=0 --owner-uid=0 --owner-gid=0; 79 | rm -rf "$$tmpdir"; 80 | """, restat=True, 81 | output_type=OstreeRef, 82 | outputs=["$ostree_repo/refs/heads/deb/dpkg-base/$architecture"], 83 | order_only=["$ostree_repo/config"]) 84 | 85 | apt_base = Rule( 86 | "apt_base", """\ 87 | tmpdir="$$(mktemp -dp $builddir/tmp -t apt_base.XXXXXX)"; 88 | mkdir -p $$tmpdir/etc/apt/sources.list.d; 89 | printf "deb [arch=%s] %s %s %s\\n" $architecture $archive_url $distribution "$components" 90 | >$$tmpdir/etc/apt/sources.list.d/$name.list; 91 | ostree --repo=$ostree_repo commit -b deb/apt_base/$_args_digest 92 | --tree=dir=$$tmpdir 93 | --no-bindings --orphan --timestamp=0 --owner-uid=0 --owner-gid=0; 94 | rm -rf "$$tmpdir"; 95 | """, 96 | output_type=OstreeRef, 97 | outputs=["$ostree_repo/refs/heads/deb/apt_base/$_args_digest"], 98 | order_only=["$ostree_repo/config"], restat=True) 99 | 100 | # Ninja will rebuild the target if the contents of the rule changes. We don't 101 | # want to redownload a deb just because the list of mirrors has changed, so 102 | # instead we write _build/deb_pool_mirrors and explicitly **don't** declare a 103 | # dependency on it. 104 | download_deb = Rule( 105 | "download_deb", """\ 106 | download() { 107 | curl -L --fail -o $$tmpdir/deb $$1 && 108 | actual_sha256="$$(sha256sum $$tmpdir/deb | cut -f1 -d ' ')" && 109 | if [ "$$actual_sha256" != "$sha256sum" ]; then 110 | printf "FAIL: SHA256sum %s from %s doesn't match %s" \\ 111 | "$$actual_sha256" "$$1" "$sha256sum"; 112 | return 1; 113 | else 114 | return 0; 115 | fi; 116 | }; 117 | 118 | set -ex; 119 | tmpdir=$builddir/tmp/download-deb/$aptly_pool_filename; 120 | mkdir -p "$$tmpdir"; 121 | while read mirror; do 122 | download file://$$PWD/$builddir/apt/mirror/${filename} && break; 123 | download $$mirror/${filename} && break; 124 | download $$mirror/$aptly_pool_filename && break; 125 | done <$builddir/deb_pool_mirrors; 126 | if ! [ -e $$tmpdir/deb ]; then 127 | echo Failed to download ${filename}; 128 | exit 1; 129 | fi; 130 | cd $$tmpdir; 131 | ar x deb; 132 | cd -; 133 | control=$$(find $$tmpdir -name 'control.tar.*'); 134 | data=$$(find $$tmpdir -name 'data.tar.*'); 135 | case "$$control" in 136 | *.zst) 137 | control=$${control%.zst}; 138 | zstd --decompress $$control.zst -o $$control --force;; 139 | esac; 140 | case "$$data" in 141 | *.zst) 142 | data=$${data%.zst}; 143 | zstd --decompress $$data.zst -o $$data --force;; 144 | esac; 145 | ostree --repo=$ostree_repo commit -b $ref_base/data 146 | --tree=tar=$$data --no-bindings --orphan --timestamp=0 147 | -s $aptly_pool_filename" data"; 148 | ostree --repo=$ostree_repo commit -b $ref_base/control 149 | --tree=tar=$$control --no-bindings --orphan --timestamp=0 150 | -s $aptly_pool_filename" control"; 151 | if [ "$apt_should_mirror" = "True" ]; then 152 | mkdir -p "$builddir/apt/mirror/$$(dirname $filename)"; 153 | mv $$tmpdir/deb "$builddir/apt/mirror/$filename"; 154 | fi; 155 | rm -rf $$tmpdir; 156 | """, 157 | restat=True, 158 | output_type=(OstreeRef, OstreeRef), 159 | outputs=['$ostree_repo/refs/heads/$ref_base/data', 160 | '$ostree_repo/refs/heads/$ref_base/control'], 161 | order_only=["$ostree_repo/config"], 162 | # Sometimes the same deb is available from multiple different URLs. This 163 | # is fine and shouldn't cause configure to fail: 164 | allow_non_identical_duplicates=True, 165 | description="Download $aptly_pool_filename") 166 | 167 | make_dpkg_info = Rule( 168 | "make_dpkg_info", """\ 169 | overwrite_if_changed () { 170 | if ! cmp $$1 $$2; then 171 | mv $$1 $$2; 172 | fi; 173 | }; 174 | set -ex; 175 | tmpdir=$builddir/tmp/make_dpkg_info/$sha256sum; 176 | rm -rf "$$tmpdir"; 177 | mkdir -p $$tmpdir/out/var/lib/dpkg/info; 178 | ostree --repo=$ostree_repo checkout --repo=$ostree_repo -UH "$ref_base/control" "$$tmpdir/control"; 179 | multi_arch=$$(awk '/^Multi-Arch:/ {print $$2}' $$tmpdir/control/control); 180 | if [ "$$multi_arch" = "same" ]; then 181 | architecture=$$(awk '/^Architecture:/ {print $$2}' $$tmpdir/control/control); 182 | suffix=":$$architecture"; 183 | fi; 184 | ostree --repo=$ostree_repo ls -R $ref_base/data --nul-filenames-only 185 | | tr '\\0' '\\n' 186 | | sed 's,^/$$,/.,' >$$tmpdir/out/var/lib/dpkg/info/$pkgname$$suffix.list; 187 | cd "$$tmpdir"; 188 | for x in conffiles 189 | config 190 | md5sums 191 | postinst 192 | postrm 193 | preinst 194 | prerm 195 | shlibs 196 | symbols 197 | templates 198 | triggers; do 199 | if [ -e "control/$$x" ]; then 200 | mv "control/$$x" "out/var/lib/dpkg/info/$pkgname$$suffix.$$x"; 201 | fi; 202 | done; 203 | ( cat control/control; echo Status: install ok unpacked; echo ) >status; 204 | ( cat control/control; echo ) >available; 205 | cd -; 206 | ostree --repo=$ostree_repo commit -b "$ref_base/info" --tree=dir=$$tmpdir/out 207 | --no-bindings --orphan --timestamp=0 --owner-uid=0 --owner-gid=0 208 | --no-xattrs; 209 | overwrite_if_changed $$tmpdir/status $builddir/$ref_base/status; 210 | overwrite_if_changed $$tmpdir/available $builddir/$ref_base/available; 211 | rm -rf "$$tmpdir"; 212 | """, 213 | restat=True, 214 | output_type=(str, str, OstreeRef), 215 | outputs=[ 216 | '$builddir/$ref_base/status', 217 | '$builddir/$ref_base/available', 218 | '$ostree_repo/refs/heads/$ref_base/info'], 219 | order_only=["$ostree_repo/config"], 220 | inputs=["$ostree_repo/refs/heads/$ref_base/control", 221 | "$ostree_repo/refs/heads/$ref_base/data"]) 222 | 223 | do_usrmove = Rule( 224 | "do_usrmove", """\ 225 | set -ex; 226 | if ! ostree --repo=$ostree_repo ls "$in_branch" | grep -e /bin -e /lib -e /sbin; then 227 | ostree --repo=$ostree_repo commit -b $out_branch 228 | --no-bindings --orphan --timestamp=0 --tree=ref=$in_branch; 229 | exit 0; 230 | fi; 231 | mkdir -p $builddir/tmp/do_usrmove; 232 | tmpdir=$builddir/tmp/do_usrmove/$$(systemd-escape $in_branch); 233 | rm -rf "$$tmpdir"; 234 | ostree --repo=$ostree_repo checkout -UH $in_branch "$$tmpdir"; 235 | ostree --repo=$ostree_repo checkout -UH :$in_branch:bin "$$tmpdir/usr/bin" --union && rm -rf $$tmpdir/bin && ln -s usr/bin $$tmpdir/bin || true; 236 | ostree --repo=$ostree_repo checkout -UH :$in_branch:sbin "$$tmpdir/usr/sbin" --union && rm -rf $$tmpdir/sbin && ln -s usr/sbin $$tmpdir/sbin || true; 237 | ostree --repo=$ostree_repo checkout -UH :$in_branch:lib "$$tmpdir/usr/lib" --union && rm -rf $$tmpdir/lib && ln -s usr/lib $$tmpdir/lib || true; 238 | 239 | ostree --repo=$ostree_repo commit --devino-canonical -b $out_branch 240 | --no-bindings --orphan --timestamp=0 --tree=dir=$$tmpdir 241 | --owner-uid=0 --owner-gid=0; 242 | """, 243 | restat=True, 244 | inputs=["$ostree_repo/refs/heads/$in_branch"], 245 | output_type=OstreeRef, 246 | outputs=["$ostree_repo/refs/heads/$out_branch"], 247 | description="usrmove $in_branch") 248 | 249 | deb_combine_meta = Rule( 250 | "deb_combine_meta", """\ 251 | set -e; 252 | tmpdir=$builddir/tmp/deb_combine_$meta/$pkgs_digest; 253 | rm -rf "$$tmpdir"; 254 | mkdir -p "$$tmpdir/var/lib/dpkg"; 255 | cat $in >$$tmpdir/var/lib/dpkg/$meta; 256 | ostree --repo=$ostree_repo commit -b "deb/images/$pkgs_digest/$meta" 257 | --tree=dir=$$tmpdir --no-bindings --orphan --timestamp=0 258 | --owner-uid=0 --owner-gid=0 --no-xattrs; 259 | rm -rf "$$tmpdir"; 260 | """, 261 | restat=True, 262 | output_type=OstreeRef, 263 | outputs=["$ostree_repo/refs/heads/deb/images/$pkgs_digest/$meta"], 264 | order_only=["$ostree_repo/config"], 265 | description="var/lib/dpkg/$meta for $pkgs_digest") 266 | 267 | 268 | # This is a really naive implementation calling `dpkg --configure -a` in a 269 | # container using `bwrap` and `sudo`. A proper implementation will be 270 | # container-system dependent and should not require root. 271 | dpkg_configure = Rule( 272 | "dpkg_configure", """\ 273 | set -ex; 274 | tmpdir=$builddir/tmp/dpkg_configure/$out_branch; 275 | sudo rm -rf "$$tmpdir"; 276 | mkdir -p $$tmpdir; 277 | TARGET=$$tmpdir/co; 278 | sudo ostree --repo=$ostree_repo checkout --force-copy $in_branch $$TARGET; 279 | sudo cp $$TARGET/usr/share/base-passwd/passwd.master $$TARGET/etc/passwd; 280 | sudo cp $$TARGET/usr/share/base-passwd/group.master $$TARGET/etc/group; 281 | 282 | BWRAP="sudo bwrap --bind $$TARGET / --proc /proc --dev /dev 283 | --tmpfs /tmp --tmpfs /run --setenv LANG C.UTF-8 284 | --setenv DEBIAN_FRONTEND noninteractive 285 | $binfmt_misc_support"; 286 | if [ -x $$TARGET/var/lib/dpkg/info/dash.preinst ]; then 287 | $$BWRAP /var/lib/dpkg/info/dash.preinst install; 288 | fi; 289 | printf '#!/bin/sh\\nexit 101' 290 | | sudo tee $$tmpdir/co/usr/sbin/policy-rc.d; 291 | sudo chmod a+x $$tmpdir/co/usr/sbin/policy-rc.d; 292 | 293 | if [ -f $$TARGET/usr/lib/insserv/insserv ]; then 294 | $$BWRAP dpkg-divert --local --rename --add /usr/lib/insserv/insserv; 295 | sudo ln -s ../../../bin/true $$TARGET/usr/lib/insserv/insserv; 296 | sudo ln -s ../bin/true $$TARGET/sbin/insserv; 297 | fi; 298 | 299 | if [ -f $$TARGET/usr/bin/mawk ]; then 300 | sudo ln -sf mawk $$TARGET/usr/bin/awk; 301 | fi; 302 | 303 | $$BWRAP dpkg --configure -a; 304 | 305 | sudo rm -f $$TARGET/etc/machine-id; 306 | 307 | sudo tar -C $$tmpdir/co -c . 308 | | ostree --repo=$ostree_repo commit --branch $out_branch --no-bindings 309 | --orphan --timestamp=0 --tree=tar=/dev/stdin; 310 | sudo rm -rf $$tmpdir; 311 | """, 312 | restat=True, 313 | output_type=OstreeRef, 314 | outputs=["$ostree_repo/refs/heads/$out_branch"], 315 | inputs=["$ostree_repo/refs/heads/$in_branch"], 316 | order_only=["$ostree_repo/config"], 317 | # pool console is used because the above involves sudo which might need 318 | # to ask for a password 319 | pool="console") 320 | 321 | 322 | AptSource = namedtuple( 323 | "AptSource", "architecture distribution archive_url components keyrings") 324 | 325 | 326 | _UBUNTU_RELEASES = { 327 | "14.04": "trusty", 328 | "16.04": "xenial", 329 | "18.04": "bionic", 330 | "20.04": "focal", 331 | "22.04": "jammy", 332 | } 333 | 334 | 335 | def ubuntu_apt_sources(release="bionic", architecture="amd64"): 336 | if release in _UBUNTU_RELEASES: 337 | release = _UBUNTU_RELEASES[release] 338 | if release in ["trusty", "xenial"]: 339 | archive_url = "https://old-releases.ubuntu.com/ubuntu" 340 | elif architecture in ["amd64", "i386"]: 341 | archive_url = "http://archive.ubuntu.com/ubuntu" 342 | else: 343 | archive_url = "http://ports.ubuntu.com/ubuntu-ports" 344 | return [ 345 | AptSource(architecture, release, archive_url, 346 | "main restricted universe multiverse", 347 | keyrings_for("ubuntu", release)), 348 | AptSource(architecture, "%s-updates" % release, archive_url, 349 | "main restricted universe multiverse", 350 | keyrings_for("ubuntu", "%s-updates" % release)), 351 | AptSource(architecture, "%s-security" % release, archive_url, 352 | "main restricted universe multiverse", 353 | keyrings_for("ubuntu", "%s-security" % release)), 354 | ] 355 | 356 | 357 | def keyrings_for(distro, release): 358 | if os.path.exists(_find_file("keyrings/%s/%s" % (distro, release))): 359 | d = "keyrings/%s/%s" % (distro, release) 360 | elif os.path.exists( 361 | _find_file("keyrings/%s/%s" % (distro, release.split("-")[0]))): 362 | d = "keyrings/%s/%s" % (distro, release.split("-")[0]) 363 | else: 364 | raise Exception("No known key for %s/%s" % (distro, release)) 365 | 366 | out = [] 367 | for x in glob.glob(_find_file("%s/*.gpg" % d)): 368 | out.append("$apt2ostreedir/%s" % os.path.relpath(x, _find_file("."))) 369 | 370 | return out 371 | 372 | 373 | class Apt(object): 374 | def __init__(self, ninja, deb_pool_mirrors=None, apt_should_mirror=False): 375 | if deb_pool_mirrors is None: 376 | deb_pool_mirrors = DEB_POOL_MIRRORS 377 | 378 | self.ninja = ninja 379 | self.archive_urls = set() 380 | self.deb_pool_mirrors = deb_pool_mirrors 381 | self.lockfile_rules = set() 382 | 383 | ninja.variable("apt_should_mirror", str(bool(apt_should_mirror))) 384 | 385 | self.ninja.add_generator_dep(__file__) 386 | 387 | # Get these files added to .gitignore: 388 | ninja.add_target("%s/config" % ninja.global_vars['ostree_repo']) 389 | ninja.add_target("%s/objects" % ninja.global_vars['ostree_repo']) 390 | 391 | def write_phony_rules(self): 392 | self.ninja.build("update-apt-lockfiles", "phony", 393 | inputs=list(self.lockfile_rules)) 394 | 395 | def build_image(self, lockfile, packages, apt_sources, unpack_only=False, 396 | usrmove=False, resolve_deps=True): 397 | self.generate_lockfile(lockfile, packages, apt_sources, resolve_deps) 398 | stage_1 = self.image_from_lockfile( 399 | lockfile, apt_sources[0].architecture, usrmove) 400 | sources_lists = [] 401 | for n, apt_source in enumerate(apt_sources): 402 | sources_lists.append(apt_base.build( 403 | self.ninja, archive_url=apt_source.archive_url, 404 | components=apt_source.components, 405 | architecture=apt_source.architecture, 406 | distribution=apt_source.distribution, 407 | name="apt2ostree-%i" % n)) 408 | if unpack_only: 409 | out = stage_1 410 | else: 411 | stage_2 = self.second_stage(stage_1, apt_sources[0].architecture) 412 | assert "unpacked" in stage_1.ref 413 | complete = ostree_combine.build( 414 | self.ninja, 415 | inputs=[stage_2.filename] + [x.filename for x in sources_lists], 416 | branch=stage_1.ref.replace("unpacked", "complete")) 417 | self.ninja.build( 418 | "image-for-%s" % lockfile, "phony", inputs=complete.filename) 419 | out = complete 420 | out.stage_1 = stage_1 421 | out.sources_lists = sources_lists 422 | return out 423 | 424 | def second_stage(self, unpacked, architecture, branch=None): 425 | if branch is None: 426 | assert "unpacked" in unpacked.ref 427 | branch = unpacked.ref.replace("unpacked", "configured") 428 | order_only = [] 429 | 430 | def deb2qemu_arch(arch): 431 | d = { 432 | 'armhf': 'arm', 433 | 'amd64': 'x86_64', 434 | 'arm64': 'aarch64', 435 | } 436 | return d.get(arch, arch) 437 | 438 | def py2deb_arch(arch): 439 | d = { 440 | 'x86_64': 'amd64', 441 | 'aarch64': 'arm64', 442 | } 443 | return d.get(arch, arch) 444 | 445 | def arch_is_capable(a1, a2): 446 | """can a1 natively run a2 binaries?""" 447 | d = { 448 | 'amd64': ['amd64', 'i386'], 449 | 'arm64': ['arm64', 'armhf'], 450 | } 451 | compatible = d.get(a1, [a1]) 452 | return a2 in compatible 453 | 454 | def native_deb_arch(): 455 | arch = platform.machine() 456 | return py2deb_arch(arch) 457 | 458 | native_arch = native_deb_arch() 459 | if arch_is_capable(native_arch, architecture): 460 | binfmt_misc_support = "" 461 | else: 462 | qemu_arch = deb2qemu_arch(architecture) 463 | qemu_user = '/usr/bin/qemu-%s-static' % qemu_arch 464 | binfmt_misc_support = '--ro-bind {0} {0}'.format(qemu_user) 465 | order_only.append(qemu_user) 466 | 467 | configured_ref = dpkg_configure.build( 468 | self.ninja, 469 | in_branch=unpacked.ref, 470 | out_branch=branch, 471 | order_only=order_only, 472 | binfmt_misc_support=binfmt_misc_support) 473 | return configured_ref 474 | 475 | def generate_lockfile(self, lockfile, packages, apt_sources, 476 | resolve_deps=True): 477 | packages = sorted(packages) 478 | 479 | this_dir_rel = os.path.relpath( 480 | os.path.dirname(os.path.abspath(__file__))) 481 | 482 | # We need to call aptly mirror create for each of our apt_sources. It's 483 | # difficult to pass that kind of structured data through to a rule via 484 | # a variable - so instead we write out a shell script which makes the 485 | # calls for us. 486 | mirrors = [] 487 | gen_mirror_cmds = [] 488 | all_keyring_args = set() 489 | s = hashlib.sha256() 490 | for n, src in enumerate(apt_sources): 491 | mirrors.append("mirror-%i" % n) 492 | self.archive_urls.add(src.archive_url) 493 | s.update(repr(apt_sources).encode('utf-8')) 494 | keyring_arg = [ 495 | "-keyring=" + x.replace("$apt2ostreedir", this_dir_rel) 496 | for x in src.keyrings] 497 | all_keyring_args = all_keyring_args.union(keyring_arg) 498 | cmd = [ 499 | "aptly", "mirror", "create", 500 | "-architectures=" + src.architecture] + keyring_arg + [ 501 | "-gpg-provider=internal", 502 | "mirror-%i" % n, src.archive_url, 503 | src.distribution] + src.components.split() 504 | gen_mirror_cmds.append(" ".join(pipes.quote(x) for x in cmd)) 505 | 506 | create_mirrors = "_build/apt/lockfile/create_mirrors-%s" % ( 507 | s.hexdigest()[:7]) 508 | mkdir_p(os.path.dirname(create_mirrors)) 509 | with self.ninja.open(create_mirrors, "w") as f: 510 | f.write("#!/bin/sh -ex\n") 511 | for x in gen_mirror_cmds: 512 | f.write(x + "\n") 513 | os.fchmod(f.fileno(), 0o755) 514 | 515 | if not resolve_deps: 516 | all_keyring_args = all_keyring_args.union([ 517 | "-solver=no-deps", "-include-essential=false", 518 | "-include-priority-required=false"]) 519 | 520 | out = update_lockfile.build( 521 | self.ninja, 522 | lockfile=lockfile, 523 | packages=packages, 524 | create_mirrors=create_mirrors, 525 | mirrors=",".join(mirrors), 526 | architecture=apt_sources[0].architecture, 527 | keyring_arg=" ".join(all_keyring_args)) 528 | self.lockfile_rules.update(out) 529 | return lockfile 530 | 531 | def image_from_lockfile(self, lockfile, architecture=None, usrmove=False): 532 | if architecture is None: 533 | architecture = "amd64" 534 | base = dpkg_base.build(self.ninja, architecture=architecture) 535 | 536 | all_data = [] 537 | all_info = [] 538 | all_status = [] 539 | all_available = [] 540 | 541 | with self.ninja.open('_build/deb_pool_mirrors', 'w') as f: 542 | for x in self.deb_pool_mirrors: 543 | f.write(x + "\n") 544 | for x in self.archive_urls: 545 | f.write(x + "\n") 546 | 547 | try: 548 | with self.ninja.open(lockfile) as f: 549 | for pkg in parse_packages(f): 550 | filename = unquote(pkg['Filename']) 551 | aptly_pool_filename = "%s/%s/%s_%s" % ( 552 | pkg['SHA256'][:2], pkg['SHA256'][2:4], 553 | pkg['SHA256'][4:], os.path.basename(filename)) 554 | ref_base = ("deb/pool/" + aptly_pool_filename 555 | .replace('+', '_').replace('~', '_')) 556 | data, _ = download_deb.build( 557 | self.ninja, sha256sum=pkg['SHA256'], filename=filename, 558 | aptly_pool_filename=aptly_pool_filename, 559 | ref_base=ref_base) 560 | if usrmove: 561 | data = do_usrmove.build( 562 | self.ninja, 563 | in_branch=data.ref, 564 | out_branch=data.ref + '-usrmove') 565 | data = self.fix_package( 566 | pkg['Package'], pkg['Version'], data) 567 | all_data.append(data.filename) 568 | status, available, info = make_dpkg_info.build( 569 | self.ninja, sha256sum=pkg['SHA256'], 570 | pkgname=pkg['Package'], ref_base=ref_base) 571 | all_status.append(status) 572 | all_available.append(available) 573 | all_info.append(info.filename) 574 | except IOError as e: 575 | # lockfile hasn't been created yet. Presumably it will be created 576 | # by running `ninja update-apt-lockfiles` soon so this isn't a fatal 577 | # error. 578 | if e.errno != errno.ENOENT: 579 | raise 580 | 581 | digest = lockfile.replace('/', '_') 582 | 583 | rootfs = ostree_combine.build( 584 | self.ninja, inputs=all_data, 585 | branch="deb/images/%s/data_combined" % digest) 586 | dpkg_infos = ostree_combine.build( 587 | self.ninja, inputs=all_info, 588 | branch="deb/images/%s/info_combined" % digest) 589 | 590 | dpkg_status = deb_combine_meta.build( 591 | self.ninja, inputs=all_status, 592 | pkgs_digest=digest, meta="status") 593 | 594 | dpkg_available = deb_combine_meta.build( 595 | self.ninja, inputs=all_available, 596 | pkgs_digest=digest, meta="available") 597 | 598 | image = ostree_combine.build( 599 | self.ninja, 600 | inputs=[base.filename, dpkg_infos.filename, dpkg_status.filename, 601 | dpkg_available.filename, rootfs.filename], 602 | implicit=lockfile, 603 | branch="deb/images/%s/unpacked" % digest) 604 | self.ninja.build("unpacked-image-for-%s" % lockfile, 605 | "phony", inputs=image.filename) 606 | return image 607 | 608 | def fix_package(self, pkgname, version, data): 609 | """ 610 | Here we can apply quirks as required to get particular packages to 611 | install. 612 | """ 613 | if pkgname == 'pylint' and version < "2.1.1-2": 614 | # This is a backport of : 615 | # 616 | # > "Use "byte compile exception patterns" feature to exclude tests 617 | # > from byte-compiling, instead of shipping a manual postinst file. 618 | # 619 | # This fixes installing python2.7-minimal on Ubuntu bionic. It 620 | # attempts to compile the contents of dist-packages/pylint/tests 621 | # much of which isn't valid Python files. 622 | # 623 | # See also https://salsa.debian.org/python-team/applications/pylint/commit/28d9e9231f58ef9a1debeb4ae34f4d7441c36a67 624 | return ostree_addfile.build( 625 | self.ninja, in_branch=data.ref, 626 | prefix="/usr/share/python/bcep", 627 | in_file=_find_file("quirks/pylint/pylint.bcep"), 628 | out_branch=data.ref + "-fixed") 629 | elif pkgname == "apt" and version == "2.0.8": 630 | # https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1968154/comments/16 631 | return ostree_addfile.build( 632 | self.ninja, in_branch=data.ref, 633 | prefix="/etc/kernel/postinst.d", 634 | in_file=_find_file("quirks/apt/apt-auto-removal"), 635 | out_branch=data.ref + "-fixed") 636 | elif pkgname == "usrmerge": 637 | # Disable usrmerge.postinst, as we have done usrmove ourselves and 638 | # for some reason the usrmerge.postinst script fails to detect this. 639 | return ostree_addfile.build( 640 | self.ninja, in_branch=data.ref, 641 | prefix="/var/lib/dpkg/info", 642 | in_file=_find_file("quirks/usrmerge/usrmerge.postinst"), 643 | out_branch=data.ref + "-fixed") 644 | else: 645 | return data 646 | 647 | 648 | def parse_packages(stream): 649 | """Parses an apt Packages file""" 650 | pkg = {} 651 | label = None 652 | for line in stream: 653 | if line.strip() == '': 654 | if pkg: 655 | yield pkg 656 | pkg = {} 657 | label = None 658 | continue 659 | elif line == ' .': 660 | pkg[label] += '\n\n' 661 | elif line.startswith(" "): 662 | pkg[label] += '\n' + line[1:].strip() 663 | else: 664 | label, data = line.split(': ', 1) 665 | pkg[label] = data.strip() 666 | 667 | 668 | def mkdir_p(d): 669 | """Python 3.2 has an optional argument to os.makedirs called exist_ok. To 670 | support older versions of python we can't use this and need to catch 671 | exceptions""" 672 | try: 673 | os.makedirs(d) 674 | except OSError as e: 675 | if e.errno == errno.EEXIST and os.path.isdir(d) \ 676 | and os.access(d, os.R_OK | os.W_OK): 677 | return 678 | else: 679 | raise 680 | 681 | 682 | def _find_file(filename, this_dir=os.path.dirname(os.path.abspath(__file__))): 683 | return os.path.join(this_dir, filename) 684 | -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-buster-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-buster-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-buster-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-buster-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-buster-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-buster-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-jessie-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/bullseye/debian-archive-stretch-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-buster-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-buster-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-buster-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-buster-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-buster-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-buster-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-jessie-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-jessie-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-jessie-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-jessie-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-jessie-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-jessie-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-stretch-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-stretch-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-stretch-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-stretch-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/buster/debian-archive-stretch-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/buster/debian-archive-stretch-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-buster-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-buster-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-buster-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-buster-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-buster-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-buster-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-jessie-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-jessie-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-jessie-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-jessie-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-jessie-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-jessie-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-stretch-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-stretch-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-stretch-security-automatic.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-stretch-security-automatic.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/debian/sid/debian-archive-stretch-stable.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/debian/sid/debian-archive-stretch-stable.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2012-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2012-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2012-cdimage.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2012-cdimage.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2018-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/bionic/ubuntu-keyring-2018-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2012-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2012-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2012-cdimage.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2012-cdimage.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2018-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/eoan/ubuntu-keyring-2018-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2012-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2012-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2012-cdimage.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2012-cdimage.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2018-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/focal/ubuntu-keyring-2018-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/jammy/ubuntu-keyring-2012-cdimage.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/jammy/ubuntu-keyring-2012-cdimage.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/jammy/ubuntu-keyring-2018-archive.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/jammy/ubuntu-keyring-2018-archive.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/ubuntu/xenial/ubuntu-keyring.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/apt2ostree/keyrings/ubuntu/xenial/ubuntu-keyring.gpg -------------------------------------------------------------------------------- /apt2ostree/keyrings/update_keyrings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | import argparse 4 | import hashlib 5 | import os 6 | import re 7 | import shutil 8 | import subprocess 9 | import sys 10 | import tempfile 11 | from contextlib import contextmanager 12 | 13 | import requests 14 | from bs4 import BeautifulSoup 15 | 16 | 17 | def main(argv): 18 | parser = argparse.ArgumentParser() 19 | parser.parse_args(argv[1:]) 20 | 21 | for x in ["xenial", "bionic-updates", "eoan", "focal", "jammy"]: 22 | print(x) 23 | get_keyring_package( 24 | "ubuntu", x, 25 | "https://packages.ubuntu.com/%s/all/ubuntu-keyring/download" % x) 26 | 27 | for x in ["buster", "bullseye", "sid"]: 28 | print(x) 29 | get_keyring_package( 30 | "debian", x, 31 | "https://packages.debian.org/%s/all/debian-archive-keyring/download" 32 | % x) 33 | 34 | 35 | def get_keyring_package(distro, release, package_download_url): 36 | print(package_download_url) 37 | r = requests.get(package_download_url) 38 | try: 39 | r.raise_for_status() 40 | except requests.HTTPError as e: 41 | sys.stderr.write("Unavailable: %s\n" % (e)) 42 | return 43 | 44 | soup = BeautifulSoup(r.text, 'html.parser') 45 | 46 | sha256 = find_sha(soup) 47 | dl = find_dl_link(soup) 48 | 49 | r = requests.get(dl) 50 | r.raise_for_status() 51 | 52 | if hashlib.sha256(r.content).hexdigest() != sha256: 53 | raise Exception("SHAs don't match!") 54 | 55 | with named_temporary_directory(prefix="apt2ostree-update_keyrings-") as tmp: 56 | with open("%s/keyring.deb" % tmp, "wb") as f: 57 | f.write(r.content) 58 | subprocess.check_call( 59 | ["dpkg-deb", '-x', 'keyring.deb', '.'], cwd=tmp) 60 | sys.stderr.write("%s\n" % tmp) 61 | os.makedirs(_find_file(distro), exist_ok=True) 62 | try: 63 | os.rename("%s/etc/apt/trusted.gpg.d" % tmp, 64 | _find_file("%s/%s" % (distro, release))) 65 | except IOError: 66 | sys.stderr.write( 67 | "Couldn't find keyrings for %s/%s\n" % (distro, release)) 68 | 69 | 70 | def find_sha(soup): 71 | for h in soup.find_all("th"): 72 | if h.string == "SHA256 checksum": 73 | sha256 = next(iter(h.find_next_siblings("td"))).string 74 | assert re.match("^[0-9a-f]{64}$", sha256), \ 75 | "%r is not a SHA" % (sha256,) 76 | return sha256 77 | raise Exception("No SHA256 in %s" % soup) 78 | 79 | 80 | def find_dl_link(soup): 81 | for a in soup.find_all("a"): 82 | if a["href"].startswith("http://dk.archive.ubuntu.com/ubuntu/pool") or \ 83 | a["href"].startswith("http://ftp.de.debian.org"): 84 | return a['href'] 85 | raise Exception("No download link") 86 | 87 | 88 | def _find_file(filename, this_dir=os.path.dirname(os.path.abspath(__file__))): 89 | return os.path.join(this_dir, filename) 90 | 91 | 92 | @contextmanager 93 | def named_temporary_directory( 94 | suffix='', prefix='tmp', dir=None): # pylint: disable=W0622 95 | dirname = tempfile.mkdtemp(suffix, prefix, dir) 96 | try: 97 | yield dirname 98 | finally: 99 | shutil.rmtree(dirname, ignore_errors=True) 100 | 101 | 102 | if __name__ == "__main__": 103 | sys.exit(main(sys.argv)) 104 | -------------------------------------------------------------------------------- /apt2ostree/multistrap.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | from configparser import NoOptionError, SafeConfigParser 3 | 4 | from .apt import AptSource, keyrings_for 5 | 6 | 7 | MultistrapConfig = namedtuple( 8 | "MultistrapConfig", "apt_sources packages") 9 | 10 | 11 | def read_multistrap_config(ninja, config_file): 12 | p = SafeConfigParser() 13 | with ninja.open(config_file) as f: 14 | p.readfp(f) 15 | 16 | def get(section, field, default=None): 17 | try: 18 | return p.get(section, field) 19 | except NoOptionError: 20 | return default 21 | 22 | apt_sources = [] 23 | packages = [] 24 | for section in p.get("General", "aptsources").split(): 25 | apt_sources.append(AptSource( 26 | architecture=get("General", "arch") or "amd64", 27 | distribution=get(section, "suite"), 28 | archive_url=get(section, "source"), 29 | components=get(section, "components"), 30 | keyrings=get_keyring(get(section, "source"), get(section, "suite")))) 31 | packages += get(section, "packages", "").split() 32 | 33 | return MultistrapConfig(apt_sources, packages) 34 | 35 | 36 | def get_keyring(archive_url, distribution): 37 | if 'ubuntu' in archive_url: 38 | return keyrings_for("ubuntu", distribution) 39 | elif 'debian' in archive_url: 40 | return keyrings_for("debian", distribution) 41 | else: 42 | raise Exception("Couldn't work out distro from %r" % archive_url) 43 | 44 | 45 | def multistrap(config_file, ninja, apt, unpack_only=False): 46 | cfg = read_multistrap_config(ninja, config_file) 47 | return apt.build_image("%s.lock" % config_file, 48 | packages=cfg.packages, 49 | apt_sources=cfg.apt_sources, 50 | unpack_only=unpack_only) 51 | -------------------------------------------------------------------------------- /apt2ostree/ninja.py: -------------------------------------------------------------------------------- 1 | import errno 2 | import hashlib 3 | import os 4 | import pipes 5 | import re 6 | import sys 7 | import textwrap 8 | import traceback 9 | 10 | from . import ninja_syntax 11 | 12 | NINJA_AUTO_VARS = set(["in", "out", "_args_digest"]) 13 | ALREADY_WRITTEN = "ALREADY_WRITTEN" 14 | 15 | 16 | class Ninja(ninja_syntax.Writer): 17 | builddir = "_build" 18 | 19 | def __init__(self, regenerate_command=None, width=78, debug=True, 20 | ninjafile="build.ninja", standalone=True): 21 | if regenerate_command is None: 22 | regenerate_command = sys.argv 23 | 24 | self.debug = debug 25 | self.ninjafile = ninjafile 26 | self.standalone = standalone 27 | 28 | output = open(self.ninjafile + '~', 'w') 29 | super(Ninja, self).__init__(output, width) 30 | self.global_vars = {} 31 | self.targets = {} 32 | self.rules = {} 33 | self.generator_deps = set() 34 | 35 | self.add_generator_dep(__file__) 36 | self.add_generator_dep(ninja_syntax.__file__) 37 | self.add_generator_dep(__file__ + '/../ostree.py') 38 | self.add_generator_dep(__file__ + '/../multistrap.py') 39 | 40 | self.regenerate_command = regenerate_command 41 | self.variable("builddir", self.builddir) 42 | self.build(".FORCE", "phony") 43 | 44 | if self.standalone: 45 | # Write a reconfigure script to rememeber arguments passed to 46 | # configure: 47 | reconfigure = "%s/reconfigure-%s" % (self.builddir, ninjafile) 48 | self.add_target(reconfigure) 49 | try: 50 | os.mkdir(self.builddir) 51 | except OSError as e: 52 | if e.errno != errno.EEXIST: 53 | raise 54 | with open(reconfigure, 'w') as f: 55 | f.write("#!/bin/sh\nexec %s\n" % ( 56 | shquote(["./" + os.path.relpath(self.regenerate_command[0])] 57 | + self.regenerate_command[1:]))) 58 | os.chmod(reconfigure, 0o755) 59 | self.rule("configure", reconfigure, generator=True) 60 | 61 | self.add_target("%s/.ninja_deps" % self.builddir) 62 | self.add_target("%s/.ninja_log" % self.builddir) 63 | 64 | def close(self): 65 | if not self.output.closed: 66 | if self.standalone: 67 | self.build(self.ninjafile, "configure", 68 | list(self.generator_deps)) 69 | super(Ninja, self).close() 70 | os.rename(self.ninjafile + '~', self.ninjafile) 71 | 72 | def __enter__(self): 73 | return self 74 | 75 | def __exit__(self, _1, _2, _3): 76 | self.close() 77 | 78 | def __del__(self): 79 | self.close() 80 | 81 | def variable(self, key, value, indent=0): 82 | if indent == 0: 83 | if key in self.global_vars: 84 | if value != self.global_vars[key]: 85 | raise RuntimeError( 86 | "Setting key to %s, when it was already set to %s" % ( 87 | key, value)) 88 | return 89 | self.global_vars[key] = value 90 | super(Ninja, self).variable(key, value, indent) 91 | 92 | def build(self, outputs, rule, inputs=None, 93 | allow_non_identical_duplicates=False, 94 | **kwargs): # pylint: disable=arguments-differ 95 | outputs = ninja_syntax.as_list(outputs) 96 | inputs = ninja_syntax.as_list(inputs) 97 | for x in outputs: 98 | s = hashlib.sha256() 99 | s.update(str((rule, inputs, sorted(kwargs.items()))).encode('utf-8')) 100 | try: 101 | if self.add_target(x, s.hexdigest()) == ALREADY_WRITTEN: 102 | # Its a duplicate build statement, but it's identical to the 103 | # last time it was written so that's ok. 104 | return outputs 105 | except DuplicateTarget: 106 | if allow_non_identical_duplicates: 107 | return outputs 108 | else: 109 | raise 110 | if self.debug: 111 | self.output.write("# Generated by:\n") 112 | stack = traceback.format_stack()[:-1] 113 | for frame in stack: 114 | for line in frame.split("\n"): 115 | if line: 116 | self.output.write("# ") 117 | self.output.write(line) 118 | self.output.write("\n") 119 | return super(Ninja, self).build(outputs, rule, inputs=inputs, **kwargs) 120 | 121 | def rule(self, name, *args, **kwargs): # pylint: disable=arguments-differ 122 | if name in self.rules: 123 | assert self.rules[name] == (args, kwargs) 124 | else: 125 | self.rules[name] = (args, kwargs) 126 | super(Ninja, self).rule(name, *args, **kwargs) 127 | 128 | def open(self, filename, mode='r', **kwargs): 129 | if 'w' in mode: 130 | self.add_target(filename) 131 | if 'r' in mode: 132 | try: 133 | out = open(filename, mode, **kwargs) 134 | self.add_generator_dep(filename) 135 | return out 136 | except IOError as e: 137 | if e.errno == errno.ENOENT: 138 | # configure output depends on the existance of this file. 139 | # It doesn't exist right now but we'll want to rerun 140 | # configure if that changes. The mtime of the containing 141 | # directory will be updated when the file is created so we 142 | # add a dependency on that instead: 143 | self.add_generator_dep(os.path.dirname(filename) or '.') 144 | raise 145 | else: 146 | raise 147 | else: 148 | return open(filename, mode, **kwargs) 149 | 150 | def add_generator_dep(self, filename): 151 | """Cause configure to be rerun if changes are made to filename""" 152 | self.generator_deps.add( 153 | os.path.relpath(filename).replace('.pyc', '.py')) 154 | 155 | def add_target(self, target, rulehash=None): 156 | if not target: 157 | raise RuntimeError("Invalid target filename %r" % target) 158 | if target in self.targets: 159 | if self.targets[target] == rulehash: 160 | return ALREADY_WRITTEN 161 | else: 162 | raise DuplicateTarget( 163 | "Duplicate target %r with different rule" % target) 164 | else: 165 | self.targets[target] = rulehash 166 | return None 167 | 168 | def write_gitignore(self, filename=None): 169 | if filename is None: 170 | filename = "%s/.gitignore" % self.builddir 171 | self.add_target(filename) 172 | with open(filename, 'w') as f: 173 | for x in self.targets: 174 | f.write("%s\n" % os.path.relpath(x, os.path.dirname(filename))) 175 | 176 | 177 | class DuplicateTarget(RuntimeError): 178 | pass 179 | 180 | 181 | def _is_string(val): 182 | if sys.version_info[0] >= 3: 183 | str_type = str 184 | else: 185 | str_type = basestring 186 | return isinstance(val, str_type) 187 | 188 | 189 | def vars_in(items): 190 | if items is None: 191 | return set() 192 | if _is_string(items): 193 | items = [items] 194 | out = set() 195 | for text in items: 196 | for x in text.split('$$'): 197 | out.update(re.findall(r"\$(\w+)", x)) 198 | out.update(re.findall(r"\${(\w+)}", x)) 199 | for line in x.split('\n'): 200 | m = re.search(r'\$[^_{0-9a-zA-Z]', line) 201 | if m: 202 | raise RuntimeError( 203 | "bad $-escape (literal $ must be written as $$)\n" 204 | "%s\n" 205 | "%s^ near here" % (line, " " * m.start())) 206 | return out 207 | 208 | 209 | class Rule(object): 210 | def __init__(self, name, command, outputs=None, inputs=None, 211 | description=None, order_only=None, implicit=None, 212 | output_type=None, allow_non_identical_duplicates=False, 213 | **kwargs): 214 | if order_only is None: 215 | order_only = [] 216 | if implicit is None: 217 | implicit = [] 218 | self.name = name 219 | self.command = textwrap.dedent(command) 220 | self.outputs = ninja_syntax.as_list(outputs) 221 | self.inputs = ninja_syntax.as_list(inputs) 222 | self.order_only = ninja_syntax.as_list(order_only) 223 | self.implicit = ninja_syntax.as_list(implicit) 224 | self.output_type = output_type 225 | self.kwargs = kwargs 226 | self.allow_non_identical_duplicates = allow_non_identical_duplicates 227 | 228 | self.vars = vars_in(command).union(vars_in(inputs)).union(vars_in(outputs)) 229 | 230 | if description is None: 231 | description = "%s(%s)" % (self.name, ", ".join( 232 | "%s=$%s" % (x, x) for x in self.vars)) 233 | self.description = description 234 | 235 | def build(self, ninja, outputs=None, inputs=None, implicit=None, 236 | order_only=None, implicit_outputs=None, pool=None, **kwargs): 237 | if outputs is None: 238 | outputs = [] 239 | if inputs is None: 240 | inputs = [] 241 | if order_only is None: 242 | order_only = [] 243 | if implicit is None: 244 | implicit = [] 245 | ninja.newline() 246 | ninja.rule(self.name, self.command, description=self.description, 247 | **self.kwargs) 248 | v = set(kwargs.keys()) 249 | missing_args = self.vars - v - set(ninja.global_vars.keys()) - NINJA_AUTO_VARS 250 | if missing_args: 251 | raise TypeError("Missing arguments to rule %s: %s" % 252 | (self.name, ", ".join(missing_args))) 253 | if v - self.vars: 254 | raise TypeError("Rule %s got unexpected arguments: %s" % 255 | (self.name, ", ".join(v - self.vars))) 256 | 257 | if '_args_digest' in self.vars: 258 | s = hashlib.sha256() 259 | s.update(str([self.name] + sorted(kwargs.items())).encode('utf-8')) 260 | kwargs['_args_digest'] = s.hexdigest()[:7] 261 | 262 | if self.outputs: 263 | outputs.extend(ninja_syntax.expand(x, ninja.global_vars, kwargs) 264 | for x in self.outputs) 265 | if self.inputs: 266 | inputs.extend(ninja_syntax.expand(x, ninja.global_vars, kwargs) 267 | for x in self.inputs) 268 | if self.implicit: 269 | inputs.extend(ninja_syntax.expand(x, ninja.global_vars, kwargs) 270 | for x in self.implicit) 271 | 272 | ninja.newline() 273 | outputs = ninja.build( 274 | outputs, self.name, inputs=inputs, 275 | implicit=implicit, order_only=self.order_only + order_only, 276 | implicit_outputs=implicit_outputs, pool=pool, variables=kwargs, 277 | allow_non_identical_duplicates=self.allow_non_identical_duplicates) 278 | if self.output_type: 279 | if isinstance(self.output_type, tuple): 280 | assert len(outputs) == len(self.output_type) 281 | outputs = tuple(t(x) for t, x in zip(self.output_type, outputs)) 282 | else: 283 | assert len(outputs) == 1 284 | outputs = self.output_type(outputs[0]) 285 | return outputs 286 | 287 | 288 | def shquote(v): 289 | if _is_string(v): 290 | return pipes.quote(v) 291 | else: 292 | return " ".join(shquote(x) for x in v) 293 | -------------------------------------------------------------------------------- /apt2ostree/ninja_syntax.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | """Python module for generating .ninja files. 4 | 5 | Note that this is emphatically not a required piece of Ninja; it's 6 | just a helpful utility for build-file-generation systems that already 7 | use Python. 8 | """ 9 | 10 | # pylint:skip-file 11 | 12 | import re 13 | import textwrap 14 | 15 | 16 | def escape_path(word): 17 | return word.replace('$ ', '$$ ').replace(' ', '$ ').replace(':', '$:') 18 | 19 | 20 | class Writer(object): 21 | def __init__(self, output, width=78): 22 | self.output = output 23 | self.width = width 24 | 25 | def newline(self): 26 | self.output.write('\n') 27 | 28 | def comment(self, text): 29 | for line in textwrap.wrap(text, self.width - 2, break_long_words=False, 30 | break_on_hyphens=False): 31 | self.output.write('# ' + line + '\n') 32 | 33 | def variable(self, key, value, indent=0): 34 | if value is None: 35 | return 36 | if isinstance(value, list): 37 | value = ' '.join(filter(None, value)) # Filter out empty strings. 38 | self._line('%s = %s' % (key, value), indent) 39 | 40 | def pool(self, name, depth): 41 | self._line('pool %s' % name) 42 | self.variable('depth', depth, indent=1) 43 | 44 | def rule(self, name, command, description=None, depfile=None, 45 | generator=False, pool=None, restat=False, rspfile=None, 46 | rspfile_content=None, deps=None): 47 | self._line('rule %s' % name) 48 | self.variable('command', command, indent=1) 49 | if description: 50 | self.variable('description', description, indent=1) 51 | if depfile: 52 | self.variable('depfile', depfile, indent=1) 53 | if generator: 54 | self.variable('generator', '1', indent=1) 55 | if pool: 56 | self.variable('pool', pool, indent=1) 57 | if restat: 58 | self.variable('restat', '1', indent=1) 59 | if rspfile: 60 | self.variable('rspfile', rspfile, indent=1) 61 | if rspfile_content: 62 | self.variable('rspfile_content', rspfile_content, indent=1) 63 | if deps: 64 | self.variable('deps', deps, indent=1) 65 | 66 | def build(self, outputs, rule, inputs=None, implicit=None, order_only=None, 67 | variables=None, implicit_outputs=None, pool=None): 68 | outputs = as_list(outputs) 69 | out_outputs = [escape_path(x) for x in outputs] 70 | all_inputs = [escape_path(x) for x in as_list(inputs)] 71 | 72 | if implicit: 73 | implicit = [escape_path(x) for x in as_list(implicit)] 74 | all_inputs.append('|') 75 | all_inputs.extend(implicit) 76 | if order_only: 77 | order_only = [escape_path(x) for x in as_list(order_only)] 78 | all_inputs.append('||') 79 | all_inputs.extend(order_only) 80 | if implicit_outputs: 81 | implicit_outputs = [escape_path(x) 82 | for x in as_list(implicit_outputs)] 83 | out_outputs.append('|') 84 | out_outputs.extend(implicit_outputs) 85 | 86 | self._line('build %s: %s' % (' '.join(out_outputs), 87 | ' '.join([rule] + all_inputs))) 88 | if pool is not None: 89 | self._line(' pool = %s' % pool) 90 | 91 | if variables: 92 | if isinstance(variables, dict): 93 | iterator = iter(variables.items()) 94 | else: 95 | iterator = iter(variables) 96 | 97 | for key, val in iterator: 98 | self.variable(key, val, indent=1) 99 | 100 | return outputs 101 | 102 | def include(self, path): 103 | self._line('include %s' % path) 104 | 105 | def subninja(self, path): 106 | self._line('subninja %s' % path) 107 | 108 | def default(self, paths): 109 | self._line('default %s' % ' '.join(as_list(paths))) 110 | 111 | def _count_dollars_before_index(self, s, i): 112 | """Returns the number of '$' characters right in front of s[i].""" 113 | dollar_count = 0 114 | dollar_index = i - 1 115 | while dollar_index > 0 and s[dollar_index] == '$': 116 | dollar_count += 1 117 | dollar_index -= 1 118 | return dollar_count 119 | 120 | def _line(self, text, indent=0): 121 | """Write 'text' word-wrapped at self.width characters.""" 122 | lines = text.strip().split('\n') 123 | for n, text in enumerate(lines): 124 | leading_space = ' ' * indent 125 | if n != 0: 126 | leading_space += ' ' 127 | while len(leading_space) + len(text) > self.width: 128 | # The text is too wide; wrap if possible. 129 | 130 | # Find the rightmost space that would obey our width constraint 131 | # and that's not an escaped space. 132 | available_space = self.width - len(leading_space) - len(' $') 133 | space = available_space 134 | while True: 135 | space = text.rfind(' ', 0, space) 136 | if (space < 0 or 137 | self._count_dollars_before_index(text, space) % 2 == 0): 138 | break 139 | 140 | if space < 0: 141 | # No such space; just use the first unescaped space we can 142 | # find. 143 | space = available_space - 1 144 | while True: 145 | space = text.find(' ', space + 1) 146 | if (space < 0 or 147 | self._count_dollars_before_index(text, space) % 2 == 148 | 0): 149 | break 150 | if space < 0: 151 | # Give up on breaking. 152 | break 153 | 154 | self.output.write(leading_space + text[0:space] + ' $\n') 155 | text = text[space+1:] 156 | 157 | # Subsequent lines are continuations, so indent them. 158 | leading_space = ' ' * (indent+2) 159 | 160 | self.output.write(leading_space + text) 161 | if n + 1 < len(lines): 162 | self.output.write(' $') 163 | self.output.write('\n') 164 | 165 | def close(self): 166 | self.output.close() 167 | 168 | 169 | def as_list(input): 170 | if input is None: 171 | return [] 172 | if isinstance(input, list): 173 | return input 174 | return [input] 175 | 176 | 177 | def escape(string): 178 | """Escape a string such that it can be embedded into a Ninja file without 179 | further interpretation.""" 180 | assert '\n' not in string, 'Ninja syntax does not allow newlines' 181 | # We only have one special metacharacter: '$'. 182 | return string.replace('$', '$$') 183 | 184 | 185 | def expand(string, vars, local_vars={}): 186 | """Expand a string containing $vars as Ninja would. 187 | 188 | Note: doesn't handle the full Ninja variable syntax, but it's enough 189 | to make configure.py's use of it work. 190 | """ 191 | def exp(m): 192 | var = m.group(1) 193 | if var == '$': 194 | return '$' 195 | return local_vars.get(var, vars.get(var, '')) 196 | return re.sub(r'\$(\$|\w*)', exp, string) 197 | -------------------------------------------------------------------------------- /apt2ostree/ostree.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | 3 | from .ninja import Rule 4 | 5 | 6 | class OstreeRef(namedtuple("OstreeImage", "filename")): 7 | @property 8 | def ref(self): 9 | return self.filename.split("/refs/heads/")[1] 10 | 11 | @property 12 | def repo(self): 13 | return self.filename.split("/refs/heads/")[0] 14 | 15 | 16 | ostree = Rule("ostree", """\ 17 | mkdir $ostree_repo; 18 | ostree init --repo=$ostree_repo --mode=bare-user; 19 | """, outputs=['$ostree_repo/config'], restat=True) 20 | 21 | 22 | ostree_combine = Rule( 23 | "ostree_combine", """\ 24 | echo $in 25 | | sed 's,$ostree_repo/refs/heads/,--tree=ref=,g' 26 | | xargs -xr ostree --repo=$ostree_repo commit -b $branch --no-bindings 27 | --orphan --timestamp=0; 28 | [ -e $out ]""", 29 | restat=True, 30 | output_type=OstreeRef, 31 | outputs=["$ostree_repo/refs/heads/$branch"], 32 | order_only=["$ostree_repo/config"], 33 | description="Ostree Combine for $branch") 34 | 35 | ostree_addfile = Rule( 36 | "file_into_ostree", """\ 37 | set -ex; 38 | tmpdir=$$(mktemp -dt ostree_adddir.XXXXXX); 39 | cp $in_file $$tmpdir; 40 | ostree --repo=$ostree_repo commit --devino-canonical -b $out_branch 41 | --no-bindings --orphan --timestamp=0 42 | --tree=ref=$in_branch 43 | --tree=prefix=$prefix --tree=dir=$$tmpdir 44 | --owner-uid=0 --owner-gid=0; 45 | rm -rf $$tmpdir; 46 | """, 47 | restat=True, 48 | inputs=["$ostree_repo/refs/heads/$in_branch", "$in_file"], 49 | output_type=OstreeRef, 50 | outputs=["$ostree_repo/refs/heads/$out_branch"], 51 | description="Add file $in_branch") 52 | -------------------------------------------------------------------------------- /apt2ostree/quirks/apt/apt-auto-removal: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /apt2ostree/quirks/pylint/pylint.bcep: -------------------------------------------------------------------------------- 1 | re|-4.0|/usr/lib/python2.7/dist-packages/pylint|.*/test/.* 2 | -------------------------------------------------------------------------------- /apt2ostree/quirks/usrmerge/usrmerge.postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /examples/multistrap/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | build.ninja 3 | 4 | -------------------------------------------------------------------------------- /examples/multistrap/multistrap.conf: -------------------------------------------------------------------------------- 1 | [General] 2 | arch=armhf 3 | # same as --tidy-up option if set to true 4 | cleanup=false 5 | # same as --no-auth option if set to true 6 | # keyring packages listed in each bootstrap will 7 | # still be installed. 8 | noauth=false 9 | # extract all downloaded archives (default is true) 10 | unpack=true 11 | # enable MultiArch for the specified architectures 12 | # default is empty 13 | multiarch= 14 | # aptsources is a list of sections to be used for downloading packages 15 | # and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list 16 | # of the target. Order is not important 17 | aptsources=Ubuntu 18 | # the order of sections is not important. 19 | # the bootstrap option determines which repository 20 | # is used to calculate the list of Priority: required packages. 21 | bootstrap=Ubuntu 22 | 23 | [Ubuntu] 24 | packages=systemd 25 | source=http://ports.ubuntu.com/ubuntu-ports 26 | keyring= 27 | suite=xenial 28 | components=main universe 29 | -------------------------------------------------------------------------------- /examples/multistrap/multistrap.conf.lock: -------------------------------------------------------------------------------- 1 | Package: adduser 2 | Architecture: all 3 | Version: 3.113+nmu3ubuntu4 4 | Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1) 5 | Depends: perl-base (>= 5.6.0), passwd (>= 1:4.1.5.1-1.1ubuntu6), debconf | debconf-2.0 6 | Filename: pool/main/a/adduser/adduser_3.113+nmu3ubuntu4_all.deb 7 | MD5sum: 36f79d952ced9bde3359b63cf9cf44fb 8 | SHA1: 6a5b8f58e33d5c9a25f79c6da80a64bf104e6268 9 | SHA256: ca6c86cb229082cc22874ed320eac8d128cc91f086fe5687946e7d05758516a3 10 | Multi-Arch: foreign 11 | 12 | Package: base-files 13 | Architecture: armhf 14 | Version: 9.4ubuntu4 15 | Replaces: base, dpkg (<= 1.15.0), miscutils 16 | Provides: base 17 | Pre-Depends: awk 18 | Breaks: initscripts (<< 2.88dsf-13.3), sendfile (<< 2.1b.20080616-5.2~) 19 | Filename: pool/main/b/base-files/base-files_9.4ubuntu4_armhf.deb 20 | MD5sum: 61aa924a73c70703ccf6dd47b293a817 21 | SHA1: de44e3b84a69d06050f0c9f24e68402e297b6543 22 | SHA256: e928fd9d4f25cf71ab824e2de20d932c5b0f10c38de6211df0dbc4c83c163f59 23 | Multi-Arch: foreign 24 | 25 | Package: base-passwd 26 | Architecture: armhf 27 | Version: 3.5.39 28 | Replaces: base 29 | Depends: libc6 (>= 2.8), libdebconfclient0 (>= 0.145) 30 | Filename: pool/main/b/base-passwd/base-passwd_3.5.39_armhf.deb 31 | MD5sum: 1027065ed63d2929216b0b8f51e989c6 32 | SHA1: 7a9f294ec519f81d5069926d218786f7048def8f 33 | SHA256: 7ea941a2bc356dc463c31eac6d97b95c271355cddacb26008798deb2abacb9f2 34 | Multi-Arch: foreign 35 | 36 | Package: bash 37 | Architecture: armhf 38 | Version: 4.3-14ubuntu1 39 | Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) 40 | Depends: base-files (>= 2.1.12), debianutils (>= 2.15) 41 | Pre-Depends: dash (>= 0.5.5.1-2.2), libc6 (>= 2.15), libtinfo5 42 | Conflicts: bash-completion (<< 20060301-0) 43 | Filename: pool/main/b/bash/bash_4.3-14ubuntu1_armhf.deb 44 | MD5sum: 0c5c4bab2c28a92b565dd75587c8b9f3 45 | SHA1: 2ee19cc645ee540bc4056675b2a8cf378c400aa9 46 | SHA256: 3d32c92dbea5946d2c167eda0124fbb3f3a7ff66cfbf46b93b8ab97e41c7348c 47 | Multi-Arch: foreign 48 | 49 | Package: bsdutils 50 | Architecture: armhf 51 | Version: 1:2.27.1-6ubuntu3 52 | Replaces: bash-completion (<< 1:2.1-4.1~) 53 | Pre-Depends: libc6 (>= 2.16), libsystemd0 54 | Breaks: bash-completion (<< 1:2.1-4.1~) 55 | Filename: pool/main/u/util-linux/bsdutils_2.27.1-6ubuntu3_armhf.deb 56 | MD5sum: 8e992476d389c6fbaf5a577f9b876128 57 | SHA1: ffb4e618d3f0ca4d54b0e948ba4ca841e217194f 58 | SHA256: b28fea6f5a2239edc9a84bc9f2036359ff0d37f25ad77530ed7c1b4fb6b1a43f 59 | Multi-Arch: foreign 60 | 61 | Package: coreutils 62 | Architecture: armhf 63 | Version: 8.25-2ubuntu2 64 | Replaces: mktemp, realpath, timeout 65 | Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 2.1.13) 66 | Conflicts: timeout 67 | Filename: pool/main/c/coreutils/coreutils_8.25-2ubuntu2_armhf.deb 68 | MD5sum: 20f38cd0087888833c2a3a7ad86f0e67 69 | SHA1: 890b75358d13d4a8d5e641c1e5250b8b933f5134 70 | SHA256: bd286a2bcaaafd7e1f4e65ff91a2499d2c6d9fab72d6d58147eacfb7075d1e28 71 | Multi-Arch: foreign 72 | 73 | Package: dash 74 | Architecture: armhf 75 | Version: 0.5.8-2.1ubuntu2 76 | Depends: debianutils (>= 2.15), dpkg (>= 1.15.0) 77 | Pre-Depends: libc6 (>= 2.11) 78 | Filename: pool/main/d/dash/dash_0.5.8-2.1ubuntu2_armhf.deb 79 | MD5sum: d80ffdb5cbdd47e98191c6c021557060 80 | SHA1: e68ae50ed48209cbd212bec8414b8720640aaf52 81 | SHA256: e94ad3ff49dffc2826d5b6010770fe0c67dbad740fb7d9aef831294496ac0acb 82 | 83 | Package: debconf 84 | Architecture: all 85 | Version: 1.5.58ubuntu1 86 | Replaces: debconf-tiny 87 | Provides: debconf-2.0 88 | Pre-Depends: perl-base (>= 5.6.1-4) 89 | Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) 90 | Filename: pool/main/d/debconf/debconf_1.5.58ubuntu1_all.deb 91 | MD5sum: 0cd4b75b7a410fcd5c02d3c8dcfca632 92 | SHA1: d64dae033d71495c1f8dc43bcd476702b829a119 93 | SHA256: d97962e9a9caa1d83152dbb7103f1dd8c63d186bc0aaf9c2079d819b04acfd4a 94 | Multi-Arch: foreign 95 | 96 | Package: debianutils 97 | Architecture: armhf 98 | Version: 4.7 99 | Replaces: manpages-pl (<< 1:0.5) 100 | Depends: sensible-utils 101 | Pre-Depends: libc6 (>= 2.15) 102 | Filename: pool/main/d/debianutils/debianutils_4.7_armhf.deb 103 | MD5sum: c73877be8c7585c13472aed6fae42052 104 | SHA1: 4000aa53175dcaa30626858be3e1e15e0d6f9302 105 | SHA256: 5cea7b85b7f4a15a0395657667af0010dd54e7f3ebe3a3f6675b1eac49a55947 106 | Multi-Arch: foreign 107 | 108 | Package: diffutils 109 | Architecture: armhf 110 | Version: 1:3.3-3 111 | Replaces: diff 112 | Pre-Depends: libc6 (>= 2.17) 113 | Filename: pool/main/d/diffutils/diffutils_3.3-3_armhf.deb 114 | MD5sum: 7715d0b3c394f402a8a488ea3f11124e 115 | SHA1: 338aac7f6027dec5b7a7b3911e2fe6c8da384866 116 | SHA256: b222169c53204c7ea427356a7a58025e607773adc05a2d2a7bd0acddb7e98d5a 117 | 118 | Package: dpkg 119 | Architecture: armhf 120 | Version: 1.18.4ubuntu1 121 | Replaces: manpages-it (<< 2.80-4) 122 | Pre-Depends: libbz2-1.0, libc6 (>= 2.11), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 2.3), zlib1g (>= 1:1.1.4), tar (>= 1.23) 123 | Conflicts: ada-reference-manual (<< 20021112web-4~), asn1-mode (<< 2.7-7~), bogosort (<< 0.4.2-3~), cl-yacc (<< 0.3-3~), cpp-4.1-doc (<< 4.1.2.nf2-4~), cpp-4.2-doc (<< 4.2.4.nf1-4~), gcc-4.1-doc (<< 4.1.2.nf2-4~), gcc-4.2-doc (<< 4.2.4.nf1-4~), gcj-4.1-doc (<< 4.1.2.nf2-4~), gcj-4.2-doc (<< 4.2.4.nf1-4~), gfortran-4.1-doc (<< 4.1.2.nf2-4~), gfortran-4.2-doc (<< 4.2.4.nf1-4~), ggz-docs (<< 0.0.14.1-2~), glame (<< 2.0.1-6~), gnat-4.1-doc (<< 4.1.2.nf2-4~), gnat-4.2-doc (<< 4.2.4.nf1-4~), gtalk (<< 0.99.10-16~), libalogg-dev (<< 1.3.7-2~), libgtk1.2-doc (<< 1.2.10-19~), libnettle-dev (<< 2~), liborbit-dev (<< 0.5.17-12~), libreadline5-dev (<< 5.2-8~), librep-doc (<< 0.90~), mmucl (<< 1.5.2-3~), nxml-mode (<< 20041004-9~), octave3.0-info (<< 1:3.0.5-7+rm), octave3.2-info (<< 3.2.4-12+rm), polgen-doc (<< 1.3-3+rm), r6rs-doc (<< 1.0-2~), serveez-doc (<< 0.1.5-3~), slat (<< 2.0-6~), texlive-base-bin-doc (<< 2007.dfsg.2-9~), ttcn-el (<< 0.6.9-2~), ulog-acctd (<< 0.4.3-3~), xconq-doc (<< 7.4.1-5~), zenirc (<< 2.112.dfsg-1~) 124 | Breaks: apt (<< 0.7.7~), apt-cudf (<< 3.3~beta1-3~), aptitude (<< 0.4.7-1~), auctex (<< 11.87-3+deb8u1~), ccache (<< 3.1.10-1~), cups (<< 1.7.5-10~), dbus (<< 1.8.12-1ubuntu6~), debian-security-support (<< 2014.10.26~), distcc (<< 3.1-6.1~), doc-base (<< 0.10.5~), dpkg-dev (<< 1.15.8), fontconfig (<< 2.11.1-0ubuntu5~), fusionforge-plugin-mediawiki (<< 5.3.2+20141104-3~), gap-core (<< 4r7p5-2~), gitweb (<< 1:2.1.4-2.1~), grace (<< 1:5.1.24-3~), gxine (<< 0.5.908-3.1~), hoogle (<< 4.2.33-4~), icecc (<< 1.0.1-2~), install-info (<< 5.1.dfsg.1-3~), libapache2-mod-php5 (<< 5.6.4+dfsg-3~), libapache2-mod-php5filter (<< 5.6.4+dfsg-3~), libdpkg-perl (<< 1.15.8), libjs-protoaculous (<< 5~), man-db (<< 2.6.3-6~), mcollective (<< 2.6.0+dfsg-2.1~), php5-fpm (<< 5.6.4+dfsg-3~), pypy (<< 2.4.0+dfsg-3~), readahead-fedora (<< 2:1.5.6-5.2~), software-center (<< 13.10-0ubuntu9~), ureadahead (<< 0.100.0-17~), wordpress (<< 4.1+dfsg-1~), xfonts-traditional (<< 1.7~), xine-ui (<< 0.99.9-1.2~) 125 | Filename: pool/main/d/dpkg/dpkg_1.18.4ubuntu1_armhf.deb 126 | MD5sum: 257d62c70afe25e78fe173675a653c5b 127 | SHA1: a275941e8869cab765a8434ca7270012bc964ecd 128 | SHA256: 783960b1c2f03ba08218c8ac30fb25677a339e768862ab58e9325b7477a9392e 129 | Multi-Arch: foreign 130 | 131 | Package: e2fslibs 132 | Architecture: armhf 133 | Version: 1.42.13-1ubuntu1 134 | Replaces: e2fsprogs (<< 1.34-1) 135 | Provides: libe2p2, libext2fs2 136 | Depends: libc6 (>= 2.17) 137 | Filename: pool/main/e/e2fsprogs/e2fslibs_1.42.13-1ubuntu1_armhf.deb 138 | MD5sum: e6ec9784b403564bf887e5d9b460e6b7 139 | SHA1: 2e9dbbf47a83eaab941735189916b397913744a9 140 | SHA256: c8a75ba96e4373d772ac88a6c61609a4e617c15b4268072bf7ce6ce3627fefd6 141 | Multi-Arch: same 142 | 143 | Package: e2fsprogs 144 | Architecture: armhf 145 | Version: 1.42.13-1ubuntu1 146 | Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) 147 | Pre-Depends: e2fslibs (= 1.42.13-1ubuntu1), libblkid1 (>= 2.17.2), libc6 (>= 2.11), libcomerr2 (>= 1.42~WIP-2011-10-05-1), libss2 (>= 1.34-1), libuuid1 (>= 2.16), util-linux (>= 2.15~rc1-1) 148 | Conflicts: dump (<< 0.4b4-4), initscripts (<< 2.85-4), quota (<< 1.55-8.1), sysvinit (<< 2.85-4) 149 | Filename: pool/main/e/e2fsprogs/e2fsprogs_1.42.13-1ubuntu1_armhf.deb 150 | MD5sum: 9f18778cdd5e1460c3de653883ead33d 151 | SHA1: c49b2e03196f00faa539da771413747bd3efd22c 152 | SHA256: 5893dd14f490e4228b5fc1e428c5de04f943de16c66e19d657ce461dc07e1ae5 153 | Multi-Arch: foreign 154 | 155 | Package: findutils 156 | Architecture: armhf 157 | Version: 4.6.0+git+20160126-2 158 | Pre-Depends: libc6 (>= 2.17), libselinux1 (>= 1.32) 159 | Conflicts: debconf (<< 1.5.50) 160 | Breaks: binstats (<< 1.08-8.1), debhelper (<< 9.20130504), guilt (<< 0.36-0.2), kernel-package (<< 13.000), libpython3.4-minimal (<< 3.4.4-2), libpython3.5-minimal (<< 3.5.1-3), lsat (<< 0.9.7.1-2.1), mc (<< 3:4.8.11-1), sendmail (<< 8.14.4-5), switchconf (<< 0.0.9-2.1) 161 | Filename: pool/main/f/findutils/findutils_4.6.0+git+20160126-2_armhf.deb 162 | MD5sum: 7d3a8eb571d3152121556a160786053c 163 | SHA1: 2fc2975891166de0c9302ae84aebb9f70de6adbd 164 | SHA256: 32019a8c294bc32daa92a784f623c02a58febab150529659b6cfa373762ee5ce 165 | Multi-Arch: foreign 166 | 167 | Package: gcc-6-base 168 | Architecture: armhf 169 | Version: 6.0.1-0ubuntu1 170 | Breaks: gcc-4.4-base (<< 4.4.7), gcc-4.7-base (<< 4.7.3), gcj-4.4-base (<< 4.4.6-9~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.4-base (<< 4.4.6-3~), gnat-4.6 (<< 4.6.1-5~) 171 | Filename: pool/main/g/gccgo-6/gcc-6-base_6.0.1-0ubuntu1_armhf.deb 172 | MD5sum: bd1773187a62dcc65ccfe3a6d315a946 173 | SHA1: d0ba6c33c80ceeb4d2864570879e9bd9ce0f608c 174 | SHA256: 0b5be16ab83bc18d87cb0b42ba187d4bfac8f0f27ce4d1d97b99e8d1a2def071 175 | Multi-Arch: same 176 | 177 | Package: grep 178 | Architecture: armhf 179 | Version: 2.24-1 180 | Provides: rgrep 181 | Depends: dpkg (>= 1.15.4) | install-info 182 | Pre-Depends: libc6 (>= 2.4), libpcre3 183 | Conflicts: rgrep 184 | Filename: pool/main/g/grep/grep_2.24-1_armhf.deb 185 | MD5sum: a21a8007b3b5fab14c169fb0dd152b2b 186 | SHA1: d2ed47c524752eaebeb559e02236dd5c9eb3ab38 187 | SHA256: 247565dffe94aed861923e43a9527764ad677cafa9b0204c1ea8ae62462249a9 188 | Multi-Arch: foreign 189 | 190 | Package: gzip 191 | Architecture: armhf 192 | Version: 1.6-4ubuntu1 193 | Depends: dpkg (>= 1.15.4) | install-info 194 | Pre-Depends: libc6 (>= 2.17) 195 | Filename: pool/main/g/gzip/gzip_1.6-4ubuntu1_armhf.deb 196 | MD5sum: 00591d91c3dbcd9b5a4e9893bfdca58b 197 | SHA1: 82fc2eff6d7220eab562012c2f06ddcba96132ba 198 | SHA256: e36ea58d1ee716b2d8d374b57329b768a5fa2b21d78f2fc3809a7ffc3f9de1e6 199 | 200 | Package: hostname 201 | Architecture: armhf 202 | Version: 3.16ubuntu2 203 | Replaces: nis (<< 3.17-30) 204 | Pre-Depends: libc6 (>= 2.4), lsb-base (>= 4.1+Debian11ubuntu7) 205 | Breaks: nis (<< 3.17-30) 206 | Filename: pool/main/h/hostname/hostname_3.16ubuntu2_armhf.deb 207 | MD5sum: 2006cda687550020c620675dcd8c96c8 208 | SHA1: d6b5a041db4049a1872009224304db1ad86349d4 209 | SHA256: 8649d1d2d8b51fc1ec8cc503f0a6c0ee01634800a9f095509cd4384adad22427 210 | 211 | Package: init 212 | Architecture: armhf 213 | Version: 1.29ubuntu1 214 | Depends: init-system-helpers 215 | Pre-Depends: systemd-sysv | upstart-sysv 216 | Filename: pool/main/i/init-system-helpers/init_1.29ubuntu1_armhf.deb 217 | MD5sum: 37da1e50032e26f3833239faa698866e 218 | SHA1: 5b3ccdf8c04ec3e17eb2bee4371471de219bece0 219 | SHA256: 331981819d634fc074979b99f320c627764a88c392afb42a38ebfeb1f078ff71 220 | Multi-Arch: foreign 221 | 222 | Package: init-system-helpers 223 | Architecture: all 224 | Version: 1.29ubuntu1 225 | Replaces: sysv-rc (<< 2.88dsf-59.3~), sysvinit-utils (<< 2.88dsf-59.3) 226 | Depends: perl-base (>= 5.20.1-3) 227 | Conflicts: file-rc (<< 0.8.17~), openrc (<= 0.18.3-1) 228 | Breaks: systemd (<< 44-12), sysvinit-utils (<< 2.88dsf-59.3~) 229 | Filename: pool/main/i/init-system-helpers/init-system-helpers_1.29ubuntu1_all.deb 230 | MD5sum: 0ecd49225ab7265f2664a3d74637d208 231 | SHA1: 70fd47ac3170cce51d12992dbbe07a4a214ca082 232 | SHA256: 68d46232a9991130124388a58fd0fb06d36c3dfc42c1a12cc8973459312114fd 233 | Multi-Arch: foreign 234 | 235 | Package: initscripts 236 | Architecture: armhf 237 | Version: 2.88dsf-59.3ubuntu2 238 | Replaces: libc0.1, libc0.3, libc6, libc6.1 239 | Depends: debianutils (>= 4), lsb-base (>= 3.2-14), sysvinit-utils (>= 2.88dsf-50), sysv-rc | file-rc, coreutils (>= 5.93) 240 | Conflicts: libdevmapper1.02.1 (<< 2:1.02.24-1) 241 | Breaks: aide (<< 0.15.1-5), atm-tools (<< 1:2.5.1-1.3), autofs (<< 5.0.0), bootchart (<< 0.10~svn407-4), console-common (<< 0.7.86), console-setup (<< 1.74), cruft (<< 0.9.16), eepc-acpi-scripts (<< 1.1.12), fcheck (<< 2.7.59-16), hostapd (<< 1:0.7.3-3), hurd (<< 0.5.git20131101~), ifupdown (<< 0.7.46), libpam-mount (<< 2.13-1), live-build (<< 3.0~a26-1), ltsp-client-core (<< 5.2.16-1), mdadm (<< 3.2.2-1), nbd-client (<< 1:2.9.23-1), nfs-common (<< 1:1.2.5-3), portmap (<< 6.0.0-2), readahead-fedora (<< 2:1.5.6-3), resolvconf (<< 1.49), rpcbind (<< 0.2.0-7), rsyslog (<< 5.8.2-2), selinux-policy-default (<= 2:0.2.20100524-9), splashy (<< 0.3.13-5.1+b1), sysklogd (<< 1.5-6.2), systemd (<< 228-5ubuntu3), util-linux (<< 2.26.2-4~), wpasupplicant (<< 0.7.3-4), xymon (<< 4.3.0~beta2.dfsg-9) 242 | Filename: pool/main/s/sysvinit/initscripts_2.88dsf-59.3ubuntu2_armhf.deb 243 | MD5sum: 6b5fabdbeff28739ff15371f3878a05a 244 | SHA1: 9a1d329457fb3d38991ba9a14cb02a6593797899 245 | SHA256: d1554b21e77fe2bb767bc55f50d04b061b75b2ee5f8445779b99c0872b3e9082 246 | Multi-Arch: foreign 247 | 248 | Package: insserv 249 | Architecture: armhf 250 | Version: 1.14.0-5ubuntu3 251 | Depends: libc6 (>= 2.7) 252 | Breaks: sysv-rc (<< 2.87dsf-3) 253 | Filename: pool/main/i/insserv/insserv_1.14.0-5ubuntu3_armhf.deb 254 | MD5sum: 545379eef3cd04ea91160e9848b9a7d7 255 | SHA1: 63754abc162a7267bf4ab345daf62c93ac490d9a 256 | SHA256: 9c578f71a7d05949354311f65756988886100e8a6a579dce90dd48f7a6007287 257 | 258 | Package: libacl1 259 | Architecture: armhf 260 | Version: 2.2.52-3 261 | Depends: libattr1 (>= 1:2.4.46-8), libc6 (>= 2.4) 262 | Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth 263 | Filename: pool/main/a/acl/libacl1_2.2.52-3_armhf.deb 264 | MD5sum: 703bd54ca2e16fb8d0e9908bf4269800 265 | SHA1: a644dd3a5a8d2d638eed4c62e01baee5ff528b9e 266 | SHA256: 64b6aa7c70cc71a829a41e6ab5479c54dcdef06065ac4a6d57bc1c43e6a2e946 267 | Multi-Arch: same 268 | 269 | Package: libapparmor1 270 | Architecture: armhf 271 | Version: 2.10.95-0ubuntu2 272 | Depends: libc6 (>= 2.17) 273 | Filename: pool/main/a/apparmor/libapparmor1_2.10.95-0ubuntu2_armhf.deb 274 | MD5sum: e48821fa9567a315fc17d6b1a7e660fe 275 | SHA1: 1199f5dc1eafd6333e6a8ad889c7f053602a3c7d 276 | SHA256: 87d1ac8c940f6657e6a41193fd54d9778fbfbf4d86ee6e0790410ef721a3f44c 277 | Multi-Arch: same 278 | 279 | Package: libattr1 280 | Architecture: armhf 281 | Version: 1:2.4.47-2 282 | Depends: libc6 (>= 2.4) 283 | Pre-Depends: multiarch-support 284 | Conflicts: attr (<< 2.0.0) 285 | Filename: pool/main/a/attr/libattr1_2.4.47-2_armhf.deb 286 | MD5sum: 7bbf6b3a51ff56650f92aee6966c00b0 287 | SHA1: ab1a7058e1cd1a96a85c6d1cfeb79ca71f1d282d 288 | SHA256: d77f44bc767f182b2eddc11a90d7e7ca5b7b48daff29eec9a90d1e0c47f43ab0 289 | Multi-Arch: same 290 | 291 | Package: libaudit-common 292 | Architecture: all 293 | Version: 1:2.4.5-1ubuntu2 294 | Replaces: libaudit0, libaudit1 (<< 1:2.2.1-2) 295 | Breaks: libaudit0, libaudit1 (<< 1:2.2.1-2) 296 | Filename: pool/main/a/audit/libaudit-common_2.4.5-1ubuntu2_all.deb 297 | MD5sum: 1f7ef825c10f8ab2a66643e5302ca3ec 298 | SHA1: 539177f5e64636fd2dbcbd6ad17a008ccd816ec8 299 | SHA256: b0fe5e0b7ef4e072795ed8a7e9fe524ea1fb2665f952528d5d2705c814787fa3 300 | Multi-Arch: foreign 301 | 302 | Package: libaudit1 303 | Architecture: armhf 304 | Version: 1:2.4.5-1ubuntu2 305 | Depends: libaudit-common (>= 1:2.4.5-1ubuntu2), libc6 (>= 2.8) 306 | Filename: pool/main/a/audit/libaudit1_2.4.5-1ubuntu2_armhf.deb 307 | MD5sum: 17ba4a94278442ff577509528251d54b 308 | SHA1: 669591c426cc168f7613f7fb19cd75f3fbe77c22 309 | SHA256: 09815d6ba28ae315a643ce789b68f5d52a944f894c75c41aaa86fef36e61ce63 310 | Multi-Arch: same 311 | 312 | Package: libblkid1 313 | Architecture: armhf 314 | Version: 2.27.1-6ubuntu3 315 | Depends: libc6 (>= 2.17), libuuid1 (>= 2.16) 316 | Filename: pool/main/u/util-linux/libblkid1_2.27.1-6ubuntu3_armhf.deb 317 | MD5sum: 8d698db16b2259e384841fa28a1eba8a 318 | SHA1: 4f5bbd00061d505619c1ec457430dbd06368ebb1 319 | SHA256: f91c4a10731abdf346bb034fd8fc9747dfda9f63737d5e027fa364ed95cf26e3 320 | Multi-Arch: same 321 | 322 | Package: libbz2-1.0 323 | Architecture: armhf 324 | Version: 1.0.6-8 325 | Depends: libc6 (>= 2.4) 326 | Filename: pool/main/b/bzip2/libbz2-1.0_1.0.6-8_armhf.deb 327 | MD5sum: 5ad73b78ef19a884c57bc585de7ad51d 328 | SHA1: 50e210a299696ec6477c94108e58423e191f030f 329 | SHA256: 1218a2213a281476d5e509700ed907d9ebaa0fedae1fba1bff7f4d4108d38e71 330 | Multi-Arch: same 331 | 332 | Package: libc-bin 333 | Architecture: armhf 334 | Version: 2.23-0ubuntu3 335 | Depends: libc6 (>> 2.23), libc6 (<< 2.24) 336 | Filename: pool/main/g/glibc/libc-bin_2.23-0ubuntu3_armhf.deb 337 | MD5sum: ddc8cf82b67a61dac1df1d8815917ebe 338 | SHA1: 940fdec61fc3c5c888404a7c5bbeb77768a0b15a 339 | SHA256: d4b7aea3fb823ac4ba55252645836f7a2e9669e9fe023af971fdf31a72b03dd2 340 | Multi-Arch: foreign 341 | 342 | Package: libc6 343 | Architecture: armhf 344 | Version: 2.23-0ubuntu3 345 | Provides: libc6-armhf 346 | Depends: libgcc1 347 | Breaks: hurd (<< 1:0.5.git20140203-1), libtirpc1 (<< 0.2.3), locales (<< 2.23), locales-all (<< 2.23), nscd (<< 2.23) 348 | Filename: pool/main/g/glibc/libc6_2.23-0ubuntu3_armhf.deb 349 | MD5sum: 4ba5df8944d66629ba01133d54651d6c 350 | SHA1: 8349836e05324d08528bbbfd7eff22dcff1dab4a 351 | SHA256: 5ff24aacaab8ac9e2627ab50146c034f69331973c4f7c2c3e1fa5578cf4d3f94 352 | Multi-Arch: same 353 | 354 | Package: libcap2 355 | Architecture: armhf 356 | Version: 1:2.24-12 357 | Depends: libc6 (>= 2.8) 358 | Filename: pool/main/libc/libcap2/libcap2_2.24-12_armhf.deb 359 | MD5sum: 6509e53eefc3864bec2c1cc4638abab3 360 | SHA1: 04f9bab221096490112d7cef12416fa67408b6cb 361 | SHA256: 527cb846d6e505fac99177bd617c1bd2bbb52fae7e0f454fb9d68dae23b1abb1 362 | Multi-Arch: same 363 | 364 | Package: libcap2-bin 365 | Architecture: armhf 366 | Version: 1:2.24-12 367 | Replaces: libcap-bin 368 | Depends: libc6 (>= 2.4), libcap2 (>= 1:2.10) 369 | Breaks: libcap-bin 370 | Filename: pool/main/libc/libcap2/libcap2-bin_2.24-12_armhf.deb 371 | MD5sum: a6d7854ef81a7b52f7f5718d32a32d8f 372 | SHA1: 208ff3777e3f26de703730fbe3cfbb32962da5b1 373 | SHA256: 115620fc509c0ec325bdb73b7b1d761eaf0a5962c5cd7724111c2a468994c13e 374 | Multi-Arch: foreign 375 | 376 | Package: libcomerr2 377 | Architecture: armhf 378 | Version: 1.42.13-1ubuntu1 379 | Replaces: e2fsprogs (<< 1.34-1) 380 | Provides: libcomerr-kth-compat 381 | Depends: libc6 (>= 2.17) 382 | Filename: pool/main/e/e2fsprogs/libcomerr2_1.42.13-1ubuntu1_armhf.deb 383 | MD5sum: b846369acc26cd7020493f2683afb130 384 | SHA1: 2eafefb16571ef966d72c8b223b74e1b4195fa47 385 | SHA256: 65ed2f09fc4e281d425fc12f266f52a9e73d2ed2dc055432ad4c4fb12e7185c0 386 | Multi-Arch: same 387 | 388 | Package: libcryptsetup4 389 | Architecture: armhf 390 | Version: 2:1.6.6-5ubuntu2 391 | Depends: libc6 (>= 2.17), libdevmapper1.02.1 (>= 2:1.02.99), libgcrypt20 (>= 1.6.1), libuuid1 (>= 2.16), libgpg-error0 (>= 1.10-0.1) 392 | Filename: pool/main/c/cryptsetup/libcryptsetup4_1.6.6-5ubuntu2_armhf.deb 393 | MD5sum: 5fb9ca778bf58c1e4a299d54057b0e08 394 | SHA1: 2191047d065257b9033774fe6f559c16e5d4bc53 395 | SHA256: 662d50fbd61f2c98cdcee1cdd1f8eb1ac5cca9e155ec77033445577d9c7c7218 396 | Multi-Arch: same 397 | 398 | Package: libdb5.3 399 | Architecture: armhf 400 | Version: 5.3.28-11 401 | Depends: libc6 (>= 2.17) 402 | Filename: pool/main/d/db5.3/libdb5.3_5.3.28-11_armhf.deb 403 | MD5sum: 0fc46403e33604f16e7d17fb7a4809d4 404 | SHA1: e13483e28e4f415694e2ad4c0bb1dcbdf42ffc44 405 | SHA256: 64d861941aaf66d95d36c6dacdd674913296652a09a6ed9ce2911fbf5d8906dd 406 | Multi-Arch: same 407 | 408 | Package: libdebconfclient0 409 | Architecture: armhf 410 | Version: 0.198ubuntu1 411 | Depends: libc6 (>= 2.4) 412 | Filename: pool/main/c/cdebconf/libdebconfclient0_0.198ubuntu1_armhf.deb 413 | MD5sum: fed74d6d4eebf0ff00e55ee0ccd870fe 414 | SHA1: 9ccd6d040e98b6e249f48d82f1ff5589adb4a6e5 415 | SHA256: a9416807cf208e188e74a4f392c847f4940c50e9cf3ea24aa86ab611a13379d8 416 | Multi-Arch: same 417 | 418 | Package: libdevmapper1.02.1 419 | Architecture: armhf 420 | Version: 2:1.02.110-1ubuntu10 421 | Depends: libc6 (>= 2.22), libselinux1 (>= 1.32), libudev1 (>= 183) 422 | Conflicts: libdevmapper1.02 423 | Breaks: liblvm2app2.2 (<< 2.02.122), lvm2 (<< 2.02.122) 424 | Filename: pool/main/l/lvm2/libdevmapper1.02.1_1.02.110-1ubuntu10_armhf.deb 425 | MD5sum: 19afb3fd6301b0ea4739e0b522d7d118 426 | SHA1: 81f15c187943f752938270dcc4d383807ef9bc39 427 | SHA256: 98a66cae3a60e662bf6399bf995e3dda79bc5639e72ef1f108bcec61c9dcc1b1 428 | Multi-Arch: same 429 | 430 | Package: libfdisk1 431 | Architecture: armhf 432 | Version: 2.27.1-6ubuntu3 433 | Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libuuid1 (>= 2.16) 434 | Filename: pool/main/u/util-linux/libfdisk1_2.27.1-6ubuntu3_armhf.deb 435 | MD5sum: 2885e6119159a9c47f62ce73565441c8 436 | SHA1: cc4d84499f20af8a6e8ae5e9a49920d83b5a4767 437 | SHA256: 23b0de2efeab5cf8756252771145a42f73072bc6cc788ba4715cfe4427078c09 438 | Multi-Arch: same 439 | 440 | Package: libgcc1 441 | Architecture: armhf 442 | Version: 1:6.0.1-0ubuntu1 443 | Provides: libgcc1-armhf 444 | Depends: gcc-6-base (= 6.0.1-0ubuntu1), libc6 (>= 2.4) 445 | Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2) 446 | Filename: pool/main/g/gccgo-6/libgcc1_6.0.1-0ubuntu1_armhf.deb 447 | MD5sum: 8a9b10aa995009972012e2a03b8e3d69 448 | SHA1: a56810298fd66ab35dc303da408f37b4f405f821 449 | SHA256: 01b0f7b51b694b2553c3f315f9aaa999722a4ecb3fa9387e31ed7361e9df5042 450 | Multi-Arch: same 451 | 452 | Package: libgcrypt20 453 | Architecture: armhf 454 | Version: 1.6.5-2 455 | Depends: libc6 (>= 2.15), libgpg-error0 (>= 1.14) 456 | Filename: pool/main/libg/libgcrypt20/libgcrypt20_1.6.5-2_armhf.deb 457 | MD5sum: 09d5e6eebee9231ee842e520f8827c9d 458 | SHA1: c9bec950f424a1f4c805492058471bef0e29c4d9 459 | SHA256: a52819a55321d5b9b3a6700ae5120e14862de678ef20c018b7de5ea3c870480e 460 | Multi-Arch: same 461 | 462 | Package: libgpg-error0 463 | Architecture: armhf 464 | Version: 1.21-2ubuntu1 465 | Depends: libc6 (>= 2.15) 466 | Filename: pool/main/libg/libgpg-error/libgpg-error0_1.21-2ubuntu1_armhf.deb 467 | MD5sum: e6fe2e5cfb7106596ab2e2b2928185be 468 | SHA1: a83fadae9f6cc616fa6bec826a308c22906b5fa5 469 | SHA256: 89635fcb4441afff924ee1fab6c679260617cd6769572911b7f510dba1f28aa5 470 | Multi-Arch: same 471 | 472 | Package: libkmod2 473 | Architecture: armhf 474 | Version: 22-1ubuntu4 475 | Depends: libc6 (>= 2.17) 476 | Filename: pool/main/k/kmod/libkmod2_22-1ubuntu4_armhf.deb 477 | MD5sum: 775268a06b2d876ff00650384406defe 478 | SHA1: 2a4fbef7b5cc16ba3b5488cd49bfd386327aa994 479 | SHA256: 2a770c359f3d6cd6d57139084f3ea1be977c6e616e040dd3aa84d55ca408f8a7 480 | Multi-Arch: same 481 | 482 | Package: liblzma5 483 | Architecture: armhf 484 | Version: 5.1.1alpha+20120614-2ubuntu2 485 | Depends: libc6 (>= 2.4) 486 | Pre-Depends: multiarch-support 487 | Filename: pool/main/x/xz-utils/liblzma5_5.1.1alpha+20120614-2ubuntu2_armhf.deb 488 | MD5sum: 9bcb8f897c42c122214ba882f6d74e2a 489 | SHA1: 7088edcb4d031f9ebbfd24f2fbbd179434bea99b 490 | SHA256: fe5cfa8cc9d1e81db20988de5b6ac9de5ff0a0b1d7b2d294cbaab57220bdd053 491 | Multi-Arch: same 492 | 493 | Package: libmount1 494 | Architecture: armhf 495 | Version: 2.27.1-6ubuntu3 496 | Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libselinux1 (>= 1.32) 497 | Filename: pool/main/u/util-linux/libmount1_2.27.1-6ubuntu3_armhf.deb 498 | MD5sum: 1febee59992832b57c48b1456b4b199a 499 | SHA1: 05853f1eef7fc386b3efba9a50747785314f3b28 500 | SHA256: 59b667699414e67482c859272d32b3dec55e2bfeeb3665157b49d62d83bf6b4e 501 | Multi-Arch: same 502 | 503 | Package: libncurses5 504 | Architecture: armhf 505 | Version: 6.0+20160213-1ubuntu1 506 | Depends: libtinfo5 (= 6.0+20160213-1ubuntu1), libc6 (>= 2.4) 507 | Filename: pool/main/n/ncurses/libncurses5_6.0+20160213-1ubuntu1_armhf.deb 508 | MD5sum: fa76227b6cdc9f5fd8ca952933e1ed53 509 | SHA1: 0d7eb241c8c5e0c5137e70cc0bf5ea512e0bf282 510 | SHA256: 7f37d7bfe2896dca1eed098277fb582df307e413892fb1c842b722e1769f0aee 511 | Multi-Arch: same 512 | 513 | Package: libncursesw5 514 | Architecture: armhf 515 | Version: 6.0+20160213-1ubuntu1 516 | Depends: libtinfo5 (= 6.0+20160213-1ubuntu1), libc6 (>= 2.4) 517 | Filename: pool/main/n/ncurses/libncursesw5_6.0+20160213-1ubuntu1_armhf.deb 518 | MD5sum: 502ec1093127f00015061bc9f3551afc 519 | SHA1: c34b597b2ff7404f2017d07604e443c19cd5a6e1 520 | SHA256: 08efec1b50a9dfb461f865999d691b15ccab555887ed959e37de2c4726ba74f9 521 | Multi-Arch: same 522 | 523 | Package: libpam-modules 524 | Architecture: armhf 525 | Version: 1.1.8-3.2ubuntu2 526 | Replaces: libpam-umask, libpam0g-util 527 | Provides: libpam-mkhomedir, libpam-motd, libpam-umask 528 | Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.15), libdb5.3, libpam0g (>= 1.1.3-2), libselinux1 (>= 2.1.9), debconf (>= 0.5) | debconf-2.0, libpam-modules-bin (= 1.1.8-3.2ubuntu2) 529 | Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask 530 | Filename: pool/main/p/pam/libpam-modules_1.1.8-3.2ubuntu2_armhf.deb 531 | MD5sum: dd8b6f08a4725608826d7d1f7faf11df 532 | SHA1: b62134a4ddb7e2b2395c8dd06939e407cbf3fd5f 533 | SHA256: 43deb832e157f14b5bb1027babccd1ad3db5b24783325cd451a1a8c7d5d94f3c 534 | Multi-Arch: same 535 | 536 | Package: libpam-modules-bin 537 | Architecture: armhf 538 | Version: 1.1.8-3.2ubuntu2 539 | Replaces: libpam-modules (<< 1.1.3-8) 540 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.4), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32) 541 | Filename: pool/main/p/pam/libpam-modules-bin_1.1.8-3.2ubuntu2_armhf.deb 542 | MD5sum: 3703bdd8d10b8d662e3c2188e117d9f9 543 | SHA1: e340ddb62b6b5ee1db459fcb41c105888f9a463b 544 | SHA256: 556110f8518321a11dc0d66984c495d9f000239fb81a584b97c7105cc883c835 545 | Multi-Arch: foreign 546 | 547 | Package: libpam-runtime 548 | Architecture: all 549 | Version: 1.1.8-3.2ubuntu2 550 | Replaces: libpam0g-dev, libpam0g-util 551 | Depends: debconf (>= 0.5) | debconf-2.0, debconf (>= 1.5.19) | cdebconf, libpam-modules (>= 1.0.1-6) 552 | Conflicts: libpam0g-util 553 | Filename: pool/main/p/pam/libpam-runtime_1.1.8-3.2ubuntu2_all.deb 554 | MD5sum: c3e36ce9cb28bd72f2536f6138544ae4 555 | SHA1: c44ba640e948405e1f3ef0d510eca22ea8d1ff11 556 | SHA256: 60ce562eb0ff783ba5deb26459ad721039d5d69bcf09d30f3dd34ec3e49639e0 557 | Multi-Arch: foreign 558 | 559 | Package: libpam0g 560 | Architecture: armhf 561 | Version: 1.1.8-3.2ubuntu2 562 | Replaces: libpam0g-util 563 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.8), debconf (>= 0.5) | debconf-2.0 564 | Filename: pool/main/p/pam/libpam0g_1.1.8-3.2ubuntu2_armhf.deb 565 | MD5sum: 0f045d6ff8fe9bc47710356568a2e73a 566 | SHA1: 77aec8be7eda141fec1deca317be4f24c637d9f5 567 | SHA256: f4747df41f022fb572e8e50ce1b92691ebfadbcaa79d07a2e019b1b2e4140c11 568 | Multi-Arch: same 569 | 570 | Package: libpcre3 571 | Architecture: armhf 572 | Version: 2:8.38-3.1 573 | Depends: libc6 (>= 2.4) 574 | Pre-Depends: multiarch-support 575 | Conflicts: libpcre3-dev (<= 4.3-3) 576 | Breaks: approx (<< 4.4-1~), cduce (<< 0.5.3-2~), cmigrep (<< 1.5-7~), galax (<< 1.1-7~), libpcre-ocaml (<< 6.0.1~), liquidsoap (<< 0.9.2-3~), ocsigen (<< 1.3.3-1~) 577 | Filename: pool/main/p/pcre3/libpcre3_8.38-3.1_armhf.deb 578 | MD5sum: 92747b9036b82a604d3a1502a99db79b 579 | SHA1: 43294ec30ff6228d30c0784cba8507415fc81fc9 580 | SHA256: d858a4d9e2485938f6ec5b295bfcae36651f5867a237525fdb698adc75d9a937 581 | Multi-Arch: same 582 | 583 | Package: libprocps4 584 | Architecture: armhf 585 | Version: 2:3.3.10-4ubuntu2 586 | Replaces: procps (<< 1:3.3.2-1) 587 | Depends: libc6 (>= 2.4), libsystemd0 588 | Filename: pool/main/p/procps/libprocps4_3.3.10-4ubuntu2_armhf.deb 589 | MD5sum: 131fd8da1a3148f167d3655bac420068 590 | SHA1: 1223c0ff574321e2bcf69b8a456d28a7b1be2ce9 591 | SHA256: bf5210303434d7eafdcdb3cac8a4e2990a010cb2c0959bf7da5502a4aa0bbcd8 592 | Multi-Arch: same 593 | 594 | Package: libseccomp2 595 | Architecture: armhf 596 | Version: 2.2.3-3ubuntu3 597 | Depends: libc6 (>= 2.4) 598 | Filename: pool/main/libs/libseccomp/libseccomp2_2.2.3-3ubuntu3_armhf.deb 599 | MD5sum: c0f1a32e3cb3c5fa02a050d7be943a3e 600 | SHA1: c73ec2e6d7c9477abcbd7cddd7ff071adb0f0ed0 601 | SHA256: d012a8184b1a77ef3f04bc5e49cbac41fe97160b5c8f5933d89ef8f2c442080f 602 | Multi-Arch: same 603 | 604 | Package: libselinux1 605 | Architecture: armhf 606 | Version: 2.4-3build2 607 | Depends: libc6 (>= 2.8), libpcre3 608 | Filename: pool/main/libs/libselinux/libselinux1_2.4-3build2_armhf.deb 609 | MD5sum: 77eca8e23a67e7c10eee539db5337e33 610 | SHA1: c13d3fc4127945324db95a91c8b981275278fc6e 611 | SHA256: 001cac0d492e9c0b04b1740ac3ca5e42f4dc53e536932b08af97f1c6cf5135bb 612 | Multi-Arch: same 613 | 614 | Package: libsemanage-common 615 | Architecture: all 616 | Version: 2.3-1build3 617 | Replaces: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) 618 | Breaks: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) 619 | Filename: pool/main/libs/libsemanage/libsemanage-common_2.3-1build3_all.deb 620 | MD5sum: 5184f579b2784a1cc7392d1c61b0e8c9 621 | SHA1: 0805d76e1dfd9a3279ce95da737d76e911c5b439 622 | SHA256: f981322182e6215c8a4ad3c372a830d868959246cc060b0be30e246f68e01589 623 | Multi-Arch: foreign 624 | 625 | Package: libsemanage1 626 | Architecture: armhf 627 | Version: 2.3-1build3 628 | Depends: libsemanage-common (= 2.3-1build3), libaudit1 (>= 1:2.2.1), libbz2-1.0, libc6 (>= 2.8), libselinux1 (>= 2.1.12), libsepol1 (>= 2.1.4), libustr-1.0-1 (>= 1.0.4) 629 | Filename: pool/main/libs/libsemanage/libsemanage1_2.3-1build3_armhf.deb 630 | MD5sum: d83268980c70431d963d5923252372e6 631 | SHA1: 68a0c4ae442653d473c3d82fdc9a60e40d6168d5 632 | SHA256: ce38b867a3be116c96b57a41fcd5835e071f6a7fc6669211c11132e781e2528a 633 | Multi-Arch: same 634 | 635 | Package: libsepol1 636 | Architecture: armhf 637 | Version: 2.4-2 638 | Depends: libc6 (>= 2.4) 639 | Filename: pool/main/libs/libsepol/libsepol1_2.4-2_armhf.deb 640 | MD5sum: c171f5fe59320ac0d2efad3c75d451e6 641 | SHA1: 0116416fcbcdde63d6854e61d40689ca92312f25 642 | SHA256: 3ade736c52d9d5bc983980da3f5349caeb18d05e115748523f38e769a4c584a3 643 | Multi-Arch: same 644 | 645 | Package: libsmartcols1 646 | Architecture: armhf 647 | Version: 2.27.1-6ubuntu3 648 | Depends: libc6 (>= 2.17) 649 | Filename: pool/main/u/util-linux/libsmartcols1_2.27.1-6ubuntu3_armhf.deb 650 | MD5sum: 99e37173351227e0d1a3a150722f6758 651 | SHA1: 5b3de9d1495204f206307f1377e8c6454013b3f6 652 | SHA256: d07c31f0e794cfe0d9532eb646be70a0877fdd3dd49c16990f97efd71d4330fe 653 | Multi-Arch: same 654 | 655 | Package: libss2 656 | Architecture: armhf 657 | Version: 1.42.13-1ubuntu1 658 | Replaces: e2fsprogs (<< 1.34-1) 659 | Depends: libcomerr2, libc6 (>= 2.17) 660 | Filename: pool/main/e/e2fsprogs/libss2_1.42.13-1ubuntu1_armhf.deb 661 | MD5sum: 0f7fdd31769807f4926c680dcaa965b3 662 | SHA1: 17cb534eea2a8fc5c22d517ddb19b46dad77629d 663 | SHA256: 75758701da75539452c2a7e3d638b8c617af07c24aced89eb0198a2efd22f884 664 | Multi-Arch: same 665 | 666 | Package: libsystemd0 667 | Architecture: armhf 668 | Version: 229-4ubuntu4 669 | Pre-Depends: libc6 (>= 2.17), libgcc1 (>= 1:3.5), libgcrypt20 (>= 1.6.1), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 1.32) 670 | Filename: pool/main/s/systemd/libsystemd0_229-4ubuntu4_armhf.deb 671 | MD5sum: 0d4ba2471b659a2eed583f6ae8bb0938 672 | SHA1: 117f509de35c1ebdf8f96e17aeb5fefb30e5706f 673 | SHA256: 73e57567674ec311cd02aa3157c4ba8f3f1e50deac28823ca998de7109ba4783 674 | Multi-Arch: same 675 | 676 | Package: libtinfo5 677 | Architecture: armhf 678 | Version: 6.0+20160213-1ubuntu1 679 | Replaces: libncurses5 (<< 5.9-3) 680 | Depends: libc6 (>= 2.16) 681 | Breaks: dialog (<< 1.2-20130523) 682 | Filename: pool/main/n/ncurses/libtinfo5_6.0+20160213-1ubuntu1_armhf.deb 683 | MD5sum: ba9824c61fc8077f79ce6a5d4abb69d2 684 | SHA1: be4270bece9240d45df8106d198b39c14e477f16 685 | SHA256: 20e8955ab06596f907c9343df1c4c3f77377962247c8184ce2c8f341b4fd87ae 686 | Multi-Arch: same 687 | 688 | Package: libudev1 689 | Architecture: armhf 690 | Version: 229-4ubuntu4 691 | Depends: libc6 (>= 2.16), libgcc1 (>= 1:3.5) 692 | Filename: pool/main/s/systemd/libudev1_229-4ubuntu4_armhf.deb 693 | MD5sum: fd536cd001b38c4de290c4db87856cd3 694 | SHA1: 52846970a7f742baec18a78f8e77a138d9d6b74d 695 | SHA256: 248c8240fd19b43502ba03dd26bf32180a5a2381bea732d9cc603e7e37c5fd0d 696 | Multi-Arch: same 697 | 698 | Package: libustr-1.0-1 699 | Architecture: armhf 700 | Version: 1.0.4-5 701 | Depends: libc6 (>= 2.4) 702 | Filename: pool/main/u/ustr/libustr-1.0-1_1.0.4-5_armhf.deb 703 | MD5sum: 3df545f6649932a48d2dbcdf6f1b66a7 704 | SHA1: bbbcb99d1d9600d675c282f26c57f12aedc91b3e 705 | SHA256: d282c5e8c302bd6f43b7e3f55f2b8580b66d15505aca7474c73f5b6deaf224e5 706 | Multi-Arch: same 707 | 708 | Package: libuuid1 709 | Architecture: armhf 710 | Version: 2.27.1-6ubuntu3 711 | Replaces: e2fsprogs (<< 1.34-1) 712 | Depends: passwd, libc6 (>= 2.4) 713 | Filename: pool/main/u/util-linux/libuuid1_2.27.1-6ubuntu3_armhf.deb 714 | MD5sum: c2aa3605b4af0dc50d19306bc5ef4f6a 715 | SHA1: 8830914577f889f1ac23b3c33e5229c10e6cf16f 716 | SHA256: 755712db15171fb8ad47c8892db6d89ee5a99398598c4c85ffa86403b8eee545 717 | Multi-Arch: same 718 | 719 | Package: locales 720 | Architecture: all 721 | Version: 2.23-0ubuntu3 722 | Replaces: libc-bin (<< 2.23), manpages-fr-extra (<< 20141022) 723 | Depends: libc-bin (>> 2.23), debconf (>= 0.5) | debconf-2.0 724 | Breaks: libc-bin (<< 2.23) 725 | Filename: pool/main/g/glibc/locales_2.23-0ubuntu3_all.deb 726 | MD5sum: 7aaa2a055a345ba0b65467a0dbda9bd1 727 | SHA1: eb334b58e4a9f957500fe4f76156899e1779c572 728 | SHA256: eafd6ddb293b315f53029d1d554e471f71db54de9ae7995b8de67fecd2b3834d 729 | 730 | Package: login 731 | Architecture: armhf 732 | Version: 1:4.2-3.1ubuntu5 733 | Replaces: manpages-de (<< 0.5-3), manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) 734 | Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.7), libpam0g (>= 0.99.7.1), libpam-runtime, libpam-modules (>= 1.1.8-1) 735 | Conflicts: amavisd-new (<< 2.3.3-8), backupninja (<< 0.9.3-5), echolot (<< 2.1.8-4), gnunet (<< 0.7.0c-2), python-4suite (<< 0.99cvs20060405-1) 736 | Filename: pool/main/s/shadow/login_4.2-3.1ubuntu5_armhf.deb 737 | MD5sum: c7c2c08d76a1c60e0790a670ba814a46 738 | SHA1: 8c0a676ae1b0e9a535847769d8194a65a8e29578 739 | SHA256: 3c8e801f47c01349f7e2a7e918578e5a0cdd94175c2ec3f196d18dca4bc32612 740 | 741 | Package: lsb-base 742 | Architecture: all 743 | Version: 9.20160110 744 | Replaces: upstart (<< 1.12.1-0ubuntu8) 745 | Breaks: upstart (<< 1.12.1-0ubuntu8) 746 | Filename: pool/main/l/lsb/lsb-base_9.20160110_all.deb 747 | MD5sum: f3dccb09af5b210210c87587df01b60e 748 | SHA1: 2f20dd95d2a64d031a1848eb4073fe9692361ac1 749 | SHA256: 7f3ada15a0793e254d670b8fa8afebd971aa417cd4ee3d895972a314a222551b 750 | Multi-Arch: foreign 751 | 752 | Package: makedev 753 | Architecture: all 754 | Version: 2.3.1-93ubuntu1 755 | Depends: base-passwd (>= 3.0.4) 756 | Conflicts: udev (<= 0.024-7) 757 | Filename: pool/main/m/makedev/makedev_2.3.1-93ubuntu1_all.deb 758 | MD5sum: 979d22fe4dece008741c019c2c4784ea 759 | SHA1: 1bd76ac552f7572b9ff945e17b06dcb8fc293172 760 | SHA256: b8120a3442ee14db32a4d33a2d0c370809bbf9ee6f2164dd08bc19feddec1293 761 | Multi-Arch: foreign 762 | 763 | Package: mawk 764 | Architecture: armhf 765 | Version: 1.3.3-17ubuntu2 766 | Provides: awk 767 | Pre-Depends: libc6 (>= 2.11) 768 | Filename: pool/main/m/mawk/mawk_1.3.3-17ubuntu2_armhf.deb 769 | MD5sum: 20a568d729aa92e3cd12c593b577de29 770 | SHA1: 91d82ed717bb6a4543bdac547357a3c5fa8e8c38 771 | SHA256: d0edba9f11c08e8fbc452052a7685a21879e5c62ca7841a645c9453c5b94dbb8 772 | Multi-Arch: foreign 773 | 774 | Package: mount 775 | Architecture: armhf 776 | Version: 2.27.1-6ubuntu3 777 | Pre-Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libmount1 (>= 2.25), libsmartcols1 (>= 2.27~rc1), libudev1 (>= 183) 778 | Filename: pool/main/u/util-linux/mount_2.27.1-6ubuntu3_armhf.deb 779 | MD5sum: fdfa0ab0f18cf3b7f31b88d6dc9db20d 780 | SHA1: e03489669d1ab668a9f43d55ea335bda5311a2d0 781 | SHA256: 1dd81d691ea2b355bc9e0d0ffa2171fafa9722adc41c610bcdfd77a7d5983b4e 782 | Multi-Arch: foreign 783 | 784 | Package: multiarch-support 785 | Architecture: armhf 786 | Version: 2.23-0ubuntu3 787 | Depends: libc6 (>= 2.13-5) 788 | Filename: pool/main/g/glibc/multiarch-support_2.23-0ubuntu3_armhf.deb 789 | MD5sum: 69b53934bcc5d5aa1e9334ab64ed944b 790 | SHA1: ec458955d632e973ad59bf1aa7f8e23f75f87666 791 | SHA256: 451d15f2009254f48d7a4f48c1d0ff6b86d5b6b5e20263115ccf84398793f179 792 | Multi-Arch: foreign 793 | 794 | Package: ncurses-base 795 | Architecture: all 796 | Version: 6.0+20160213-1ubuntu1 797 | Provides: ncurses-runtime 798 | Breaks: ncurses-term (<< 5.7+20100313-3) 799 | Filename: pool/main/n/ncurses/ncurses-base_6.0+20160213-1ubuntu1_all.deb 800 | MD5sum: 741fdd0a709bf75c99ca4388f9c2205c 801 | SHA1: 0334cd326e36ec372c8306cd9ed8685d619e189e 802 | SHA256: 7e391954e99353a2d2ac351bd8e1736dccaa39453c35fd6f9f1f2a3413b6c9b9 803 | Multi-Arch: foreign 804 | 805 | Package: ncurses-bin 806 | Architecture: armhf 807 | Version: 6.0+20160213-1ubuntu1 808 | Pre-Depends: libc6 (>= 2.4), libtinfo5 (>= 6.0+20151017), libtinfo5 (<< 6.1~) 809 | Filename: pool/main/n/ncurses/ncurses-bin_6.0+20160213-1ubuntu1_armhf.deb 810 | MD5sum: 07e4188e9e118333bfe178c678222819 811 | SHA1: 9eb29bd57453ab36fc95383fe4af9c6921aabedc 812 | SHA256: 25daba3ab3b9bdbc7cc3c06965d59e8cf8479bfedbe3cec0d9c4902abbea453d 813 | Multi-Arch: foreign 814 | 815 | Package: passwd 816 | Architecture: armhf 817 | Version: 1:4.2-3.1ubuntu5 818 | Replaces: manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) 819 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.8), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libsemanage1 (>= 2.0.3), lsb-base (>= 4.1+Debian11ubuntu7), libpam-modules, debianutils (>= 2.15.2) 820 | Filename: pool/main/s/shadow/passwd_4.2-3.1ubuntu5_armhf.deb 821 | MD5sum: 6e14eebdf71f0fd9ce95c6f49386c7e7 822 | SHA1: b60e8a96a1ef739ff7716166a1d28f7304329eaa 823 | SHA256: 8b2bc949e7cf00cf6f6fef9d21ca85ae13c1c0987086fd9134a16991bb0636a0 824 | Multi-Arch: foreign 825 | 826 | Package: perl-base 827 | Architecture: armhf 828 | Version: 5.22.1-9 829 | Replaces: libfile-path-perl (<< 2.09), libfile-temp-perl (<< 0.2304), libio-socket-ip-perl (<< 0.37), libscalar-list-utils-perl (<< 1:1.41), libsocket-perl (<< 2.018), libxsloader-perl (<< 0.20), perl (<< 5.10.1-12), perl-modules (<< 5.20.1-3) 830 | Provides: libfile-path-perl, libfile-temp-perl, libio-socket-ip-perl, libscalar-list-utils-perl, libsocket-perl, libxsloader-perl, perlapi-5.22.1 831 | Pre-Depends: libc6 (>= 2.11), dpkg (>= 1.17.17) 832 | Conflicts: defoma (<< 0.11.12), doc-base (<< 0.10.3), mono-gac (<< 2.10.8.1-3), safe-rm (<< 0.8), update-inetd (<< 4.41) 833 | Breaks: autoconf2.13 (<< 2.13-45), backuppc (<< 3.3.1-2), libalien-wxwidgets-perl (<< 0.65+dfsg-2), libanyevent-perl (<< 7.070-2), libcommon-sense-perl (<< 3.72-2~), libfile-path-perl (<< 2.09), libfile-spec-perl (<< 3.5600), libfile-temp-perl (<< 0.2304), libgtk2-perl-doc (<< 2:1.2491-4), libio-socket-ip-perl (<< 0.37), libjcode-perl (<< 2.13-3), libmarc-charset-perl (<< 1.2), libsbuild-perl (<< 0.67.0-1), libscalar-list-utils-perl (<< 1:1.41), libsocket-perl (<< 2.018), libxsloader-perl (<< 0.20), mailagent (<< 1:3.1-81-2), pdl (<< 1:2.007-4), perl (<< 5.22.1~), perl-modules (<< 5.22.1~) 834 | Filename: pool/main/p/perl/perl-base_5.22.1-9_armhf.deb 835 | MD5sum: a2d1f6fa052f374ce725917cf214589e 836 | SHA1: e005aeab1af68ce42758955847aa9a0c1047c4a4 837 | SHA256: 8e743b07716f7a642ad6041ec8c886336e574051f9bd0088b4386409076a1e36 838 | 839 | Package: procps 840 | Architecture: armhf 841 | Version: 2:3.3.10-4ubuntu2 842 | Provides: watch 843 | Depends: libc6 (>= 2.15), libncurses5 (>= 6), libncursesw5 (>= 6), libprocps4, libtinfo5 (>= 6), lsb-base (>= 4.1+Debian11ubuntu7), initscripts 844 | Conflicts: pgrep (<< 3.3-5), w-bassman (<< 1.0-3) 845 | Breaks: guymager (<= 0.5.9-1), open-vm-tools (<= 2011.12.20-562307-1), xmem (<= 1.20-27.1) 846 | Filename: pool/main/p/procps/procps_3.3.10-4ubuntu2_armhf.deb 847 | MD5sum: 945d4ec140eb38b07a635c9746804c8b 848 | SHA1: 8f4de77640182bb2242de0989fee143ee5eed7a4 849 | SHA256: 635ed1b2690fdcc7f5a85bc60046043a75be6ff58556976a3955b3a876e46107 850 | Multi-Arch: foreign 851 | 852 | Package: sed 853 | Architecture: armhf 854 | Version: 4.2.2-7 855 | Depends: dpkg (>= 1.15.4) | install-info 856 | Pre-Depends: libc6 (>= 2.7), libselinux1 (>= 1.32) 857 | Filename: pool/main/s/sed/sed_4.2.2-7_armhf.deb 858 | MD5sum: 1bc718c314e866e5b8b000d2aaaeca67 859 | SHA1: 34aa46163db72f8ffece8624e98fff9781118a00 860 | SHA256: a499eb716f118b9ad9c7289d6701724cafa878695f7af574eab8339cb6709a83 861 | Multi-Arch: foreign 862 | 863 | Package: sensible-utils 864 | Architecture: all 865 | Version: 0.0.9 866 | Replaces: debianutils (<= 2.32.3), manpages-pl (<= 20060617-3~) 867 | Filename: pool/main/s/sensible-utils/sensible-utils_0.0.9_all.deb 868 | MD5sum: 18f69bbed048d2d39f7a13c26a949ccf 869 | SHA1: d8383323633d56d6d25a058cb4711ab3057502e4 870 | SHA256: de75c4690051dfb43c8faa8f37afe276f78d41dc89d9258fa080e6a7a450c826 871 | Multi-Arch: foreign 872 | 873 | Package: systemd 874 | Architecture: armhf 875 | Version: 229-4ubuntu4 876 | Replaces: systemd-services, udev (<< 228-5) 877 | Provides: systemd-services 878 | Depends: libacl1 (>= 2.2.51-8), libapparmor1 (>= 2.9.0-3+exp2), libaudit1 (>= 1:2.2.1), libblkid1 (>= 2.19.1), libcap2 (>= 1:2.10), libcryptsetup4 (>= 2:1.4.3), libgpg-error0 (>= 1.14), libkmod2 (>= 5~), libmount1 (>= 2.26.2), libpam0g (>= 0.99.7.1), libseccomp2 (>= 2.1.0), libselinux1 (>= 2.1.9), libsystemd0 (= 229-4ubuntu4), util-linux (>= 2.27.1), mount (>= 2.26), adduser, libcap2-bin 879 | Pre-Depends: libc6 (>= 2.17), libgcc1 (>= 1:3.5), libgcrypt20 (>= 1.6.1), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 1.32) 880 | Conflicts: klogd, systemd-services 881 | Breaks: apparmor (<< 2.9.2-1), ifupdown (<< 0.8.5~), lsb-base (<< 4.1+Debian4), lvm2 (<< 2.02.104-1), systemd-shim (<< 8-2), udev (<< 228-5) 882 | Filename: pool/main/s/systemd/systemd_229-4ubuntu4_armhf.deb 883 | MD5sum: b64b6c152433934f5e7de6d725031740 884 | SHA1: f8163eeb62345bd51994f6f63a96e35d6d3efadc 885 | SHA256: cf886527389369ec1f4df0a1109a603461397478ac42e10f7c1ba184eda96e7e 886 | Multi-Arch: foreign 887 | 888 | Package: systemd-sysv 889 | Architecture: armhf 890 | Version: 229-4ubuntu4 891 | Replaces: sysvinit (<< 2.88dsf-44~), sysvinit-core, upstart (<< 1.13.2-0ubuntu10~), upstart-sysv 892 | Pre-Depends: systemd 893 | Conflicts: file-rc, openrc, sysvinit-core, upstart (<< 1.13.2-0ubuntu10~), upstart-sysv 894 | Filename: pool/main/s/systemd/systemd-sysv_229-4ubuntu4_armhf.deb 895 | MD5sum: e48b9f7bd3c728cca39f7f4c147aa9e7 896 | SHA1: 0a684e5053cd3875fd263e403bb3f46648f6352e 897 | SHA256: 0738b2f24a91db4eba67280f99daf11b8ce2e76475592296902d46e79de84af8 898 | Multi-Arch: foreign 899 | 900 | Package: sysv-rc 901 | Architecture: all 902 | Version: 2.88dsf-59.3ubuntu2 903 | Depends: debconf (>= 0.5) | debconf-2.0, sysvinit-utils (>= 2.86.ds1-62), insserv (>> 1.12.0-10) 904 | Pre-Depends: init-system-helpers (>= 1.25~) 905 | Breaks: initscripts (<< 2.86.ds1-63), systemd (<< 215) 906 | Filename: pool/main/s/sysvinit/sysv-rc_2.88dsf-59.3ubuntu2_all.deb 907 | MD5sum: 21684a8162a0dc9279456e061434c6d7 908 | SHA1: e7e80167f6b23a7d9ea1b4d37683f339052f688d 909 | SHA256: e77cbe5bb5dfec2ac1c214fc2fd8cce6d30d50fc3302ce69773c46c5d9e43997 910 | Multi-Arch: foreign 911 | 912 | Package: sysvinit-utils 913 | Architecture: armhf 914 | Version: 2.88dsf-59.3ubuntu2 915 | Replaces: last, sysvinit (<= 2.86.ds1-65) 916 | Depends: libc6 (>= 2.4), init-system-helpers (>= 1.25~) 917 | Conflicts: chkconfig (<< 11.0-79.1-2), last, startpar (<< 0.58-2), sysvconfig 918 | Breaks: systemd (<< 215), upstart (<< 1.5-0ubuntu5), util-linux (<< 2.26.2-3) 919 | Filename: pool/main/s/sysvinit/sysvinit-utils_2.88dsf-59.3ubuntu2_armhf.deb 920 | MD5sum: 1f051ecf95a9426e286bba8d26e8ec7c 921 | SHA1: cecdb39cea4d4e092db25b0f3bf4978752f1cd09 922 | SHA256: 93dc858ddbe1712de6e946f16664cf7cd5f80a17806093e1c7ebb2caee8ec978 923 | Multi-Arch: foreign 924 | 925 | Package: tar 926 | Architecture: armhf 927 | Version: 1.28-2.1 928 | Replaces: cpio (<< 2.4.2-39) 929 | Pre-Depends: libacl1 (>= 2.2.51-8), libc6 (>= 2.17), libselinux1 (>= 1.32) 930 | Conflicts: cpio (<= 2.4.2-38) 931 | Breaks: dpkg-dev (<< 1.14.26) 932 | Filename: pool/main/t/tar/tar_1.28-2.1_armhf.deb 933 | MD5sum: 0b6843f4e1c8bb3d13156e7a64c503f6 934 | SHA1: f1166cf04327256e30043b8f472c6e311bc72fca 935 | SHA256: a5ff2d27f2562e51d043b1b01d91915e350f94cb62bad2faaad3c4d4bfbc3c95 936 | Multi-Arch: foreign 937 | 938 | Package: tzdata 939 | Architecture: all 940 | Version: 2016d-0ubuntu0.16.04 941 | Replaces: libc0.1, libc0.3, libc6, libc6.1 942 | Provides: tzdata-stretch 943 | Depends: debconf (>= 0.5) | debconf-2.0 944 | Filename: pool/main/t/tzdata/tzdata_2016d-0ubuntu0.16.04_all.deb 945 | MD5sum: 9cb16825b48431444a3f8e4416261ba5 946 | SHA1: 8ed97e25a0a5f53941be0059f6ee014bb28e4e32 947 | SHA256: 93379d5a0b92f89b7c806f81f73ff6cfe9cfb6b6eb45294732d6fe8a4799dca8 948 | Multi-Arch: foreign 949 | 950 | Package: util-linux 951 | Architecture: armhf 952 | Version: 2.27.1-6ubuntu3 953 | Replaces: bash-completion (<< 1:2.1-4.1~), initscripts (<< 2.88dsf-59.2~), mount (= 2.26.2-3), mount (= 2.26.2-3ubuntu1), sysvinit-utils (<< 2.88dsf-59.1~) 954 | Depends: lsb-base (>= 4.1+Debian11ubuntu7), sysvinit-utils (>= 2.88dsf-59.1~) 955 | Pre-Depends: libblkid1 (>= 2.25), libc6 (>= 2.15), libfdisk1 (>= 2.27~rc1), libmount1 (>= 2.25), libncursesw5 (>= 6), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libsmartcols1 (>= 2.27~rc1), libsystemd0, libtinfo5 (>= 6), libudev1 (>= 183), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4) 956 | Breaks: bash-completion (<< 1:2.1-4.1~), cloud-guest-utils (<< 0.27-0ubuntu16), grml-debootstrap (<< 0.68), mac-fdisk (<< 0.1-16ubuntu3), mount (= 2.26.2-3), mount (= 2.26.2-3ubuntu1), pmac-fdisk (<< 0.1-16ubuntu3) 957 | Filename: pool/main/u/util-linux/util-linux_2.27.1-6ubuntu3_armhf.deb 958 | MD5sum: 34e38db91779bc1cba4d981495c8c66f 959 | SHA1: 72728d75988ac31a45ad6b740401b7d5b8056db9 960 | SHA256: 60d2d18f13c8bc9913df85205c01a47ea79a034e52766dc7e1764cbc0143adf1 961 | Multi-Arch: foreign 962 | 963 | Package: zlib1g 964 | Architecture: armhf 965 | Version: 1:1.2.8.dfsg-2ubuntu4 966 | Provides: libz1 967 | Depends: libc6 (>= 2.4) 968 | Conflicts: zlib1 (<= 1:1.0.4-7) 969 | Breaks: libxml2 (<< 2.7.6.dfsg-2), texlive-binaries (<< 2009-12) 970 | Filename: pool/main/z/zlib/zlib1g_1.2.8.dfsg-2ubuntu4_armhf.deb 971 | MD5sum: 5d2bcb07a0adaac8a52d2a79296256eb 972 | SHA1: e1dd3dc7adaa13ce51131cb71f079971de0a3d21 973 | SHA256: 98f23ecbd414a2a513f8ca479d92b541dd3dddb14b40307ff2cc40a6c55ac565 974 | Multi-Arch: same 975 | 976 | -------------------------------------------------------------------------------- /examples/multistrap/multistrap.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | """ 4 | Configure script to build images from multistrap configs. This supports an 5 | ill-defined subset of multistrap configuration files. Multiple multistrap 6 | configuration files can be provided at one time and an image will be built for 7 | each. 8 | 9 | Usage: 10 | 11 | ./multistrap.py --ostree-repo=repo multistrap.conf 12 | 13 | # Create the packages lockfiles: 14 | ninja update-apt-lockfiles 15 | 16 | # There will now be a file called multistrap.conf.lock which you can check 17 | # into your source control system 18 | 19 | # Build the image(s) 20 | ninja 21 | 22 | # Inspect the built image: 23 | ostree --repo=repo ls -R refs/deb/images/multistrap.conf/configured 24 | """ 25 | 26 | import argparse 27 | import os 28 | import sys 29 | 30 | sys.path.append(os.path.dirname(__file__) + '/../..') 31 | from apt2ostree import Apt, Ninja 32 | from apt2ostree.multistrap import multistrap 33 | 34 | 35 | def main(argv): 36 | parser = argparse.ArgumentParser() 37 | parser.add_argument("--ostree-repo", default="_build/ostree") 38 | parser.add_argument("-o", "--output", default="build.ninja") 39 | parser.add_argument( 40 | "config_file", nargs="+", help="multistrap config files") 41 | args = parser.parse_args(argv[1:]) 42 | 43 | with Ninja(argv, ninjafile=args.output) as ninja: 44 | ninja.add_generator_dep(__file__) 45 | 46 | ninja.variable("ostree_repo", os.path.relpath(args.ostree_repo)) 47 | 48 | apt = Apt(ninja) 49 | for cfg in args.config_file: 50 | image = multistrap(cfg, ninja, apt) 51 | ninja.default(image.filename) 52 | 53 | apt.write_phony_rules() 54 | 55 | # We write a gitignore file so we can use git-clean to remove build 56 | # artifacts that we no-longer produce: 57 | ninja.write_gitignore() 58 | 59 | 60 | if __name__ == '__main__': 61 | sys.exit(main(sys.argv)) 62 | -------------------------------------------------------------------------------- /examples/nginx/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | build.ninja 3 | 4 | -------------------------------------------------------------------------------- /examples/nginx/Packages.lock: -------------------------------------------------------------------------------- 1 | Package: adduser 2 | Architecture: all 3 | Version: 3.113+nmu3ubuntu4 4 | Replaces: manpages-it (<< 0.3.4-2), manpages-pl (<= 20051117-1) 5 | Depends: perl-base (>= 5.6.0), passwd (>= 1:4.1.5.1-1.1ubuntu6), debconf | debconf-2.0 6 | Filename: pool/main/a/adduser/adduser_3.113+nmu3ubuntu4_all.deb 7 | MD5sum: 36f79d952ced9bde3359b63cf9cf44fb 8 | SHA1: 6a5b8f58e33d5c9a25f79c6da80a64bf104e6268 9 | SHA256: ca6c86cb229082cc22874ed320eac8d128cc91f086fe5687946e7d05758516a3 10 | Multi-Arch: foreign 11 | 12 | Package: base-files 13 | Architecture: amd64 14 | Version: 9.4ubuntu4.11 15 | Replaces: base, dpkg (<= 1.15.0), miscutils 16 | Provides: base 17 | Pre-Depends: awk 18 | Breaks: initscripts (<< 2.88dsf-13.3), sendfile (<< 2.1b.20080616-5.2~) 19 | Filename: pool/main/b/base-files/base-files_9.4ubuntu4.11_amd64.deb 20 | MD5sum: 540b44c59b0fb443d62040f04fc11120 21 | SHA1: 0da64b2a4bce8b6256044f95190b2f50c043a776 22 | SHA256: 464ce0515a6bd99ff3b862c5a772e51d912863db854bad074bd479815c9b50f8 23 | Multi-Arch: foreign 24 | 25 | Package: base-passwd 26 | Architecture: amd64 27 | Version: 3.5.39 28 | Replaces: base 29 | Depends: libc6 (>= 2.8), libdebconfclient0 (>= 0.145) 30 | Filename: pool/main/b/base-passwd/base-passwd_3.5.39_amd64.deb 31 | MD5sum: ae5a08c3fc5e711bab0b6689cdb02cc2 32 | SHA1: 162bc2b7bd85f287d2bbaa9cdab8cbdc5cfe6c12 33 | SHA256: fcc13a5bc7476a3a458b9ff989838e04cd4405259d313669707b245322b45788 34 | Multi-Arch: foreign 35 | 36 | Package: bash 37 | Architecture: amd64 38 | Version: 4.3-14ubuntu1.4 39 | Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1) 40 | Depends: base-files (>= 2.1.12), debianutils (>= 2.15) 41 | Pre-Depends: dash (>= 0.5.5.1-2.2), libc6 (>= 2.15), libtinfo5 (>= 6) 42 | Conflicts: bash-completion (<< 20060301-0) 43 | Filename: pool/main/b/bash/bash_4.3-14ubuntu1.4_amd64.deb 44 | MD5sum: 732883a110a54b7ce5031f6ed7d428de 45 | SHA1: 307876fdbb317bf2dcd5b5dcf1d728722c75df5e 46 | SHA256: 6363ce9c44ab17388257754c41f2bd0d23f6419838b7ed7766b135f8ecbbf48b 47 | Multi-Arch: foreign 48 | 49 | Package: bsdutils 50 | Architecture: amd64 51 | Version: 1:2.27.1-6ubuntu3.10 52 | Replaces: bash-completion (<< 1:2.1-4.1~) 53 | Pre-Depends: libc6 (>= 2.16), libsystemd0 54 | Breaks: bash-completion (<< 1:2.1-4.1~) 55 | Filename: pool/main/u/util-linux/bsdutils_2.27.1-6ubuntu3.10_amd64.deb 56 | MD5sum: 2337f46a0a2a4c666583eb1e8adb629d 57 | SHA1: b882c4ec4ab9f70d0ff82e94f065e9311c904eda 58 | SHA256: 3334096c1367f2b78da559e6d2c983a9d2f5061b837d3f9ce0058a54b2df1149 59 | Multi-Arch: foreign 60 | 61 | Package: coreutils 62 | Architecture: amd64 63 | Version: 8.25-2ubuntu3~16.04 64 | Replaces: mktemp, realpath, timeout 65 | Pre-Depends: libacl1 (>= 2.2.51-8), libattr1 (>= 1:2.4.46-8), libc6 (>= 2.17), libselinux1 (>= 2.1.13) 66 | Conflicts: timeout 67 | Filename: pool/main/c/coreutils/coreutils_8.25-2ubuntu3~16.04_amd64.deb 68 | MD5sum: e9b0e774d272e4468f4606f379dde88a 69 | SHA1: cb735c4d8734c2fded42c7a9ec14bcd5eaa2f73a 70 | SHA256: 056b90da514d6ef207199d9c446201f9214ce5af0a2cc8db2d617587250980c9 71 | Multi-Arch: foreign 72 | 73 | Package: dash 74 | Architecture: amd64 75 | Version: 0.5.8-2.1ubuntu2 76 | Depends: debianutils (>= 2.15), dpkg (>= 1.15.0) 77 | Pre-Depends: libc6 (>= 2.14) 78 | Filename: pool/main/d/dash/dash_0.5.8-2.1ubuntu2_amd64.deb 79 | MD5sum: ab5d5cffd458264a823168df73a9cf25 80 | SHA1: 0db9abe56aefd5f92a25994c4cc33ce5b1424c84 81 | SHA256: c46b4b8c9c952bfeab03993451f7c3c7f5d359ebfbf381e6c36e2870373cde85 82 | 83 | Package: debconf 84 | Architecture: all 85 | Version: 1.5.58ubuntu2 86 | Replaces: debconf-tiny 87 | Provides: debconf-2.0 88 | Pre-Depends: perl-base (>= 5.6.1-4) 89 | Conflicts: apt (<< 0.3.12.1), cdebconf (<< 0.96), debconf-tiny, debconf-utils (<< 1.3.22), dialog (<< 0.9b-20020814-1), menu (<= 2.1.3-1), whiptail (<< 0.51.4-11), whiptail-utf8 (<= 0.50.17-13) 90 | Filename: pool/main/d/debconf/debconf_1.5.58ubuntu2_all.deb 91 | MD5sum: 61f10de6aaf8c3465a18babc7ccd7266 92 | SHA1: 317d621d97899fc7eadc22d237074f91fd847cf4 93 | SHA256: 29302bef7aba8076993f75baaded85001b0f9c7586e2357af837b50494f3e606 94 | Multi-Arch: foreign 95 | 96 | Package: debianutils 97 | Architecture: amd64 98 | Version: 4.7 99 | Replaces: manpages-pl (<< 1:0.5) 100 | Depends: sensible-utils 101 | Pre-Depends: libc6 (>= 2.15) 102 | Filename: pool/main/d/debianutils/debianutils_4.7_amd64.deb 103 | MD5sum: 3e6edbae0f11150b1cf061234c972c04 104 | SHA1: def7253373af1617bc3f08e56007d63db5e18fbb 105 | SHA256: 827d56710cd5259395d9e5c30a5e0fddd831172a76b7f9c4847fc5461c79154f 106 | Multi-Arch: foreign 107 | 108 | Package: diffutils 109 | Architecture: amd64 110 | Version: 1:3.3-3 111 | Replaces: diff 112 | Pre-Depends: libc6 (>= 2.17) 113 | Filename: pool/main/d/diffutils/diffutils_3.3-3_amd64.deb 114 | MD5sum: c4444a31300ce0d1bbd4a3ef50316d54 115 | SHA1: 707084d876a277ab7a60e7e0eb3eb9d840ee173a 116 | SHA256: 516031eed9f074d1307743321abe5e5be726f43e180c71f761927cd2ed8d8a5b 117 | 118 | Package: dpkg 119 | Architecture: amd64 120 | Version: 1.18.4ubuntu1.6 121 | Replaces: manpages-it (<< 2.80-4) 122 | Pre-Depends: libbz2-1.0, libc6 (>= 2.14), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 2.3), zlib1g (>= 1:1.1.4), tar (>= 1.23) 123 | Conflicts: ada-reference-manual (<< 20021112web-4~), asn1-mode (<< 2.7-7~), bogosort (<< 0.4.2-3~), cl-yacc (<< 0.3-3~), cpp-4.1-doc (<< 4.1.2.nf2-4~), cpp-4.2-doc (<< 4.2.4.nf1-4~), gcc-4.1-doc (<< 4.1.2.nf2-4~), gcc-4.2-doc (<< 4.2.4.nf1-4~), gcj-4.1-doc (<< 4.1.2.nf2-4~), gcj-4.2-doc (<< 4.2.4.nf1-4~), gfortran-4.1-doc (<< 4.1.2.nf2-4~), gfortran-4.2-doc (<< 4.2.4.nf1-4~), ggz-docs (<< 0.0.14.1-2~), glame (<< 2.0.1-6~), gnat-4.1-doc (<< 4.1.2.nf2-4~), gnat-4.2-doc (<< 4.2.4.nf1-4~), gtalk (<< 0.99.10-16~), libalogg-dev (<< 1.3.7-2~), libgtk1.2-doc (<< 1.2.10-19~), libnettle-dev (<< 2~), liborbit-dev (<< 0.5.17-12~), libreadline5-dev (<< 5.2-8~), librep-doc (<< 0.90~), mmucl (<< 1.5.2-3~), nxml-mode (<< 20041004-9~), octave3.0-info (<< 1:3.0.5-7+rm), octave3.2-info (<< 3.2.4-12+rm), polgen-doc (<< 1.3-3+rm), r6rs-doc (<< 1.0-2~), serveez-doc (<< 0.1.5-3~), slat (<< 2.0-6~), texlive-base-bin-doc (<< 2007.dfsg.2-9~), ttcn-el (<< 0.6.9-2~), ulog-acctd (<< 0.4.3-3~), xconq-doc (<< 7.4.1-5~), zenirc (<< 2.112.dfsg-1~) 124 | Breaks: apt (<< 0.7.7~), apt-cudf (<< 3.3~beta1-3~), aptitude (<< 0.4.7-1~), auctex (<< 11.87-3+deb8u1~), ccache (<< 3.1.10-1~), cups (<< 1.7.5-10~), dbus (<< 1.8.12-1ubuntu6~), debian-security-support (<< 2014.10.26~), distcc (<< 3.1-6.1~), doc-base (<< 0.10.5~), dpkg-dev (<< 1.15.8), fontconfig (<< 2.11.1-0ubuntu5~), fusionforge-plugin-mediawiki (<< 5.3.2+20141104-3~), gap-core (<< 4r7p5-2~), gitweb (<< 1:2.1.4-2.1~), grace (<< 1:5.1.24-3~), gxine (<< 0.5.908-3.1~), hoogle (<< 4.2.33-4~), icecc (<< 1.0.1-2~), install-info (<< 5.1.dfsg.1-3~), libapache2-mod-php5 (<< 5.6.4+dfsg-3~), libapache2-mod-php5filter (<< 5.6.4+dfsg-3~), libdpkg-perl (<< 1.15.8), libjs-protoaculous (<< 5~), man-db (<< 2.6.3-6~), mcollective (<< 2.6.0+dfsg-2.1~), php5-fpm (<< 5.6.4+dfsg-3~), pypy (<< 2.4.0+dfsg-3~), readahead-fedora (<< 2:1.5.6-5.2~), software-center (<< 13.10-0ubuntu9~), ufw (<< 0.35-0ubuntu2~), ureadahead (<< 0.100.0-17~), wordpress (<< 4.1+dfsg-1~), xfonts-traditional (<< 1.7~), xine-ui (<< 0.99.9-1.2~) 125 | Filename: pool/main/d/dpkg/dpkg_1.18.4ubuntu1.6_amd64.deb 126 | MD5sum: 22fe9e456e052b4a40104e6f5babb8c2 127 | SHA1: 204abe27ba385d46cbeb79a0c9cccba7ad0871f1 128 | SHA256: 64e1864e2ed3f201c65564f733e9659608a84da563f9694ee85493c7181c5096 129 | Multi-Arch: foreign 130 | 131 | Package: e2fslibs 132 | Architecture: amd64 133 | Version: 1.42.13-1ubuntu1.2 134 | Replaces: e2fsprogs (<< 1.34-1) 135 | Provides: libe2p2, libext2fs2 136 | Depends: libc6 (>= 2.17) 137 | Filename: pool/main/e/e2fsprogs/e2fslibs_1.42.13-1ubuntu1.2_amd64.deb 138 | MD5sum: 1f121dc7889aa0abc291a55b167aac6f 139 | SHA1: 46f6146725f71f05b53d1ac08be6010fe8fe9e46 140 | SHA256: 5093e67f6c979813353afb2cbf1b5536f172d371d709a6510655bebbb63405d2 141 | Multi-Arch: same 142 | 143 | Package: e2fsprogs 144 | Architecture: amd64 145 | Version: 1.42.13-1ubuntu1.2 146 | Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) 147 | Pre-Depends: e2fslibs (= 1.42.13-1ubuntu1.2), libblkid1 (>= 2.17.2), libc6 (>= 2.14), libcomerr2 (>= 1.42~WIP-2011-10-05-1), libss2 (>= 1.34-1), libuuid1 (>= 2.16), util-linux (>= 2.15~rc1-1) 148 | Conflicts: dump (<< 0.4b4-4), initscripts (<< 2.85-4), quota (<< 1.55-8.1), sysvinit (<< 2.85-4) 149 | Filename: pool/main/e/e2fsprogs/e2fsprogs_1.42.13-1ubuntu1.2_amd64.deb 150 | MD5sum: 3dc11d261efe3c140d8b6b309354c9d0 151 | SHA1: ac213caecc807a506376ce5198958a888e0d2360 152 | SHA256: 71f3a255e8e4a932f471c416ae87cdc6325cc52aad1f7832378978262bcc7f9e 153 | Multi-Arch: foreign 154 | 155 | Package: findutils 156 | Architecture: amd64 157 | Version: 4.6.0+git+20160126-2 158 | Pre-Depends: libc6 (>= 2.17), libselinux1 (>= 1.32) 159 | Conflicts: debconf (<< 1.5.50) 160 | Breaks: binstats (<< 1.08-8.1), debhelper (<< 9.20130504), guilt (<< 0.36-0.2), kernel-package (<< 13.000), libpython3.4-minimal (<< 3.4.4-2), libpython3.5-minimal (<< 3.5.1-3), lsat (<< 0.9.7.1-2.1), mc (<< 3:4.8.11-1), sendmail (<< 8.14.4-5), switchconf (<< 0.0.9-2.1) 161 | Filename: pool/main/f/findutils/findutils_4.6.0+git+20160126-2_amd64.deb 162 | MD5sum: 1831065c484b6413ba65b08bc427d9cc 163 | SHA1: a94bc6acde7319023a23426c9b376cd88e901678 164 | SHA256: c7de902635759c740db8b74aa102a04373c0c2c2a86d3636eab7e27af1f45ac6 165 | Multi-Arch: foreign 166 | 167 | Package: fontconfig-config 168 | Architecture: all 169 | Version: 2.11.94-0ubuntu1.1 170 | Replaces: fontconfig (<< 2.3.2-2) 171 | Depends: fonts-dejavu-core | ttf-bitstream-vera | fonts-freefont-ttf | gsfonts-x11, ucf (>= 0.29) 172 | Conflicts: fontconfig (<< 2.3.2-2) 173 | Filename: pool/main/f/fontconfig/fontconfig-config_2.11.94-0ubuntu1.1_all.deb 174 | MD5sum: d8ee5cb98a73e9fd84f0c21b7f00728f 175 | SHA1: 8ce5a5bd6a9ecfafd2da833c26b4d78026b3cfab 176 | SHA256: 57cad57c49f62ecad1cf7086b8d8646430db5f2a6892885595517aa9a7a70e09 177 | Multi-Arch: foreign 178 | 179 | Package: fonts-dejavu-core 180 | Architecture: all 181 | Version: 2.35-1 182 | Replaces: ttf-dejavu (<< 2.20-1), ttf-dejavu-core (<< 2.33+svn2514-2~) 183 | Breaks: ttf-dejavu (<< 2.20-1), ttf-dejavu-core (<< 2.33+svn2514-2~) 184 | Filename: pool/main/f/fonts-dejavu/fonts-dejavu-core_2.35-1_all.deb 185 | MD5sum: d3c6235a85d2646078f1b82ab257ef33 186 | SHA1: b4df3aa4e4a889fda19490a91bd2cb378c09aa00 187 | SHA256: 51450ce72919a974e8d1853c0215a319a398aab78306711b67c84312be77703f 188 | Multi-Arch: foreign 189 | 190 | Package: gcc-5-base 191 | Architecture: amd64 192 | Version: 5.4.0-6ubuntu1~16.04.12 193 | Breaks: gcc-4.4-base (<< 4.4.7), gcc-4.7-base (<< 4.7.3), gcj-4.4-base (<< 4.4.6-9~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.4-base (<< 4.4.6-3~), gnat-4.6 (<< 4.6.1-5~) 194 | Filename: pool/main/g/gcc-5/gcc-5-base_5.4.0-6ubuntu1~16.04.12_amd64.deb 195 | MD5sum: f0c536ac2c6413c7d9a246da3c4ddb5d 196 | SHA1: 0b1636dca0166c0ea31d29cbe018ad21e8e637ed 197 | SHA256: 663092c31e0dc2aaef35de11b5066f35fcff412efb9e3e2008427222682fd449 198 | Multi-Arch: same 199 | 200 | Package: gcc-6-base 201 | Architecture: amd64 202 | Version: 6.0.1-0ubuntu1 203 | Breaks: gcc-4.4-base (<< 4.4.7), gcc-4.7-base (<< 4.7.3), gcj-4.4-base (<< 4.4.6-9~), gcj-4.6-base (<< 4.6.1-4~), gnat-4.4-base (<< 4.4.6-3~), gnat-4.6 (<< 4.6.1-5~) 204 | Filename: pool/main/g/gccgo-6/gcc-6-base_6.0.1-0ubuntu1_amd64.deb 205 | MD5sum: 0e19f9a506207825f1b7bc20764e3d81 206 | SHA1: e2e0e09bb59b6846700064bdaeb9c14d90744e84 207 | SHA256: 450f0d5f2a2e7932e21c7abe66c494a8cbb5364680160b10a488f65ee4b0bd03 208 | Multi-Arch: same 209 | 210 | Package: grep 211 | Architecture: amd64 212 | Version: 2.25-1~16.04.1 213 | Provides: rgrep 214 | Depends: dpkg (>= 1.15.4) | install-info 215 | Pre-Depends: libc6 (>= 2.14), libpcre3 216 | Conflicts: rgrep 217 | Filename: pool/main/g/grep/grep_2.25-1~16.04.1_amd64.deb 218 | MD5sum: 14734973565c150a1a4bf58803399055 219 | SHA1: 1ff43c906bc69ff5cb3fb1c27f46d17d7366ac9b 220 | SHA256: b29bf212703582c2e6c49448577483bbb45845b06ed0f41c44d8041017ac03d0 221 | Multi-Arch: foreign 222 | 223 | Package: gzip 224 | Architecture: amd64 225 | Version: 1.6-4ubuntu1 226 | Depends: dpkg (>= 1.15.4) | install-info 227 | Pre-Depends: libc6 (>= 2.17) 228 | Filename: pool/main/g/gzip/gzip_1.6-4ubuntu1_amd64.deb 229 | MD5sum: f2a74190b327fe4c08a5f4aa6cda619a 230 | SHA1: dbea19e85c973fb71473265407b11a7d2c3138a9 231 | SHA256: 602ccc16cef9dfca72f5ff310e7364781bef338fb83e5ab7546ae66d5d0c2a37 232 | 233 | Package: hostname 234 | Architecture: amd64 235 | Version: 3.16ubuntu2 236 | Replaces: nis (<< 3.17-30) 237 | Pre-Depends: libc6 (>= 2.4), lsb-base (>= 4.1+Debian11ubuntu7) 238 | Breaks: nis (<< 3.17-30) 239 | Filename: pool/main/h/hostname/hostname_3.16ubuntu2_amd64.deb 240 | MD5sum: 2665061ae6994785781cdd97bdc39082 241 | SHA1: 5a63028ef09fc0e8056fbdac7b6d2f1f47f327ef 242 | SHA256: 78ffb1d52ec35aafb91eefa09ddd4b66a264c114697b71ddb4867bc86dfe39c3 243 | 244 | Package: init 245 | Architecture: amd64 246 | Version: 1.29ubuntu4 247 | Depends: init-system-helpers 248 | Pre-Depends: systemd-sysv | upstart-sysv 249 | Filename: pool/main/i/init-system-helpers/init_1.29ubuntu4_amd64.deb 250 | MD5sum: 8d3d89c4cf7ae5be6a091614c0e3344b 251 | SHA1: 55544ecb21214f9c490f5a11d45594296fdb498d 252 | SHA256: 806b173a1a78040f406ce84b13dbd9edcb0ac5d08f58ad10e104685ed2c18b19 253 | Multi-Arch: foreign 254 | 255 | Package: init-system-helpers 256 | Architecture: all 257 | Version: 1.29ubuntu4 258 | Replaces: sysv-rc (<< 2.88dsf-59.3~), sysvinit-utils (<< 2.88dsf-59.3) 259 | Depends: perl-base (>= 5.20.1-3) 260 | Conflicts: file-rc (<< 0.8.17~), openrc (<= 0.18.3-1) 261 | Breaks: systemd (<< 44-12), sysvinit-utils (<< 2.88dsf-59.3~) 262 | Filename: pool/main/i/init-system-helpers/init-system-helpers_1.29ubuntu4_all.deb 263 | MD5sum: e2e41ef69b3b9758bdbd801634d4ed0c 264 | SHA1: 3733903966e354bdd0fba7b0da5108487500f208 265 | SHA256: e7d3fd50644ce39aa67ca512d03e2b14e070deac1bca5be52b689cb95e613305 266 | Multi-Arch: foreign 267 | 268 | Package: initscripts 269 | Architecture: amd64 270 | Version: 2.88dsf-59.3ubuntu2 271 | Replaces: libc0.1, libc0.3, libc6, libc6.1 272 | Depends: mount (>= 2.11x-1), debianutils (>= 4), lsb-base (>= 3.2-14), sysvinit-utils (>= 2.88dsf-50), sysv-rc | file-rc, coreutils (>= 5.93) 273 | Conflicts: libdevmapper1.02.1 (<< 2:1.02.24-1) 274 | Breaks: aide (<< 0.15.1-5), atm-tools (<< 1:2.5.1-1.3), autofs (<< 5.0.0), bootchart (<< 0.10~svn407-4), console-common (<< 0.7.86), console-setup (<< 1.74), cruft (<< 0.9.16), eepc-acpi-scripts (<< 1.1.12), fcheck (<< 2.7.59-16), hostapd (<< 1:0.7.3-3), hurd (<< 0.5.git20131101~), ifupdown (<< 0.7.46), libpam-mount (<< 2.13-1), live-build (<< 3.0~a26-1), ltsp-client-core (<< 5.2.16-1), mdadm (<< 3.2.2-1), nbd-client (<< 1:2.9.23-1), nfs-common (<< 1:1.2.5-3), portmap (<< 6.0.0-2), readahead-fedora (<< 2:1.5.6-3), resolvconf (<< 1.49), rpcbind (<< 0.2.0-7), rsyslog (<< 5.8.2-2), selinux-policy-default (<= 2:0.2.20100524-9), splashy (<< 0.3.13-5.1+b1), sysklogd (<< 1.5-6.2), systemd (<< 228-5ubuntu3), util-linux (<< 2.26.2-4~), wpasupplicant (<< 0.7.3-4), xymon (<< 4.3.0~beta2.dfsg-9) 275 | Filename: pool/main/s/sysvinit/initscripts_2.88dsf-59.3ubuntu2_amd64.deb 276 | MD5sum: 74b2006c75a68ebd1b54024d1499a4c1 277 | SHA1: cf96ad2fcf7bad872c77f22853b48d83f16a33d9 278 | SHA256: 3694172f6c989fccfebe073630c3e24e0a803d4490ad1e122b84301e5985c0cc 279 | Multi-Arch: foreign 280 | 281 | Package: insserv 282 | Architecture: amd64 283 | Version: 1.14.0-5ubuntu3 284 | Depends: libc6 (>= 2.14) 285 | Breaks: sysv-rc (<< 2.87dsf-3) 286 | Filename: pool/main/i/insserv/insserv_1.14.0-5ubuntu3_amd64.deb 287 | MD5sum: a1d516b4884a60a82501b3135d0bbc8a 288 | SHA1: e907f0e9290da763be3dd8b13849f4925fdc9915 289 | SHA256: 858b6e39f00226f83447d0c9a73607072a70987a2fb0ce004a5908e9c12660f0 290 | 291 | Package: libacl1 292 | Architecture: amd64 293 | Version: 2.2.52-3 294 | Depends: libattr1 (>= 1:2.4.46-8), libc6 (>= 2.14) 295 | Conflicts: acl (<< 2.0.0), libacl1-kerberos4kth 296 | Filename: pool/main/a/acl/libacl1_2.2.52-3_amd64.deb 297 | MD5sum: be8e11292b60577362493d9c4d0ff251 298 | SHA1: 851f6817bbbae40c9a8f41ca3dc3e8d365f66ea5 299 | SHA256: a6f4378176071b6d9f2b6f0402edf8ef6cd2cc53ad4052089642aad358fe55a6 300 | Multi-Arch: same 301 | 302 | Package: libapparmor1 303 | Architecture: amd64 304 | Version: 2.10.95-0ubuntu2.11 305 | Depends: libc6 (>= 2.17) 306 | Filename: pool/main/a/apparmor/libapparmor1_2.10.95-0ubuntu2.11_amd64.deb 307 | MD5sum: 812d4ab6f76fb24839c384df8001b9c9 308 | SHA1: ed67538b3d7dd27b8baef8a67a272a3e8a3695df 309 | SHA256: 1b433c482e1364c6a0bc28b555e9ccda08e91337a8ff7baa400d0ff7dfc90786 310 | Multi-Arch: same 311 | 312 | Package: libattr1 313 | Architecture: amd64 314 | Version: 1:2.4.47-2 315 | Depends: libc6 (>= 2.4) 316 | Pre-Depends: multiarch-support 317 | Conflicts: attr (<< 2.0.0) 318 | Filename: pool/main/a/attr/libattr1_2.4.47-2_amd64.deb 319 | MD5sum: fccf83d54d50840eb7308fbf23c83891 320 | SHA1: a2e188fa349a1f451151a50e7716fd991c738957 321 | SHA256: 6b34040173acef1b806b128bc258b130519b2a7eb167ff1c3f3cb98fa1ddc648 322 | Multi-Arch: same 323 | 324 | Package: libaudit-common 325 | Architecture: all 326 | Version: 1:2.4.5-1ubuntu2.1 327 | Replaces: libaudit0, libaudit1 (<< 1:2.2.1-2) 328 | Breaks: libaudit0, libaudit1 (<< 1:2.2.1-2) 329 | Filename: pool/main/a/audit/libaudit-common_2.4.5-1ubuntu2.1_all.deb 330 | MD5sum: 45798929445bf81e91d731c19a67fa77 331 | SHA1: 78ac460195e1e50c1f85569dea36ff71e08d74b2 332 | SHA256: 5e8856bcb8da84684c6dbd6a5036fabe62db0c64a2bdd36d887bc1fca403db98 333 | Multi-Arch: foreign 334 | 335 | Package: libaudit1 336 | Architecture: amd64 337 | Version: 1:2.4.5-1ubuntu2.1 338 | Depends: libaudit-common (>= 1:2.4.5-1ubuntu2.1), libc6 (>= 2.14) 339 | Filename: pool/main/a/audit/libaudit1_2.4.5-1ubuntu2.1_amd64.deb 340 | MD5sum: 589f863e5cc85e32c85d4bf0cb267ca5 341 | SHA1: 1359ced2b0d5301c48107a892973965477d06f22 342 | SHA256: 62e1512eedd636ae3398b84c954a44200f8a6944f63f58cf75a6ad4a94fbd01d 343 | Multi-Arch: same 344 | 345 | Package: libblkid1 346 | Architecture: amd64 347 | Version: 2.27.1-6ubuntu3.10 348 | Depends: libc6 (>= 2.17), libuuid1 (>= 2.16) 349 | Filename: pool/main/u/util-linux/libblkid1_2.27.1-6ubuntu3.10_amd64.deb 350 | MD5sum: 3dc882bde3bf3c92f93d3330b9a7a5b5 351 | SHA1: d58abb539cf60f83d3285acbd3855ff24373a123 352 | SHA256: cb65d08b3824424c9f729f93f71bb1ee805dad36da26eb3fccbde1ebc5c2deae 353 | Multi-Arch: same 354 | 355 | Package: libbz2-1.0 356 | Architecture: amd64 357 | Version: 1.0.6-8ubuntu0.2 358 | Depends: libc6 (>= 2.4) 359 | Filename: pool/main/b/bzip2/libbz2-1.0_1.0.6-8ubuntu0.2_amd64.deb 360 | MD5sum: e33f8d34d360c8eed702d2b310e1738a 361 | SHA1: 93bb0926bc1a9dc56f122f8e3fc37ca0c73c715e 362 | SHA256: 7ef95d7e6ecd8873d0809e91011b3cc2a6516bb5bf79f75b7942658620448d9f 363 | Multi-Arch: same 364 | 365 | Package: libc-bin 366 | Architecture: amd64 367 | Version: 2.23-0ubuntu11 368 | Depends: libc6 (>> 2.23), libc6 (<< 2.24) 369 | Filename: pool/main/g/glibc/libc-bin_2.23-0ubuntu11_amd64.deb 370 | MD5sum: 36604530fc5881238186592fa5d9ff0d 371 | SHA1: a395560a999464cd0660d0b1eb394e237b643baf 372 | SHA256: dc6e0ba84d1010b60b7bc82b3363cb214ac0d9286c4b4f2cf11db54e7019de79 373 | Multi-Arch: foreign 374 | 375 | Package: libc6 376 | Architecture: amd64 377 | Version: 2.23-0ubuntu11 378 | Replaces: libc6-amd64 379 | Depends: libgcc1 380 | Breaks: hurd (<< 1:0.5.git20140203-1), libtirpc1 (<< 0.2.3), locales (<< 2.23), locales-all (<< 2.23), lsb-core (<= 3.2-27), nscd (<< 2.23) 381 | Filename: pool/main/g/glibc/libc6_2.23-0ubuntu11_amd64.deb 382 | MD5sum: 9fa554db26eaa705ff02cab4e0289e4f 383 | SHA1: 6228335ebf0b5426f2d220baaabf1083e1401e8e 384 | SHA256: 7c802a3051203c32bba4e2e1c6cab831c338c186810bc5cab59fc600a63ac8e0 385 | Multi-Arch: same 386 | 387 | Package: libcap2 388 | Architecture: amd64 389 | Version: 1:2.24-12 390 | Depends: libc6 (>= 2.14) 391 | Filename: pool/main/libc/libcap2/libcap2_2.24-12_amd64.deb 392 | MD5sum: 8adacf8eba5546dd45b21bbdb569c06e 393 | SHA1: 8c653f487a858009cec88aceec5c5e2c498b60de 394 | SHA256: 5060624cdafe4745280b6e4b4069b818c7a1d5344a3931b989a6c12fa5907a4b 395 | Multi-Arch: same 396 | 397 | Package: libcap2-bin 398 | Architecture: amd64 399 | Version: 1:2.24-12 400 | Replaces: libcap-bin 401 | Depends: libc6 (>= 2.14), libcap2 (>= 1:2.10) 402 | Breaks: libcap-bin 403 | Filename: pool/main/libc/libcap2/libcap2-bin_2.24-12_amd64.deb 404 | MD5sum: a461e30be3350dceab4c6c045c731225 405 | SHA1: 73b5fbc1499eb291363f6741ecd1f68b4a2630ea 406 | SHA256: 772c039c189bc58e745db4664833ded8cd4acb7777470961f6b12e00afe716ce 407 | Multi-Arch: foreign 408 | 409 | Package: libcomerr2 410 | Architecture: amd64 411 | Version: 1.42.13-1ubuntu1.2 412 | Replaces: e2fsprogs (<< 1.34-1) 413 | Provides: libcomerr-kth-compat 414 | Depends: libc6 (>= 2.17) 415 | Filename: pool/main/e/e2fsprogs/libcomerr2_1.42.13-1ubuntu1.2_amd64.deb 416 | MD5sum: 185bd22cfc271f5d778f8f5cb0be0258 417 | SHA1: 8056f47131949e73be86e15cfd2d9d571ae9bd7d 418 | SHA256: 3079cfbf642ea0e89e7af080135f98350bc4ce8a882ab63a9844f5e74eae2767 419 | Multi-Arch: same 420 | 421 | Package: libcryptsetup4 422 | Architecture: amd64 423 | Version: 2:1.6.6-5ubuntu2.1 424 | Depends: libc6 (>= 2.17), libdevmapper1.02.1 (>= 2:1.02.97), libgcrypt20 (>= 1.6.1), libuuid1 (>= 2.16), libgpg-error0 (>= 1.10-0.1) 425 | Filename: pool/main/c/cryptsetup/libcryptsetup4_1.6.6-5ubuntu2.1_amd64.deb 426 | MD5sum: 24aa8687bb06d653cb0cfb0960025fa6 427 | SHA1: 93823775f3aedd7f146577abad014e38e6faaa2c 428 | SHA256: 8f28712eb6c86b94ed1d18d36ae171b02260caa8d1c96da4b356d1d9c1f93cf1 429 | Multi-Arch: same 430 | 431 | Package: libdb5.3 432 | Architecture: amd64 433 | Version: 5.3.28-11ubuntu0.2 434 | Depends: libc6 (>= 2.17) 435 | Filename: pool/main/d/db5.3/libdb5.3_5.3.28-11ubuntu0.2_amd64.deb 436 | MD5sum: 52e4bfea939e97c287ef0e8dcfe2cc74 437 | SHA1: 651f4642389d332983c88ff18c2bb75863c29b79 438 | SHA256: c9dc6eaefb9a2d3a0fd1b41479fda696aec66a402deab41eb1b5c8c5e9bde43e 439 | Multi-Arch: same 440 | 441 | Package: libdebconfclient0 442 | Architecture: amd64 443 | Version: 0.198ubuntu1 444 | Depends: libc6 (>= 2.4) 445 | Filename: pool/main/c/cdebconf/libdebconfclient0_0.198ubuntu1_amd64.deb 446 | MD5sum: 09f6dee236597ef2aaeecb08d755c063 447 | SHA1: 13fc2e6e6a5ddb9ccd61266b7ebab840eadcfb70 448 | SHA256: 12bda08bcae8d07f1ecea01715031faa107cf19c4f614b5652590cd12776dff5 449 | Multi-Arch: same 450 | 451 | Package: libdevmapper1.02.1 452 | Architecture: amd64 453 | Version: 2:1.02.110-1ubuntu10 454 | Depends: libc6 (>= 2.22), libselinux1 (>= 1.32), libudev1 (>= 183) 455 | Conflicts: libdevmapper1.02 456 | Breaks: liblvm2app2.2 (<< 2.02.122), lvm2 (<< 2.02.122) 457 | Filename: pool/main/l/lvm2/libdevmapper1.02.1_1.02.110-1ubuntu10_amd64.deb 458 | MD5sum: 2ad0aeb50415929d5d23e2b5d961891d 459 | SHA1: f521adefd542278d5e0ddd12ff4535aba940acbd 460 | SHA256: cd724eb7974541dcadcc8d457bf71246012f02b85c0add1d1bd271208c78a6f4 461 | Multi-Arch: same 462 | 463 | Package: libexpat1 464 | Architecture: amd64 465 | Version: 2.1.0-7ubuntu0.16.04.5 466 | Depends: libc6 (>= 2.14) 467 | Conflicts: wink (<= 1.5.1060-4) 468 | Filename: pool/main/e/expat/libexpat1_2.1.0-7ubuntu0.16.04.5_amd64.deb 469 | MD5sum: f3956732f52b3f71466729eba344c8ea 470 | SHA1: 527e6301ca4793a469ea92441f17c9b26272a1ad 471 | SHA256: 372465554ac8c8ce1674c97f2029ac90960d2e54cee92b24d91fc846e942a4f2 472 | Multi-Arch: same 473 | 474 | Package: libfdisk1 475 | Architecture: amd64 476 | Version: 2.27.1-6ubuntu3.10 477 | Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libuuid1 (>= 2.16) 478 | Filename: pool/main/u/util-linux/libfdisk1_2.27.1-6ubuntu3.10_amd64.deb 479 | MD5sum: a34439d262fc26f9438f3fbf6856450b 480 | SHA1: 21e3cfa91dc251abd8b41d292e271a4bdc9fb351 481 | SHA256: 51dd3b478d8ccac418bb86576415406cfb6fdf4a11dd0d0534acb6d90d59db56 482 | Multi-Arch: same 483 | 484 | Package: libfontconfig1 485 | Architecture: amd64 486 | Version: 2.11.94-0ubuntu1.1 487 | Provides: libfontconfig 488 | Depends: fontconfig-config (= 2.11.94-0ubuntu1.1), libc6 (>= 2.14), libexpat1 (>= 2.0.1), libfreetype6 (>= 2.2.1) 489 | Filename: pool/main/f/fontconfig/libfontconfig1_2.11.94-0ubuntu1.1_amd64.deb 490 | MD5sum: e1d3510a190b0910720a7ae597ce53ea 491 | SHA1: 1c4767d985652f5fbbae5e2f0e83686f3579fdd8 492 | SHA256: 6c1c68046e5e87da8dfdb9db107e85c124a5214fdddf1eda2d7b76644e2f33fb 493 | Multi-Arch: same 494 | 495 | Package: libfreetype6 496 | Architecture: amd64 497 | Version: 2.6.1-0.1ubuntu2.4 498 | Depends: libc6 (>= 2.14), libpng12-0 (>= 1.2.13-4), zlib1g (>= 1:1.1.4) 499 | Filename: pool/main/f/freetype/libfreetype6_2.6.1-0.1ubuntu2.4_amd64.deb 500 | MD5sum: a7c80cab945424bef3f262c6b10b33ae 501 | SHA1: e1982903a51eb3990f908f598bc8e71491339c65 502 | SHA256: 3e1ca8e411da68aaefaeb0a934d3e1ce2bbdfdaae9ea38fd831807834256c83c 503 | Multi-Arch: same 504 | 505 | Package: libgcc1 506 | Architecture: amd64 507 | Version: 1:6.0.1-0ubuntu1 508 | Depends: gcc-6-base (= 6.0.1-0ubuntu1), libc6 (>= 2.14) 509 | Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2) 510 | Filename: pool/main/g/gccgo-6/libgcc1_6.0.1-0ubuntu1_amd64.deb 511 | MD5sum: 540b75712b73d679c4626ead4b184514 512 | SHA1: 7eeb8245e3ace19a4489c84b55a3e64689af8909 513 | SHA256: 6e374d7b6ee1ffbcff568705b7f9ec7b9befbfcf17e683a21ef6480dc9d0cfe0 514 | Multi-Arch: same 515 | 516 | Package: libgcrypt20 517 | Architecture: amd64 518 | Version: 1.6.5-2ubuntu0.6 519 | Depends: libc6 (>= 2.15), libgpg-error0 (>= 1.14) 520 | Filename: pool/main/libg/libgcrypt20/libgcrypt20_1.6.5-2ubuntu0.6_amd64.deb 521 | MD5sum: c830f94c2d8d6e1c6bf9e2ca9e9a94cd 522 | SHA1: 075a9a2bfc6e708b2ebecfa0c1ceb951520ca83f 523 | SHA256: 9285aa307b00e73e266b4dfda5e4d7fe10c5336c6aa6032ce2917981407e8b3c 524 | Multi-Arch: same 525 | 526 | Package: libgd3 527 | Architecture: amd64 528 | Version: 2.1.1-4ubuntu0.16.04.12 529 | Depends: libc6 (>= 2.14), libfontconfig1 (>= 2.11.94), libfreetype6 (>= 2.2.1), libjpeg8 (>= 8c), libpng12-0 (>= 1.2.13-4), libtiff5 (>= 4.0.3), libvpx3 (>= 1.5.0), libxpm4, zlib1g (>= 1:1.1.4) 530 | Filename: pool/main/libg/libgd2/libgd3_2.1.1-4ubuntu0.16.04.12_amd64.deb 531 | MD5sum: ff1a2d84977be6399e3765590a520944 532 | SHA1: 00f1e1a07d93c3b1f8b6fd1f6832f4fd680ee94d 533 | SHA256: 297fbe6d7ccc14f7e5dba8a844b5b4b9b9aba2a136aa873313c38a287501a336 534 | Multi-Arch: same 535 | 536 | Package: libgeoip1 537 | Architecture: amd64 538 | Version: 1.6.9-1 539 | Depends: libc6 (>= 2.4) 540 | Filename: pool/main/g/geoip/libgeoip1_1.6.9-1_amd64.deb 541 | MD5sum: 22cde99bd5aca237e04d2eae38bade61 542 | SHA1: e847a764b7254eebf04351cd537e3c1821c3be25 543 | SHA256: 4f468bebbfd6d24d5f796fe35f3a68d2b0f4a08a05154dffb150f88da9291dc3 544 | Multi-Arch: same 545 | 546 | Package: libgpg-error0 547 | Architecture: amd64 548 | Version: 1.21-2ubuntu1 549 | Depends: libc6 (>= 2.15) 550 | Filename: pool/main/libg/libgpg-error/libgpg-error0_1.21-2ubuntu1_amd64.deb 551 | MD5sum: a00f8f1a08113f1eb43b4782ed83beb5 552 | SHA1: c8dc1769c9971c05839651bdb8cffc1c7f2736d5 553 | SHA256: 22f56dc31efd0cee75398590960c3e4425ddfd9b55c6ffec790732c249974a12 554 | Multi-Arch: same 555 | 556 | Package: libicu55 557 | Architecture: amd64 558 | Version: 55.1-7ubuntu0.5 559 | Depends: libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 5.2) 560 | Filename: pool/main/i/icu/libicu55_55.1-7ubuntu0.5_amd64.deb 561 | MD5sum: 573091adb02258aa4d148e0f7050ba16 562 | SHA1: d3a7b65584de4e5e76c9cb922988489ebe2a9236 563 | SHA256: 5c7ab6a4e0850d20c35b0c3c23f15948e685227e85d76d2eb2afd186e6efe4ed 564 | Multi-Arch: same 565 | 566 | Package: libjbig0 567 | Architecture: amd64 568 | Version: 2.1-3.1 569 | Depends: libc6 (>= 2.4) 570 | Pre-Depends: multiarch-support 571 | Filename: pool/main/j/jbigkit/libjbig0_2.1-3.1_amd64.deb 572 | MD5sum: 40f4b9dab9dec66cc7fd1d642430f357 573 | SHA1: 3a8aa928d11dca72f9a21329e88e68c2fd5a6d83 574 | SHA256: 70005b26acd942c7eb05903508172a7a531210fce6f35cd36a900b8bebb29413 575 | Multi-Arch: same 576 | 577 | Package: libjpeg-turbo8 578 | Architecture: amd64 579 | Version: 1.4.2-0ubuntu3.4 580 | Replaces: libjpeg8 (<< 8c-2ubuntu5) 581 | Depends: libc6 (>= 2.14) 582 | Pre-Depends: multiarch-support 583 | Breaks: libjpeg8 (<< 8c-2ubuntu5) 584 | Filename: pool/main/libj/libjpeg-turbo/libjpeg-turbo8_1.4.2-0ubuntu3.4_amd64.deb 585 | MD5sum: d99d2b236ba2e11cde75d95d115324f5 586 | SHA1: 587a878d0cf5575b745dcca5d140e59019a82068 587 | SHA256: 07d65b5d5e8d2cd634c831724747f2da8c1ac100d05a8480787254c211e7c5ac 588 | Multi-Arch: same 589 | 590 | Package: libjpeg8 591 | Architecture: amd64 592 | Version: 8c-2ubuntu8 593 | Depends: libjpeg-turbo8 (>= 1.1.90+svn722-1ubuntu6) 594 | Filename: pool/main/libj/libjpeg8-empty/libjpeg8_8c-2ubuntu8_amd64.deb 595 | MD5sum: e0f16286dd787b951ffa953987fdf6a7 596 | SHA1: 50f0a11ba80717e17b8485567ee1be76b744ce8f 597 | SHA256: baaecbc8e7ef55fc1887365721a7771f7d533fabca38fca878668b9c8f7ee13f 598 | Multi-Arch: same 599 | 600 | Package: libkmod2 601 | Architecture: amd64 602 | Version: 22-1ubuntu5.2 603 | Depends: libc6 (>= 2.17) 604 | Filename: pool/main/k/kmod/libkmod2_22-1ubuntu5.2_amd64.deb 605 | MD5sum: 0818deb9e0438be854dc4893f7c52a2e 606 | SHA1: 0d1f66961019074e192eb34737294f560d4812e9 607 | SHA256: 1eca39a519c22e66491fb75d64a5877ef025b6e95c759fd247c105d1e5a3133d 608 | Multi-Arch: same 609 | 610 | Package: liblzma5 611 | Architecture: amd64 612 | Version: 5.1.1alpha+20120614-2ubuntu2 613 | Depends: libc6 (>= 2.14) 614 | Pre-Depends: multiarch-support 615 | Filename: pool/main/x/xz-utils/liblzma5_5.1.1alpha+20120614-2ubuntu2_amd64.deb 616 | MD5sum: 759f50b893e9809a168a9d926a6095d0 617 | SHA1: 5047b25046c22cc6a22579722312150e5428d9e9 618 | SHA256: 4062214896ad59759d0fe012146d7f001159b9a79fe28baea296205b53ba7cb9 619 | Multi-Arch: same 620 | 621 | Package: libmount1 622 | Architecture: amd64 623 | Version: 2.27.1-6ubuntu3.10 624 | Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libselinux1 (>= 1.32) 625 | Filename: pool/main/u/util-linux/libmount1_2.27.1-6ubuntu3.10_amd64.deb 626 | MD5sum: 69f2f452632409556a3e65df95f66bc8 627 | SHA1: d41a42226970d94bf4f00ec0891ef47374e7c06f 628 | SHA256: 23c8de181e02cb08cbaa994e4bbf91a03b9d1a5d3fec2b12513ad8a18b587cce 629 | Multi-Arch: same 630 | 631 | Package: libncurses5 632 | Architecture: amd64 633 | Version: 6.0+20160213-1ubuntu1 634 | Depends: libtinfo5 (= 6.0+20160213-1ubuntu1), libc6 (>= 2.14) 635 | Filename: pool/main/n/ncurses/libncurses5_6.0+20160213-1ubuntu1_amd64.deb 636 | MD5sum: 069554f95e57ac8709c290a98eb0a403 637 | SHA1: 4ade5dc196a75b9ebb2caa6b521a9744d8b974d6 638 | SHA256: 085efe5f455b6e6e33f52a57d5af800883482f20e7e19774323c02cd0aa9f2b7 639 | Multi-Arch: same 640 | 641 | Package: libncursesw5 642 | Architecture: amd64 643 | Version: 6.0+20160213-1ubuntu1 644 | Depends: libtinfo5 (= 6.0+20160213-1ubuntu1), libc6 (>= 2.14) 645 | Filename: pool/main/n/ncurses/libncursesw5_6.0+20160213-1ubuntu1_amd64.deb 646 | MD5sum: 923ddf282a121d22262e62ef738b8ad1 647 | SHA1: 858eab2e2cb93f5301f1c97ffe653e7d82b826c6 648 | SHA256: da2dbe9903994e7406aaa0091f7ffaeb90156990bf5585e0d5edb0be4310e9c2 649 | Multi-Arch: same 650 | 651 | Package: libpam-modules 652 | Architecture: amd64 653 | Version: 1.1.8-3.2ubuntu2.1 654 | Replaces: libpam-umask, libpam0g-util 655 | Provides: libpam-mkhomedir, libpam-motd, libpam-umask 656 | Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.15), libdb5.3, libpam0g (>= 1.1.3-2), libselinux1 (>= 2.1.9), debconf (>= 0.5) | debconf-2.0, libpam-modules-bin (= 1.1.8-3.2ubuntu2.1) 657 | Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask 658 | Filename: pool/main/p/pam/libpam-modules_1.1.8-3.2ubuntu2.1_amd64.deb 659 | MD5sum: 7e749cf7b2d4af980d32368deaef8b12 660 | SHA1: b5e1b37f96705844f4df382784648c20085b335a 661 | SHA256: 6337e13144bcc16a5e4085d64b4111922ff56b73dbce594fc125af8cb68b1628 662 | Multi-Arch: same 663 | 664 | Package: libpam-modules-bin 665 | Architecture: amd64 666 | Version: 1.1.8-3.2ubuntu2.1 667 | Replaces: libpam-modules (<< 1.1.3-8) 668 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.14), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32) 669 | Filename: pool/main/p/pam/libpam-modules-bin_1.1.8-3.2ubuntu2.1_amd64.deb 670 | MD5sum: a427c5c2d10a6161a4cfd9ff44576186 671 | SHA1: 93c7e423fc85841eb594743beb047dc4003b27ad 672 | SHA256: adfdbdc9802034a1de107c85ca70052e8efdf2289ae204e85eed3775df6e66e1 673 | Multi-Arch: foreign 674 | 675 | Package: libpam-runtime 676 | Architecture: all 677 | Version: 1.1.8-3.2ubuntu2.1 678 | Replaces: libpam0g-dev, libpam0g-util 679 | Depends: debconf (>= 0.5) | debconf-2.0, debconf (>= 1.5.19) | cdebconf, libpam-modules (>= 1.0.1-6) 680 | Conflicts: libpam0g-util 681 | Filename: pool/main/p/pam/libpam-runtime_1.1.8-3.2ubuntu2.1_all.deb 682 | MD5sum: 61e02bf3d7f6d7d85b9c0b260677150d 683 | SHA1: 5bb59964d9695744135bfb79cc525465fcc229b3 684 | SHA256: cc06dd66d7e18ea111e739d16fcb5fc5dd067903c7c04b0aaf6206271a093575 685 | Multi-Arch: foreign 686 | 687 | Package: libpam0g 688 | Architecture: amd64 689 | Version: 1.1.8-3.2ubuntu2.1 690 | Replaces: libpam0g-util 691 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.14), debconf (>= 0.5) | debconf-2.0 692 | Filename: pool/main/p/pam/libpam0g_1.1.8-3.2ubuntu2.1_amd64.deb 693 | MD5sum: 80d3ab7dfc2fdc445980d3da1b508546 694 | SHA1: dccfc66711605ac2bc68d864980e58c7e98348c0 695 | SHA256: 3e4a347a19096da31bcfeef9020a6ef801082d6b1dc578e59cdfebd614eb52f0 696 | Multi-Arch: same 697 | 698 | Package: libpcre3 699 | Architecture: amd64 700 | Version: 2:8.38-3.1 701 | Depends: libc6 (>= 2.14) 702 | Pre-Depends: multiarch-support 703 | Conflicts: libpcre3-dev (<= 4.3-3) 704 | Breaks: approx (<< 4.4-1~), cduce (<< 0.5.3-2~), cmigrep (<< 1.5-7~), galax (<< 1.1-7~), libpcre-ocaml (<< 6.0.1~), liquidsoap (<< 0.9.2-3~), ocsigen (<< 1.3.3-1~) 705 | Filename: pool/main/p/pcre3/libpcre3_8.38-3.1_amd64.deb 706 | MD5sum: 2c81decd656a3c3843e47fb5ccf71065 707 | SHA1: a6ca64812097d460f767aa74166bfdaa0af14395 708 | SHA256: 736f799fbb8a8d4be8cdded2b046813de391661d925d6e5a5a82febf65bbf065 709 | Multi-Arch: same 710 | 711 | Package: libpng12-0 712 | Architecture: amd64 713 | Version: 1.2.54-1ubuntu1.1 714 | Replaces: libpng12-dev (<= 1.2.8rel-7) 715 | Depends: libc6 (>= 2.14), zlib1g (>= 1:1.1.4) 716 | Conflicts: libpng12-dev (<= 1.2.8rel-7), mzscheme (<= 1:209-5), pngcrush (<= 1.5.10-2), pngmeta (<= 1.11-3), povray-3.5 (<= 3.5.0c-10), qemacs (<= 0.3.1-5) 717 | Filename: pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb 718 | MD5sum: 38fd39cd2f688be1f46f53f8f2c80711 719 | SHA1: b3d7791657429647aaa8f3f2d542cc83173b0abf 720 | SHA256: 9d938a376dafd1668827ceeb742f18b164c390e53774b06eaaf644713b6ffb25 721 | Multi-Arch: same 722 | 723 | Package: libprocps4 724 | Architecture: amd64 725 | Version: 2:3.3.10-4ubuntu2.5 726 | Replaces: procps (<< 1:3.3.2-1) 727 | Depends: libc6 (>= 2.14), libsystemd0 728 | Filename: pool/main/p/procps/libprocps4_3.3.10-4ubuntu2.5_amd64.deb 729 | MD5sum: 522dab6ba5612b1894e93ec8be667544 730 | SHA1: 56a31d967589e1df4f2e1b9bc640826a42ab6eb3 731 | SHA256: fc42969dec1e749f6b3b0bfdb91ad5d3876a30c29db4d22840b16a271cd39b68 732 | Multi-Arch: same 733 | 734 | Package: libseccomp2 735 | Architecture: amd64 736 | Version: 2.4.1-0ubuntu0.16.04.2 737 | Depends: libc6 (>= 2.4) 738 | Filename: pool/main/libs/libseccomp/libseccomp2_2.4.1-0ubuntu0.16.04.2_amd64.deb 739 | MD5sum: 1468290b8608da7b2578988b719c6d95 740 | SHA1: 5fddf2b9df6127c331e0b6790f0cc099fcbe21f1 741 | SHA256: f5e11d12b9f338998584284f5d764ee943c2717200d319a091cb1493d4a7718d 742 | Multi-Arch: same 743 | 744 | Package: libselinux1 745 | Architecture: amd64 746 | Version: 2.4-3build2 747 | Depends: libc6 (>= 2.14), libpcre3 748 | Filename: pool/main/libs/libselinux/libselinux1_2.4-3build2_amd64.deb 749 | MD5sum: 5ba8c7ff222a86611b0ef37b52eebc28 750 | SHA1: 9e5126344d70f36f53e1eba23b41a6ad2d2e4f8c 751 | SHA256: 1d71715f2fa16391e55e29f2b4238ca4333f6324a40e5fc503bce9760d5b9330 752 | Multi-Arch: same 753 | 754 | Package: libsemanage-common 755 | Architecture: all 756 | Version: 2.3-1build3 757 | Replaces: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) 758 | Breaks: libsemanage1 (<= 2.0.41-1), libsemanage1-dev (<< 2.1.6-3~) 759 | Filename: pool/main/libs/libsemanage/libsemanage-common_2.3-1build3_all.deb 760 | MD5sum: 5184f579b2784a1cc7392d1c61b0e8c9 761 | SHA1: 0805d76e1dfd9a3279ce95da737d76e911c5b439 762 | SHA256: f981322182e6215c8a4ad3c372a830d868959246cc060b0be30e246f68e01589 763 | Multi-Arch: foreign 764 | 765 | Package: libsemanage1 766 | Architecture: amd64 767 | Version: 2.3-1build3 768 | Depends: libsemanage-common (= 2.3-1build3), libaudit1 (>= 1:2.2.1), libbz2-1.0, libc6 (>= 2.14), libselinux1 (>= 2.1.12), libsepol1 (>= 2.1.4), libustr-1.0-1 (>= 1.0.4) 769 | Filename: pool/main/libs/libsemanage/libsemanage1_2.3-1build3_amd64.deb 770 | MD5sum: d665d032af79a18b11aceb4ea28f20b0 771 | SHA1: 43ef7f3391818aaabb724f70e7bc99471543126d 772 | SHA256: a96ed2999ecf0f4afe89652435e3f252ad5d53840e9c0d6d21bfa56a8c09b70f 773 | Multi-Arch: same 774 | 775 | Package: libsepol1 776 | Architecture: amd64 777 | Version: 2.4-2 778 | Depends: libc6 (>= 2.14) 779 | Filename: pool/main/libs/libsepol/libsepol1_2.4-2_amd64.deb 780 | MD5sum: a2738f36eed6c92f5bdc603431a0c803 781 | SHA1: 13fcc0e69859d45b2166f24dd08e0d60683001b8 782 | SHA256: 51a02be01ee81f771f87cab13abc977c407eff8c3d5f142f665cfb15a03a6222 783 | Multi-Arch: same 784 | 785 | Package: libsmartcols1 786 | Architecture: amd64 787 | Version: 2.27.1-6ubuntu3.10 788 | Depends: libc6 (>= 2.17) 789 | Filename: pool/main/u/util-linux/libsmartcols1_2.27.1-6ubuntu3.10_amd64.deb 790 | MD5sum: 9daae93a7dbb1a448ae001f265bab880 791 | SHA1: 7050d3a280eb1057a56e1c4a63028e77ea9e9cf2 792 | SHA256: 0bbf116c1016601ebdc63bd9d0bd63f90b8b0f7825a6a71e9030b2b1ae251599 793 | Multi-Arch: same 794 | 795 | Package: libss2 796 | Architecture: amd64 797 | Version: 1.42.13-1ubuntu1.2 798 | Replaces: e2fsprogs (<< 1.34-1) 799 | Depends: libcomerr2, libc6 (>= 2.17) 800 | Filename: pool/main/e/e2fsprogs/libss2_1.42.13-1ubuntu1.2_amd64.deb 801 | MD5sum: b3c62931f99f603dcf28ff4182aa410f 802 | SHA1: d47c2574ca55918d98970ca6e8c66f129a746b0b 803 | SHA256: 1454ca70bf10c8a0ea65ed1b8073d27c4a427d2eb1cc4247d400f1d0e5fa0c61 804 | Multi-Arch: same 805 | 806 | Package: libssl1.0.0 807 | Architecture: amd64 808 | Version: 1.0.2g-1ubuntu4.16 809 | Depends: libc6 (>= 2.14), debconf (>= 0.5) | debconf-2.0 810 | Filename: pool/main/o/openssl/libssl1.0.0_1.0.2g-1ubuntu4.16_amd64.deb 811 | MD5sum: 80cbff26a4bde8a0857303ea8e615e83 812 | SHA1: d4267219ac973a010950fc47caae684a2f37984e 813 | SHA256: 991a0acdb4e144eac5a4dacf1ba1ae8bae5c130bb5778eee5538320e47b585bf 814 | Multi-Arch: same 815 | 816 | Package: libstdc++6 817 | Architecture: amd64 818 | Version: 5.4.0-6ubuntu1~16.04.12 819 | Replaces: libstdc++6-5-dbg (<< 4.9.0-3) 820 | Depends: gcc-5-base (= 5.4.0-6ubuntu1~16.04.12), libc6 (>= 2.18), libgcc1 (>= 1:4.2) 821 | Conflicts: scim (<< 1.4.2-1) 822 | Breaks: blockattack (<= 1.4.1+ds1-2.1build2), boo (<= 0.9.5~git20110729.r1.202a430-2), c++-annotations (<= 10.2.0-1), chromium-browser (<= 43.0.2357.130-0ubuntu2), clustalx (<= 2.1+lgpl-2), dff (<= 1.3.0+dfsg.1-4.1build2), emscripten (<= 1.22.1-1), ergo (<= 3.4.0-1), fceux (<= 2.2.2+dfsg0-1), flush (<= 0.9.12-3.1ubuntu1), freeorion (<= 0.4.4+git20150327-2), fslview (<= 4.0.1-4), fwbuilder (<= 5.1.0-4), gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2), gnote (<= 3.16.2-1), gnudatalanguage (<= 0.9.5-2build1), innoextract (<= 1.4-1build1), libantlr-dev (<= 2.7.7+dfsg-6), libapache2-mod-passenger (<= 4.0.53-1), libaqsis1 (<= 1.8.2-1), libassimp3 (<= 3.0~dfsg-4), libboost-date-time1.55.0, libcpprest2.2 (<= 2.2.0-1), libdap17 (<= 3.14.0-2), libdapclient6 (<= 3.14.0-2), libdapserver7 (<= 3.14.0-2), libdavix0 (<= 0.4.0-1build1), libdballe6 (<= 6.8-1), libdiet-admin2.8 (<= 2.8.0-1build3), libdiet-client2.8 (<= 2.8.0-1build3), libdiet-sed2.8 (<= 2.8.0-1build3), libfreefem++ (<= 3.37.1-1), libgazebo5 (<= 5.0.1+dfsg-2.1), libgetfem4++ (<= 4.2.1~beta1~svn4482~dfsg-3ubuntu3), libgmsh2 (<= 2.8.5+dfsg-1.1ubuntu1), libinsighttoolkit4.6 (<= 4.6.0-3ubuntu3), libkgeomap2 (<= 4:15.04.2-0ubuntu1), libkolabxml1 (<= 1.1.0-3), libkvkontakte1 (<= 1.0~digikam4.10.0-0ubuntu2), libmarisa0 (<= 0.2.4-8build1), libmediawiki1 (<= 1.0~digikam4.10.0-0ubuntu2), libogre-1.8.0 (<= 1.8.1+dfsg-0ubuntu5), libogre-1.9.0 (<= 1.9.0+dfsg1-4), libopenwalnut1 (<= 1.4.0~rc1+hg3a3147463ee2-1ubuntu2), libpqxx-4.0 (<= 4.0.1+dfsg-3ubuntu1), libreoffice-core (<= 1:4.4.4~rc3-0ubuntu1), librime1 (<= 1.2+dfsg-2), libwibble-dev (<= 1.1-1), libwreport2 (<= 2.14-1), libxmltooling6 (<= 1.5.3-2.1), lightspark (<= 0.7.2+git20150512-2), mira-assembler (<= 4.9.5-1), mongodb (<= 1:2.6.3-0ubuntu7), mongodb-server (<= 1:2.6.3-0ubuntu7), ncbi-blast+ (<= 2.2.30-4), openscad (<= 2014.03+dfsg-1build1), passepartout (<= 0.7.1-1.1), pdf2djvu (<= 0.7.19-1ubuntu2), photoprint (<= 0.4.2~pre2-2.3), plastimatch (<= 1.6.2+dfsg-1), plee-the-bear (<= 0.6.0-3.1), povray (<= 1:3.7.0.0-8), powertop (<= 2.6.1-1), printer-driver-brlaser (<= 3-3), psi4 (<= 4.0~beta5+dfsg-2build1), python-healpy (<= 1.8.1-1), python3-taglib (<= 0.3.6+dfsg-2build2), realtimebattle (<= 1.0.8-14), ruby-passenger (<= 4.0.53-1), sqlitebrowser (<= 3.5.1-3), tecnoballz (<= 0.93.1-6), wesnoth-1.12-core (<= 1:1.12.4-1), widelands (<= 1:18-3build1), xflr5 (<= 6.09.06-2) 823 | Filename: pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.12_amd64.deb 824 | MD5sum: 27c81118795b303957571fd31342afa9 825 | SHA1: d3ba6b6fc9fc151a9c47dafe8b18a7f698d196b0 826 | SHA256: 652b9ab17faa48651187f7cd61edd3a3f4e22751c50ce1b2519af67bb086ae06 827 | Multi-Arch: same 828 | 829 | Package: libsystemd0 830 | Architecture: amd64 831 | Version: 229-4ubuntu21.28 832 | Pre-Depends: libc6 (>= 2.17), libgcrypt20 (>= 1.6.1), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 1.32) 833 | Filename: pool/main/s/systemd/libsystemd0_229-4ubuntu21.28_amd64.deb 834 | MD5sum: 101158813955b88e166625b80984d133 835 | SHA1: 4ff6645f7f2ce95584405cc8edc4a0158be8102e 836 | SHA256: fbda9c430e278ff2d6a3e6dd9b9e4499d38e0f250b77ecc525d5233f07335b34 837 | Multi-Arch: same 838 | 839 | Package: libtiff5 840 | Architecture: amd64 841 | Version: 4.0.6-1ubuntu0.7 842 | Depends: libc6 (>= 2.14), libjbig0 (>= 2.0), libjpeg8 (>= 8c), liblzma5 (>= 5.1.1alpha+20120614), zlib1g (>= 1:1.1.4) 843 | Filename: pool/main/t/tiff/libtiff5_4.0.6-1ubuntu0.7_amd64.deb 844 | MD5sum: 2deb34f2bb051e6882efbb89f56acb4f 845 | SHA1: bdafc49a60a007249834059948c221a47255006d 846 | SHA256: d0634877ddbd00e54d8799db0b97e8364d2a63e41c81e54bec4cb1062b377f30 847 | Multi-Arch: same 848 | 849 | Package: libtinfo5 850 | Architecture: amd64 851 | Version: 6.0+20160213-1ubuntu1 852 | Replaces: libncurses5 (<< 5.9-3) 853 | Depends: libc6 (>= 2.16) 854 | Breaks: dialog (<< 1.2-20130523) 855 | Filename: pool/main/n/ncurses/libtinfo5_6.0+20160213-1ubuntu1_amd64.deb 856 | MD5sum: 5c4e3666aa6f6dd419f3301ecedae411 857 | SHA1: b961599d2bf6a5a0cf21f78746b01278d10a661d 858 | SHA256: 87911b59dabcc52e2dcad9c01679259ccfa785916aed4b1bbecdd3e699c75fb8 859 | Multi-Arch: same 860 | 861 | Package: libudev1 862 | Architecture: amd64 863 | Version: 229-4ubuntu21.28 864 | Depends: libc6 (>= 2.16) 865 | Filename: pool/main/s/systemd/libudev1_229-4ubuntu21.28_amd64.deb 866 | MD5sum: 0ec4154c8e991d5dc4d5514b68803045 867 | SHA1: 1febd2029838b4ba60b06e8ae7ea9febdde66394 868 | SHA256: 09ce81fc31dd9eded4362e0d1ee9a3aebaaf6ad0e4b9fd68602a211be83dfd99 869 | Multi-Arch: same 870 | 871 | Package: libustr-1.0-1 872 | Architecture: amd64 873 | Version: 1.0.4-5 874 | Depends: libc6 (>= 2.14) 875 | Filename: pool/main/u/ustr/libustr-1.0-1_1.0.4-5_amd64.deb 876 | MD5sum: 8a3180d1f907e884bc6be4fa71f304e0 877 | SHA1: 03d5b74c64ce4263507e7080a08b52c2606b0d76 878 | SHA256: e2b8877211e32780d76ed1361ffa16eba8cdfecd2f0e5a437ba1ea81b550869f 879 | Multi-Arch: same 880 | 881 | Package: libuuid1 882 | Architecture: amd64 883 | Version: 2.27.1-6ubuntu3.10 884 | Replaces: e2fsprogs (<< 1.34-1) 885 | Depends: passwd, libc6 (>= 2.4) 886 | Filename: pool/main/u/util-linux/libuuid1_2.27.1-6ubuntu3.10_amd64.deb 887 | MD5sum: da27b09be8faeaa777128ada7e6c9329 888 | SHA1: 7f7b7ed5939c7d8e3d729eaf4ea72b12b7d7e0f7 889 | SHA256: 2448657baae15d88d964022bd3827e9274129928ae8a9f04556866b26cf8a4dd 890 | Multi-Arch: same 891 | 892 | Package: libvpx3 893 | Architecture: amd64 894 | Version: 1.5.0-2ubuntu1.1 895 | Depends: libc6 (>= 2.14) 896 | Filename: pool/main/libv/libvpx/libvpx3_1.5.0-2ubuntu1.1_amd64.deb 897 | MD5sum: 9abcc80739adc9553eaf81a8001967d6 898 | SHA1: d2bb3c75b69c3c2a514965bf167011b27575d92a 899 | SHA256: 2b54c32aa43bc9014e485a370fa13f69e70b060b672c99671740a2138c3700d9 900 | Multi-Arch: same 901 | 902 | Package: libx11-6 903 | Architecture: amd64 904 | Version: 2:1.6.3-1ubuntu2.1 905 | Depends: libc6 (>= 2.15), libxcb1 (>= 1.2), libx11-data 906 | Filename: pool/main/libx/libx11/libx11-6_1.6.3-1ubuntu2.1_amd64.deb 907 | MD5sum: 7b3aa0f594d77ab441d2f64a8860cf4a 908 | SHA1: 42dc1199cfc557d0e48966bae8cddf51231349db 909 | SHA256: 0f0e9ae20b51d9ee4607b292a1df75da2fc03e9d92f99816945ebabbdf0b1042 910 | Multi-Arch: same 911 | 912 | Package: libx11-data 913 | Architecture: all 914 | Version: 2:1.6.3-1ubuntu2.1 915 | Breaks: libx11-6 (<< 2:1.4.1) 916 | Filename: pool/main/libx/libx11/libx11-data_1.6.3-1ubuntu2.1_all.deb 917 | MD5sum: 110193ab800440329d4b8358c2786138 918 | SHA1: 0d6db694a5f8b0a17c85743c468eec886e42b9e2 919 | SHA256: 3d4bb2733b43d7281949a31279a6c9d398987a7240fe946a19d47d9d871e0068 920 | Multi-Arch: foreign 921 | 922 | Package: libxau6 923 | Architecture: amd64 924 | Version: 1:1.0.8-1 925 | Depends: libc6 (>= 2.4) 926 | Pre-Depends: multiarch-support 927 | Filename: pool/main/libx/libxau/libxau6_1.0.8-1_amd64.deb 928 | MD5sum: af209429d197827db35c09cd232037c1 929 | SHA1: 07f54fc6d707f7744411275cce141899c7b53e8e 930 | SHA256: 881544ee71d85e89ebf224e45acc94930f6a309da2fb33dbf850bd1434e70597 931 | Multi-Arch: same 932 | 933 | Package: libxcb1 934 | Architecture: amd64 935 | Version: 1.11.1-1ubuntu1 936 | Depends: libc6 (>= 2.14), libxau6, libxdmcp6 937 | Breaks: alsa-utils (<< 1.0.24.2-5) 938 | Filename: pool/main/libx/libxcb/libxcb1_1.11.1-1ubuntu1_amd64.deb 939 | MD5sum: 7bbe1f1568c088c9ec34127fdcb6ed30 940 | SHA1: ccdd79a5ed5528a42f9dd6cd5a066ce18aa6abff 941 | SHA256: 74feef1455379608484266ad3dd9d6d2419fed7e9fba34625c04012401fc9069 942 | Multi-Arch: same 943 | 944 | Package: libxdmcp6 945 | Architecture: amd64 946 | Version: 1:1.1.2-1.1 947 | Depends: libc6 (>= 2.4) 948 | Filename: pool/main/libx/libxdmcp/libxdmcp6_1.1.2-1.1_amd64.deb 949 | MD5sum: 18b73febf5dcdcea0b2fe2b145be5388 950 | SHA1: 2b11906d6976b905bf92ccf35fa528499090fbd2 951 | SHA256: 4219784f39ab5b10d4d83789b4822b56c6926055bcad655fae5312a9d1885c2b 952 | Multi-Arch: same 953 | 954 | Package: libxml2 955 | Architecture: amd64 956 | Version: 2.9.3+dfsg1-1ubuntu0.7 957 | Depends: libc6 (>= 2.15), libicu55 (>= 55.1-1~), liblzma5 (>= 5.1.1alpha+20120614), zlib1g (>= 1:1.2.3.3) 958 | Filename: pool/main/libx/libxml2/libxml2_2.9.3+dfsg1-1ubuntu0.7_amd64.deb 959 | MD5sum: 76fcddc9904953f49401cfe85b4c36dd 960 | SHA1: 95dd70e81be3828ede6bb0dcdf9fbfc0e66a8ef1 961 | SHA256: 2a29a734f81933bc64ed06d3953622af232cff7ce5fe041621003e7fc362de1b 962 | Multi-Arch: same 963 | 964 | Package: libxpm4 965 | Architecture: amd64 966 | Version: 1:3.5.11-1ubuntu0.16.04.1 967 | Depends: libc6 (>= 2.14), libx11-6 968 | Filename: pool/main/libx/libxpm/libxpm4_3.5.11-1ubuntu0.16.04.1_amd64.deb 969 | MD5sum: 1cef98c6908b80d8f7d366669c784bac 970 | SHA1: 117f31053735bdff78841811a663b18926ad83ee 971 | SHA256: c835bf6460a2e3f6999c37f1d4e6c09d28c2e08c8029fdfb2c29e7fa57f66421 972 | Multi-Arch: same 973 | 974 | Package: libxslt1.1 975 | Architecture: amd64 976 | Version: 1.1.28-2.1ubuntu0.3 977 | Depends: libc6 (>= 2.17), libgcrypt20 (>= 1.6.0), libxml2 (>= 2.9.0) 978 | Filename: pool/main/libx/libxslt/libxslt1.1_1.1.28-2.1ubuntu0.3_amd64.deb 979 | MD5sum: e461b4e73db792b6c714a18655a35cd1 980 | SHA1: 4a079ea43921ca73b2a93f3adefef4f6e10d04de 981 | SHA256: 2d42161e57a11bd97d9352b879c68bc26799d2e7084149698bd3d657702e7c16 982 | Multi-Arch: same 983 | 984 | Package: locales 985 | Architecture: all 986 | Version: 2.23-0ubuntu11 987 | Replaces: libc-bin (<< 2.23), manpages-fr-extra (<< 20141022) 988 | Depends: libc-bin (>> 2.23), debconf (>= 0.5) | debconf-2.0 989 | Breaks: libc-bin (<< 2.23) 990 | Filename: pool/main/g/glibc/locales_2.23-0ubuntu11_all.deb 991 | MD5sum: b10a896f24604251aa733b03f1d4d24d 992 | SHA1: 3a32323b2508ceed12531256a5f1e75cfcf95830 993 | SHA256: f608236e76137c8597ca0a37779efc6c48eef89624c7e1cef0b6488097e69d54 994 | 995 | Package: login 996 | Architecture: amd64 997 | Version: 1:4.2-3.1ubuntu5.4 998 | Replaces: manpages-de (<< 0.5-3), manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) 999 | Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.14), libpam0g (>= 0.99.7.1), libpam-runtime, libpam-modules (>= 1.1.8-1) 1000 | Conflicts: amavisd-new (<< 2.3.3-8), backupninja (<< 0.9.3-5), echolot (<< 2.1.8-4), gnunet (<< 0.7.0c-2), python-4suite (<< 0.99cvs20060405-1) 1001 | Filename: pool/main/s/shadow/login_4.2-3.1ubuntu5.4_amd64.deb 1002 | MD5sum: 92b87bdc83fbeb09a1238210b4719065 1003 | SHA1: ec43149cb7fba5cf02abe3d9c8346bd54f525d4e 1004 | SHA256: ac0925ff6c7fd0489ea81b53852e027dab8a725ba5a0ce8a0d7a18c8e97ae0d3 1005 | 1006 | Package: lsb-base 1007 | Architecture: all 1008 | Version: 9.20160110ubuntu0.2 1009 | Replaces: upstart (<< 1.12.1-0ubuntu8) 1010 | Breaks: upstart (<< 1.12.1-0ubuntu8) 1011 | Filename: pool/main/l/lsb/lsb-base_9.20160110ubuntu0.2_all.deb 1012 | MD5sum: a2da9e96d14b21489ad7f363ad52f6c9 1013 | SHA1: a1c9250aeec1efc7d85a646dabc38472ccf8ac96 1014 | SHA256: c777b09ccc75be22711b20d303188d289e9bcfbc20a2c34851ba92f7ee6dc208 1015 | Multi-Arch: foreign 1016 | 1017 | Package: makedev 1018 | Architecture: all 1019 | Version: 2.3.1-93ubuntu2~ubuntu16.04.1 1020 | Depends: base-passwd (>= 3.0.4) 1021 | Conflicts: udev (<= 0.024-7) 1022 | Filename: pool/main/m/makedev/makedev_2.3.1-93ubuntu2~ubuntu16.04.1_all.deb 1023 | MD5sum: ef1dda8e9d64b8623a48d9771876a154 1024 | SHA1: 504fe1921ddda283085bf52434cbf12b1ca37c4e 1025 | SHA256: bbf14a408ecbff417e9e9d5c71ea274c215a87b0286761b64208a2f359088d1d 1026 | Multi-Arch: foreign 1027 | 1028 | Package: mawk 1029 | Architecture: amd64 1030 | Version: 1.3.3-17ubuntu2 1031 | Provides: awk 1032 | Pre-Depends: libc6 (>= 2.14) 1033 | Filename: pool/main/m/mawk/mawk_1.3.3-17ubuntu2_amd64.deb 1034 | MD5sum: ca1ecd2030a4aee73ae8d64ed7ddaba5 1035 | SHA1: ce7577c4a0692a0501a2d957af4e1be834a054bc 1036 | SHA256: c1f3ebea7ffeca3d4289284fc54e61eafa7b50f1e5fcc2c04695ee4cae1eb958 1037 | Multi-Arch: foreign 1038 | 1039 | Package: mount 1040 | Architecture: amd64 1041 | Version: 2.27.1-6ubuntu3.10 1042 | Pre-Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.17), libmount1 (>= 2.25), libsmartcols1 (>= 2.27~rc1), libudev1 (>= 183) 1043 | Filename: pool/main/u/util-linux/mount_2.27.1-6ubuntu3.10_amd64.deb 1044 | MD5sum: 716323624032f60111329a949a47c8a4 1045 | SHA1: 46127f1ca7fdce50608944f7c7016779afefbe27 1046 | SHA256: 54b6415be5172c0026c77e267b244d173a82867a81a3921ebaf4a397c22ffb43 1047 | Multi-Arch: foreign 1048 | 1049 | Package: multiarch-support 1050 | Architecture: amd64 1051 | Version: 2.23-0ubuntu11 1052 | Depends: libc6 (>= 2.3.6-2) 1053 | Filename: pool/main/g/glibc/multiarch-support_2.23-0ubuntu11_amd64.deb 1054 | MD5sum: 635069dd2f89c0824bdff884df291bf8 1055 | SHA1: a4d11a038555397b2faa46c7d08f4f71d1852434 1056 | SHA256: b21387bcab6fc0fff12573e7b48af3265618c4066efa209e83817b92f66417b6 1057 | Multi-Arch: foreign 1058 | 1059 | Package: ncurses-base 1060 | Architecture: all 1061 | Version: 6.0+20160213-1ubuntu1 1062 | Provides: ncurses-runtime 1063 | Breaks: ncurses-term (<< 5.7+20100313-3) 1064 | Filename: pool/main/n/ncurses/ncurses-base_6.0+20160213-1ubuntu1_all.deb 1065 | MD5sum: 741fdd0a709bf75c99ca4388f9c2205c 1066 | SHA1: 0334cd326e36ec372c8306cd9ed8685d619e189e 1067 | SHA256: 7e391954e99353a2d2ac351bd8e1736dccaa39453c35fd6f9f1f2a3413b6c9b9 1068 | Multi-Arch: foreign 1069 | 1070 | Package: ncurses-bin 1071 | Architecture: amd64 1072 | Version: 6.0+20160213-1ubuntu1 1073 | Pre-Depends: libc6 (>= 2.14), libtinfo5 (>= 6.0+20151017), libtinfo5 (<< 6.1~) 1074 | Filename: pool/main/n/ncurses/ncurses-bin_6.0+20160213-1ubuntu1_amd64.deb 1075 | MD5sum: b48f2e1d24f9263428975a8894efd77d 1076 | SHA1: 7c273822660bf480fdf9daa3e1ca0390c64b4442 1077 | SHA256: 56818f36b177e09d14f820d5f6b750c7f73d15027c235e81bab6b7f7a25afa72 1078 | Multi-Arch: foreign 1079 | 1080 | Package: nginx-common 1081 | Architecture: all 1082 | Version: 1.10.3-0ubuntu0.16.04.5 1083 | Replaces: nginx (<< 0.8.54-4), nginx-extras (<< 0.8.54-4), nginx-full (<< 0.8.54-4), nginx-light (<< 0.8.54-4) 1084 | Depends: lsb-base (>= 4.1+Debian11ubuntu7), debconf (>= 0.5) | debconf-2.0, init-system-helpers (>= 1.18~) 1085 | Breaks: nginx (<< 0.8.54-4), nginx-extras (<< 0.8.54-4), nginx-full (<< 0.8.54-4), nginx-light (<< 0.8.54-4) 1086 | Filename: pool/main/n/nginx/nginx-common_1.10.3-0ubuntu0.16.04.5_all.deb 1087 | MD5sum: 0d0a194df7979637a42341a2cfd1c089 1088 | SHA1: 4cca70d5a93959f64dc578ee0733a5b5d5b6d38e 1089 | SHA256: 3bf2f72178678d67f4487c88e914a70e6e7d21d023bef814fc1fe488e972a318 1090 | 1091 | Package: nginx-core 1092 | Architecture: amd64 1093 | Version: 1.10.3-0ubuntu0.16.04.5 1094 | Provides: httpd, httpd-cgi, nginx 1095 | Depends: nginx-common (= 1.10.3-0ubuntu0.16.04.5), libc6 (>= 2.14), libgd3 (>= 2.1.0~alpha~), libgeoip1, libpcre3, libssl1.0.0 (>= 1.0.2~beta3), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4) 1096 | Conflicts: nginx-extras, nginx-full, nginx-light 1097 | Breaks: nginx (<< 1.4.5-1) 1098 | Filename: pool/main/n/nginx/nginx-core_1.10.3-0ubuntu0.16.04.5_amd64.deb 1099 | MD5sum: cd2a7af6b818a6af210d9570d912f0af 1100 | SHA1: 977452f7bb5cffc97594c48794f036592c692182 1101 | SHA256: a5e76f91024e05080ab58f676fff3daef78a1cf28d7ad324387d90176da398a7 1102 | 1103 | Package: passwd 1104 | Architecture: amd64 1105 | Version: 1:4.2-3.1ubuntu5.4 1106 | Replaces: manpages-tr (<< 1.0.5), manpages-zh (<< 1.5.1-1) 1107 | Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.14), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libsemanage1 (>= 2.0.3), lsb-base (>= 4.1+Debian11ubuntu7), libpam-modules, debianutils (>= 2.15.2) 1108 | Filename: pool/main/s/shadow/passwd_4.2-3.1ubuntu5.4_amd64.deb 1109 | MD5sum: 57ba9ae720368fb39980813a754e76b8 1110 | SHA1: 51633827c553cbd30875e29f673dc2013b4caaa6 1111 | SHA256: 1a3fc2a6633088b5a596648910fc2021d3f04f56887768f2f37c603bd92db8b3 1112 | Multi-Arch: foreign 1113 | 1114 | Package: perl-base 1115 | Architecture: amd64 1116 | Version: 5.22.1-9ubuntu0.6 1117 | Replaces: libfile-path-perl (<< 2.09), libfile-temp-perl (<< 0.2304), libio-socket-ip-perl (<< 0.37), libscalar-list-utils-perl (<< 1:1.41), libsocket-perl (<< 2.018), libxsloader-perl (<< 0.20), perl (<< 5.10.1-12), perl-modules (<< 5.20.1-3) 1118 | Provides: libfile-path-perl, libfile-temp-perl, libio-socket-ip-perl, libscalar-list-utils-perl, libsocket-perl, libxsloader-perl, perlapi-5.22.1 1119 | Pre-Depends: libc6 (>= 2.23), dpkg (>= 1.17.17) 1120 | Conflicts: defoma (<< 0.11.12), doc-base (<< 0.10.3), mono-gac (<< 2.10.8.1-3), safe-rm (<< 0.8), update-inetd (<< 4.41) 1121 | Breaks: autoconf2.13 (<< 2.13-45), backuppc (<< 3.3.1-2), libalien-wxwidgets-perl (<< 0.65+dfsg-2), libanyevent-perl (<< 7.070-2), libcommon-sense-perl (<< 3.72-2~), libfile-path-perl (<< 2.09), libfile-spec-perl (<< 3.5600), libfile-temp-perl (<< 0.2304), libgtk2-perl-doc (<< 2:1.2491-4), libio-socket-ip-perl (<< 0.37), libjcode-perl (<< 2.13-3), libmarc-charset-perl (<< 1.2), libsbuild-perl (<< 0.67.0-1), libscalar-list-utils-perl (<< 1:1.41), libsocket-perl (<< 2.018), libxsloader-perl (<< 0.20), mailagent (<< 1:3.1-81-2), pdl (<< 1:2.007-4), perl (<< 5.22.1~), perl-modules (<< 5.22.1~) 1122 | Filename: pool/main/p/perl/perl-base_5.22.1-9ubuntu0.6_amd64.deb 1123 | MD5sum: 97feb21dc19ec551688659e4f9601df3 1124 | SHA1: 9b0a1205cc6595f94b035641bce197271144e421 1125 | SHA256: ad7eac4fd8ee4a2d14d1d02e689fc6170a136a372f55eec370442555576ed827 1126 | 1127 | Package: procps 1128 | Architecture: amd64 1129 | Version: 2:3.3.10-4ubuntu2.5 1130 | Provides: watch 1131 | Depends: libc6 (>= 2.15), libncurses5 (>= 6), libncursesw5 (>= 6), libprocps4, libtinfo5 (>= 6), lsb-base (>= 4.1+Debian11ubuntu7), initscripts 1132 | Conflicts: pgrep (<< 3.3-5), w-bassman (<< 1.0-3) 1133 | Breaks: guymager (<= 0.5.9-1), open-vm-tools (<= 2011.12.20-562307-1), xmem (<= 1.20-27.1) 1134 | Filename: pool/main/p/procps/procps_3.3.10-4ubuntu2.5_amd64.deb 1135 | MD5sum: 5c9e5215a8b01fb868e83cd4fb5838f2 1136 | SHA1: f55e4060bc589b89913250e091144c32e4d43a3c 1137 | SHA256: 3d13296fba462722884b9081664595a43857807359a82016759d63a1663a4fcf 1138 | Multi-Arch: foreign 1139 | 1140 | Package: sed 1141 | Architecture: amd64 1142 | Version: 4.2.2-7 1143 | Depends: dpkg (>= 1.15.4) | install-info 1144 | Pre-Depends: libc6 (>= 2.14), libselinux1 (>= 1.32) 1145 | Filename: pool/main/s/sed/sed_4.2.2-7_amd64.deb 1146 | MD5sum: cb5d3a67bb2859bc2549f1916b9a1818 1147 | SHA1: dc7e76d7a861b329ed73e807153c2dd89d6a0c71 1148 | SHA256: 0623b35cdc60f8bc74e6b31ee32ed4585433fb0bc7b99c9a62985c115dbb7f0d 1149 | Multi-Arch: foreign 1150 | 1151 | Package: sensible-utils 1152 | Architecture: all 1153 | Version: 0.0.9ubuntu0.16.04.1 1154 | Replaces: debianutils (<= 2.32.3), manpages-pl (<= 20060617-3~) 1155 | Filename: pool/main/s/sensible-utils/sensible-utils_0.0.9ubuntu0.16.04.1_all.deb 1156 | MD5sum: 2ef985dcd226e216d6397ef61367390d 1157 | SHA1: 17e7015e0f67a8ea6895562dfd496b014788bac2 1158 | SHA256: 4cef35020cd50424f6b99eb3074551bbc68090306795741c6771f0ef22e4f186 1159 | Multi-Arch: foreign 1160 | 1161 | Package: systemd 1162 | Architecture: amd64 1163 | Version: 229-4ubuntu21.28 1164 | Replaces: systemd-services, udev (<< 228-5) 1165 | Provides: systemd-services 1166 | Depends: libacl1 (>= 2.2.51-8), libapparmor1 (>= 2.9.0-3+exp2), libaudit1 (>= 1:2.2.1), libblkid1 (>= 2.19.1), libcap2 (>= 1:2.10), libcryptsetup4 (>= 2:1.4.3), libgpg-error0 (>= 1.14), libkmod2 (>= 5~), libmount1 (>= 2.26.2), libpam0g (>= 0.99.7.1), libseccomp2 (>= 2.2.3-3~), libselinux1 (>= 2.1.9), libsystemd0 (= 229-4ubuntu21.28), util-linux (>= 2.27.1), mount (>= 2.26), adduser, libcap2-bin 1167 | Pre-Depends: libc6 (>= 2.17), libgcrypt20 (>= 1.6.1), liblzma5 (>= 5.1.1alpha+20120614), libselinux1 (>= 1.32) 1168 | Conflicts: klogd, systemd-services 1169 | Breaks: apparmor (<< 2.9.2-1), ifupdown (<< 0.8.5~), lsb-base (<< 4.1+Debian4), lvm2 (<< 2.02.104-1), systemd-shim (<< 8-2), udev (<< 228-5) 1170 | Filename: pool/main/s/systemd/systemd_229-4ubuntu21.28_amd64.deb 1171 | MD5sum: a7ea1e461becda9466c1289a95b00730 1172 | SHA1: 1be4ed8c6c334e48f1a0227baac5608c6e66150c 1173 | SHA256: 6d25a25d56bb639445d47a3556d7d1a2034b619e76b2a6b681f8c27b2ce71dbc 1174 | Multi-Arch: foreign 1175 | 1176 | Package: systemd-sysv 1177 | Architecture: amd64 1178 | Version: 229-4ubuntu21.28 1179 | Replaces: sysvinit (<< 2.88dsf-44~), sysvinit-core, upstart (<< 1.13.2-0ubuntu10~), upstart-sysv 1180 | Pre-Depends: systemd 1181 | Conflicts: file-rc, openrc, sysvinit-core, upstart (<< 1.13.2-0ubuntu10~), upstart-sysv 1182 | Filename: pool/main/s/systemd/systemd-sysv_229-4ubuntu21.28_amd64.deb 1183 | MD5sum: 7c221e942f95d572d6e51849591c0954 1184 | SHA1: 552e699e6fdc3fd7e610ddc4895493ffe40a82ff 1185 | SHA256: a791f5681ad10e5b44398b0a330849165b99e7b20f2024f7f30c030b3d2c6516 1186 | Multi-Arch: foreign 1187 | 1188 | Package: sysv-rc 1189 | Architecture: all 1190 | Version: 2.88dsf-59.3ubuntu2 1191 | Depends: debconf (>= 0.5) | debconf-2.0, sysvinit-utils (>= 2.86.ds1-62), insserv (>> 1.12.0-10) 1192 | Pre-Depends: init-system-helpers (>= 1.25~) 1193 | Breaks: initscripts (<< 2.86.ds1-63), systemd (<< 215) 1194 | Filename: pool/main/s/sysvinit/sysv-rc_2.88dsf-59.3ubuntu2_all.deb 1195 | MD5sum: 21684a8162a0dc9279456e061434c6d7 1196 | SHA1: e7e80167f6b23a7d9ea1b4d37683f339052f688d 1197 | SHA256: e77cbe5bb5dfec2ac1c214fc2fd8cce6d30d50fc3302ce69773c46c5d9e43997 1198 | Multi-Arch: foreign 1199 | 1200 | Package: sysvinit-utils 1201 | Architecture: amd64 1202 | Version: 2.88dsf-59.3ubuntu2 1203 | Replaces: last, sysvinit (<= 2.86.ds1-65) 1204 | Depends: libc6 (>= 2.14), init-system-helpers (>= 1.25~) 1205 | Conflicts: chkconfig (<< 11.0-79.1-2), last, startpar (<< 0.58-2), sysvconfig 1206 | Breaks: systemd (<< 215), upstart (<< 1.5-0ubuntu5), util-linux (<< 2.26.2-3) 1207 | Filename: pool/main/s/sysvinit/sysvinit-utils_2.88dsf-59.3ubuntu2_amd64.deb 1208 | MD5sum: c46b52e0bfa0444002deffdfc8088675 1209 | SHA1: def4a33f78cfa177d1eed8ddc85c6acb272441f8 1210 | SHA256: 30c10658bc6f963db27f963257364b9b1e072fa95310f49c25c00345b321cb89 1211 | Multi-Arch: foreign 1212 | 1213 | Package: tar 1214 | Architecture: amd64 1215 | Version: 1.28-2.1ubuntu0.1 1216 | Replaces: cpio (<< 2.4.2-39) 1217 | Pre-Depends: libacl1 (>= 2.2.51-8), libc6 (>= 2.17), libselinux1 (>= 1.32) 1218 | Conflicts: cpio (<= 2.4.2-38) 1219 | Breaks: dpkg-dev (<< 1.14.26) 1220 | Filename: pool/main/t/tar/tar_1.28-2.1ubuntu0.1_amd64.deb 1221 | MD5sum: 984affa3d0dbbe9bbb9d67b005f14a8a 1222 | SHA1: 02a477abbd3123d4e4a9243a9d366b8a7bb42fa3 1223 | SHA256: 3fb4ea7c82d84d8fe7c7909b77c3c3b733bf8694492c81aadc626b953c72e7e4 1224 | Multi-Arch: foreign 1225 | 1226 | Package: tzdata 1227 | Architecture: all 1228 | Version: 2020a-0ubuntu0.16.04 1229 | Replaces: libc0.1, libc0.3, libc6, libc6.1 1230 | Provides: tzdata-stretch 1231 | Depends: debconf (>= 0.5) | debconf-2.0 1232 | Filename: pool/main/t/tzdata/tzdata_2020a-0ubuntu0.16.04_all.deb 1233 | MD5sum: 2c9dc99376393b07d595b060269808cd 1234 | SHA1: 1b7a01799160f04096b09c2216dd59dd9b59b7ca 1235 | SHA256: 6e5c4fa3cb2ce0a15f9143381343806dda79f74d3f052d1691028e6ae6ca45bb 1236 | Multi-Arch: foreign 1237 | 1238 | Package: ucf 1239 | Architecture: all 1240 | Version: 3.0036 1241 | Depends: debconf (>= 1.5.19), coreutils (>= 5.91) 1242 | Filename: pool/main/u/ucf/ucf_3.0036_all.deb 1243 | MD5sum: 69c8bd539f6f461f680bf2bc1ef33fcd 1244 | SHA1: 3c6423a767ff6f4c9fa38a00c6c3046e37642f3b 1245 | SHA256: 51d6a88fd746fe1f6f9e9933f096cf53dc42aac357600e498d038d2c775afa80 1246 | Multi-Arch: foreign 1247 | 1248 | Package: util-linux 1249 | Architecture: amd64 1250 | Version: 2.27.1-6ubuntu3.10 1251 | Replaces: bash-completion (<< 1:2.1-4.1~), initscripts (<< 2.88dsf-59.2~), mount (= 2.26.2-3), mount (= 2.26.2-3ubuntu1), sysvinit-utils (<< 2.88dsf-59.1~) 1252 | Depends: lsb-base (>= 4.1+Debian11ubuntu7), sysvinit-utils (>= 2.88dsf-59.1~) 1253 | Pre-Depends: libaudit1 (>= 1:2.2.1), libblkid1 (>= 2.25), libc6 (>= 2.15), libfdisk1 (>= 2.27~rc1), libmount1 (>= 2.25), libncursesw5 (>= 6), libpam0g (>= 0.99.7.1), libselinux1 (>= 1.32), libsmartcols1 (>= 2.27~rc1), libsystemd0, libtinfo5 (>= 6), libudev1 (>= 183), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4) 1254 | Breaks: bash-completion (<< 1:2.1-4.1~), cloud-guest-utils (<< 0.27-0ubuntu16), grml-debootstrap (<< 0.68), mac-fdisk (<< 0.1-16ubuntu3), mount (= 2.26.2-3), mount (= 2.26.2-3ubuntu1), pmac-fdisk (<< 0.1-16ubuntu3) 1255 | Filename: pool/main/u/util-linux/util-linux_2.27.1-6ubuntu3.10_amd64.deb 1256 | MD5sum: 15faa6157817c7a3a985782c1bb65a5b 1257 | SHA1: 38205357c793a3e7ff99585b0155dc6c96284cc2 1258 | SHA256: 9516e6928dc0d386eb99bcafe4d4d4ff8154d0d9c48c0685223c77c03fc514b5 1259 | Multi-Arch: foreign 1260 | 1261 | Package: zlib1g 1262 | Architecture: amd64 1263 | Version: 1:1.2.8.dfsg-2ubuntu4.3 1264 | Provides: libz1 1265 | Depends: libc6 (>= 2.14) 1266 | Conflicts: zlib1 (<= 1:1.0.4-7) 1267 | Breaks: libxml2 (<< 2.7.6.dfsg-2), texlive-binaries (<< 2009-12) 1268 | Filename: pool/main/z/zlib/zlib1g_1.2.8.dfsg-2ubuntu4.3_amd64.deb 1269 | MD5sum: d154a31d8232510776213a1f5e86f4f7 1270 | SHA1: b8e03302a8147782f6545d8275d3c11cae2c4862 1271 | SHA256: 7dc32cfa3794ee7e4ffc3698c1f7236a0b24704bc38185ef4aa5449f672bfb0f 1272 | Multi-Arch: same 1273 | 1274 | -------------------------------------------------------------------------------- /examples/nginx/configure.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | import argparse 4 | import os 5 | import sys 6 | 7 | # Needed so we don't need to add apt2ostree to PYTHONPATH for this example to 8 | # work: 9 | sys.path.append(os.path.dirname(__file__) + '/../..') 10 | from apt2ostree import Apt, Ninja, ubuntu_apt_sources 11 | 12 | 13 | def main(argv): 14 | parser = argparse.ArgumentParser() 15 | parser.add_argument("--ostree-repo", default="_build/ostree") 16 | args = parser.parse_args(argv[1:]) 17 | 18 | # Ninja() will write a build.ninja file: 19 | with Ninja(argv) as ninja: 20 | # Rebuild build.ninja if this file changes: 21 | ninja.add_generator_dep(__file__) 22 | 23 | # Ostree repo where the images will be written: 24 | ninja.variable("ostree_repo", args.ostree_repo) 25 | 26 | apt = Apt(ninja) 27 | 28 | # Build an image containing the package nginx-core and dependencies. 29 | # The ref will be deb/images/Packages.lock/configured. A lockfile will 30 | # be written to `Packages.lock`. This can be updated with 31 | # `ninja update-lockfile-Packages.lock`. 32 | image = apt.build_image("Packages.lock", ['nginx-core'], 33 | ubuntu_apt_sources("xenial")) 34 | 35 | # If run `ninja` without specifying a target our image will be built: 36 | ninja.default(image.filename) 37 | 38 | # Write a rule `update-apt-lockfiles` to update all the lockfiles (as it 39 | # is we only have the one). 40 | apt.write_phony_rules() 41 | 42 | # We write a gitignore file so we can use git-clean to remove build 43 | # artifacts that we no-longer produce: 44 | ninja.write_gitignore() 45 | 46 | 47 | if __name__ == '__main__': 48 | sys.exit(main(sys.argv)) 49 | -------------------------------------------------------------------------------- /tests/multistrap_compare/.gitignore: -------------------------------------------------------------------------------- 1 | build.ninja 2 | _build 3 | -------------------------------------------------------------------------------- /tests/multistrap_compare/apt-bootstrap/apt-bootstrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | from __future__ import print_function 4 | 5 | import apt 6 | import apt_inst 7 | import apt_pkg 8 | from argparse import ArgumentParser 9 | import atexit 10 | import errno 11 | import logging 12 | import os 13 | import shutil 14 | import stat 15 | import subprocess 16 | import sys 17 | 18 | apt_pkg.init() 19 | 20 | DEFAULT_URL = 'http://obs-master.endlessm-sf.com:82/shared/eos' 21 | DEFAULT_SUITE = 'master' 22 | DEFAULT_ARCH = 'i386' 23 | DEFAULT_PLATFORM = 'i386' 24 | DEFAULT_COMPONENTS = 'endless,core' 25 | DEFAULT_KEYRING = '/usr/share/keyrings/eos-archive-keyring.gpg' 26 | 27 | def makedirs(name, mode=0o777, exist_ok=False): 28 | try: 29 | os.makedirs(name, mode) 30 | except OSError as err: 31 | if not exist_ok or err.errno != errno.EEXIST: 32 | raise 33 | 34 | class PriorityFilter(apt.cache.Filter): 35 | def __init__(self, priority): 36 | super(PriorityFilter, self).__init__() 37 | if priority not in ['essential', 'required', 'important']: 38 | raise Exception('Unrecognized priority %s' % self.priority) 39 | self.priority = priority 40 | 41 | def apply(self, pkg): 42 | if self.priority == 'essential': 43 | return pkg.essential 44 | return pkg.candidate.priority.lower() == self.priority 45 | 46 | class AptBootstrap(object): 47 | NEEDED_DIRS = ['etc/apt/apt.conf.d', 'etc/apt/preferences.d', 48 | 'etc/apt/trusted.gpg.d', 'var/lib/apt/lists/partial', 49 | 'var/cache/apt/archives/partial', 'var/log/apt', 50 | 'var/lib/dpkg', 'var/lib/dpkg/updates', 51 | 'var/lib/dpkg/info'] 52 | 53 | def __init__(self, path, suite=DEFAULT_SUITE, url=DEFAULT_URL, 54 | components=DEFAULT_COMPONENTS, arch=None, 55 | packages=[], keyring=None, required=True, 56 | important=True, recommends=True, debug=False, 57 | dry_run=False): 58 | self.path = os.path.abspath(path) 59 | self.suite = suite 60 | self.url = url 61 | self.components = components.split(',') 62 | self.arch = arch 63 | self.packages = packages 64 | self.keyring = keyring 65 | self.required = required 66 | self.important = important 67 | self.recommends = recommends 68 | self.debug = debug 69 | self.dry_run = dry_run 70 | 71 | self.mounts = [] 72 | atexit.register(self.umount_all) 73 | 74 | # Use current arch if none specified 75 | if self.arch is None: 76 | self.arch = apt_pkg.get_architectures()[0] 77 | logging.info('Using architecture %s' % self.arch) 78 | 79 | # Use EOS keyring if it exists and none specified 80 | if self.keyring is None and os.path.exists(DEFAULT_KEYRING): 81 | self.keyring = DEFAULT_KEYRING 82 | logging.info('Using keyring %s' % self.keyring) 83 | 84 | # Create needed directories 85 | for dir in self.NEEDED_DIRS: 86 | makedirs(os.path.join(self.path, dir), exist_ok=True) 87 | 88 | # Create sources.list 89 | sources_list = os.path.join(self.path, 'etc/apt/sources.list') 90 | if not os.path.exists(sources_list): 91 | with open(sources_list, 'w') as f: 92 | f.write('deb %s %s %s\n' %(self.url, self.suite, 93 | ' '.join(self.components))) 94 | 95 | # Create empty dpkg status so it looks like there are no 96 | # packages installed 97 | self.dpkg_status = os.path.join(self.path, 'var/lib/dpkg/status') 98 | if not os.path.exists(self.dpkg_status): 99 | with open(self.dpkg_status, 'w') as f: 100 | pass 101 | 102 | # Satisfy runtime by creating dpkg available file. Apparently 103 | # dpkg doesn't do this by itself, but debootstrap does. 104 | dpkg_available = os.path.join(self.path, 105 | 'var/lib/dpkg/available') 106 | with open(dpkg_available, 'a'): 107 | pass 108 | 109 | # Setup configuration 110 | apt_pkg.config.set('APT::Architecture', self.arch) 111 | apt_pkg.config.set('Dir', self.path) 112 | apt_pkg.config.set('DPkg::Chroot-Directory', self.path) 113 | apt_pkg.config.set('Dir::State::status', self.dpkg_status) 114 | apt_pkg.config.set('APT::Install-Recommends', 115 | str(self.recommends)) 116 | apt_pkg.config.set('Dpkg::Options::', '--force-unsafe-io') 117 | 118 | # Keyring configuration 119 | self.target_keyring = os.path.join( 120 | self.path, 'etc/apt/trusted.gpg.d/apt-bootstrap.gpg') 121 | if self.keyring is not None: 122 | if not os.path.exists(self.target_keyring): 123 | print('Installing temporary keyring', 124 | self.target_keyring) 125 | shutil.copy(self.keyring, self.target_keyring) 126 | else: 127 | # If no keyring is provided, package verification will fail 128 | apt_pkg.config.set('APT::Get::AllowUnauthenticated', 'true') 129 | 130 | # Debug configuration 131 | if self.debug: 132 | apt_pkg.config.set('Debug::pkgDepCache::AutoInstall', 'true') 133 | apt_pkg.config.set('Debug::pkgProblemResolver', 'true') 134 | apt_pkg.config.set('Debug::pkgInitConfig', 'true') 135 | #apt_pkg.config.set('Debug::pkgDPkgPM', 'true') 136 | 137 | # Avoid saving these logs inside the chroot (debootstrap results 138 | # don't include these either) 139 | apt_pkg.config.set('Dir::Log::Terminal', '') 140 | apt_pkg.config.set('Dir::Log::Planner', '') 141 | 142 | self.acquire_progress = \ 143 | apt.progress.text.AcquireProgress(outfile=sys.stderr) 144 | self.op_progress = \ 145 | apt.progress.text.OpProgress(outfile=sys.stderr) 146 | self.cache = apt.Cache(progress=self.op_progress) 147 | self.archive_dir = apt_pkg.config.find_dir('Dir::Cache::archives') 148 | 149 | def mount(self, *args): 150 | target = args[-1] 151 | if os.path.ismount(target): 152 | logging.warning('%s is already mounted' % target) 153 | return 154 | logging.info('Mounting %s' % target) 155 | makedirs(target, exist_ok=True) 156 | subprocess.check_call(['mount'] + list(args)) 157 | self.mounts.append(target) 158 | 159 | def umount(self, target): 160 | for index, value in enumerate(self.mounts): 161 | if value == target: 162 | logging.info('Unmounting %s' % target) 163 | subprocess.check_call(['umount', target]) 164 | del self.mounts[index] 165 | return 166 | 167 | # Not found 168 | raise Exception('%s was not mounted from here' % target) 169 | 170 | def umount_all(self): 171 | while len(self.mounts) > 0: 172 | target = self.mounts[-1] 173 | logging.info('Unmounting %s' % target) 174 | subprocess.check_call(['umount', target]) 175 | self.mounts.pop() 176 | 177 | def __del__(self): 178 | self.umount_all() 179 | 180 | def update(self): 181 | self.cache.update(self.acquire_progress) 182 | self.cache.open(progress=self.op_progress) 183 | 184 | def mark_all_packages(self): 185 | self.mark_priority_packages('essential') 186 | if self.required: 187 | self.mark_priority_packages('required') 188 | if self.important: 189 | self.mark_priority_packages('important') 190 | self.mark_requested_packages() 191 | 192 | def mark_priority_packages(self, priority): 193 | with self.cache.actiongroup(): 194 | print('Adding', priority, 'packages', file=sys.stderr) 195 | packages = apt.cache.FilteredCache(self.cache) 196 | packages.set_filter(PriorityFilter(priority)) 197 | for pkg in packages: 198 | logging.debug('Adding %s package %s' % (priority, pkg.name)) 199 | pkg.mark_install() 200 | 201 | # HACK - we should make this a hard dependency of debconf 202 | if priority == 'essential': 203 | self.cache['apt-utils'].mark_install() 204 | 205 | def mark_requested_packages(self): 206 | with self.cache.actiongroup(): 207 | print('Adding requested packages', file=sys.stderr) 208 | for name in self.packages: 209 | pkg = self.cache[name] 210 | logging.debug('Adding requested package %s' % pkg.name) 211 | pkg.mark_install() 212 | 213 | def get_packages(self): 214 | packages = {} 215 | for pkg in self.cache.get_changes(): 216 | # If this is a multi-arch package, use the fullname with the 217 | # architecture to match output from dpkg-query. 218 | multi_arch = pkg.candidate.record.get('Multi-Arch', '') 219 | if multi_arch == 'same': 220 | name = pkg.fullname 221 | else: 222 | name = pkg.shortname 223 | version = pkg.candidate.version 224 | packages[name] = version 225 | return packages 226 | 227 | def extract_member(self, member, data): 228 | if len(data) != member.size: 229 | raise Exception('%s data length %d != size %d' 230 | %(member.name, len(data), member.size)) 231 | logging.debug('Extracting %s' % member.name) 232 | dest = os.path.join(self.path, member.name) 233 | makedirs(os.path.dirname(dest), exist_ok=True) 234 | if member.isfile(): 235 | with open(dest, 'wb') as f: 236 | f.write(data) 237 | elif member.isdir(): 238 | makedirs(dest, exist_ok=True) 239 | elif member.issym(): 240 | os.symlink(member.linkname, dest) 241 | elif member.islnk(): 242 | os.link(os.path.join(self.path, member.linkname), dest) 243 | elif member.isdev(): 244 | if member.ischr(): 245 | mode = member.mode | stat.S_IFCHR 246 | device = os.makedev(member.major, member.minor) 247 | elif member.isblk(): 248 | mode = member.mode | stat.S_IFBLK 249 | device = os.makedev(member.major, member.minor) 250 | elif member.isfifo(): 251 | mode = member.mode | stat.S_IFIFO 252 | device = 0 253 | else: 254 | raise Exception('Unexpected device member %s' % member.name) 255 | os.mknod(dest, mode=mode, device=device) 256 | else: 257 | raise Exception("Don't know how to handle %s" % member.name) 258 | 259 | os.lchown(dest, member.uid, member.gid) 260 | if not member.issym(): 261 | os.chmod(dest, member.mode) 262 | os.utime(dest, (member.mtime, member.mtime)) 263 | 264 | def archive_path(self, pkg): 265 | candidate = pkg.candidate 266 | base = '%s_%s_%s.deb' %(pkg.name, 267 | apt_pkg.quote_string(candidate.version, ':'), 268 | candidate.architecture) 269 | return os.path.join(self.archive_dir, base) 270 | 271 | def fake_install(self, pkg): 272 | name = pkg.name 273 | version = pkg.candidate.version 274 | 275 | logging.debug('Faking installation of %s' % name) 276 | with open(self.dpkg_status, 'w+') as f: 277 | f.writelines(['Package: %s\n' % name, 278 | 'Version: %s\n' % version, 279 | 'Maintainer: unknown\n', 280 | 'Status: install ok installed\n\n']) 281 | 282 | info = os.path.join(self.path, 'var/lib/dpkg/info', 283 | name + '.list') 284 | with open(info, 'w+') as f: 285 | pass 286 | 287 | def dpkg_install(self, pkg): 288 | archive = self.archive_path(pkg) 289 | target_archive = os.path.join('/', os.path.relpath(archive, 290 | self.path)) 291 | cmd = ['chroot', self.path, 'dpkg', '--install', 292 | '--force-depends', '--force-unsafe-io', target_archive] 293 | logging.debug('Using dpkg to install %s' % pkg.name) 294 | subprocess.check_call(cmd) 295 | 296 | def dpkg_unpack(self, pkg): 297 | archive = self.archive_path(pkg) 298 | target_archive = os.path.join('/', os.path.relpath(archive, 299 | self.path)) 300 | cmd = ['chroot', self.path, 'dpkg', '--unpack', 301 | '--force-depends', '--force-unsafe-io', target_archive] 302 | logging.debug('Using dpkg to unpack %s' % pkg.name) 303 | subprocess.check_call(cmd) 304 | 305 | def dpkg_configure_pending(self): 306 | cmd = ['chroot', self.path, 'dpkg', '--configure', 307 | '--force-depends', '--pending', '--force-configure-any', 308 | '--force-unsafe-io'] 309 | logging.debug('Using dpkg to configure packages') 310 | subprocess.check_call(cmd) 311 | 312 | def makedev(self): 313 | """Create /dev files like debootstrap""" 314 | # Device files 315 | nodes = [('full', 0, 0, 0o666, stat.S_IFCHR, 1, 7), 316 | ('null', 0, 0, 0o666, stat.S_IFCHR, 1, 3), 317 | ('random', 0, 0, 0o666, stat.S_IFCHR, 1, 8), 318 | ('tty', 0, 5, 0o666, stat.S_IFCHR, 5, 0), 319 | ('urandom', 0, 0, 0o666, stat.S_IFCHR, 1, 9), 320 | ('zero', 0, 0, 0o666, stat.S_IFCHR, 1, 5)] 321 | 322 | # Symlinks 323 | links = [('fd', '/proc/self/fd'), 324 | ('stderr', 'fd/2'), 325 | ('stdin', 'fd/0'), 326 | ('stdout', 'fd/1')] 327 | 328 | makedirs(os.path.join(self.path, 'dev', 'shm'), exist_ok=True) 329 | makedirs(os.path.join(self.path, 'dev', 'pts'), exist_ok=True) 330 | for node in nodes: 331 | path = os.path.join(self.path, 'dev', node[0]) 332 | if not os.path.exists(path): 333 | logging.info('Creating device node %s' % path) 334 | os.mknod(path, node[4], os.makedev(node[5], node[6])) 335 | os.chmod(path, node[3]) 336 | os.chown(path, node[1], node[2]) 337 | for link in links: 338 | path = os.path.join(self.path, 'dev', link[0]) 339 | if not os.path.exists(path): 340 | logging.info('Creating dev symlink %s' % path) 341 | os.symlink(link[1], path) 342 | 343 | # Inside a container, we might not be allowed to create /dev/ptmx. 344 | # If not, do the next best thing. 345 | path = os.path.join(self.path, 'dev', 'ptmx') 346 | try: 347 | os.mknod(path, stat.S_IFCHR, os.makedev(5, 2)) 348 | except OSError: 349 | logging.warning("Could not create /dev/ptmx, falling back to " \ 350 | "symlink. This chroot will require /dev/pts " \ 351 | "mounted with ptmxmode=666") 352 | os.symlink('pts/ptmx', path) 353 | 354 | def stage1(self): 355 | # Create merged /usr directories 356 | for dir in ['bin', 'lib', 'sbin', 'lib64']: 357 | link = os.path.join(self.path, dir) 358 | usrdir = os.path.join(self.path, 'usr', dir) 359 | makedirs(usrdir, exist_ok=True) 360 | if os.path.exists(link): 361 | if not os.path.islink(link): 362 | raise Exception('%s exists but is not a symlink' % link) 363 | os.unlink(link) 364 | os.symlink(os.path.join('usr', dir), os.path.join(self.path, dir)) 365 | 366 | # Mirror /usr merge to /usr/lib/debug directory 367 | usrdir = os.path.join(self.path, 'usr', 'lib', 'debug', 'usr', dir) 368 | link = os.path.join(self.path, 'usr', 'lib', 'debug', dir) 369 | makedirs(usrdir, exist_ok=True) 370 | if os.path.exists(link): 371 | if not os.path.islink(link): 372 | raise Exception('%s exists but is not a symlink' % link) 373 | os.unlink(link) 374 | os.symlink(os.path.join('usr', dir), 375 | os.path.join(self.path, 'usr', 'lib', 'debug', dir)) 376 | 377 | self.mark_priority_packages('essential') 378 | 379 | self.cache.fetch_archives(self.acquire_progress) 380 | for pkg in self.cache.get_changes(): 381 | # Manually extract the debs 382 | archive = self.archive_path(pkg) 383 | deb = apt_inst.DebFile(archive) 384 | logging.info('Extracting %s' % pkg.name) 385 | deb.data.go(self.extract_member) 386 | 387 | self.fake_install(self.cache['dpkg']) 388 | 389 | def stage2(self): 390 | os.environ['LC_ALL'] = 'C' 391 | os.environ['DEBIAN_FRONTEND'] = 'noninteractive' 392 | 393 | self.makedev() 394 | self.mount('-t', 'proc', 'proc', os.path.join(self.path, 'proc')) 395 | self.mount('-t', 'sysfs', 'sysfs', os.path.join(self.path, 'sys')) 396 | self.mount('--bind', '/tmp', os.path.join(self.path, 'tmp')) 397 | 398 | # Random prep copied from debootstrap 399 | subprocess.check_call(['chroot', self.path, '/sbin/ldconfig']) 400 | if not os.path.exists(os.path.join(self.path, 'usr/bin/awk')): 401 | os.symlink('mawk', os.path.join(self.path, 'usr/bin/awk')) 402 | if not os.path.exists(os.path.join(self.path, 'etc/localtime')): 403 | os.symlink('/usr/share/zoneinfo/UTC', 404 | os.path.join(self.path, 'etc/localtime')) 405 | 406 | print('Installing bootstrap packages') 407 | early_packages = ['base-passwd', 'base-files', 'dpkg', 'libc6', 408 | 'perl-base', 'mawk', 'debconf', 'debianutils', 409 | 'passwd'] 410 | for pkgname in early_packages: 411 | self.dpkg_install(self.cache[pkgname]) 412 | 413 | print('Unpacking essential packages') 414 | for pkg in self.cache.get_changes(): 415 | self.dpkg_unpack(pkg) 416 | 417 | # Make sure we don't start any daemons in the chroot 418 | start_stop_daemon = os.path.join(self.path, 419 | 'sbin/start-stop-daemon') 420 | if os.path.exists(start_stop_daemon): 421 | os.rename(start_stop_daemon, start_stop_daemon + '.REAL') 422 | os.symlink('/bin/true', start_stop_daemon) 423 | policy_rc_d = os.path.join(self.path, 'usr/sbin/policy-rc.d') 424 | with open(policy_rc_d, 'w') as f: 425 | f.writelines(['#!/bin/sh\n', 426 | 'exit 101\n']) 427 | os.chmod(policy_rc_d, 0o755) 428 | 429 | print('Configuring essential packages') 430 | self.dpkg_configure_pending() 431 | 432 | # Re-open the cache to get updated dpkg status 433 | self.cache.open(progress=self.op_progress) 434 | if self.required: 435 | self.mark_priority_packages('required') 436 | if self.important: 437 | self.mark_priority_packages('important') 438 | self.mark_requested_packages() 439 | 440 | print('Installing remaining packages') 441 | self.cache.commit(fetch_progress=self.acquire_progress) 442 | 443 | # Restore daemon control tools 444 | if os.path.exists(start_stop_daemon + '.REAL'): 445 | os.unlink(start_stop_daemon) 446 | os.rename(start_stop_daemon + '.REAL', start_stop_daemon) 447 | os.unlink(policy_rc_d) 448 | 449 | self.umount(os.path.join(self.path, 'sys')) 450 | self.umount(os.path.join(self.path, 'proc')) 451 | self.umount(os.path.join(self.path, 'tmp')) 452 | 453 | def bootstrap(self): 454 | self.update() 455 | 456 | if args.dry_run: 457 | self.mark_all_packages() 458 | packages = self.get_packages() 459 | for pkg, ver in sorted(packages.items()): 460 | print(pkg, ver, sep='\t') 461 | return 462 | 463 | self.stage1() 464 | self.stage2() 465 | 466 | # Remove temporary keyring 467 | if os.path.exists(self.target_keyring): 468 | print('Removing temporary keyring', self.target_keyring) 469 | os.unlink(self.target_kerying) 470 | 471 | print('Installation complete') 472 | 473 | if __name__ == '__main__': 474 | aparser = ArgumentParser(description='Bootstrap system with APT') 475 | aparser.add_argument('-n', '--dry-run', action='store_true', 476 | help='print packages and exit') 477 | aparser.add_argument('-a', '--arch', help='target architecture') 478 | aparser.add_argument('--components', default=DEFAULT_COMPONENTS, 479 | help='components from archive to use') 480 | aparser.add_argument('--packages', default='', 481 | help='packages to include') 482 | aparser.add_argument('--keyring', help='keyring for verification') 483 | aparser.add_argument('--required', action='store_true', 484 | default=True, help='enable required packages') 485 | aparser.add_argument('--no-required', dest='required', 486 | action='store_false', 487 | help='disable required packages') 488 | aparser.add_argument('--important', action='store_true', 489 | default=True, help='enable important packages') 490 | aparser.add_argument('--no-important', dest='important', 491 | action='store_false', 492 | help='disable important packages') 493 | aparser.add_argument('--recommends', action='store_true', 494 | default=True, help='enable package recommends') 495 | aparser.add_argument('--no-recommends', dest='recommends', 496 | action='store_false', 497 | help='disable package recommends') 498 | aparser.add_argument('-v', '--verbose', action='store_true', 499 | help='enable verbose output') 500 | aparser.add_argument('--debug', action='store_true', 501 | help='enable debugging output') 502 | aparser.add_argument('SUITE', help='archive branch') 503 | aparser.add_argument('TARGET', help='path to bootstrap') 504 | aparser.add_argument('MIRROR', nargs='?', default=DEFAULT_URL, 505 | help='archive URL') 506 | args = aparser.parse_args() 507 | 508 | loglevel = logging.WARNING 509 | if args.verbose: 510 | loglevel = logging.INFO 511 | if args.debug: 512 | loglevel = logging.DEBUG 513 | logging.basicConfig(format='%(module)s: %(levelname)s: %(message)s', 514 | level=loglevel) 515 | 516 | packages = [] 517 | args.packages = args.packages.strip() 518 | if len(args.packages) > 0: 519 | packages = args.packages.split(',') 520 | 521 | bootstrap = AptBootstrap(args.TARGET, args.SUITE, args.MIRROR, 522 | components=args.components, 523 | arch=args.arch, 524 | packages=packages, 525 | keyring=args.keyring, 526 | required=args.required, 527 | important=args.important, 528 | recommends=args.recommends, 529 | debug=args.debug, 530 | dry_run=args.dry_run) 531 | bootstrap.bootstrap() 532 | -------------------------------------------------------------------------------- /tests/multistrap_compare/configure.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | """ 4 | Configure script to build images from multistrap configs. This supports an 5 | ill-defined subset of multistrap configuration files. Multiple multistrap 6 | configuration files can be provided at one time and an image will be built for 7 | each. 8 | 9 | Usage: 10 | 11 | ./multistrap.py --ostree-repo=repo multistrap.conf 12 | 13 | # Create the packages lockfiles: 14 | ninja update-apt-lockfiles 15 | 16 | # There will now be a file called multistrap.conf.lock which you can check 17 | # into your source control system 18 | 19 | # Build the image(s) 20 | ninja 21 | 22 | # Inspect the built image: 23 | ostree --repo=repo ls -R refs/deb/images/multistrap.conf/configured 24 | """ 25 | 26 | import argparse 27 | import os 28 | import sys 29 | from collections import namedtuple 30 | from configparser import NoOptionError, SafeConfigParser 31 | 32 | sys.path.append(os.path.dirname(__file__) + '/../..') 33 | from apt2ostree import Apt, AptSource, Ninja, Rule 34 | from apt2ostree.multistrap import multistrap, read_multistrap_config 35 | from apt2ostree.ostree import ostree, OstreeRef 36 | import apt2ostree.apt 37 | 38 | 39 | def main(argv): 40 | parser = argparse.ArgumentParser() 41 | parser.add_argument("--ostree-repo", default="_build/ostree") 42 | args = parser.parse_args(argv[1:]) 43 | 44 | config_files = ['multistrap.conf'] 45 | 46 | with Ninja(argv) as ninja: 47 | ninja.add_generator_dep(__file__) 48 | 49 | ninja.variable("ostree_repo", os.path.relpath(args.ostree_repo)) 50 | ostree.build(ninja) 51 | 52 | apt = Apt(ninja) 53 | for cfg in config_files: 54 | ours = multistrap(cfg, ninja, apt) 55 | orig = real_multistrap(cfg, ninja, apt) 56 | aptbs = apt_bootstrap(cfg, ninja) 57 | diff1 = ostree_diff.build( 58 | ninja, left=orig.stage_1.ref, right=ours.stage_1.ref)[0] 59 | diff2 = ostree_diff.build( 60 | ninja, left=aptbs.ref, right=ours.stage_1.ref)[0] 61 | bwrap_enter.build(ninja, ref=ours.ref) 62 | bwrap_enter.build(ninja, ref=orig.ref) 63 | bwrap_enter.build(ninja, ref=aptbs.ref) 64 | ninja.build("diff", "phony", inputs=[diff1, diff2]) 65 | 66 | ninja.default("diff") 67 | 68 | apt.write_phony_rules() 69 | 70 | # We write a gitignore file so we can use git-clean to remove build 71 | # artifacts that we no-longer produce: 72 | ninja.write_gitignore() 73 | 74 | 75 | # This can be used to compare images built with different systems: 76 | ostree_diff = Rule("ostree_diff", """\ 77 | ostree --repo=$ostree_repo diff $left $right; 78 | bash -xc 'diff -u <(ostree --repo=$ostree_repo ls -R $left) 79 | <(ostree --repo=$ostree_repo ls -R $right)';""", 80 | outputs=["diff-$left-$right"], 81 | inputs=["$ostree_repo/refs/heads/$left", 82 | "$ostree_repo/refs/heads/$right"], 83 | implicit=['.FORCE'], 84 | order_only=["$ostree_repo/config"]) 85 | 86 | 87 | # This is useful for interactive exploration of the built images: 88 | bwrap_enter = Rule("bwrap_enter", """\ 89 | set -ex; 90 | mkdir -p $builddir/tmp/bwrap_enter; 91 | TARGET=$builddir/tmp/bwrap_enter/$$(echo $ref | sed s,/,-,g); 92 | sudo rm -rf "$$TARGET"; 93 | sudo ostree --repo=$ostree_repo checkout --force-copy $ref $$TARGET; 94 | sudo bwrap --bind $$TARGET / --proc /proc --dev /dev --tmpfs /tmp 95 | --tmpfs /run --setenv LANG C.UTF-8 96 | --ro-bind /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static 97 | --ro-bind "$$(readlink -f /etc/resolv.conf)" /etc/resolv.conf 98 | bash -i; 99 | """, pool="console", 100 | inputs=["$ostree_repo/refs/heads/$ref", '.FORCE'], 101 | outputs="bwrap_enter-$ref") 102 | 103 | 104 | _real_multistrap = Rule("real_multistrap", """\ 105 | TARGET="$builddir/tmp/multistrap/$name"; 106 | rm -rf $$TARGET; 107 | set -ex; 108 | mkdir -p "$$TARGET/etc/apt"; 109 | cp ubuntu-archive-keyring.gpg "$$TARGET/etc/apt/trusted.gpg"; 110 | fakeroot multistrap -d $$TARGET -f $in; 111 | rm $$TARGET/var/cache/apt/archives/*.deb; 112 | fakeroot tar -C $$TARGET -c . | 113 | ostree --repo=$ostree_repo commit --orphan -b multistrap/$name/unpacked 114 | --no-bindings --tree=tar=/dev/stdin; 115 | rm -rf $$TARGET; 116 | """, 117 | outputs=['$ostree_repo/refs/heads/multistrap/$name/unpacked'], 118 | implicit=['ubuntu-archive-keyring.gpg']) 119 | 120 | 121 | def real_multistrap(config_file, ninja, apt): 122 | cfg = read_multistrap_config(ninja, config_file) 123 | 124 | stage_1 = OstreeRef(_real_multistrap.build( 125 | ninja, inputs=[config_file], name=config_file.replace('/', '-'))[0]) 126 | 127 | stage_2 = OstreeRef(apt.second_stage( 128 | stage_1, architecture=cfg.apt_source.architecture, 129 | branch=stage_1.ref.replace('unpacked', 'complete'))[0]) 130 | stage_2.stage_1 = stage_1 131 | return stage_2 132 | 133 | 134 | _apt_bootstrap = Rule("apt_bootstrap", """\ 135 | TARGET="$builddir/tmp/apt_bootstrap/$$(systemd-escape $branch)"; 136 | rm -rf $$TARGET; 137 | set -ex; 138 | ./apt-bootstrap/apt-bootstrap -a "$architecture" --components "$components" 139 | --packages "$packages" --keyring "$keyring" --required --important 140 | --no-recommends "$distribution" "$$TARGET" "$archive_url"; 141 | fakeroot tar -C $$TARGET -c . | 142 | ostree --repo=$ostree_repo commit --orphan -b $branch 143 | --no-bindings --tree=tar=/dev/stdin; 144 | """, outputs="$ostree_repo/refs/heads/$branch") 145 | 146 | 147 | def apt_bootstrap(config_file, ninja): 148 | apt_source, packages = read_multistrap_config(ninja, config_file) 149 | return OstreeRef(_apt_bootstrap.build( 150 | ninja, archive_url=apt_source.archive_url, 151 | distribution=apt_source.distribution, 152 | architecture=apt_source.architecture, 153 | components=apt_source.components, 154 | packages=packages, keyring='ubuntu-archive-keyring.gpg', 155 | branch="apt_bootstrap/%s/complete" % config_file)[0]) 156 | 157 | 158 | if __name__ == '__main__': 159 | sys.exit(main(sys.argv)) 160 | -------------------------------------------------------------------------------- /tests/multistrap_compare/multistrap.conf: -------------------------------------------------------------------------------- 1 | [General] 2 | arch=armhf 3 | # same as --tidy-up option if set to true 4 | cleanup=false 5 | # same as --no-auth option if set to true 6 | # keyring packages listed in each bootstrap will 7 | # still be installed. 8 | noauth=false 9 | # extract all downloaded archives (default is true) 10 | unpack=true 11 | # enable MultiArch for the specified architectures 12 | # default is empty 13 | multiarch= 14 | # aptsources is a list of sections to be used for downloading packages 15 | # and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list 16 | # of the target. Order is not important 17 | aptsources=Ubuntu 18 | # the order of sections is not important. 19 | # the bootstrap option determines which repository 20 | # is used to calculate the list of Priority: required packages. 21 | bootstrap=Ubuntu 22 | 23 | [Ubuntu] 24 | packages=apt systemd 25 | source=http://ports.ubuntu.com/ubuntu-ports 26 | keyring= 27 | suite=xenial 28 | components=main universe 29 | -------------------------------------------------------------------------------- /tests/multistrap_compare/ubuntu-archive-keyring.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stb-tester/apt2ostree/1f20336b96c27f1dce9a6cdebae285e1d6990bf6/tests/multistrap_compare/ubuntu-archive-keyring.gpg --------------------------------------------------------------------------------