mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-05 21:04:28 +02:00
Add hostname support for check_ping
ipv6 resolving has not been tested thoroughly fixes #9831
This commit is contained in:
parent
adad7180e0
commit
abd99efae7
@ -46,17 +46,23 @@ INT wmain(INT argc, WCHAR **argv)
|
|||||||
response response;
|
response response;
|
||||||
|
|
||||||
WSADATA dat;
|
WSADATA dat;
|
||||||
WORD req = MAKEWORD(1, 1);
|
|
||||||
|
|
||||||
WSAStartup(req, &dat);
|
if (WSAStartup(MAKEWORD(2, 2), &dat)) {
|
||||||
|
std::cout << "WSAStartup failed\n";
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
if (parseArguments(argc, argv, vm, printInfo) != -1)
|
if (parseArguments(argc, argv, vm, printInfo) != -1)
|
||||||
return 3;
|
return 3;
|
||||||
if (printInfo.ipv4) {
|
|
||||||
if (check_ping4(printInfo, response) != -1)
|
if (!resolveHostname(printInfo.host, printInfo.ipv6, printInfo.ip))
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
if (printInfo.ipv6) {
|
||||||
|
if (check_ping6(printInfo, response) != -1)
|
||||||
return 3;
|
return 3;
|
||||||
} else {
|
} else {
|
||||||
if (check_ping6(printInfo, response) != -1)
|
if (check_ping4(printInfo, response) != -1)
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,9 +82,9 @@ INT parseArguments(INT ac, WCHAR **av, po::variables_map& vm, printInfoStruct& p
|
|||||||
("help,h", "Print usage message and exit")
|
("help,h", "Print usage message and exit")
|
||||||
("version,V", "Print version and exit")
|
("version,V", "Print version and exit")
|
||||||
("debug,d", "Verbose/Debug output")
|
("debug,d", "Verbose/Debug output")
|
||||||
("host,H", po::wvalue<std::wstring>()->required(), "Host ip to ping")
|
("host,H", po::wvalue<std::wstring>()->required(), "Target hostname or IP. If an IPv6 address is given, the '-6' option must be set")
|
||||||
(",4", "--Host is an ipv4 address (default)")
|
(",4", "--Host is an IPv4 address or if it's a hostname: Resolve it to an IPv4 address (default)")
|
||||||
(",6", "--Host is an ipv6 address")
|
(",6", "--Host is an IPv6 address or if it's a hostname: Resolve it to an IPv6 address")
|
||||||
("timeout,t", po::value<INT>(), "Specify timeout for requests in ms (default=1000)")
|
("timeout,t", po::value<INT>(), "Specify timeout for requests in ms (default=1000)")
|
||||||
("packets,p", po::value<INT>(), "Declare ping count (default=5)")
|
("packets,p", po::value<INT>(), "Declare ping count (default=5)")
|
||||||
("warning,w", po::wvalue<std::wstring>(), "Warning values: rtt,package loss")
|
("warning,w", po::wvalue<std::wstring>(), "Warning values: rtt,package loss")
|
||||||
@ -154,6 +160,8 @@ INT parseArguments(INT ac, WCHAR **av, po::variables_map& vm, printInfoStruct& p
|
|||||||
std::cout << "Conflicting options \"4\" and \"6\"" << '\n';
|
std::cout << "Conflicting options \"4\" and \"6\"" << '\n';
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
if (vm.count("-6"))
|
||||||
|
printInfo.ipv6 = TRUE;
|
||||||
|
|
||||||
if (vm.count("warning")) {
|
if (vm.count("warning")) {
|
||||||
std::vector<std::wstring> sVec = splitMultiOptions(vm["warning"].as<std::wstring>());
|
std::vector<std::wstring> sVec = splitMultiOptions(vm["warning"].as<std::wstring>());
|
||||||
@ -196,8 +204,7 @@ INT parseArguments(INT ac, WCHAR **av, po::variables_map& vm, printInfoStruct& p
|
|||||||
printInfo.timeout = vm["timeout"].as<INT>();
|
printInfo.timeout = vm["timeout"].as<INT>();
|
||||||
if (vm.count("packets"))
|
if (vm.count("packets"))
|
||||||
printInfo.num = vm["packets"].as<INT>();
|
printInfo.num = vm["packets"].as<INT>();
|
||||||
if (vm.count("-6"))
|
|
||||||
printInfo.ipv4 = FALSE;
|
|
||||||
|
|
||||||
printInfo.host = vm["host"].as<std::wstring>();
|
printInfo.host = vm["host"].as<std::wstring>();
|
||||||
|
|
||||||
@ -247,7 +254,45 @@ INT printOutput(printInfoStruct& printInfo, response& response)
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT check_ping4(const printInfoStruct& pi, response& response)
|
BOOL resolveHostname(CONST std::wstring hostname, BOOL ipv6, std::wstring& ipaddr)
|
||||||
|
{
|
||||||
|
ADDRINFOW *result = NULL;
|
||||||
|
ADDRINFOW *ptr = NULL;
|
||||||
|
ADDRINFOW hints;
|
||||||
|
ZeroMemory(&hints, sizeof(hints));
|
||||||
|
wchar_t ipstringbuffer[46];
|
||||||
|
|
||||||
|
if (ipv6)
|
||||||
|
hints.ai_family = AF_INET6;
|
||||||
|
else
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
std::wcout << L"Resolving hostname \"" << hostname << L"\"\n";
|
||||||
|
|
||||||
|
DWORD ret = GetAddrInfoW(hostname.c_str(), NULL, &hints, &result);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
std::cout << "Failed to resolve hostname. Winsock Error Code: " << ret << '\n';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ipv6) {
|
||||||
|
struct sockaddr_in6 *address6 = (struct sockaddr_in6 *) result->ai_addr;
|
||||||
|
InetNtop(AF_INET6, &address6->sin6_addr, ipstringbuffer, 46);
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in *address4 = (struct sockaddr_in *) result->ai_addr;
|
||||||
|
InetNtop(AF_INET, &address4->sin_addr, ipstringbuffer, 46);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
std::wcout << L"Resolved to \"" << ipstringbuffer << L"\"\n";
|
||||||
|
|
||||||
|
ipaddr = ipstringbuffer;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT check_ping4(CONST printInfoStruct& pi, response& response)
|
||||||
{
|
{
|
||||||
in_addr ipDest4;
|
in_addr ipDest4;
|
||||||
HANDLE hIcmp;
|
HANDLE hIcmp;
|
||||||
@ -261,13 +306,13 @@ INT check_ping4(const printInfoStruct& pi, response& response)
|
|||||||
if (debug)
|
if (debug)
|
||||||
std::wcout << L"Parsing ip address" << '\n';
|
std::wcout << L"Parsing ip address" << '\n';
|
||||||
|
|
||||||
if (RtlIpv4StringToAddress(pi.host.c_str(), TRUE, &term, &ipDest4) == STATUS_INVALID_PARAMETER) {
|
if (RtlIpv4StringToAddress(pi.ip.c_str(), TRUE, &term, &ipDest4) == STATUS_INVALID_PARAMETER) {
|
||||||
std::wcout << pi.host << " is not a valid ip address\n";
|
std::wcout << pi.ip << " is not a valid ip address\n";
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*term != L'\0') {
|
if (*term != L'\0') {
|
||||||
std::wcout << pi.host << " is not a valid ip address\n";
|
std::wcout << pi.ip << " is not a valid ip address\n";
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +391,7 @@ die:
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT check_ping6(const printInfoStruct& pi, response& response)
|
INT check_ping6(CONST printInfoStruct& pi, response& response)
|
||||||
{
|
{
|
||||||
sockaddr_in6 ipDest6, ipSource6;
|
sockaddr_in6 ipDest6, ipSource6;
|
||||||
IP_OPTION_INFORMATION ipInfo = { 30, 0, 0, 0, NULL };
|
IP_OPTION_INFORMATION ipInfo = { 30, 0, 0, 0, NULL };
|
||||||
@ -361,8 +406,8 @@ INT check_ping6(const printInfoStruct& pi, response& response)
|
|||||||
if (debug)
|
if (debug)
|
||||||
std::wcout << L"Parsing ip address" << '\n';
|
std::wcout << L"Parsing ip address" << '\n';
|
||||||
|
|
||||||
if (RtlIpv6StringToAddressEx(pi.host.c_str(), &ipDest6.sin6_addr, &ipDest6.sin6_scope_id, &ipDest6.sin6_port)) {
|
if (RtlIpv6StringToAddressEx(pi.ip.c_str(), &ipDest6.sin6_addr, &ipDest6.sin6_scope_id, &ipDest6.sin6_port)) {
|
||||||
std::wcout << pi.host << " is not a valid ipv6 address" << '\n';
|
std::wcout << pi.ip << " is not a valid ipv6 address" << '\n';
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ struct printInfoStruct
|
|||||||
{
|
{
|
||||||
threshold warn, crit;
|
threshold warn, crit;
|
||||||
threshold wpl, cpl;
|
threshold wpl, cpl;
|
||||||
std::wstring host;
|
std::wstring host, ip;
|
||||||
BOOL ipv4 = TRUE;
|
BOOL ipv6 = FALSE;
|
||||||
DWORD timeout = 1000;
|
DWORD timeout = 1000;
|
||||||
INT num = 5;
|
INT num = 5;
|
||||||
};
|
};
|
||||||
@ -42,5 +42,6 @@ INT printOutput(printInfoStruct&, response&);
|
|||||||
INT parseArguments(INT, WCHAR **, boost::program_options::variables_map&, printInfoStruct&);
|
INT parseArguments(INT, WCHAR **, boost::program_options::variables_map&, printInfoStruct&);
|
||||||
INT check_ping4(CONST printInfoStruct&, response&);
|
INT check_ping4(CONST printInfoStruct&, response&);
|
||||||
INT check_ping6(CONST printInfoStruct&, response&);
|
INT check_ping6(CONST printInfoStruct&, response&);
|
||||||
|
BOOL resolveHostname(CONST std::wstring, BOOL, std::wstring&);
|
||||||
|
|
||||||
#endif // !CHECK_PING_H
|
#endif // !CHECK_PING_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user