libzypp  17.1.1
SystemCheck.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <fstream>
14 #include <vector>
15 
16 #define ZYPP_USE_RESOLVER_INTERNALS
17 
18 #include "zypp/base/LogTools.h"
19 #include "zypp/base/IOStream.h"
20 #include "zypp/base/String.h"
21 
22 #include "zypp/ZYppFactory.h"
23 #include "zypp/ZConfig.h"
24 #include "zypp/Pathname.h"
25 #include "zypp/PathInfo.h"
27 
28 using namespace std;
29 
31 namespace zypp
32 {
33 
35  Pathname _dir = "";
38 
39  typedef vector<string> CapList;
40 
41  const SystemCheck & SystemCheck::instance()
42  {
43  static SystemCheck _val;
44  return _val;
45  }
46 
47 
48  SystemCheck::SystemCheck() {
49  if (_file.empty()) {
50  _file = ZConfig::instance().solver_checkSystemFile();
51  loadFile(_file);
52  }
53  if (_dir.empty()) {
54  _dir = ZConfig::instance().solver_checkSystemFileDir();
55  loadFiles();
56  }
57  }
58 
59  bool SystemCheck::setFile(const Pathname & file) const{
60  MIL << "Setting checkFile to : " << file << endl;
61  _file = file;
62  loadFile(_file);
63  return true;
64  }
65 
66  bool SystemCheck::setDir(const Pathname & dir) const {
67  MIL << "Setting checkFile directory to : " << dir << endl;
68  loadFile(_file);
69  _dir = dir;
70  loadFiles();
71  return true;
72  }
73 
74  const Pathname & SystemCheck::file() {
75  return _file;
76  }
77 
78  const Pathname & SystemCheck::dir() {
79  return _dir;
80  }
81 
82  const CapabilitySet & SystemCheck::requiredSystemCap() const{
83  return _require;
84  }
85 
86  const CapabilitySet & SystemCheck::conflictSystemCap() const{
87  return _conflict;
88  }
89 
90  bool SystemCheck::loadFile(Pathname & file, bool reset_caps) const{
91  Target_Ptr trg( getZYpp()->getTarget() );
92  if ( trg )
93  file = trg->assertRootPrefix( file );
94 
95  PathInfo pi( file );
96  if ( ! pi.isFile() ) {
97  WAR << "Can't read " << file << " " << pi << endl;
98  return false;
99  }
100 
101  if (reset_caps) {
102  _require.clear();
103  _conflict.clear();
104  }
105 
106  std::ifstream infile( file.c_str() );
107  for( iostr::EachLine in( infile ); in; in.next() ) {
108  std::string l( str::trim(*in) );
109  if ( ! l.empty() && l[0] != '#' )
110  {
111  CapList capList;
112  str::split( l, back_inserter(capList), ":" );
113  if (capList.size() == 2 ) {
114  CapList::iterator it = capList.begin();
115  if (*it == "requires") {
116  _require.insert(Capability(*(it+1)));
117  } else if (*it == "conflicts") {
118  _conflict.insert(Capability(*(it+1)));
119  } else {
120  ERR << "Wrong parameter: " << l << endl;
121  }
122  } else {
123  ERR << "Wrong line: " << l << endl;
124  }
125  }
126  }
127  MIL << "Read " << pi << endl;
128  return true;
129  }
130 
131  bool SystemCheck::loadFiles() const {
132 
134  [this](const Pathname & dir_r, const char *const & name_r)->bool
135  {
136  const std::string wanted = ".check";
137  Pathname pth = dir_r/name_r;
138  if (pth.extension() != wanted) {
139  MIL << "Skipping " << pth << " (not a *.check file)" << endl;
140  return true;
141  }
142  else {
143  MIL << "Reading " << pth << endl;
144  return loadFile(pth, false /* do not reset caps */);
145  }
146  });
147  return true;
148  }
149 
150 
151  /******************************************************************
152  **
153  ** FUNCTION NAME : operator<<
154  ** FUNCTION TYPE : std::ostream &
155  */
156  std::ostream & operator<<( std::ostream & str, const SystemCheck & obj )
157  {
158  str << _file << endl;
159  str << "requires" << endl;
160  for (CapabilitySet::const_iterator it = _require.begin(); it != _require.end(); ++it)
161  str << " " << *it << endl;
162 
163  str << "conflicts" << endl;
164  for (CapabilitySet::const_iterator it = _conflict.begin(); it != _conflict.end(); ++it)
165  str << " " << *it << endl;
166 
167  return str;
168  }
169 
171 } // namespace zypp
vector< string > CapList
Definition: SystemCheck.cc:39
#define MIL
Definition: Logger.h:64
bool next()
Advance to next line.
Definition: IOStream.cc:72
const char * c_str() const
String representation.
Definition: Pathname.h:109
String related utilities and Regular expression matching.
Definition: Arch.h:344
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \)
Split line_r into words.
Definition: String.h:519
Simple lineparser: Traverse each line in a file.
Definition: IOStream.h:111
#define ERR
Definition: Logger.h:66
bool empty() const
Test for an empty path.
Definition: Pathname.h:113
CapabilitySet _require
Definition: SystemCheck.cc:36
std::string trim(const std::string &s, const Trim trim_r)
Definition: String.cc:221
#define WAR
Definition: Logger.h:65
Pathname _dir
Definition: SystemCheck.cc:35
std::ostream & operator<<(std::ostream &str, const zypp::shared_ptr< void > &obj)
Definition: PtrTypes.h:134
std::unordered_set< Capability > CapabilitySet
Definition: Capability.h:33
A sat capability.
Definition: Capability.h:59
CapabilitySet _conflict
Definition: SystemCheck.cc:37
Wrapper class for ::stat/::lstat.
Definition: PathInfo.h:220
int dirForEach(const Pathname &dir_r, function< bool(const Pathname &, const char *const)> fnc_r)
Invoke callback function fnc_r for each entry in directory dir_r.
Definition: PathInfo.cc:542
Pathname _file
Definition: SystemCheck.cc:34
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
std::string extension() const
Return all of the characters in name after and including the last dot in the last element of name...
Definition: Pathname.h:134