diff options
author | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-09-10 12:06:48 +0200 |
---|---|---|
committer | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-09-10 12:06:48 +0200 |
commit | 2c81d1257bd2cccb57c2e9f02fbfc42c70323217 (patch) | |
tree | 5fd8172c7200c69605e284e8dcdadacd431af80c | |
parent | 669441d16c454974622d5d4d1e3aefac5428a26a (diff) | |
download | monitoring-plugins-2c81d1257bd2cccb57c2e9f02fbfc42c70323217.tar.gz |
check_curl: remove goto logic
-rw-r--r-- | plugins/check_curl.c | 260 |
1 files changed, 138 insertions, 122 deletions
diff --git a/plugins/check_curl.c b/plugins/check_curl.c index ba38854a..897ca9e1 100644 --- a/plugins/check_curl.c +++ b/plugins/check_curl.c | |||
@@ -1628,6 +1628,8 @@ check_curl_config_wrapper process_arguments(int argc, char **argv) { | |||
1628 | char *critical_thresholds = NULL; | 1628 | char *critical_thresholds = NULL; |
1629 | int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE; | 1629 | int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE; |
1630 | bool specify_port = false; | 1630 | bool specify_port = false; |
1631 | bool enable_tls = false; | ||
1632 | char *tls_option_optarg = NULL; | ||
1631 | 1633 | ||
1632 | while (true) { | 1634 | while (true) { |
1633 | int option_index = getopt_long( | 1635 | int option_index = getopt_long( |
@@ -1748,152 +1750,82 @@ check_curl_config_wrapper process_arguments(int argc, char **argv) { | |||
1748 | result.config.display_html = false; | 1750 | result.config.display_html = false; |
1749 | break; | 1751 | break; |
1750 | case 'C': /* Check SSL cert validity */ | 1752 | case 'C': /* Check SSL cert validity */ |
1751 | #ifdef LIBCURL_FEATURE_SSL | 1753 | #ifndef LIBCURL_FEATURE_SSL |
1752 | char *temp; | 1754 | usage4(_("Invalid option - SSL is not available")); |
1753 | if ((temp = strchr(optarg, ',')) != NULL) { | 1755 | #endif |
1754 | *temp = '\0'; | 1756 | { |
1755 | if (!is_intnonneg(optarg)) { | 1757 | char *temp; |
1756 | usage2(_("Invalid certificate expiration period"), optarg); | 1758 | if ((temp = strchr(optarg, ',')) != NULL) { |
1757 | } | 1759 | *temp = '\0'; |
1758 | result.config.days_till_exp_warn = atoi(optarg); | 1760 | if (!is_intnonneg(optarg)) { |
1759 | *temp = ','; | 1761 | usage2(_("Invalid certificate expiration period"), optarg); |
1760 | temp++; | 1762 | } |
1761 | if (!is_intnonneg(temp)) { | 1763 | result.config.days_till_exp_warn = atoi(optarg); |
1762 | usage2(_("Invalid certificate expiration period"), temp); | 1764 | *temp = ','; |
1763 | } | 1765 | temp++; |
1764 | result.config.days_till_exp_crit = atoi(temp); | 1766 | if (!is_intnonneg(temp)) { |
1765 | } else { | 1767 | usage2(_("Invalid certificate expiration period"), temp); |
1766 | result.config.days_till_exp_crit = 0; | 1768 | } |
1767 | if (!is_intnonneg(optarg)) { | 1769 | result.config.days_till_exp_crit = atoi(temp); |
1768 | usage2(_("Invalid certificate expiration period"), optarg); | 1770 | } else { |
1771 | result.config.days_till_exp_crit = 0; | ||
1772 | if (!is_intnonneg(optarg)) { | ||
1773 | usage2(_("Invalid certificate expiration period"), optarg); | ||
1774 | } | ||
1775 | result.config.days_till_exp_warn = atoi(optarg); | ||
1769 | } | 1776 | } |
1770 | result.config.days_till_exp_warn = atoi(optarg); | 1777 | result.config.check_cert = true; |
1778 | enable_tls = true; | ||
1771 | } | 1779 | } |
1772 | result.config.check_cert = true; | 1780 | break; |
1773 | goto enable_ssl; | ||
1774 | #endif | ||
1775 | case CONTINUE_AFTER_CHECK_CERT: /* don't stop after the certificate is checked */ | 1781 | case CONTINUE_AFTER_CHECK_CERT: /* don't stop after the certificate is checked */ |
1776 | #ifdef HAVE_SSL | 1782 | #ifdef HAVE_SSL |
1777 | result.config.continue_after_check_cert = true; | 1783 | result.config.continue_after_check_cert = true; |
1778 | break; | 1784 | break; |
1779 | #endif | 1785 | #endif |
1780 | case 'J': /* use client certificate */ | 1786 | case 'J': /* use client certificate */ |
1781 | #ifdef LIBCURL_FEATURE_SSL | 1787 | #ifndef LIBCURL_FEATURE_SSL |
1788 | usage4(_("Invalid option - SSL is not available")); | ||
1789 | #endif | ||
1782 | test_file(optarg); | 1790 | test_file(optarg); |
1783 | result.config.client_cert = optarg; | 1791 | result.config.client_cert = optarg; |
1784 | goto enable_ssl; | 1792 | enable_tls = true; |
1785 | #endif | 1793 | break; |
1786 | case 'K': /* use client private key */ | 1794 | case 'K': /* use client private key */ |
1787 | #ifdef LIBCURL_FEATURE_SSL | 1795 | #ifndef LIBCURL_FEATURE_SSL |
1796 | usage4(_("Invalid option - SSL is not available")); | ||
1797 | #endif | ||
1788 | test_file(optarg); | 1798 | test_file(optarg); |
1789 | result.config.client_privkey = optarg; | 1799 | result.config.client_privkey = optarg; |
1790 | goto enable_ssl; | 1800 | enable_tls = true; |
1791 | #endif | 1801 | break; |
1792 | #ifdef LIBCURL_FEATURE_SSL | ||
1793 | case CA_CERT_OPTION: /* use CA chain file */ | 1802 | case CA_CERT_OPTION: /* use CA chain file */ |
1803 | #ifndef LIBCURL_FEATURE_SSL | ||
1804 | usage4(_("Invalid option - SSL is not available")); | ||
1805 | #endif | ||
1794 | test_file(optarg); | 1806 | test_file(optarg); |
1795 | result.config.ca_cert = optarg; | 1807 | result.config.ca_cert = optarg; |
1796 | goto enable_ssl; | 1808 | enable_tls = true; |
1797 | #endif | 1809 | break; |
1798 | #ifdef LIBCURL_FEATURE_SSL | ||
1799 | case 'D': /* verify peer certificate & host */ | 1810 | case 'D': /* verify peer certificate & host */ |
1811 | #ifndef LIBCURL_FEATURE_SSL | ||
1812 | usage4(_("Invalid option - SSL is not available")); | ||
1813 | #endif | ||
1800 | result.config.verify_peer_and_host = true; | 1814 | result.config.verify_peer_and_host = true; |
1815 | enable_tls = true; | ||
1801 | break; | 1816 | break; |
1802 | #endif | ||
1803 | case 'S': /* use SSL */ | 1817 | case 'S': /* use SSL */ |
1804 | #ifdef LIBCURL_FEATURE_SSL | 1818 | tls_option_optarg = optarg; |
1805 | { | 1819 | enable_tls = true; |
1806 | enable_ssl: | 1820 | #ifndef LIBCURL_FEATURE_SSL |
1807 | bool got_plus = false; | ||
1808 | result.config.initial_config.use_ssl = true; | ||
1809 | /* ssl_version initialized to CURL_SSLVERSION_DEFAULT as a default. | ||
1810 | * Only set if it's non-zero. This helps when we include multiple | ||
1811 | * parameters, like -S and -C combinations */ | ||
1812 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
1813 | if (option_index == 'S' && optarg != NULL) { | ||
1814 | char *plus_ptr = strchr(optarg, '+'); | ||
1815 | if (plus_ptr) { | ||
1816 | got_plus = true; | ||
1817 | *plus_ptr = '\0'; | ||
1818 | } | ||
1819 | |||
1820 | if (optarg[0] == '2') { | ||
1821 | result.config.ssl_version = CURL_SSLVERSION_SSLv2; | ||
1822 | } else if (optarg[0] == '3') { | ||
1823 | result.config.ssl_version = CURL_SSLVERSION_SSLv3; | ||
1824 | } else if (!strcmp(optarg, "1") || !strcmp(optarg, "1.0")) { | ||
1825 | # if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
1826 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_0; | ||
1827 | # else | ||
1828 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
1829 | # endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
1830 | } else if (!strcmp(optarg, "1.1")) { | ||
1831 | # if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
1832 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_1; | ||
1833 | # else | ||
1834 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
1835 | # endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
1836 | } else if (!strcmp(optarg, "1.2")) { | ||
1837 | # if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
1838 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_2; | ||
1839 | # else | ||
1840 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
1841 | # endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
1842 | } else if (!strcmp(optarg, "1.3")) { | ||
1843 | # if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 52, 0) | ||
1844 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_3; | ||
1845 | # else | ||
1846 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
1847 | # endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 52, 0) */ | ||
1848 | } else { | ||
1849 | usage4(_("Invalid option - Valid SSL/TLS versions: 2, 3, 1, 1.1, 1.2, 1.3 " | ||
1850 | "(with optional '+' suffix)")); | ||
1851 | } | ||
1852 | } | ||
1853 | # if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 54, 0) | ||
1854 | if (got_plus) { | ||
1855 | switch (result.config.ssl_version) { | ||
1856 | case CURL_SSLVERSION_TLSv1_3: | ||
1857 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_3; | ||
1858 | break; | ||
1859 | case CURL_SSLVERSION_TLSv1_2: | ||
1860 | case CURL_SSLVERSION_TLSv1_1: | ||
1861 | case CURL_SSLVERSION_TLSv1_0: | ||
1862 | result.config.ssl_version |= CURL_SSLVERSION_MAX_DEFAULT; | ||
1863 | break; | ||
1864 | } | ||
1865 | } else { | ||
1866 | switch (result.config.ssl_version) { | ||
1867 | case CURL_SSLVERSION_TLSv1_3: | ||
1868 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_3; | ||
1869 | break; | ||
1870 | case CURL_SSLVERSION_TLSv1_2: | ||
1871 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_2; | ||
1872 | break; | ||
1873 | case CURL_SSLVERSION_TLSv1_1: | ||
1874 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_1; | ||
1875 | break; | ||
1876 | case CURL_SSLVERSION_TLSv1_0: | ||
1877 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_0; | ||
1878 | break; | ||
1879 | } | ||
1880 | } | ||
1881 | # endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 54, 0) */ | ||
1882 | if (verbose >= 2) { | ||
1883 | printf(_("* Set SSL/TLS version to %d\n"), result.config.ssl_version); | ||
1884 | } | ||
1885 | if (!specify_port) { | ||
1886 | result.config.initial_config.serverPort = HTTPS_PORT; | ||
1887 | } | ||
1888 | } break; | ||
1889 | #else /* LIBCURL_FEATURE_SSL */ | ||
1890 | /* -C -J and -K fall through to here without SSL */ | ||
1891 | usage4(_("Invalid option - SSL is not available")); | 1821 | usage4(_("Invalid option - SSL is not available")); |
1822 | #endif | ||
1892 | break; | 1823 | break; |
1893 | case SNI_OPTION: /* --sni is parsed, but ignored, the default is true with libcurl */ | 1824 | case SNI_OPTION: /* --sni is parsed, but ignored, the default is true with libcurl */ |
1894 | use_sni = true; | 1825 | #ifndef LIBCURL_FEATURE_SSL |
1895 | break; | 1826 | usage4(_("Invalid option - SSL is not available")); |
1896 | #endif /* LIBCURL_FEATURE_SSL */ | 1827 | #endif /* LIBCURL_FEATURE_SSL */ |
1828 | break; | ||
1897 | case MAX_REDIRS_OPTION: | 1829 | case MAX_REDIRS_OPTION: |
1898 | if (!is_intnonneg(optarg)) { | 1830 | if (!is_intnonneg(optarg)) { |
1899 | usage2(_("Invalid max_redirs count"), optarg); | 1831 | usage2(_("Invalid max_redirs count"), optarg); |
@@ -2080,6 +2012,90 @@ check_curl_config_wrapper process_arguments(int argc, char **argv) { | |||
2080 | } | 2012 | } |
2081 | } | 2013 | } |
2082 | 2014 | ||
2015 | if (enable_tls) { | ||
2016 | bool got_plus = false; | ||
2017 | result.config.initial_config.use_ssl = true; | ||
2018 | /* ssl_version initialized to CURL_SSLVERSION_DEFAULT as a default. | ||
2019 | * Only set if it's non-zero. This helps when we include multiple | ||
2020 | * parameters, like -S and -C combinations */ | ||
2021 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
2022 | if (tls_option_optarg != NULL) { | ||
2023 | char *plus_ptr = strchr(optarg, '+'); | ||
2024 | if (plus_ptr) { | ||
2025 | got_plus = true; | ||
2026 | *plus_ptr = '\0'; | ||
2027 | } | ||
2028 | |||
2029 | if (optarg[0] == '2') { | ||
2030 | result.config.ssl_version = CURL_SSLVERSION_SSLv2; | ||
2031 | } else if (optarg[0] == '3') { | ||
2032 | result.config.ssl_version = CURL_SSLVERSION_SSLv3; | ||
2033 | } else if (!strcmp(optarg, "1") || !strcmp(optarg, "1.0")) { | ||
2034 | #if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
2035 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_0; | ||
2036 | #else | ||
2037 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
2038 | #endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
2039 | } else if (!strcmp(optarg, "1.1")) { | ||
2040 | #if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
2041 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_1; | ||
2042 | #else | ||
2043 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
2044 | #endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
2045 | } else if (!strcmp(optarg, "1.2")) { | ||
2046 | #if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) | ||
2047 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_2; | ||
2048 | #else | ||
2049 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
2050 | #endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 34, 0) */ | ||
2051 | } else if (!strcmp(optarg, "1.3")) { | ||
2052 | #if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 52, 0) | ||
2053 | result.config.ssl_version = CURL_SSLVERSION_TLSv1_3; | ||
2054 | #else | ||
2055 | result.config.ssl_version = CURL_SSLVERSION_DEFAULT; | ||
2056 | #endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 52, 0) */ | ||
2057 | } else { | ||
2058 | usage4(_("Invalid option - Valid SSL/TLS versions: 2, 3, 1, 1.1, 1.2, 1.3 " | ||
2059 | "(with optional '+' suffix)")); | ||
2060 | } | ||
2061 | } | ||
2062 | #if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 54, 0) | ||
2063 | if (got_plus) { | ||
2064 | switch (result.config.ssl_version) { | ||
2065 | case CURL_SSLVERSION_TLSv1_3: | ||
2066 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_3; | ||
2067 | break; | ||
2068 | case CURL_SSLVERSION_TLSv1_2: | ||
2069 | case CURL_SSLVERSION_TLSv1_1: | ||
2070 | case CURL_SSLVERSION_TLSv1_0: | ||
2071 | result.config.ssl_version |= CURL_SSLVERSION_MAX_DEFAULT; | ||
2072 | break; | ||
2073 | } | ||
2074 | } else { | ||
2075 | switch (result.config.ssl_version) { | ||
2076 | case CURL_SSLVERSION_TLSv1_3: | ||
2077 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_3; | ||
2078 | break; | ||
2079 | case CURL_SSLVERSION_TLSv1_2: | ||
2080 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_2; | ||
2081 | break; | ||
2082 | case CURL_SSLVERSION_TLSv1_1: | ||
2083 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_1; | ||
2084 | break; | ||
2085 | case CURL_SSLVERSION_TLSv1_0: | ||
2086 | result.config.ssl_version |= CURL_SSLVERSION_MAX_TLSv1_0; | ||
2087 | break; | ||
2088 | } | ||
2089 | } | ||
2090 | #endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 54, 0) */ | ||
2091 | if (verbose >= 2) { | ||
2092 | printf(_("* Set SSL/TLS version to %d\n"), result.config.ssl_version); | ||
2093 | } | ||
2094 | if (!specify_port) { | ||
2095 | result.config.initial_config.serverPort = HTTPS_PORT; | ||
2096 | } | ||
2097 | } | ||
2098 | |||
2083 | int option_counter = optind; | 2099 | int option_counter = optind; |
2084 | 2100 | ||
2085 | if (result.config.initial_config.server_address == NULL && option_counter < argc) { | 2101 | if (result.config.initial_config.server_address == NULL && option_counter < argc) { |