/*
* Copyright (C), 2000-2007 by the monit project group.
* All Rights Reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef MONIT_UTIL_H
#define MONIT_UTIL_H
/**
* General purpose utility methods.
*
* @author Jan-Henrik Haukeland,
* @author "Martin Pala"
* @author Christian Hopp
* @author Michael Amster,
*
* @version \$Id: util.h,v 1.19 2007/10/16 03:05:41 hauk Exp $
* @file
*/
/**
* Return only the filename with leading directory components
* removed. This function does not modify the path string.
* @param path A file path string
* @return A pointer to the basename in path
*/
char *Util_basename(char* path);
/**
* Removes everything from the first line break or newline (CR|LF)
* @param s A string to be chomped
* @return The chomped string
*/
char *Util_chomp(char *s);
/**
* Remove leading and trailing space from the string
* @param s A string
* @return s with leading and trailing spaces removed
*/
char *Util_trim(char *s);
/**
* Remove leading white space [ \t\r\n] from the string.
* @param s A string
* @return s with leading spaces removed
*/
char *Util_ltrim(char *s);
/**
* Remove trailing white space [ \t\r\n] from the string
* @param s A string
* @return s with trailing spaces removed
*/
char *Util_rtrim(char *s);
/**
* Remove any enclosing quotes ["'] from the string
* @param s A string
* @return s with any enclosed quotes removed
*/
void Util_trimQuotes(char *s);
/**
* Replace all occurrences of the old char in the string
* s with the new char.
* @param s A string
* @param old The old char
* @param new The new char
* @return s where all occurrence of old are replaced with new
*/
char *Util_replace(char *s, char old, char new);
/**
* Replace all occurrences of the sub-string old in the string src
* with the sub-string new. The method is case sensitive for the
* sub-strings new and old. The string parameter src must be an
* allocated string, not a character array.
* @param src An allocated string reference (e.g. &string)
* @param old The old sub-string
* @param new The new sub-string
* @return src where all occurrences of the old sub-string are
* replaced with the new sub-string.
*/
char *Util_replaceString(char **src, const char *old, const char *new);
/**
* Count the number the sub-string word occurs in s.
* @param s The String to search for word in
* @param word The sub-string to count in s
*/
int Util_countWords(char *s, const char *word);
/**
* Return TRUE if the string a starts with the string
* b. The test is case-insensitive but depends on that
* all characters in the two strings can be translated in the current
* locale.
* @param a The string to search for b in
* @param b The sub-string to test a against
* @return TRUE if a starts with b, otherwise FALSE
*/
int Util_startsWith(const char *a, const char *b);
/**
* Exchanges \escape sequences in a string
* @param buf A string
*/
void Util_handleEscapes(char *buf);
/**
* Variant of Util_handleEscapes() which only handle \0x00 escape sequences
* in a string
* @param buf A string
* @return The new length of buf
*/
int Util_handle0Escapes(char *buf);
/**
* Convert a digest buffer to a char string
* @param digest buffer containing a MD digest
* @param mdlen digest length
* @param result buffer to write the result to. Must be at least
* 41 bytes long.
*/
char *Util_digest2Bytes(unsigned char *digest, int mdlen, MD_T result);
/**
* @param name A service name as stated in the config file
* @return the named service or NULL if not found
*/
Service_T Util_getService(const char *name);
/**
* @param name A service name as stated in the config file
* @return TRUE if the service name exist in the
* servicelist, otherwise FALSE
*/
int Util_existService(const char *name);
/**
* Get the length of the service list, that is; the number of services
* managed by monit
* @return The number of services monitored
*/
int Util_getNumberOfServices();
/**
* Print the Runtime object
*/
void Util_printRunList();
/**
* Print a service object
* @param p A Service_T object
*/
void Util_printService(Service_T s);
/**
* Print all the services in the servicelist
*/
void Util_printServiceList();
/**
* Print file hashes from stdin or from the given file
*/
void Util_printHash(char *filename);
/**
* Open and read the pid from the given pidfile.
* @param pidfile A pidfile with full path
* @return the pid (TRUE) or FALSE if the pid could
* not be read from the file
*/
pid_t Util_getPid(char *pidfile);
/**
* @return TRUE (i.e. the running pid id) if
* the process is running, otherwise FALSE
*/
int Util_isProcessRunning(Service_T s);
/**
* Returns a RFC822 Date string. If the given date is NULL compute the
* date now. If an error occured the result buffer is set to an empty
* string. The result buffer should be large enough to hold 33 bytes.
* @param date seconds since EPOCH
* @param result The buffer to write the date string to
* @param len the length of the result buffer
* @return a pointer to the result buffer
*/
char *Util_getRFC822Date(time_t *date, char *result, int len);
/**
* Compute an uptime for a process based on the ctime
* from the pidfile.
* @param pidfile A process pidfile
* @return an uptime
*/
time_t Util_getProcessUptime(char *pidfile);
/**
* Compute an uptime string based on the delta time in seconds. The
* caller must free the returned string.
* @param delta seconds.
* @param sep string separator
* @return an uptime string
*/
char *Util_getUptime(time_t delta, char *sep);
/**
* @return a checksum for the given file, or NULL if error.
*/
char *Util_getChecksum(char *file, int hashtype);
/**
* Escape an uri string converting unsafe characters to a hex (%xx)
* representation. The caller must free the returned string.
* @param uri an uri string
* @return the escaped string
*/
char *Util_urlEncode(char *uri);
/**
* Unescape an url string. The url parameter is modified
* by this method.
* @param url an escaped url string
* @return A pointer to the unescaped urlstring
*/
char *Util_urlDecode(char *url);
/**
* @return a Basic Authentication Authorization string (RFC 2617),
* with credentials from the Run object, NULL if credentials are not defined.
*/
char *Util_getBasicAuthHeader();
/**
* Creates a new String by merging a formated string and a variable
* argument list. The caller must free the returned String.
* @param s A format string
* @return The new String or NULL if the string could not be created
*/
char *Util_getString(const char *s, ...);
/**
* Do printf style format line parsing
* @param s format string
* @param ap variable argument list
* @param len The lenght of the bytes written,
* may be different from the returned allocated buffer size
* @return buffer with parsed string
*/
char *Util_formatString(const char *s, va_list ap, long *len);
/**
* Redirect the standard file descriptors to /dev/null and route any
* error messages to the log file.
*/
void Util_redirectStdFds();
/*
* Close all filedescriptors except standard. Everything
* seems to have getdtablesize, so we'll use it here, and back
* out to use 1024 if getdtablesize not available.
*/
void Util_closeFds();
/*
* Check if monit does have credentials for this user. If successful
* a pointer to the password is returned.
*/
Auth_T Util_getUserCredentials(char *uname);
/**
* Check if the given password match the registred password for the
* given username.
* @param uname Username
* @param outside The password to test
* @return TRUE if the passwords match for the given uname otherwise
* FALSE
*/
int Util_checkCredentials(char *uname, char *outside);
/**
* Compute SHA1 and MD5 message digests simultaneously for bytes read
* from STREAM (suitable for stdin, which is not always rewindable).
* The resulting message digest numbers will be written into the first
* bytes of resblock buffers.
* @param stream The stream from where the digests are computed
* @param sha_resblock The buffer to write the SHA1 result to
* @param md5_resblock The buffer to write the MD5 result to
*/
int Util_getStreamDigests (FILE *stream, void *sha_resblock, void *md5_resblock);
/**
* Reset the service information structure
*/
void Util_resetInfo(Service_T s);
/**
* Are service status data available?
* @param s The service to test
* @return TRUE if available otherwise FALSE
*/
int Util_hasServiceStatus(Service_T s);
/**
* Construct a HTTP/1.1 Host header utilizing information from the
* socket. The returned hostBuf is set to "hostname:port" or to the
* empty string if information is not available or not applicable.
* @param s A connected socket
* @param hostBuf the buffer to write the host-header to
* @param len Length of the hostBuf
* @return the hostBuffer
*/
char *Util_getHTTPHostHeader(Socket_T s, char *hostBuf, int len);
/**
* Evaluate a qualification expression.
* @param operator The qualification operator
* @param left Expression lval
* @param rightExpression rval
* @return the boolean value of the expression
*/
int Util_evalQExpression(int operator, long long left, long long right);
/*
* This will enable service monitoring in the case that it was disabled.
* @param s A Service_T object
*/
void Util_monitorSet(Service_T s);
/*
* This will disable service monitoring in the case that it is enabled
* @param s A Service_T object
*/
void Util_monitorUnset(Service_T s);
/*
* Retun appropriate action id for string
* @param action A action string
* @return the action id
*/
int Util_getAction(const char *action);
/**
* Print event ratio needed to trigger the action to the buffer
* @param action A action string
* @return the action id
*/
char *Util_getEventratio(Action_T action, char *buf);
/**
* Print port type description
* @param p A port structure
* @return the socket type description
*/
char *Util_portTypeDescription(Port_T p);
#endif