File: offline.hpp

package info (click to toggle)
dnf5 5.4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,960 kB
  • sloc: cpp: 94,312; python: 3,370; xml: 1,073; ruby: 600; sql: 250; ansic: 232; sh: 104; perl: 62; makefile: 30
file content (146 lines) | stat: -rw-r--r-- 6,122 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright Contributors to the DNF5 project.
// Copyright (C) 2024 Red Hat, Inc.
// SPDX-License-Identifier: LGPL-2.0-or-later
//
// This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
//
// Libdnf is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// Libdnf is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with libdnf.  If not, see <https://www.gnu.org/licenses/>.

#ifndef LIBDNF5_TRANSACTION_OFFLINE_HPP
#define LIBDNF5_TRANSACTION_OFFLINE_HPP

#include "libdnf5/conf/const.hpp"
#include "libdnf5/defs.h"

#include <filesystem>
#include <memory>

namespace libdnf5::offline {

// Unique identifiers used to mark and identify system-upgrade boots in
// journald logs. These are the same as they are in `dnf4 system-upgrade`, so
// `dnf5 offline log` will find offline transactions performed by DNF 4 and
// vice-versa.
const std::string REBOOT_REQUESTED_ID{"9348174c5cc74001a71ef26bd79d302e"};
const std::string OFFLINE_STARTED_ID{"3e0a5636d16b4ca4bbe5321d06c6aa62"};
const std::string OFFLINE_FINISHED_ID{"8cec00a1566f4d3594f116450395f06c"};

const std::string STATUS_DOWNLOAD_INCOMPLETE{"download-incomplete"};
const std::string STATUS_DOWNLOAD_COMPLETE{"download-complete"};
const std::string STATUS_READY{"ready"};
const std::string STATUS_TRANSACTION_INCOMPLETE{"transaction-incomplete"};

// This value comes from systemd, see
// https://www.freedesktop.org/wiki/Software/systemd/SystemUpdates or
// systemd.offline-updates(7).
const std::filesystem::path MAGIC_SYMLINK{"/system-update"};

const std::filesystem::path DEFAULT_DATADIR{std::filesystem::path(libdnf5::SYSTEM_STATE_DIR) / "offline"};
const std::filesystem::path DEFAULT_DESTDIR{std::filesystem::path(libdnf5::PERSISTDIR) / "offline"};
const std::filesystem::path TRANSACTION_STATE_FILENAME{"offline-transaction-state.toml"};

class OfflineTransactionState;

/// Data of the initiated offline transaction state, by default stored in the
/// /usr/lib/sysimage/libdnf5/offline/offline-transaction-state.toml file.
struct LIBDNF_API OfflineTransactionStateData {
public:
    friend OfflineTransactionState;

    OfflineTransactionStateData();
    ~OfflineTransactionStateData();

    OfflineTransactionStateData(const OfflineTransactionStateData & src);
    OfflineTransactionStateData & operator=(const OfflineTransactionStateData & src);

    OfflineTransactionStateData(OfflineTransactionStateData && src) noexcept;
    OfflineTransactionStateData & operator=(OfflineTransactionStateData && src) noexcept;

    /// Set the transaction state data file version
    void set_state_version(int state_version);
    int get_state_version() const;

    /// Set current offline transaction status. One of download-incomplete,
    /// download-complete, ready, or transaction-incomplete.
    void set_status(const std::string & status);
    const std::string & get_status() const;

    /// Set the cachedir to be used for the offline transaction.
    void set_cachedir(const std::string & cachedir);
    const std::string & get_cachedir() const;

    /// Set the target releasever for the offline transaction.
    void set_target_releasever(const std::string & target_releasever);
    const std::string & get_target_releasever() const;

    /// Set the detected releasever in time the offline transaction was initialized.
    void set_system_releasever(const std::string & system_releasever);
    const std::string & get_system_releasever() const;

    /// Set the dnf command used to initialize the offline transaction (e.g. "system-upgrade download").
    void set_verb(const std::string & verb);
    const std::string & get_verb() const;

    /// Set the command line used to initialize the offline transaction.
    void set_cmd_line(const std::string & cmd_line);
    const std::string & get_cmd_line() const;

    /// Set whether the system power off after the operation is complete is required
    void set_poweroff_after(bool poweroff_after);
    bool get_poweroff_after() const;

    /// Set module_platform_id for the offline transaction.
    void set_module_platform_id(const std::string & module_platform_id);
    const std::string & get_module_platform_id() const;

private:
    class LIBDNF_LOCAL Impl;
    std::unique_ptr<Impl> p_impl;
};


/// Class to handle offline transaction state.
class LIBDNF_API OfflineTransactionState {
public:
    OfflineTransactionState() = delete;
    ~OfflineTransactionState();

    /// Constructs a new OfflineTransactionState instance based on the state file location.
    /// @param path Path to the state file (default location is /usr/lib/sysimage/libdnf5/offline/offline-transaction-state.toml).
    OfflineTransactionState(std::filesystem::path path);

    OfflineTransactionState(const OfflineTransactionState & src);
    OfflineTransactionState & operator=(const OfflineTransactionState & src);
    OfflineTransactionState(OfflineTransactionState && src) noexcept;
    OfflineTransactionState & operator=(OfflineTransactionState && src) noexcept;

    /// Returns offline transaction state data.
    OfflineTransactionStateData & get_data();
    /// Write the current state to the file.
    void write();
    /// Returns any exception caught during the reading of the state file (or nullptr if no exception occurred).
    const std::exception_ptr & get_read_exception() const;
    /// Returns path to the state file.
    std::filesystem::path get_path() const;

private:
    class LIBDNF_LOCAL Impl;
    /// Read offline transaction state data from the file
    LIBDNF_LOCAL void read();
    std::unique_ptr<Impl> p_impl;
};

}  // namespace libdnf5::offline

#endif  // LIBDNF5_TRANSACTION_OFFLINE_HPP