libstorage-ng
Storage.h
1 /*
2  * Copyright (c) [2014-2015] Novell, Inc.
3  * Copyright (c) [2016-2023] SUSE LLC
4  *
5  * All Rights Reserved.
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of version 2 of the GNU General Public License as published
9  * by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, contact Novell, Inc.
18  *
19  * To contact Novell about this file by physical or electronic mail, you may
20  * find current contact information at www.novell.com.
21  */
22 
23 
24 #ifndef STORAGE_STORAGE_H
25 #define STORAGE_STORAGE_H
26 
27 
28 #include <string>
29 #include <vector>
30 #include <map>
31 #include <utility>
32 #include <memory>
33 #include <boost/noncopyable.hpp>
34 
35 #include "storage/CommitOptions.h"
36 #include "storage/Actions/Base.h"
37 #include "storage/Utils/Callbacks.h"
38 #include "storage/Utils/Swig.h"
39 
40 
44 namespace storage
45 {
79  class Environment;
80  class Arch;
81  class Devicegraph;
82  class Actiongraph;
83  class Pool;
84  enum class PtType;
85  enum class FsType;
86  enum class MountByType;
87 
88 
98  {
99  public:
100 
101  virtual ~ActivateCallbacks() {}
102 
108  virtual bool multipath(bool looks_like_real_multipath) const = 0;
109 
121  virtual std::pair<bool, std::string> luks(const std::string& uuid, int attempt) const = 0;
122 
123  };
124 
125 
129  class LuksInfo : private boost::noncopyable
130  {
131  public:
132 
133  LuksInfo();
134  ~LuksInfo();
135 
136  const std::string& get_device_name() const;
137  unsigned long long get_size() const;
138  const std::string& get_dm_table_name() const;
139  bool is_dm_table_name_generated() const;
140  const std::string& get_uuid() const;
141  const std::string& get_label() const;
142 
143  public:
144 
145  class Impl;
146 
147  Impl& get_impl() { return *impl; }
148  const Impl& get_impl() const { return *impl; }
149 
150  private:
151 
152  const std::unique_ptr<Impl> impl;
153 
154  };
155 
156 
161  {
162  public:
163 
164  virtual ~ActivateCallbacksLuks() {}
165 
171  virtual std::pair<bool, std::string> luks(const LuksInfo& luks_info, int attempt) const = 0;
172 
173  };
174 
175 
179  class BitlockerInfo : private boost::noncopyable
180  {
181  public:
182 
183  BitlockerInfo();
184  ~BitlockerInfo();
185 
186  const std::string& get_device_name() const;
187  unsigned long long get_size() const;
188  const std::string& get_dm_table_name() const;
189  bool is_dm_table_name_generated() const;
190  const std::string& get_uuid() const;
191 
192  public:
193 
194  class Impl;
195 
196  Impl& get_impl() { return *impl; }
197  const Impl& get_impl() const { return *impl; }
198 
199  private:
200 
201  const std::unique_ptr<Impl> impl;
202 
203  };
204 
205 
210  {
211  public:
212 
213  virtual ~ActivateCallbacksV3() {}
214 
218  virtual void begin() const {}
219 
223  virtual void end() const {}
224 
230  virtual std::pair<bool, std::string> bitlocker(const BitlockerInfo& bitlocker_info, int attempt) const = 0;
231 
232  };
233 
234 
235  struct ST_DEPRECATED DeactivateStatus
236  {
237  bool multipath;
238  bool dm_raid;
239  bool md;
240  bool lvm_lv;
241  bool luks;
242  };
243 
244 
251  {
252  public:
253 
255  DeactivateStatusV2(const DeactivateStatusV2& deactivate_status);
256  virtual ~DeactivateStatusV2();
257 
258  DeactivateStatusV2& operator=(const DeactivateStatusV2& deactivate_status);
259 
260  bool multipath() const;
261  bool dm_raid() const;
262  bool md() const;
263  bool lvm_lv() const;
264  bool luks() const;
265  bool bitlocker() const;
266 
267  public:
268 
269  class Impl;
270 
271  Impl& get_impl() { return *impl; }
272  const Impl& get_impl() const { return *impl; }
273 
274  private:
275 
276  const std::unique_ptr<Impl> impl;
277 
278  };
279 
280 
281  class ProbeCallbacks : public Callbacks
282  {
283  public:
284 
285  virtual ~ProbeCallbacks() {}
286 
287  };
288 
289 
291  {
292  public:
293 
294  virtual ~ProbeCallbacksV2() {}
295 
308  virtual bool missing_command(const std::string& message, const std::string& what,
309  const std::string& command, uint64_t used_features) const = 0;
310 
311  };
312 
313 
315  {
316  public:
317 
318  virtual ~ProbeCallbacksV3() {}
319 
323  virtual void begin() const {}
324 
328  virtual void end() const {}
329 
330  };
331 
332 
334  {
335  public:
336 
337  virtual ~ProbeCallbacksV4() {}
338 
345  virtual bool ambiguity_partition_table_and_filesystem(const std::string& message, const std::string& what,
346  const std::string& name, PtType pt_type,
347  FsType fs_type) const = 0;
348 
355  virtual bool ambiguity_partition_table_and_luks(const std::string& message, const std::string& what,
356  const std::string& name, PtType pt_type) const = 0;
357 
364  virtual bool ambiguity_partition_table_and_lvm_pv(const std::string& message, const std::string& what,
365  const std::string& name, PtType pt_type) const = 0;
366 
375  virtual bool unsupported_partition_table(const std::string& message, const std::string& what,
376  const std::string& name, PtType pt_type) const = 0;
377 
386  virtual bool unsupported_filesystem(const std::string& message, const std::string& what,
387  const std::string& name, FsType fs_type) const = 0;
388 
389  };
390 
391 
393  {
394  public:
395 
396  virtual ~CheckCallbacks() {}
397 
398  virtual void error(const std::string& message) const = 0;
399 
400  };
401 
402 
403  class CommitCallbacks : public Callbacks
404  {
405  public:
406 
407  virtual ~CommitCallbacks() {}
408 
409  };
410 
411 
413  {
414  public:
415 
419  virtual void begin() const {}
420 
424  virtual void end() const {}
425 
429  virtual void begin_action(const Action::Base* action) const {}
430 
434  virtual void end_action(const Action::Base* action) const {}
435 
436  virtual ~CommitCallbacksV2() {}
437 
438  };
439 
441  class Storage : private boost::noncopyable
442  {
443  public:
444 
450  Storage(const Environment& environment);
451 
452  ~Storage();
453 
454  public:
455 
456  const Environment& get_environment() const;
457  const Arch& get_arch() const;
458 
464  Devicegraph* create_devicegraph(const std::string& name);
465 
469  Devicegraph* copy_devicegraph(const std::string& source_name, const std::string& dest_name);
470 
476  void remove_devicegraph(const std::string& name);
477 
481  void restore_devicegraph(const std::string& name);
482 
483  bool equal_devicegraph(const std::string& lhs, const std::string& rhs) const;
484 
488  bool exist_devicegraph(const std::string& name) const;
489 
493  std::vector<std::string> get_devicegraph_names() const ST_DEPRECATED;
494 
501  std::map<std::string, const Devicegraph*> get_devicegraphs() const;
502 
508  Devicegraph* get_devicegraph(const std::string& name);
509 
513  const Devicegraph* get_devicegraph(const std::string& name) const;
514 
521 
527  const Devicegraph* get_staging() const;
528 
534  const Devicegraph* get_probed() const;
535 
542 
548  const Devicegraph* get_system() const;
549 
566  void check(const CheckCallbacks* check_callbacks = nullptr) const;
567 
572 
576  void set_default_mount_by(MountByType default_mount_by);
577 
578  const std::string& get_rootprefix() const;
579  void set_rootprefix(const std::string& rootprefix) ST_DEPRECATED;
580 
584  std::string prepend_rootprefix(const std::string& mount_point) const;
585 
593 
610  void activate(const ActivateCallbacks* activate_callbacks) const;
611 
615  DeactivateStatus deactivate() const ST_DEPRECATED;
616 
631 
641  void probe(const ProbeCallbacks* probe_callbacks = nullptr);
642 
651  void commit(const CommitOptions& commit_options, const CommitCallbacks* commit_callbacks = nullptr);
652 
661  void commit(const CommitCallbacks* commit_callbacks = nullptr) ST_DEPRECATED;
662 
670  void generate_pools(const Devicegraph* devicegraph);
671 
677  Pool* create_pool(const std::string& name);
678 
684  void remove_pool(const std::string& name);
685 
691  void rename_pool(const std::string& old_name, const std::string& new_name);
692 
696  bool exists_pool(const std::string& name) const;
697 
701  std::vector<std::string> get_pool_names() const ST_DEPRECATED;
702 
706  std::map<std::string, Pool*> get_pools();
707 
711  std::map<std::string, const Pool*> get_pools() const;
712 
718  Pool* get_pool(const std::string& name);
719 
723  const Pool* get_pool(const std::string& name) const;
724 
725  public:
726 
727  class Impl;
728 
729  Impl& get_impl() { return *impl; }
730  const Impl& get_impl() const { return *impl; }
731 
732  private:
733 
734  const std::unique_ptr<Impl> impl;
735 
736  };
737 
738 }
739 
740 #endif
Provides information whether deactivate_v2() was able to deactivate subsystems.
Definition: Storage.h:250
Definition: Storage.h:235
void remove_pool(const std::string &name)
Remove a pool by name.
Definition: Environment.h:63
std::map< std::string, Pool * > get_pools()
Get all pools with their names.
void probe(const ProbeCallbacks *probe_callbacks=nullptr)
Probe the system and replace the probed, system and staging devicegraphs.
virtual void end() const
Called at the end of activation.
Definition: Storage.h:223
virtual bool ambiguity_partition_table_and_luks(const std::string &message, const std::string &what, const std::string &name, PtType pt_type) const =0
This error callback is called when a partition table and a LUKS are found on a device.
MountByType get_default_mount_by() const
Query the default mount-by method.
Definition: CommitOptions.h:31
Definition: Storage.h:412
Definition: Arch.h:35
Definition: Storage.h:314
virtual void begin() const
Called at the begin of activation.
Definition: Storage.h:218
virtual bool ambiguity_partition_table_and_filesystem(const std::string &message, const std::string &what, const std::string &name, PtType pt_type, FsType fs_type) const =0
This error callback is called when a partition table and a filesystem are found on a device...
Devicegraph * copy_devicegraph(const std::string &source_name, const std::string &dest_name)
void restore_devicegraph(const std::string &name)
const Devicegraph * get_probed() const
Return the probed devicegraph.
virtual void begin_action(const Action::Base *action) const
Called at the begin of commit of a single action.
Definition: Storage.h:429
virtual void begin() const
Called at the begin of commit.
Definition: Storage.h:419
bool exist_devicegraph(const std::string &name) const
Check whether a devicegraph exists by name.
Storage(const Environment &environment)
Construct Storage object.
void check(const CheckCallbacks *check_callbacks=nullptr) const
Checks all devicegraphs.
Definition: Storage.h:333
void commit(const CommitOptions &commit_options, const CommitCallbacks *commit_callbacks=nullptr)
The actiongraph must be valid.
virtual void begin() const
Called at the begin of probing.
Definition: Storage.h:323
virtual std::pair< bool, std::string > luks(const std::string &uuid, int attempt) const =0
Decide whether the LUKS with uuid should be activated.
std::string prepend_rootprefix(const std::string &mount_point) const
Prepends the root prefix to a mount point if necessary.
bool exists_pool(const std::string &name) const
Check whether a pool exists by name.
Stores information about a Bitlocker device.
Definition: Storage.h:179
PtType
Partition Table Type.
Definition: PartitionTable.h:42
const Actiongraph * calculate_actiongraph()
The actiongraph is only valid until either the probed or staging devicegraph is modified.
The main container of the libstorage-ng.
Definition: Devicegraph.h:169
Devicegraph * get_devicegraph(const std::string &name)
Return a devicegraph by name.
virtual std::pair< bool, std::string > bitlocker(const BitlockerInfo &bitlocker_info, int attempt) const =0
Decide whether the BitLocker should be activated.
Definition: Storage.h:403
void rename_pool(const std::string &old_name, const std::string &new_name)
Rename a pool.
The actiongraph has all actions including the dependencies among them to get from one devicegraph to ...
Definition: Actiongraph.h:61
virtual void end_action(const Action::Base *action) const
Called at the end of commit of a single action.
Definition: Storage.h:434
DeactivateStatus deactivate() const ST_DEPRECATED
virtual bool unsupported_filesystem(const std::string &message, const std::string &what, const std::string &name, FsType fs_type) const =0
This error callback is called when a known but unsupported filesystem type, e.g.
virtual bool multipath(bool looks_like_real_multipath) const =0
Decide whether multipath should be activated.
Pool * create_pool(const std::string &name)
Create a pool with name.
void set_default_mount_by(MountByType default_mount_by)
Set the default mount-by method.
Devicegraph * get_staging()
Return the staging devicegraph.
virtual bool missing_command(const std::string &message, const std::string &what, const std::string &command, uint64_t used_features) const =0
Callback for missing commands.
void activate(const ActivateCallbacks *activate_callbacks) const
Activate devices like multipath, DM and MD RAID, LVM and LUKS.
virtual void end() const
Called at the end of probing.
Definition: Storage.h:328
Stores information about a LUKS device.
Definition: Storage.h:129
Definition: Storage.h:290
Devicegraph * get_system()
Return the system devicegraph.
std::vector< std::string > get_devicegraph_names() const ST_DEPRECATED
Get the names of all devicegraphs.
Definition: Callbacks.h:33
std::vector< std::string > get_pool_names() const ST_DEPRECATED
Get the names of all pools.
virtual bool unsupported_partition_table(const std::string &message, const std::string &what, const std::string &name, PtType pt_type) const =0
This error callback is called when a known but unsupported partition table type, e.g.
virtual void message(const std::string &message) const =0
Callback for progress messages.
Specialized callbacks with a more generic parameter for LUKS activation.
Definition: Storage.h:160
The main entry point to libstorage.
Definition: Storage.h:441
void generate_pools(const Devicegraph *devicegraph)
Generate pools, e.g.
virtual bool ambiguity_partition_table_and_lvm_pv(const std::string &message, const std::string &what, const std::string &name, PtType pt_type) const =0
This error callback is called when a partition table and a LVM PV are found on a device.
Devicegraph * create_devicegraph(const std::string &name)
Create a devicegraph with name.
Definition: Storage.h:281
The storage namespace.
Definition: Actiongraph.h:39
virtual void end() const
Called at the end of commit.
Definition: Storage.h:424
DeactivateStatusV2 deactivate_v2() const
Deactivate devices like multipath, DM and MD RAID, LVM and LUKS.
void remove_devicegraph(const std::string &name)
Remove a devicegraph by name.
A pool represents a collection of devices.
Definition: Pool.h:82
Definition: Storage.h:392
virtual std::pair< bool, std::string > luks(const LuksInfo &luks_info, int attempt) const =0
Decide whether the LUKS should be activated.
Specialized callbacks with a more generic parameter for Bitlocker activation.
Definition: Storage.h:209
std::map< std::string, const Devicegraph * > get_devicegraphs() const
Get all devicegraphs with their names.
Pool * get_pool(const std::string &name)
Return a pool by name.
Other storage subsystems are activated automatically, e.g.
Definition: Storage.h:97
MountByType
The key by which the mount program identifies a mountable.
Definition: Mountable.h:60