diff options
-rw-r--r-- | configure.in | 14 | ||||
-rwxr-xr-x | do | 7 | ||||
-rwxr-xr-x | go | 6 | ||||
-rw-r--r-- | include/sysinc.h | 4 | ||||
-rw-r--r-- | m4/libcurl.m4 | 239 | ||||
-rw-r--r-- | src/zabbix_server/Makefile.am | 4 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 95 |
7 files changed, 343 insertions, 26 deletions
diff --git a/configure.in b/configure.in index 2be0810e..3ac20011 100644 --- a/configure.in +++ b/configure.in @@ -70,14 +70,14 @@ dnl AC_CHECK_LIB(pthread, main) dnl Check for socklen_t AC_MSG_CHECKING(for socklen_t) -AC_TRY_COMPILE( -[#include <sys/types.h> +AC_TRY_COMPILE([ +#include <sys/types.h> #include <unistd.h> -#include <sys/socket.h>], -[socklen_t s;], +#include <sys/socket.h> +],[socklen_t s;], AC_MSG_RESULT(yes), -AC_DEFINE(socklen_t, int, [Define socklen_t type]) -AC_MSG_RESULT(no)) +[AC_DEFINE(socklen_t, int, [Define socklen_t type]) +AC_MSG_RESULT(no)]) dnl Check for /proc filesystem AC_MSG_CHECKING(for /proc filesystem) @@ -806,6 +806,8 @@ AC_SUBST(SNMP_INCLUDE) AC_SUBST(SNMP_LFLAGS) AC_SUBST(SNMP_LIBS) +LIBCURL_CHECK_CONFIG([yes], [7.15.1], [],[]) + AC_MSG_CHECKING(for UCD-SNMP support) AC_ARG_WITH(ucd-snmp, [ --with-ucd-snmp[=DIR] Include SNMP support. DIR is the UCD-SNMP @@ -103,7 +103,7 @@ if [ "$premake" = "yes" ] then echo "Pre-making..." echo "Pre-making..." >> WARNINGS - aclocal 2>> WARNINGS + aclocal -I m4 2>> WARNINGS autoconf 2>> WARNINGS autoheader 2>> WARNINGS automake -a 2>> WARNINGS @@ -129,14 +129,15 @@ then echo "Configuring..." >> WARNINGS #export CFLAGS="-Wall" #export CFLAGS="-Wall -pedantic" - ./configure $config_param 2>>WARNINGS + ./configure $config_param 2>> WARNINGS + ./create/schema/gen.pl c 2>> WARNINGS > ./include/dbsync.h fi if [ "$domake" = "yes" ] then echo "Cleaning..." echo "Cleaning..." >> WARNINGS - make clean 2>>WARNINGS + make clean 2>> WARNINGS echo "Making..." echo "Making..." >> WARNINGS make 2>>WARNINGS @@ -5,7 +5,7 @@ clear rm -f WARNINGS echo Pre-making... -aclocal +aclocal -I m4 autoconf autoheader automake -a @@ -32,8 +32,8 @@ cd create/schema cd - #export CFLAGS="-Wall -pedantic" #./configure --enable-agent --enable-server --with-sqlite3 --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null -./configure --enable-agent --enable-server --with-pgsql --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null -#./configure --enable-agent --enable-server --with-mysql --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null +#./configure --enable-agent --enable-server --with-pgsql --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null +./configure --enable-agent --enable-server --with-libcurl --with-mysql --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null #./configure --enable-agent --enable-server --with-oracle=/home/zabbix/sqlora8 --with-net-snmp --prefix=`pwd` 2>>WARNINGS >/dev/null echo Cleaning... make clean 2>>WARNINGS >/dev/null diff --git a/include/sysinc.h b/include/sysinc.h index cd4613e4..02199417 100644 --- a/include/sysinc.h +++ b/include/sysinc.h @@ -326,4 +326,8 @@ # include <procinfo.h> #endif +#ifdef HAVE_LIBCURL +# include <curl/curl.h> +#endif + #endif diff --git a/m4/libcurl.m4 b/m4/libcurl.m4 new file mode 100644 index 00000000..a9bfa2e2 --- /dev/null +++ b/m4/libcurl.m4 @@ -0,0 +1,239 @@ +# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], +# [ACTION-IF-YES], [ACTION-IF-NO]) +# ---------------------------------------------------------- +# David Shaw <dshaw@jabberwocky.com> May-09-2006 +# +# Checks for libcurl. DEFAULT-ACTION is the string yes or no to +# specify whether to default to --with-libcurl or --without-libcurl. +# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the +# minimum version of libcurl to accept. Pass the version as a regular +# version number like 7.10.1. If not supplied, any version is +# accepted. ACTION-IF-YES is a list of shell commands to run if +# libcurl was successfully found and passed the various tests. +# ACTION-IF-NO is a list of shell commands that are run otherwise. +# Note that using --without-libcurl does run ACTION-IF-NO. +# +# This macro #defines HAVE_LIBCURL if a working libcurl setup is +# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary +# values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are +# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy +# where yyy are the various protocols supported by libcurl. Both xxx +# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of +# the macro for the complete list of possible defines. Shell +# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also +# defined to 'yes' for those features and protocols that were found. +# Note that xxx and yyy keep the same capitalization as in the +# curl-config list (e.g. it's "HTTP" and not "http"). +# +# Users may override the detected values by doing something like: +# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure +# +# For the sake of sanity, this macro assumes that any libcurl that is +# found is after version 7.7.2, the first version that included the +# curl-config script. Note that it is very important for people +# packaging binary versions of libcurl to include this script! +# Without curl-config, we can only guess what protocols are available, +# or use curl_version_info to figure it out at runtime. + +AC_DEFUN([LIBCURL_CHECK_CONFIG], +[ + AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL]) + AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4]) + AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6]) + AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz]) + AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS]) + AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN]) + AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI]) + AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM]) + + AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS]) + AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE]) + AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET]) + AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP]) + AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT]) + AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP]) + + AC_ARG_WITH(libcurl, + AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]), + [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])]) + + if test "$_libcurl_with" != "no" ; then + + AC_PROG_AWK + + _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'" + + _libcurl_try_link=yes + + if test -d "$_libcurl_with" ; then + LIBCURL_CPPFLAGS="-I$withval/include" + _libcurl_ldflags="-L$withval/lib" + AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"]) + else + AC_PATH_PROG([_libcurl_config],[curl-config]) + fi + + if test x$_libcurl_config != "x" ; then + AC_CACHE_CHECK([for the version of libcurl], + [libcurl_cv_lib_curl_version], + [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`]) + + _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` + _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse` + + if test $_libcurl_wanted -gt 0 ; then + AC_CACHE_CHECK([for libcurl >= version $2], + [libcurl_cv_lib_version_ok], + [ + if test $_libcurl_version -ge $_libcurl_wanted ; then + libcurl_cv_lib_version_ok=yes + else + libcurl_cv_lib_version_ok=no + fi + ]) + fi + + if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then + if test x"$LIBCURL_CPPFLAGS" = "x" ; then + LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` + fi + if test x"$LIBCURL" = "x" ; then + LIBCURL=`$_libcurl_config --libs` + + # This is so silly, but Apple actually has a bug in their + # curl-config script. Fixed in Tiger, but there are still + # lots of Panther installs around. + case "${host}" in + powerpc-apple-darwin7*) + LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` + ;; + esac + fi + + # All curl-config scripts support --feature + _libcurl_features=`$_libcurl_config --feature` + + # Is it modern enough to have --protocols? (7.12.4) + if test $_libcurl_version -ge 461828 ; then + _libcurl_protocols=`$_libcurl_config --protocols` + fi + else + _libcurl_try_link=no + fi + + unset _libcurl_wanted + fi + + if test $_libcurl_try_link = yes ; then + + # we didn't find curl-config, so let's see if the user-supplied + # link line (or failing that, "-lcurl") is enough. + LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} + + AC_CACHE_CHECK([whether libcurl is usable], + [libcurl_cv_lib_curl_usable], + [ + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBCURL $LIBS" + + AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ +/* Try and use a few common options to force a failure if we are + missing symbols or can't link. */ +int x; +curl_easy_setopt(NULL,CURLOPT_URL,NULL); +x=CURL_ERROR_SIZE; +x=CURLOPT_WRITEFUNCTION; +x=CURLOPT_FILE; +x=CURLOPT_ERRORBUFFER; +x=CURLOPT_STDERR; +x=CURLOPT_VERBOSE; +]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + ]) + + if test $libcurl_cv_lib_curl_usable = yes ; then + + # Does curl_free() exist in this version of libcurl? + # If not, fake it with free() + + _libcurl_save_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" + _libcurl_save_libs=$LIBS + LIBS="$LIBS $LIBCURL" + + AC_CHECK_FUNC(curl_free,, + AC_DEFINE(curl_free,free, + [Define curl_free() as free() if our version of curl lacks curl_free.])) + + CPPFLAGS=$_libcurl_save_cppflags + LIBS=$_libcurl_save_libs + unset _libcurl_save_cppflags + unset _libcurl_save_libs + + AC_DEFINE(HAVE_LIBCURL,1, + [Define to 1 if you have a functional curl library.]) + AC_SUBST(LIBCURL_CPPFLAGS) + AC_SUBST(LIBCURL) + + for _libcurl_feature in $_libcurl_features ; do + AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1]) + eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes + done + + if test "x$_libcurl_protocols" = "x" ; then + + # We don't have --protocols, so just assume that all + # protocols are available + _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" + + if test x$libcurl_feature_SSL = xyes ; then + _libcurl_protocols="$_libcurl_protocols HTTPS" + + # FTPS wasn't standards-compliant until version + # 7.11.0 + if test $_libcurl_version -ge 461568; then + _libcurl_protocols="$_libcurl_protocols FTPS" + fi + fi + fi + + for _libcurl_protocol in $_libcurl_protocols ; do + AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1]) + eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes + done + else + unset LIBCURL + unset LIBCURL_CPPFLAGS + fi + fi + + unset _libcurl_try_link + unset _libcurl_version_parse + unset _libcurl_config + unset _libcurl_feature + unset _libcurl_features + unset _libcurl_protocol + unset _libcurl_protocols + unset _libcurl_version + unset _libcurl_ldflags + fi + + if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then + # This is the IF-NO path + ifelse([$4],,:,[$4]) + else + # This is the IF-YES path + ifelse([$3],,:,[$3]) + fi + + unset _libcurl_with +])dnl diff --git a/src/zabbix_server/Makefile.am b/src/zabbix_server/Makefile.am index 8307a404..2fb0c1d3 100644 --- a/src/zabbix_server/Makefile.am +++ b/src/zabbix_server/Makefile.am @@ -1,5 +1,5 @@ SUBDIRS = alerter housekeeper pinger poller timer trapper nodewatcher utils -INCLUDES=-I@top_srcdir@/include @MYSQL_INCLUDE@ @ORACLE_INCLUDE@ @SNMP_INCLUDE@ @PGSQL_INCLUDE@ @SQLITE3_INCLUDE@ +INCLUDES=-I@top_srcdir@/include @MYSQL_INCLUDE@ @ORACLE_INCLUDE@ @SNMP_INCLUDE@ @PGSQL_INCLUDE@ @SQLITE3_INCLUDE@ @LIBCURL_CPPFLAGS@ bin_PROGRAMS = zabbix_server zabbix_server_SOURCES = evalfunc.c expression.c actions.c events.c zlog.c functions.c server.c @@ -10,5 +10,5 @@ zabbix_server_LDADD = ../libs/zbxsysinfo/libzbxsysinfo.a ../libs/zbxsysinfo/@ARC alerter/libzbxalerter.a timer/libzbxtimer.a trapper/libzbxtrapper.a nodewatcher/libzbxnodewatcher.a \ ../libs/zbxemail/libzbxemail.a utils/libzbxutils.a \ ../libs/zbxsms/libzbxsms.a ../libs/zbxdbhigh/libzbxdbhigh.a ../libs/zbxcommon/libzbxcommon.a \ -../libs/zbxcrypto/libzbxcrypto.a @MYSQL_LIBS@ @PGSQL_LIBS@ @ORACLE_LIBS@ @SQLITE3_LIBS@ @LDAP_LIBS@ @SNMP_LIBS@ +../libs/zbxcrypto/libzbxcrypto.a @MYSQL_LIBS@ @PGSQL_LIBS@ @ORACLE_LIBS@ @SQLITE3_LIBS@ @LDAP_LIBS@ @SNMP_LIBS@ @LIBCURL@ zabbix_server_LDFLAGS=@MYSQL_LFLAGS@ @PGSQL_LFLAGS@ @ORACLE_LFLAGS@ @SQLITE3_LFLAGS@ @LDAP_LFLAGS@ @SNMP_LFLAGS@ diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index 640e632a..b84f5b9b 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -323,31 +323,102 @@ int tcp_listen(const char *host, int port, socklen_t *addrlenp) * * ******************************************************************************/ -/* #define TEST */ +#define TEST #ifdef TEST -#include "zbxsock.h" +#define ZBX_LIM_PRINT(msg, str_len, str, limit) \ + printf(msg "(%i): %." #limit "s<br/>\n", str_len, str, str_len > limit ? "..." : "") + +//#define ZBX_LIM_PRINT(msg, str_len, str, limit) + +size_t HEADERFUNCTION( void *ptr, size_t size, size_t nmemb, void *stream) +{ + ZBX_LIM_PRINT("HEADERFUNCTION", size*nmemb, ptr, 300); + + return size*nmemb; +} + +size_t WRITEFUNCTION( void *ptr, size_t size, size_t nmemb, void *stream) +{ + size_t s = size*nmemb + 1; + char *str_dat = calloc(1, s); + + zbx_snprintf(str_dat,s,ptr); + ZBX_LIM_PRINT("WRITEFUNCTION", s, str_dat, 65535); + + return size*nmemb; +} + +#define XBX_CURL_ERR(msg) \ + printf("ERROR: " msg " [%s]\n", curl_easy_strerror(err)) + +#define ZBX_CURL_SET_OPT(opt_name, opt_val) \ + if(CURLE_OK != (err = curl_easy_setopt(easyhandle, opt_name, opt_val))) \ + XBX_CURL_ERR("curl_easy_setopt(" #opt_name ")") + +typedef struct s_zbx_step +{ + char *url; + char *post; +} zbx_step; void test() { - char err[0xFF]; - struct hostent *host; + int err = CURLE_OK; + CURL *easyhandle = NULL; + zbx_step *stp = NULL; + zbx_step steps[] = { + /* URL POST */ + {"http://www.zabbix.com/forum/", NULL}, + {"http://www.zabbix.com/forum/login.php", "vb_login_username=Eugene" + "&cookieuser=" + "&vb_login_password=" + "&s=" + "&do=login" + "&forceredirect=1" + "&vb_login_md5password=ec5287c45f0e70ec22d52e8bcbeeb640" + "&vb_login_md5password_utf=ec5287c45f0e70ec22d52e8bcbeeb640"}, + {"http://www.zabbix.com/forum/", NULL}, + {"http://www.zabbix.com/forum/usercp.php?", NULL}, + {"http://www.zabbix.com/forum/login.php?do=logout", NULL}, + {"http://www.zabbix.com/forum/", NULL}, + {NULL, NULL} + }; + printf("-= Test Started =-\n"); - host = zbx_gethost("www.zabbix.com"); + if(NULL != (easyhandle = curl_easy_init())) + { + ZBX_CURL_SET_OPT(CURLOPT_COOKIEFILE, ""); + ZBX_CURL_SET_OPT(CURLOPT_FOLLOWLOCATION, 1); + ZBX_CURL_SET_OPT(CURLOPT_HEADERFUNCTION, HEADERFUNCTION); + ZBX_CURL_SET_OPT(CURLOPT_WRITEFUNCTION, WRITEFUNCTION); + + for(stp=&steps[0];(*stp).url; stp++) + { + printf("****************************************************************\n"); + printf("{{ %s }}\n", stp->url); + printf("****************************************************************\n"); + + if(stp->post) ZBX_CURL_SET_OPT(CURLOPT_POSTFIELDS, stp->post); + + ZBX_CURL_SET_OPT(CURLOPT_URL, stp->url); + + if(CURLE_OK != curl_easy_perform(easyhandle)) /* post away! */ + XBX_CURL_ERR("curl_easy_perform()"); - if(host) + fflush(stdout); + } + (void)curl_easy_cleanup(easyhandle); + } + else { - SDI2("HOST: %s", host->h_name); - SDI2("HADDR: %i", host->h_addr[0] & 0xFF); - SDI2("HADDR: %i", host->h_addr[1] & 0xFF); - SDI2("HADDR: %i", host->h_addr[2] & 0xFF); - SDI2("HADDR: %i", host->h_addr[3] & 0xFF); + XBX_CURL_ERR("curl_easy_init()"); } - printf("-= Test completed =-\n"); + printf("\n-= Test completed =-\n"); } #endif /* TEST */ |