Files
doos/src/image.hpp
T

64 lines
2.1 KiB
C++

#pragma once
#include <cstdint>
#include <filesystem>
#include <optional>
#include <string>
#include <vector>
#include "idmap.hpp"
namespace doos {
// Where an image comes from, after resolving a catalog name, URL or file.
struct ImageSource {
std::string name; // store name
std::string location; // https URL or local file path
std::string sha256; // expected, empty only for local files
bool isFile = false;
// Optional detached signature over the downloaded file; the key is fetched and must match the pinned fingerprint.
std::string sigUrl;
std::string keyUrl;
std::string keyFpr;
};
struct ImageInfo {
std::string name;
std::string source;
IdMode ids = IdMode::Single;
long created = 0;
std::uint64_t bytes = 0;
};
// Built-in sources: alpine, ubuntu (latest LTS), ubuntu-VERSION, debian, debian-RELEASE. Resolved from the
// publishers over https; Alpine and Ubuntu are also checked against their pinned release signing keys.
class Catalog {
public:
static std::vector<std::string> names();
static bool knows(const std::string& imageName);
static ImageSource resolve(const std::string& imageName);
};
class ImageStore {
public:
explicit ImageStore(std::filesystem::path root);
static std::string normalize(const std::string& name); // "ubuntu:24.04" -> "ubuntu-24.04"
static void validateName(const std::string& name);
bool has(const std::string& name) const;
std::filesystem::path rootfs(const std::string& name) const;
IdMode ids(const std::string& name) const;
std::vector<ImageInfo> list() const;
// Downloads (catalog/URL) or reads (file), verifies the sha256, extracts under the id map.
ImageInfo add(const ImageSource& src, IdMode ids);
// Dry run unless confirmed. `usedBy` lists containers referencing the image; non-empty refuses.
std::string remove(const std::string& name, bool confirmed, const std::vector<std::string>& usedBy);
private:
std::filesystem::path dir(const std::string& name) const { return root_ / name; }
std::filesystem::path root_;
};
} // namespace doos