Config.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #include "squid.h"
10 #include "acl/FilledChecklist.h"
11 #include "acl/Gadgets.h"
12 #include "adaptation/AccessRule.h"
13 #include "adaptation/Config.h"
14 #include "adaptation/History.h"
15 #include "adaptation/Service.h"
17 #include "cache_cf.h"
18 #include "ConfigParser.h"
19 #include "DebugMessages.h"
20 #include "globals.h"
21 #include "HttpReply.h"
22 #include "HttpRequest.h"
23 #include "Store.h"
24 
25 #include <algorithm>
26 
27 bool Adaptation::Config::Enabled = false;
33 static const char *protectedFieldNamesRaw[] = {
34  "Allow",
35  "Date",
36  "Encapsulated",
37  "ISTag",
38  "Max-Connections",
39  "Methods",
40  "Opt-body-type",
41  "Options-TTL",
42  "Preview",
43  "Service",
44  "Service-ID",
45  "Transfer-Complete",
46  "Transfer-Ignore",
47  "Transfer-Preview"
48 };
52 
55 {
56  return new ServiceConfig();
57 }
58 
59 void
61 {
62  removeRule(service);
63  const Groups& groups = AllGroups();
64  for (unsigned int i = 0; i < groups.size(); ) {
65  const ServiceGroupPointer group = groups[i];
66  const ServiceGroup::Store& services = group->services;
67  typedef ServiceGroup::Store::const_iterator SGSI;
68  for (SGSI it = services.begin(); it != services.end(); ++it) {
69  if (*it == service) {
70  group->removedServices.push_back(service);
71  ServiceGroup::Store::iterator newend;
72  newend = std::remove(group->services.begin(), group->services.end(), service);
73  group->services.resize(newend-group->services.begin());
74  debugs(93, 5, "adaptation service " << service <<
75  " removed from group " << group->id);
76  break;
77  }
78  }
79  if (services.empty()) {
80  removeRule(group->id);
81  Groups::iterator newend;
82  newend = std::remove(AllGroups().begin(), AllGroups().end(), group);
83  AllGroups().resize(newend-AllGroups().begin());
84  } else {
85  ++i;
86  }
87  }
88 }
89 
92 {
93  typedef ServiceConfigs::const_iterator SCI;
94  const ServiceConfigs& configs = serviceConfigs;
95  for (SCI cfg = configs.begin(); cfg != configs.end(); ++cfg) {
96  if ((*cfg)->key == service)
97  return *cfg;
98  }
99  return NULL;
100 }
101 
102 void
104 {
105  typedef AccessRules::const_iterator ARI;
106  const AccessRules& rules = AllRules();
107  for (ARI it = rules.begin(); it != rules.end(); ++it) {
108  AccessRule* rule = *it;
109  if (rule->groupId == id) {
110  debugs(93, 5, "removing access rules for:" << id);
111  AccessRules::iterator newend;
112  newend = std::remove(AllRules().begin(), AllRules().end(), rule);
113  AllRules().resize(newend-AllRules().begin());
114  delete (rule);
115  break;
116  }
117  }
118 }
119 
120 void
122 {
123  debugs(93, 3, HERE << "rules: " << AllRules().size() << ", groups: " <<
124  AllGroups().size() << ", services: " << serviceConfigs.size());
125  typedef ServiceConfigs::const_iterator SCI;
126  const ServiceConfigs& configs = serviceConfigs;
127  for (SCI cfg = configs.begin(); cfg != configs.end(); ++cfg)
128  removeService((*cfg)->key);
129  serviceConfigs.clear();
130  debugs(93, 3, HERE << "rules: " << AllRules().size() << ", groups: " <<
131  AllGroups().size() << ", services: " << serviceConfigs.size());
132 }
133 
134 void
136 {
137  ServiceConfigPointer cfg = newServiceConfig();
138  if (!cfg->parse()) {
139  fatalf("%s:%d: malformed adaptation service configuration",
141  }
142  serviceConfigs.push_back(cfg);
143 }
144 
145 void
147 {
148  FreeAccess();
149  FreeServiceGroups();
150 
151  DetachServices();
152 
153  serviceConfigs.clear();
154 }
155 
156 void
157 Adaptation::Config::dumpService(StoreEntry *entry, const char *name) const
158 {
159  typedef Services::iterator SCI;
160  for (SCI i = AllServices().begin(); i != AllServices().end(); ++i) {
161  const ServiceConfig &cfg = (*i)->cfg();
162  bool isEcap = cfg.protocol.caseCmp("ecap") == 0;
163  bool isIcap = !isEcap;
164  const char *optConnectionEncryption = "";
165  // Print connections_encrypted option if no default value is used
167  optConnectionEncryption = " connection-encryption=off";
168  else if (isEcap && !cfg.connectionEncryption)
169  optConnectionEncryption = " connection-encryption=off";
170  else if (isIcap && !cfg.secure.encryptTransport && cfg.connectionEncryption)
171  optConnectionEncryption = " connection-encryption=on";
172 
173  storeAppendPrintf(entry, "%s " SQUIDSTRINGPH " %s_%s %d " SQUIDSTRINGPH "%s\n",
174  name,
175  SQUIDSTRINGPRINT(cfg.key),
176  cfg.methodStr(), cfg.vectPointStr(), cfg.bypass,
177  SQUIDSTRINGPRINT(cfg.uri),
178 
179  optConnectionEncryption);
180  }
181 }
182 
183 bool
185 {
186  if (!onoff) {
187  clear();
188  return false;
189  }
190 
191  // create service reps from service configs
192  int created = 0;
193 
194  typedef ServiceConfigs::const_iterator VISCI;
195  const ServiceConfigs &configs = serviceConfigs;
196  for (VISCI i = configs.begin(); i != configs.end(); ++i) {
197  const ServiceConfigPointer cfg = *i;
198  if (FindService(cfg->key) != NULL) {
199  debugs(93, DBG_CRITICAL, "ERROR: Duplicate adaptation service name: " <<
200  cfg->key);
201  continue; // TODO: make fatal
202  }
203  ServicePointer s = createService(cfg);
204  if (s != NULL) {
205  AllServices().push_back(s);
206  ++created;
207  }
208  }
209 
210  debugs(93,3, HERE << "Created " << created << " adaptation services");
211 
212  // services remember their configs; we do not have to
213  serviceConfigs.clear();
214  return true;
215 }
216 
217 // poor man for_each
218 template <class Collection>
219 static void
220 FinalizeEach(Collection &collection, const char *label)
221 {
222  typedef typename Collection::iterator CI;
223  for (CI i = collection.begin(); i != collection.end(); ++i)
224  (*i)->finalize();
225 
226  debugs(93,2, HERE << "Initialized " << collection.size() << ' ' << label);
227 }
228 
229 void
231 {
232  Enabled = enabled;
233  debugs(93, Important(11), "Adaptation support is " << (Enabled ? "on" : "off."));
234 
235  FinalizeEach(AllServices(), "message adaptation services");
236  FinalizeEach(AllGroups(), "message adaptation service groups");
237  FinalizeEach(AllRules(), "message adaptation access rules");
238 }
239 
240 void
242 {
244 }
245 
246 void
248 {
250 }
251 
252 void
254 {
255  assert(g != NULL);
256  g->parse();
257  AllGroups().push_back(g);
258 }
259 
260 void
262 {
263  while (!AllGroups().empty()) {
264  // groups are refcounted so we do not explicitly delete them
265  AllGroups().pop_back();
266  }
267 }
268 
269 void
271 {
272  typedef Groups::iterator GI;
273  for (GI i = AllGroups().begin(); i != AllGroups().end(); ++i)
274  storeAppendPrintf(entry, "%s " SQUIDSTRINGPH "\n", name, SQUIDSTRINGPRINT((*i)->id));
275 }
276 
277 void
279 {
280  String groupId = ConfigParser::NextToken();
281  AccessRule *r;
282  if (!(r=FindRuleByGroupId(groupId))) {
283  r = new AccessRule(groupId);
284  AllRules().push_back(r);
285  }
286  r->parse(parser);
287 }
288 
289 void
291 {
292  while (!AllRules().empty()) {
293  delete AllRules().back();
294  AllRules().pop_back();
295  }
296 }
297 
298 void
300 {
301  LOCAL_ARRAY(char, nom, 64);
302 
303  typedef AccessRules::iterator CI;
304  for (CI i = AllRules().begin(); i != AllRules().end(); ++i) {
305  snprintf(nom, 64, "%s " SQUIDSTRINGPH, name, SQUIDSTRINGPRINT((*i)->groupId));
306  dump_acl_access(entry, nom, (*i)->acl);
307  }
308 }
309 
311  onoff(0), service_failure_limit(0), oldest_service_failure(0),
312  service_revival_delay(0)
313 {}
314 
315 // XXX: this is called for ICAP and eCAP configs, but deals mostly
316 // with global arrays shared by those individual configs
318 {
319  freeService();
320 }
321 
int caseCmp(char const *) const
Definition: String.cc:287
static void ParseAccess(ConfigParser &parser)
Definition: Config.cc:278
virtual ServiceConfig * newServiceConfig() const
creates service configuration object that will parse and keep cfg info
Definition: Config.cc:54
#define LOCAL_ARRAY(type, name, size)
Definition: squid.h:75
static bool Enabled
Definition: Config.h:42
static int send_client_ip
Definition: Config.h:47
void storeAppendPrintf(StoreEntry *e, const char *fmt,...)
Definition: store.cc:869
virtual ~Config()
Definition: Config.cc:317
#define SQUIDSTRINGPRINT(s)
Definition: SquidString.h:22
static const char * protectedFieldNamesRaw[]
Definition: Config.cc:33
static int send_username
Definition: Config.h:48
static int use_indirect_client
Definition: Config.h:49
static void FreeServiceGroups(void)
Definition: Config.cc:261
std::vector< String > Store
Definition: ServiceGroups.h:29
#define DBG_CRITICAL
Definition: Debug.h:40
void dumpService(StoreEntry *, const char *) const
Definition: Config.cc:157
#define SQUIDSTRINGPH
Definition: SquidString.h:21
static void FinalizeEach(Collection &collection, const char *label)
Definition: Config.cc:220
virtual bool finalize()
Definition: Config.cc:184
Security::PeerOptions secure
Definition: ServiceConfig.h:53
int size
Definition: ModDevPoll.cc:76
#define NULL
Definition: types.h:166
Definition: Notes.h:109
#define debugs(SECTION, LEVEL, CONTENT)
Definition: Debug.h:123
void dump_acl_access(StoreEntry *entry, const char *name, acl_access *head)
Definition: cache_cf.cc:1521
static int service_iteration_limit
Definition: Config.h:46
ServiceConfigPointer findServiceConfig(const String &)
Definition: Config.cc:91
Services & AllServices()
Definition: Service.cc:61
void removeRule(const String &id)
Removes access rules of the given service or group.
Definition: Config.cc:103
std::vector< SBuf > Keys
unordered annotation names
Definition: Notes.h:112
std::ostream & HERE(std::ostream &s)
Definition: Debug.h:152
ServicePointer FindService(const Service::Id &key)
Definition: Service.cc:68
#define assert(EX)
Definition: assert.h:19
static bool needHistory
HttpRequest adaptation history should recorded.
Definition: Config.h:60
static void ParseServiceGroup(ServiceGroupPointer group)
Definition: Config.cc:253
const char * cfg_filename
Definition: cache_cf.cc:270
void fatalf(const char *fmt,...)
Definition: fatal.cc:68
AccessRules & AllRules()
Definition: AccessRule.cc:61
const char * vectPointStr() const
int config_lineno
Definition: cache_cf.cc:271
static Notes metaHeaders
The list of configured meta headers.
Definition: Config.h:58
static char * NextToken()
static void DumpServiceGroups(StoreEntry *, const char *)
Definition: Config.cc:270
Store removedServices
the disabled services in the case ecap or icap is disabled
Definition: ServiceGroups.h:68
static void ParseServiceChain(void)
Definition: Config.cc:247
#define Important(id)
Definition: DebugMessages.h:91
a group of services that must be used one after another
static void DumpAccess(StoreEntry *, const char *)
Definition: Config.cc:299
Groups & AllGroups()
std::vector< ServiceGroupPointer > Groups
void DetachServices()
detach all adaptation services from current configuration
Definition: Service.cc:78
static void FreeAccess(void)
Definition: Config.cc:290
static void ParseServiceSet(void)
Definition: Config.cc:241
const char * methodStr() const
YesNoNone connectionEncryption
whether this service uses only secure connections
Definition: ServiceConfig.h:54
std::vector< ServiceConfigPointer > ServiceConfigs
Definition: Config.h:62
void parse(ConfigParser &parser)
Definition: AccessRule.cc:30
static char * masterx_shared_name
Definition: Config.h:45
static const Notes::Keys protectedFieldNames(std::begin(protectedFieldNamesRaw), std::end(protectedFieldNamesRaw))
bool encryptTransport
whether transport encryption (TLS/SSL) is to be used on connections to the peer
Definition: PeerOptions.h:145
AccessRule * FindRuleByGroupId(const String &groupId)
Definition: AccessRule.cc:81
void parseService(void)
Definition: Config.cc:135
std::vector< Adaptation::AccessRule * > AccessRules
Definition: AccessRule.h:47
static StatHist s
virtual void clear()
Removes any reference to the services from configuration.
Definition: Config.cc:121
void freeService(void)
Definition: Config.cc:146
static void Finalize(bool enable)
Definition: Config.cc:230
void removeService(const String &service)
Removes the given service from all service groups.
Definition: Config.cc:60

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors