46#define DSM_ONE_GB (1073741824)
61 fUser(user), fCommonUser(), fCommonGroup(),
62 fGroupQuota(), fGroupUsed(),
63 fUserUsed(), fNTouchedFiles(0), fNOpenedFiles(0),
64 fNDisappearedFiles(0), fMTimeGroupConfig(-1)
117 Warning(
"TDataSetManager",
"problems parsing DataSet.SrvMaps input info (%s)"
118 " - ignoring",
srvmaps.Data());
214 Info(
"ReadGroupConfig",
"path to config file undefined - nothing to do");
224 Info(
"ReadGroupConfig",
"file has not changed - do nothing");
233 Error(
"ReadGroupConfig",
"could not stat %s",
cf);
237 Error(
"ReadGroupConfig",
"cannot read %s",
cf);
246 Info(
"ReadGroupConfig",
"reading group config from %s",
cf);
252 Error(
"ReadGroupConfig",
"could not open config file %s",
cf);
265 if (
line[0] ==
'#')
continue;
272 if (key ==
"property") {
277 Info(
"ReadGroupConfig",
"incomplete line: '%s'",
line.Data());
284 if (
type ==
"diskquota") {
290 if (
sdq.IsDigit())
sdq +=
"G";
297 "problems parsing string: wrong or unsupported suffix? %s",
300 }
else if (
type ==
"commonuser") {
308 }
else if (key ==
"dataset") {
313 Info(
"ReadGroupConfig",
"incomplete line: '%s'",
line.Data());
316 if (
type ==
"commonuser") {
322 }
else if (
type ==
"commongroup") {
328 }
else if (
type ==
"diskquota") {
335 }
else if (
on ==
"off") {
340 }
else if (key ==
"averagefilesize") {
346 Info(
"ReadGroupConfig",
"incomplete line: '%s'",
line.Data());
354 "problems parsing string: wrong or unsupported suffix? %s",
357 }
else if (key ==
"include") {
363 Info(
"ReadGroupConfig",
"incomplete line: '%s'",
line.Data());
368 Error(
"ReadGroupConfig",
"request to parse file '%s' which is not readable",
373 Error(
"ReadGroupConfig",
"problems parsing include file '%s'",
subfn.Data());
398 const char *unit[5] = {
"k",
"M",
"G",
"T",
"P"};
556 if (dataset->GetTotalSize() > 0) {
564 size->SetVal(
size->GetVal() + dataset->GetTotalSize());
578 size->SetVal(
size->GetVal() + dataset->GetTotalSize());
602 Printf(
" +++ Group %s uses %.1f GB out of %.1f GB",
group->String().Data(),
626 Printf(
"------------------------------------------------------");
630 Printf(
" +++ Quota check enabled but no quota info available +++ ");
640 Info(
"PrintUsedSpace",
"listing used space");
651 Printf(
"Group %s: %lld B = %.2f GB",
group->String().Data(),
size->GetVal(),
664 Printf(
"------------------------------------------------------");
675 Info(
"MonitorUsedSpace",
"sending used space to monitoring server");
705 Warning(
"MonitorUsedSpace",
"problems sending monitoring parameters");
723 Info(
"GetGroupUsed",
"group %s not found",
group);
727 return size->GetVal();
743 Info(
"GetGroupQuota",
"group %s not found",
group);
746 return value->GetVal();
851 if ((
uristr.Index(
'=') >= 0) && (
uristr.Index(
';') >= 0)) {
857 "Dataset URI looks like a virtual URI, treating it as such. "
858 "No group and user will be parsed!");
880 pc =
uristr.CountChar(
'/');
884 if (pc == 1)
uristr +=
"/*/";
893 Info (
"ParseUri",
"URI query part <%s> ignored",
resolved.GetQuery().Data());
899 Error (
"ParseUri",
"illegal dataset path: '%s'", uri);
901 }
else if (pc >= 0 && pc < 3) {
906 }
else if (pc == 1) {
908 }
else if (pc == 0) {
915 Info(
"ParseUri",
"path: '%s'", path.
Data());
923 if (
gDebug > 0)
Info(
"ParseUri",
"'name' missing");
925 if (
gDebug > 0)
Info(
"ParseUri",
"'user' missing");
928 if (
gDebug > 1)
Info(
"ParseUri",
"'group' missing");
933 if (tree.EndsWith(
"/"))
934 tree.Remove(tree.Length()-1);
937 Info(
"ParseUri",
"group: '%s', user: '%s', dsname:'%s', seg: '%s'",
942 Error (
"ParseUri",
"no wildcards allowed for user/group in this context (uri: '%s')", uri);
948 Error (
"ParseUri",
"DataSet name is empty");
957 Error(
"ParseUri",
"illegal characters in group (uri: '%s', group: '%s')", uri,
group.Data());
961 if (!
wcExp.Match(user)) {
962 Error(
"ParseUri",
"illegal characters in user (uri: '%s', user: '%s')", uri, user.
Data());
968 Error(
"ParseUri",
"illegal characters in name (uri: '%s', name: '%s')", uri,
name.Data());
972 if (tree.Contains(
TRegexp(
"[^A-Za-z0-9-/_]"))) {
973 Error(
"ParseUri",
"Illegal characters in subdir/object name (uri: '%s', obj: '%s')", uri, tree.Data());
979 Error(
"ParseUri",
"only datasets from your group/user allowed");
1011 Info(
"GetDataSets",
"dataset name undefined!");
1018 Info(
"GetDataSets",
"could not retrieve the dataset '%s'",
ds);
1023 if (!(map =
fc->GetFilesPerServer(
exclude))) {
1025 Info(
"GetDataSets",
"could not get map for '%s'",
ds);
1051 if (
fc->GetTitle() && (
strlen(
fc->GetTitle()) > 0)) {
1052 Printf(
"+++ Dumping: %s: ",
fc->GetTitle());
1054 Printf(
"+++ Dumping: %s: ",
fc->GetName());
1056 Printf(
"%s",
fc->ExportInfo(
"+++ Summary:", 1)->GetName());
1064 Printf(
"+++ %5d. %s", ++
nf,
fi->GetCurrentUrl()->GetUrl());
1066 Printf(
"+++ %5d. %s", ++
nf,
fi->GetCurrentUrl()->GetFile());
1134 if (
u ==
"" ||
u ==
"*" ||
u ==
"/*" ||
u ==
"/*/" ||
u ==
"/*/*")
u =
"/*/*/";
1136 Warning(
"ShowDataSets",
"problems parsing URI '%s'", uri);
1143 if (!
u.IsNull() && !
u.Contains(
"*") && !
grp.IsNull() && !
usr.IsNull() && !
dsn.IsNull()) {
1161 u.Form(
"/%s/%s/%s",
grp.Data(),
usr.Data(),
dsn.Data());
1232 ::Info(
"TDataSetManager::ScanDataSet",
"processing a maximum of %d files",
maxfiles);
1249 ::Error(
"TDataSetManager::ScanDataSet",
"input list is mandatory for option 'scan file list'");
1279 TIter iter(dataset->GetList());
1298 ::Info(
"TDataSetManager::ScanDataSet",
"opening %d: file: %s",
1309 ::Info(
"TDataSetManager::ScanDataSet",
" %d files appear to be newly staged",
1324 ::Info(
"TDataSetManager::ScanDataSet",
"opening %d files that appear to be newly staged",
1343 ::Info(
"TDataSetManager::ScanDataSet",
"processing %d.'new' file: %s",
1344 count,
fileInfo->GetCurrentUrl()->GetUrl());
1360 dataset->RemoveDuplicates();
1361 dataset->Update(
avgsz);
1366 ::Info(
"TDataSetManager::ScanDataSet",
"%d files 'new'; %d files touched;"
1422 if (fopt >= 0) fopt %= 100;
1439 ::Error(
"TDataSetManager::CheckStagedStatus",
"GetCurrentUrl() returned 0 for %s",
1440 fileInfo->GetFirstUrl()->GetUrl());
1464 uopt +=
"filetype=raw&mxredir=2";
1472 ::Warning(
"TDataSetManager::CheckStagedStatus",
"problems reading 1 byte from open file");
1480 if (
dbg)
::Info(
"TDataSetManager::CheckStagedStatus",
"file %s disappeared",
url.GetUrl());
1523 ::Info(
"TDataSetManager::CheckStagedStatus",
"IsStaged: %s: %d",
url.GetUrl(),
result);
1527 ::Warning(
"TDataSetManager::CheckStagedStatus",
1528 "could not get stager instance for '%s'",
url.GetUrl());
1549 url.SetOptions(
curl->GetOptions());
1550 url.SetAnchor(
curl->GetAnchor());
1592 ::Error(
"TDataSetManager::ProcessFile",
1593 "could not get valid stager instance for '%s'",
url.GetUrl());
1614 ::Error(
"TDataSetManager::ProcessFile",
"could not locate %s",
url.GetUrl());
1622 ::Error(
"TDataSetManager::ProcessFile",
1623 "problems issuing stage request for %s",
url.GetUrl());
1640 ::Warning(
"TDataSetManager::ProcessFile",
1641 "required file '%s' does not look as being online (staged)",
url.GetUrl());
1659 ::Error(
"TDataSetManager::ScanFile",
"undefined input (!)");
1677 const char *
furl =
url->GetUrl();
1710 eurl.SetOptions(
url->GetOptions());
1711 eurl.SetAnchor(
url->GetAnchor());
1715 !
strcmp(
eurl.GetHost(),
"localhost.localdomain")) {
1722 if (
gDebug > 0)
::Info(
"TDataSetManager::ScanFile",
"added URL %s",
eurl.GetUrl());
1725 ::Warning(
"TDataSetManager::ScanFile",
"end-point URL undefined for file %s", file->
GetName());
1742 if (
dbg)
::Info(
"TDataSetManager::ScanFile",
"marking %s as corrupt",
url->GetUrl());
1758 eurl.SetOptions(
url->GetOptions());
1759 eurl.SetAnchor(
url->GetAnchor());
1763 !
strcmp(
eurl.GetHost(),
"localhost.localdomain")) {
1770 if (
gDebug > 0)
::Info(
"TDataSetManager::ScanFile",
"added URL %s",
eurl.GetUrl());
1779 ::Error(
"TDataSetManager::ScanFile",
1780 "problems processing the directory tree in looking for metainfo");
1805 ::Error(
"TDataSetManager::FillMetaData",
1806 "some inputs are invalid (fi:%p,d:%p,r:%s)",
fi,
d,
rdir);
1810 if (
d->GetListOfKeys()) {
1813 while ((k =
dynamic_cast<TKey *
> (
nxk()))) {
1819 ::Error(
"TDataSetManager::FillMetaData",
"cannot get sub-directory '%s'", k->
GetName());
1823 ::Error(
"TDataSetManager::FillMetaData",
"problems processing sub-directory '%s'", k->
GetName());
1838 fi->AddMetaData(
md);
1840 ::Info(
"TDataSetManager::FillMetaData",
"created meta data for tree %s",
ks.Data());
1853 ::Error(
"TDataSetManager::FillMetaData",
"could not get tree '%s'", k->
GetName());
1871 ::Warning(
"TDataSetManager::ParseDataSetSrvMaps",
1872 "called with an empty string! - nothing to do");
1879 if (
srvmap.Contains(
"|")) {
1887 ::Warning(
"TDataSetManager::ParseDataSetSrvMaps",
1888 "parsing DataSet.SrvMaps: target must be defined"
1889 " (token: %s) - ignoring",
srvmap.Data());
1891 }
else if (!(
st.EndsWith(
"/"))) {
1897 if (!(
sf.IsNull()) &&
sf.Contains(
"*")) {
1899 if (!(
sf.BeginsWith(
u->GetProtocol())))
u->SetProtocol(
"root");
1900 sp.Form(
":%d",
u->GetPort());
1901 if (!(
sf.Contains(
sp)))
u->SetPort(1094);
1935 const char *file =
furl->GetUrl();
1945 if (!
strcmp(
u->GetProtocol(),
furl->GetProtocol())) {
1947 if (!
strcmp(
u->GetProtocol(),
"file")) {
1949 if (re.Index(
furl->GetFileAndOptions(), &
len) == 0) replace =
kTRUE;
1951 if (
u->GetPort() ==
furl->GetPort()) {
1953 if (re.Index(
furl->GetHost(), &
len) == 0) replace =
kTRUE;
1960 if (os->GetString().IsNull() ||
1961 !
strncmp(file, os->GetName(), os->GetString().Length())) replace =
kTRUE;
1967 file1.Form(
"%s%s",
ost->GetName(),
furl->GetFileAndOptions());
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Int_t gErrorIgnoreLevel
Error handling routines.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void reg
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
R__EXTERN TSystem * gSystem
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
static TString fgCommonDataSetTag
static Bool_t CheckStagedStatus(TFileInfo *fileInfo, Int_t fopt, Int_t maxfiles, Int_t newstagedfiles, TFileStager *stager, Bool_t createStager, Bool_t dbg, Bool_t &changed, Bool_t &touched, Bool_t &disappeared)
Check stage status of the file described by "fileInfo".
virtual TFileCollection * GetDataSet(const char *uri, const char *server=0)
Utility function used in various methods for user dataset upload.
virtual Long64_t GetGroupUsed(const char *group)
Returns the used space of that group.
Int_t ScanDataSet(const char *uri, const char *opt)
Scans the dataset indicated by 'uri' following the 'opts' directives.
Bool_t ReadGroupConfig(const char *cf=0)
Read group config file 'cf'.
~TDataSetManager() override
Destructor.
static TList * GetDataSetSrvMaps()
Static getter for server mapping list.
virtual void UpdateUsedSpace()
updates the used space maps
static void ProcessFile(TFileInfo *fileInfo, Int_t sopt, Bool_t checkstg, Bool_t doall, TFileStager *stager, Bool_t createStager, const char *stageopts, Bool_t dbg, Bool_t &changed, Bool_t &opened)
Locate, stage, or fully validate file "fileInfo".
static TList * ParseDataSetSrvMaps(const TString &srvmaps)
Create a server mapping list from the content of 'srvmaps' Return the list (owned by the caller) or 0...
static Int_t ScanFile(TFileInfo *fileinfo, Bool_t notify)
Open the file described by 'fileinfo' to extract the relevant meta-information.
static TString CreateUri(const char *dsGroup=0, const char *dsUser=0, const char *dsName=0, const char *dsTree=0)
Creates URI for the dataset manger in the form '[[/dsGroup/]dsUser/]dsName[#dsObjPath]',...
static Int_t FillMetaData(TFileInfo *fi, TDirectory *d, const char *rdir="/")
Navigate the directory 'd' (and its subdirectories) looking for TTree objects.
void PrintUsedSpace()
Prints the quota.
static Bool_t CheckDataSetSrvMaps(TUrl *furl, TString &fn, TList *srvmaplist=0)
Check if the dataset server mappings apply to the url defined by 'furl'.
void GetQuota(const char *group, const char *user, const char *dsName, TFileCollection *dataset)
Gets quota information from this dataset.
void PrintDataSet(TFileCollection *fc, Int_t popt=0)
Formatted printout of the content of TFileCollection 'fc'.
virtual TMap * GetDataSets(const char *uri, UInt_t=TDataSetManager::kExport)
Returns all datasets for the <group> and <user> specified by <uri>.
void SetScanCounters(Int_t t=-1, Int_t o=-1, Int_t d=-1)
Update scan counters.
virtual Bool_t ExistsDataSet(const char *uri)
Checks if the indicated dataset exits.
virtual TMap * GetGroupQuotaMap()
virtual void ShowDataSets(const char *uri="*", const char *opt="")
Prints formatted information about the dataset 'uri'.
virtual TMap * GetUserUsedMap()
virtual void ShowQuota(const char *opt)
Display quota information.
virtual Int_t NotifyUpdate(const char *group=0, const char *user=0, const char *dspath=0, Long_t mtime=0, const char *checksum=0)
Save into the <datasetdir>/dataset.list file the name of the last updated or created or modified data...
virtual Bool_t RemoveDataSet(const char *uri)
Removes the indicated dataset.
Bool_t ParseUri(const char *uri, TString *dsGroup=0, TString *dsUser=0, TString *dsName=0, TString *dsTree=0, Bool_t onlyCurrent=kFALSE, Bool_t wildcards=kFALSE)
Parses a (relative) URI that describes a DataSet on the cluster.
static TList * fgDataSetSrvMaps
virtual Long64_t GetGroupQuota(const char *group)
returns the quota a group is allowed to have
virtual Int_t ClearCache(const char *uri)
Clear cached information matching uri.
virtual void ParseInitOpts(const char *opts)
Parse the opts string and set the init bits accordingly Available options: Cq: set kCheckQuota Ar: se...
virtual TMap * GetSubDataSets(const char *uri, const char *excludeservers)
Partition dataset 'ds' accordingly to the servers.
TDataSetManager(const TDataSetManager &)
virtual void MonitorUsedSpace(TVirtualMonitoringWriter *monitoring)
Log info to the monitoring server.
virtual Int_t RegisterDataSet(const char *uri, TFileCollection *dataSet, const char *opt)
Register a dataset, perfoming quota checkings, if needed.
static Long64_t ToBytes(const char *size=0)
Static utility function to gt the number of bytes from a string representation in the form "`<digit>`...
virtual Int_t ShowCache(const char *uri)
Show cached information matching uri.
Describe directory structure in memory.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Class that contains a list of TFileInfo's and accumulated meta data information about its entries.
Class describing a generic file including meta information.
static TFileStager * Open(const char *stager)
Open a stager, after having loaded the relevant plug-in.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
virtual Long64_t GetSize() const
Returns the current file size.
virtual const TUrl * GetEndpointUrl() const
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
void Close(Option_t *option="") override
Close a file.
virtual Bool_t ReadBuffer(char *buf, Int_t len)
Read a buffer from the file.
Book space in a file, create I/O buffers, to fill them, (un)compress them.
virtual const char * GetClassName() const
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
void DeleteAll()
Remove all (key,value) pairs from the map AND delete the keys AND values when they are allocated on t...
void Add(TObject *obj) override
This function may not be used (but we need to provide it since it is a pure virtual in TCollection).
TObject * GetValue(const char *keyname) const
Returns a pointer to the value associated with keyname as name of the key.
const char * GetName() const override
Returns name of object.
Collectable string class.
Mother of all ROOT objects.
void AbstractMethod(const char *method) const
Use this method to implement an "abstract" method that you don't want to leave purely abstract.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Wrapper for PCRE library (Perl Compatible Regular Expressions).
Class used by TMap to store (key,value) pairs.
Regular expression class.
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
TString & Insert(Ssiz_t pos, const char *s)
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
const char * Data() const
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
TString & ReplaceAll(const TString &s1, const TString &s2)
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
TString & Remove(Ssiz_t pos)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual const char * Getenv(const char *env)
Get environment variable.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void DispatchOneEvent(Bool_t pendingOnly=kFALSE)
Dispatch a single event.
virtual const char * HostName()
Return the system's host name.
virtual UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
A TTree represents a columnar dataset.
virtual Long64_t GetEntries() const
virtual Long64_t GetZipBytes() const
virtual Long64_t GetTotBytes() const
const char * AsString() const
Return UUID as string. Copy string immediately since it will be reused.
This class represents a RFC 3986 compatible URI.
static TUri Transform(const TUri &reference, const TUri &base)
Transform a URI reference into its target URI using given a base URI.
Bool_t SetUri(const TString &uri)
Parse URI and set the member variables accordingly, returns kTRUE if URI validates,...
This class represents a WWW compatible URL.
const char * GetHostFQDN() const
Return fully qualified domain name of url host.