libzypp  17.28.5
ZYppImpl.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
13 #include <iostream>
14 #include <zypp/TmpPath.h>
15 #include <zypp/base/Logger.h>
16 #include <zypp/base/String.h>
17 #include <zypp/base/Env.h>
18 
20 #include <zypp/target/TargetImpl.h>
21 #include <zypp/ZYpp.h>
22 #include <zypp/DiskUsageCounter.h>
23 #include <zypp/ZConfig.h>
24 #include <zypp/sat/Pool.h>
25 #include <zypp/PoolItem.h>
26 
27 #include <zypp/ZYppCallbacks.h> // JobReport::instance
28 
29 using std::endl;
30 
32 namespace zypp
33 {
34 
36  namespace media
37  {
39  {
40  static weak_ptr<callback::TempConnect<media::MediaChangeReport> > globalguard;
41  if ( condition_r && ! (_guard = globalguard.lock()) )
42  {
43  // aquire a new one....
45  globalguard = _guard;
46  }
47  }
48  } // namespace media
50 
52  {
53  static callback::SendReport<JobReport> _report;
54  return _report;
55  }
56 
57 
59  namespace zypp_detail
60  {
61 
63  //
64  // METHOD NAME : ZYppImpl::ZYppImpl
65  // METHOD TYPE : Constructor
66  //
68  : _target( nullptr )
69  , _resolver( new Resolver( ResPool::instance()) )
70  {
72  MIL << "Initializing keyring..." << std::endl;
73  _keyring = new KeyRing(tmpPath());
74  _keyring->allowPreload( true );
75  }
76 
78  //
79  // METHOD NAME : ZYppImpl::~ZYppImpl
80  // METHOD TYPE : Destructor
81  //
83  {}
84 
85  //------------------------------------------------------------------------
86  // add/remove resolvables
87 
89  {
90  if ( ! _disk_usage )
91  {
93  }
94  return _disk_usage->disk_usage(pool());
95  }
96 
98  {
99  _disk_usage.reset(new DiskUsageCounter());
100  _disk_usage->setMountPoints(mp);
101  }
102 
104  {
105  if (_disk_usage)
106  return _disk_usage->getMountPoints();
107  else
109  }
110 
111  //------------------------------------------------------------------------
112  // target
113 
115  {
116  if (! _target)
117  ZYPP_THROW(Exception("Target not initialized."));
118  return _target;
119  }
120 
121  void ZYppImpl::initializeTarget( const Pathname & root, bool doRebuild_r )
122  {
123  MIL << "initTarget( " << root << (doRebuild_r?", rebuilddb":"") << ")" << endl;
124  if (_target) {
125  if (_target->root() == root) {
126  MIL << "Repeated call to initializeTarget()" << endl;
127  return;
128  }
129 
130  _target->unload();
131 
132  }
133  _target = new Target( root, doRebuild_r );
134  _target->buildCache();
135  }
136 
138  {
139  if (_target)
140  _target->unload();
141 
142  _target = nullptr;
143  }
144 
145  //------------------------------------------------------------------------
146  // commit
147 
151  {
152  if ( getenv("ZYPP_TESTSUITE_FAKE_ARCH") )
153  {
154  ZYPP_THROW( Exception("ZYPP_TESTSUITE_FAKE_ARCH set. Commit not allowed and disabled.") );
155  }
156 
157  MIL << "Attempt to commit (" << policy_r << ")" << endl;
158  if (! _target)
159  ZYPP_THROW( Exception("Target not initialized.") );
160 
161 
162  env::ScopedSet ea { "ZYPP_IS_RUNNING", str::numstring(getpid()).c_str() };
163  env::ScopedSet eb;
164  if ( _target->chrooted() )
165  eb = env::ScopedSet( "SYSTEMD_OFFLINE", "1" ); // bsc#1118758 - indicate no systemd if chrooted install
166 
167  ZYppCommitResult res = _target->_pimpl->commit( pool(), policy_r );
168 
169  if (! policy_r.dryRun() )
170  {
171  if ( policy_r.syncPoolAfterCommit() )
172  {
173  // reload new status from target
174  DBG << "reloading " << sat::Pool::instance().systemRepoAlias() << " repo to pool" << endl;
175  _target->load();
176  }
177  else
178  {
179  DBG << "unloading " << sat::Pool::instance().systemRepoAlias() << " repo from pool" << endl;
180  _target->unload();
181  }
182  }
183 
184  MIL << "Commit (" << policy_r << ") returned: "
185  << res << endl;
186  return res;
187  }
188 
189  void ZYppImpl::installSrcPackage( const SrcPackage_constPtr & srcPackage_r )
190  {
191  if (! _target)
192  ZYPP_THROW( Exception("Target not initialized.") );
193  _target->_pimpl->installSrcPackage( srcPackage_r );
194  }
195 
196  ManagedFile ZYppImpl::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r )
197  {
198  if (! _target)
199  ZYPP_THROW( Exception("Target not initialized.") );
200  return _target->_pimpl->provideSrcPackage( srcPackage_r );
201  }
202 
203  //------------------------------------------------------------------------
204  // target store path
205 
207  { return _home_path.empty() ? Pathname("/var/lib/zypp") : _home_path; }
208 
209  void ZYppImpl::setHomePath( const Pathname & path )
210  { _home_path = path; }
211 
213  { return zypp::myTmpDir(); }
214 
215  /******************************************************************
216  **
217  ** FUNCTION NAME : operator<<
218  ** FUNCTION TYPE : std::ostream &
219  */
220  std::ostream & operator<<( std::ostream & str, const ZYppImpl & obj )
221  {
222  return str << "ZYppImpl";
223  }
224 
226  } // namespace zypp_detail
228 
229  Pathname myTmpDir() // from TmpPath.h
230  {
231  static filesystem::TmpDir _tmpdir( filesystem::TmpPath::defaultLocation(), "zypp." );
232  return _tmpdir.path();
233  }
234 
236 } // namespace zypp
Target_Ptr target() const
Definition: ZYppImpl.cc:114
#define MIL
Definition: Logger.h:96
std::ostream & about(std::ostream &str) const
Print some detail about the current libzypp version.
Definition: ZConfig.cc:1219
void setHomePath(const Pathname &path)
set the home, if you need to change it
Definition: ZYppImpl.cc:209
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:392
Result returned from ZYpp::commit.
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:126
Gpg key handling.
Definition: KeyRing.h:186
ZYppCommitPolicy & dryRun(bool yesNo_r)
Set dry run (default: false).
String related utilities and Regular expression matching.
static const Pathname & defaultLocation()
Definition: TmpPath.cc:157
DiskUsageCounter::MountPointSet diskUsage()
Definition: ZYppImpl.cc:88
Pathname path() const
Definition: TmpPath.cc:146
DiskUsageCounter::MountPointSet getPartitions() const
Definition: ZYppImpl.cc:103
void initializeTarget(const Pathname &root, bool doRebuild_r)
Definition: ZYppImpl.cc:121
Temporarily connect a ReceiveReport then restore the previous one.
Definition: Callback.h:284
Temporarily set/unset an environment variable.
Definition: Env.h:28
std::set< MountPoint > MountPointSet
shared_ptr< DiskUsageCounter > _disk_usage
defined mount points, used for disk usage counting
Definition: ZYppImpl.h:122
ZYppCommitResult commit(const ZYppCommitPolicy &policy_r)
Commit changes and transactions.
Definition: ZYppImpl.cc:150
bool empty() const
Test for an empty path.
Definition: Pathname.h:114
static Pool instance()
Singleton ctor.
Definition: Pool.h:55
Dependency resolver interface.
Definition: Resolver.h:44
Provide a new empty temporary directory and recursively delete it when no longer needed.
Definition: TmpPath.h:177
static const std::string & systemRepoAlias()
Reserved system repository alias .
Definition: Pool.cc:46
ZYppImpl()
Default ctor.
Definition: ZYppImpl.cc:67
Options and policies for ZYpp::commit.
Pathname tmpPath() const
Get the path where zypp related plugins store tmp data.
Definition: ZYppImpl.cc:212
void installSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
Definition: ZYppImpl.cc:189
#define nullptr
Definition: Easy.h:55
Pathname homePath() const
Get the path where zypp related plugins store persistent data and caches.
Definition: ZYppImpl.cc:206
Pathname myTmpDir()
Global access to the zypp.TMPDIR (created on demand, deleted when libzypp is unloaded) ...
Definition: ZYppImpl.cc:229
ZYppCommitPolicy & syncPoolAfterCommit(bool yesNo_r)
Kepp pool in sync with the Target databases after commit (default: true)
std::string numstring(char n, int w=0)
Definition: String.h:289
std::ostream & operator<<(std::ostream &str, const ZYppImpl &obj)
Definition: ZYppImpl.cc:220
ScopedDisableMediaChangeReport(bool condition_r=true)
Disbale MediaChangeReport if condition_r is true.
Definition: ZYppImpl.cc:38
Global ResObject pool.
Definition: ResPool.h:60
Base class for Exception.
Definition: Exception.h:145
Compute disk space occupied by packages across partitions/directories.
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition: AutoDispose.h:92
shared_ptr< callback::TempConnect< media::MediaChangeReport > > _guard
ResPool pool() const
Definition: ZYppImpl.h:50
static callback::SendReport< JobReport > & instance()
Singleton sender instance.
Definition: ZYppImpl.cc:51
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
void setPartitions(const DiskUsageCounter::MountPointSet &mp)
Definition: ZYppImpl.cc:97
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
Definition: ZYppImpl.cc:196
#define DBG
Definition: Logger.h:95
static MountPointSet detectMountPoints(const std::string &rootdir="/")
Get mountpoints of system below rootdir If we happen to detect snapshotting btrfs partitions...