Merge branch 'local_services' of gitorious.org:~duncan/opensuse/duncans-libzypp
[platform/upstream/libzypp.git] / zypp / ZConfig.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/ZConfig.h
10  *
11 */
12 #ifndef ZYPP_ZCONFIG_H
13 #define ZYPP_ZCONFIG_H
14
15 #include <iosfwd>
16 #include <set>
17 #include <string>
18
19 #include "zypp/base/Deprecated.h"
20 #include "zypp/base/NonCopyable.h"
21 #include "zypp/base/PtrTypes.h"
22
23 #include "zypp/Arch.h"
24 #include "zypp/Locale.h"
25 #include "zypp/Pathname.h"
26 #include "zypp/IdString.h"
27
28 #include "zypp/DownloadMode.h"
29 #include "zypp/target/rpm/RpmFlags.h"
30
31 ///////////////////////////////////////////////////////////////////
32 namespace zypp
33 { /////////////////////////////////////////////////////////////////
34
35   ///////////////////////////////////////////////////////////////////
36   //
37   //    CLASS NAME : ZConfig
38   //
39   /** Interim helper class to collect global options and settings.
40    * Use it to avoid hardcoded values and calls to getZYpp() just
41    * to retrieve some value like architecture, languages or tmppath.
42    *
43    * It reads /etc/zypp/zypp.conf, the filename can be overridden by
44    * setting the ZYPP_CONF environment variable to a different file.
45    *
46    * Note, if you add settings to this file, please follow the following
47    * convention:
48    *
49    * namespace.settingname
50    *
51    * should become
52    *
53    * namespace_settingName()
54    *
55    * \ingroup Singleton
56   */
57   class ZConfig : private base::NonCopyable
58   {
59     public:
60
61       /** Singleton ctor */
62       static ZConfig & instance();
63
64       /** Print some detail about the current libzypp version.*/
65       std::ostream & about( std::ostream & str ) const;
66
67     public:
68
69       /** The target root directory.
70        * Returns an empty path if no target is set.
71        */
72       Pathname systemRoot() const;
73
74     public:
75
76       /** The autodetected system architecture. */
77       static Arch defaultSystemArchitecture();
78
79       /** The system architecture zypp uses. */
80       Arch systemArchitecture() const;
81
82       /** Override the zypp system architecture.
83        * This is useful for test scenarious. <b>But be warned</b>, zypp does
84        * not expect the system architecture to change at runtime. So
85        * set it at the verry beginning before you acess any other
86        * zypp component.
87       */
88       void setSystemArchitecture( const Arch & arch_r );
89
90       /** Reset the zypp system architecture to the default. */
91       void resetSystemArchitecture()
92       { setSystemArchitecture( defaultSystemArchitecture() ); }
93
94     public:
95       /** The autodetected prefered locale for translated texts.
96        */
97       static Locale defaultTextLocale();
98
99       /** The locale for translated texts zypp uses.
100        */
101       Locale textLocale() const;
102
103       /** Set the prefered locale for translated texts. */
104       void setTextLocale( const Locale & locale_r );
105
106       /** Reset the locale for translated texts to the default. */
107       void resetTextLocale()
108       { setTextLocale( defaultTextLocale() ); }
109
110     public:
111       /**
112        * Path where the caches are kept (/var/cache/zypp)
113        * \ingroup g_ZC_REPOCACHE
114        */
115       Pathname repoCachePath() const;
116
117      /**
118        * Path where the repo metadata is downloaded and kept (repoCachePath()/raw).
119         * \ingroup g_ZC_REPOCACHE
120       */
121       Pathname repoMetadataPath() const;
122
123      /**
124        * Path where the repo solv files are created and kept (repoCachePath()/solv).
125         * \ingroup g_ZC_REPOCACHE
126       */
127       Pathname repoSolvfilesPath() const;
128
129       /**
130        * Path where the repo packages are downloaded and kept (repoCachePath()/packages).
131         * \ingroup g_ZC_REPOCACHE
132       */
133       Pathname repoPackagesPath() const;
134
135       /**
136        * Path where the configfiles are kept (/etc/zypp).
137        * \ingroup g_ZC_CONFIGFILES
138        */
139       Pathname configPath() const;
140
141       /**
142        * Path where the known repositories .repo files are kept (configPath()/repos.d).
143        * \ingroup g_ZC_CONFIGFILES
144        */
145       Pathname knownReposPath() const;
146
147       /**
148        * Path where the known services .service files are kept (configPath()/services.d).
149        * \ingroup g_ZC_CONFIGFILES
150        */
151       Pathname knownServicesPath() const;
152
153       /**
154        * Path where plugin services are installed
155        * plugin services are scripts returning a repository
156        * list
157        * \ingroup g_ZC_CONFIGFILES
158        */
159       Pathname pluginServicesPath() const;
160
161       /**
162        * Whether repository urls should be probed.
163        / config option
164        * repo.add.probe
165        */
166       bool repo_add_probe() const;
167
168       /**
169        * Amount of time in minutes that must pass before another refresh.
170        */
171       unsigned repo_refresh_delay() const;
172
173       /**
174        * Whether to use repository alias or name in user messages (progress,
175        * exceptions, ...).
176        * True: use alias, false: use name.
177        */
178       bool repoLabelIsAlias() const;
179
180       /**
181        * Whether to use repository alias or name in user messages (progress,
182        * exceptions, ...). Console applications might prefer to use and display
183        * the shorter alias instead of full repository name.
184        *
185        * Default: false; i.e. repo label is 'name'
186        */
187       void repoLabelIsAlias( bool yesno_r );
188
189       /**
190        * Maximum number of concurrent connections for a single transfer
191        */
192       long download_max_concurrent_connections() const;
193
194       /**
195        * Minimum download speed (bytes per second)
196        * until the connection is dropped
197        */
198       long download_min_download_speed() const;
199
200       /**
201        * Maximum download speed (bytes per second)
202        */
203       long download_max_download_speed() const;
204
205       /**
206        * Maximum silent tries
207        */
208       long download_max_silent_tries() const;
209
210
211       /** Whether to consider using a deltarpm when downloading a package.
212        * Config option <tt>download.use_deltarpm (true)</tt>
213        */
214       bool download_use_deltarpm() const;
215
216       /** Whether to consider using a deltarpm even when rpm is local.
217        * This requires \ref download_use_deltarpm being \c true.
218        * Config option <tt>download.use_deltarpm.always (false)</tt>
219        */
220       bool download_use_deltarpm_always() const;
221
222       /**
223        * Hint which media to prefer when installing packages (download vs. CD).
224        * \see class \ref media::MediaPriority
225        */
226       bool download_media_prefer_download() const;
227       /** \overload */
228       bool download_media_prefer_volatile() const
229       { return ! download_media_prefer_download(); }
230       /**
231        * Set \ref download_media_prefer_download to a specific value.
232        */
233       void set_download_media_prefer_download( bool yesno_r );
234       /**
235        * Set \ref download_media_prefer_download to the configfiles default.
236        */
237       void set_default_download_media_prefer_download();
238
239       /**
240        * Commit download policy to use as default.
241        */
242       DownloadMode commit_downloadMode() const;
243
244       /**
245        * Directory for equivalent vendor definitions  (configPath()/vendors.d)
246        * \ingroup g_ZC_CONFIGFILES
247        */
248       Pathname vendorPath() const;
249
250       /**
251        * Solver regards required packages,patterns,... only
252        */
253       bool solver_onlyRequires() const;
254
255       /**
256        * File in which dependencies described which has to be
257        * fulfilled for a running system.
258        */
259       Pathname solver_checkSystemFile() const;
260
261       /**
262        * Whether vendor check is by default enabled.
263        */
264       bool solver_allowVendorChange() const;
265
266       /**
267        * Whether removing a package should also remove no longer needed requirements.
268        */
269       bool solver_cleandepsOnRemove() const;
270
271       /**
272        * When committing a dist upgrade (e.g. <tt>zypper dup</tt>)
273        * a solver testcase is written. It is needed in bugreports,
274        * in case something went wrong. This returns the number of
275        * testcases to keep on the system. Old cases will be deleted,
276        * as new ones are created. Use \c 0 to write no testcase at all.
277        */
278       unsigned solver_upgradeTestcasesToKeep() const;
279
280       /** Whether dist upgrade should remove a products dropped packages (true).
281        *
282        * A new product may suggest a list of old and no longer supported
283        * packages (dropped packages). Performing a dist upgrade the solver
284        * may try to delete them, even if they do not cause any dependency
285        * problem.
286        *
287        * Turning this option off, the solver will not try to remove those
288        * packages unless they actually do cause dependency trouble. At any
289        * time you may use zypper to detect orphaned packages, and do the
290        * cleanup manually. Or simply leave them installed as long as you don't
291        * need the disk space.
292        */
293       bool solverUpgradeRemoveDroppedPackages() const;
294       /** Set \ref solverUpgradeRemoveDroppedPackages to \a val_r. */
295       void setSolverUpgradeRemoveDroppedPackages( bool val_r );
296       /** Reset \ref solverUpgradeRemoveDroppedPackages to the \c zypp.conf default. */
297       void resetSolverUpgradeRemoveDroppedPackages();
298
299       /** \name Packages which can be installed in different versions at the same time.
300        * This returns the config file values (\c names or \c provides:...). For the corresponding
301        * packages use e.g \ref sat::Pool::multiversionBegin, or \ref sat::Solbale::multiversionInstall
302        * (\ref ui::Selectable::multiversionInstall).
303        */
304       //@{
305       const std::set<std::string> & multiversionSpec() const;
306       void addMultiversionSpec( const std::string & name_r );
307       void removeMultiversionSpec( const std::string & name_r );
308       //@}
309
310       /**
311        * Path where zypp can find or create lock file (configPath()/locks)
312        * \ingroup g_ZC_CONFIGFILES
313        */
314       Pathname locksFile() const;
315
316       /**
317        * Whether locks file should be read and applied after start (true)
318        */
319       bool apply_locks_file() const;
320
321       /**
322        * Path where the update items are kept (/var/adm)
323        */
324       Pathname update_dataPath() const;
325
326      /**
327       * Path where the repo metadata is downloaded and kept (update_dataPath()/).
328       * \ingroup g_ZC_REPOCACHE
329       */
330       Pathname update_scriptsPath() const;
331
332      /**
333       * Path where the repo solv files are created and kept (update_dataPath()/solv).
334       * \ingroup g_ZC_REPOCACHE
335       */
336       Pathname update_messagesPath() const;
337
338       /** \name Command to be invoked to send update messages. */
339       //@{
340       /** Command definition for sending update messages.*/
341       std::string updateMessagesNotify() const;
342       /** Set a new command definition (see update.messages.notify in zypp.conf). */
343       void setUpdateMessagesNotify( const std::string & val_r );
344       /** Reset to the zypp.conf default. */
345       void resetUpdateMessagesNotify();
346      //@}
347
348       /** \name Options for package installation */
349       //@{
350       /** The default \ref target::rpm::RpmInstFlags for \ref ZYppCommitPolicy.
351        * Or-combination of \ref target::rpm::RpmInstFlag.
352        * \code
353        * ZConfig.instance().rpmInstallFlags().testFlag( target::rpm::RPMINST_EXCLUDEDOCS );
354        * \endcode
355        */
356       target::rpm::RpmInstFlags rpmInstallFlags() const;
357       //@}
358
359       /**
360        * Path where ZYpp install history is logged. Defaults to
361        * /var/log/zypp/history.
362        *
363        * \see http://en.opensuse.org/Libzypp/Package_History
364        */
365       Pathname historyLogFile() const;
366
367       /**
368        * Defaults to /etc/zypp/credentials.d
369        */
370       Pathname credentialsGlobalDir() const;
371
372       /**
373        * Defaults to /etc/zypp/credentials.cat
374        */
375       Pathname credentialsGlobalFile() const;
376
377       /** Package telling the "product version" on systems not using /etc/product.d/baseproduct.
378        *
379        * On RHEL, Fedora and others the "product version" is determined by the first package
380        * providing 'redhat-release'. This value is not hardcoded in YUM and can be configured
381        * with the $distroverpkg variable.
382        *
383        * Defaults to 'redhat-release'.
384        */
385       std::string distroverpkg() const;
386
387       /** \name Plugins */
388       //@{
389       /**
390        * Defaults to \c /usr/lib/zypp/plugins
391        */
392       Pathname pluginsDir() const;
393
394       /**
395        * Defaults to \ref pluginsDir()/media
396        */
397       Pathname mediaPluginsDir() const;
398
399        /**
400         * Defaults to \ref pluginsDir()/services
401         */
402        Pathname servicePluginsDir() const;
403       //@}
404     public:
405       class Impl;
406       /** Dtor */
407       ~ZConfig();
408     private:
409       friend class Impl;
410       /** Default ctor. */
411       ZConfig();
412       /** Pointer to implementation */
413       RW_pointer<Impl, rw_pointer::Scoped<Impl> > _pimpl;
414   };
415   ///////////////////////////////////////////////////////////////////
416
417   /////////////////////////////////////////////////////////////////
418 } // namespace zypp
419 ///////////////////////////////////////////////////////////////////
420 #endif // ZYPP_ZCONFIG_H