mirror of
https://gitlab.com/Syping/mayu
synced 2024-12-22 18:25:28 +01:00
0.1 code commit
This commit is contained in:
parent
fbc6c05d52
commit
201f20999b
4 changed files with 355 additions and 0 deletions
39
main.cpp
Normal file
39
main.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
/*****************************************************************************
|
||||
* mayu Mate Are You Up
|
||||
* Copyright (C) 2018 Syping
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include "mayu.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication a(argc, argv);
|
||||
a.setApplicationName("mayu");
|
||||
|
||||
QStringList arguments = a.arguments();
|
||||
arguments.removeAt(0);
|
||||
|
||||
if (arguments.length() >= 2) {
|
||||
mayu a_mayu;
|
||||
a_mayu.setHostsFile(arguments.at(0));
|
||||
a_mayu.setJsonFile(arguments.at(1));
|
||||
a_mayu.work();
|
||||
return a_mayu.getResult();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
233
mayu.cpp
Normal file
233
mayu.cpp
Normal file
|
@ -0,0 +1,233 @@
|
|||
/*****************************************************************************
|
||||
* mayu Mate Are You Up
|
||||
* Copyright (C) 2018 Syping
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <QHostAddress>
|
||||
#include <QEventLoop>
|
||||
#include <QHostInfo>
|
||||
#include <QSaveFile>
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
#include "mayu.h"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
extern "C" {
|
||||
#include "oping.h"
|
||||
}
|
||||
|
||||
mayu::mayu(QObject *parent) : QObject(parent)
|
||||
{
|
||||
p_return = -1;
|
||||
p_tries = 4;
|
||||
}
|
||||
|
||||
void mayu::setHostsFile(const QString &fileName)
|
||||
{
|
||||
p_hostsFile = fileName;
|
||||
p_hostsParsed = false;
|
||||
}
|
||||
|
||||
void mayu::setHosts(const QStringList &hostsList)
|
||||
{
|
||||
p_hostsList = hostsList;
|
||||
p_hostsParsed = true;
|
||||
}
|
||||
|
||||
void mayu::setJsonFile(const QString &fileName)
|
||||
{
|
||||
p_jsonFile = fileName;
|
||||
}
|
||||
|
||||
const QString mayu::getHostsFile()
|
||||
{
|
||||
return p_hostsFile;
|
||||
}
|
||||
|
||||
const QStringList mayu::getHosts()
|
||||
{
|
||||
return p_hostsList;
|
||||
}
|
||||
|
||||
const QString mayu::getJsonFile()
|
||||
{
|
||||
return p_jsonFile;
|
||||
}
|
||||
|
||||
int mayu::getResult()
|
||||
{
|
||||
return p_return;
|
||||
}
|
||||
|
||||
double mayu::ping(const QString &host, int tries, double timeout)
|
||||
{
|
||||
double latency;
|
||||
pingobj_t *pingObj;
|
||||
pingobj_iter_t *pingIter;
|
||||
if ((pingObj = ping_construct()) == NULL) {
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "Ping construction failed";
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
if (ping_setopt(pingObj, PING_OPT_TIMEOUT, (void*)(&timeout)) < 0) {
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "Setting timeout to" << timeout << "have failed";
|
||||
#endif
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
QHostAddress hostAddress(host);
|
||||
if (QAbstractSocket::IPv4Protocol == hostAddress.protocol()) {
|
||||
if (ping_host_add(pingObj, hostAddress.toString().toStdString().c_str()) < 0) {
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "IPv4 Address" << hostAddress.toString() << "found";
|
||||
#endif
|
||||
}
|
||||
else if (QAbstractSocket::IPv6Protocol == hostAddress.protocol()) {
|
||||
if (ping_host_add(pingObj, hostAddress.toString().toStdString().c_str()) < 0) {
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "IPv6 Address" << hostAddress.toString() << "found";
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
QList<QHostAddress> hostAddresses = QHostInfo::fromName(host).addresses();
|
||||
if (hostAddresses.length() >= 1) {
|
||||
QString ipStr = hostAddresses.at(0).toString();
|
||||
if (ping_host_add(pingObj, ipStr.toStdString().c_str()) < 0) {
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "Hostname" << host << "found and resolved" << ipStr;
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "Hostname" << host << "not found";
|
||||
#endif
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
bool hostUp = false;
|
||||
int curTry = 0;
|
||||
while (!hostUp && curTry != tries) {
|
||||
if (ping_send(pingObj) < 0) {
|
||||
#ifdef E_DEBUG
|
||||
qDebug() << "Pinging host" << host << " has failed";
|
||||
#endif
|
||||
ping_destroy(pingObj);
|
||||
return -1;
|
||||
}
|
||||
bool pingSuccess = false;
|
||||
for (pingIter = ping_iterator_get(pingObj); pingIter != NULL; pingIter =
|
||||
ping_iterator_next(pingIter)) {
|
||||
char hostname[100];
|
||||
size_t len;
|
||||
len = sizeof(double);
|
||||
ping_iterator_get_info(pingIter, PING_INFO_LATENCY, &latency, &len);
|
||||
pingSuccess = !(latency < 0);
|
||||
#ifdef E_DEBUG
|
||||
len = 100;
|
||||
ping_iterator_get_info(pingIter, PING_INFO_HOSTNAME, hostname, &len);
|
||||
qDebug() << hostname << latency << pingSuccess;
|
||||
#endif
|
||||
}
|
||||
if (pingSuccess) {
|
||||
hostUp = true;
|
||||
}
|
||||
curTry++;
|
||||
}
|
||||
ping_destroy(pingObj);
|
||||
if (hostUp)
|
||||
return latency;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void mayu::parse_hosts()
|
||||
{
|
||||
p_hostsList.clear();
|
||||
/**
|
||||
Drop here
|
||||
**/
|
||||
QFile hostsFile(p_hostsFile);
|
||||
if (hostsFile.open(QFile::ReadOnly)) {
|
||||
const QList<QByteArray> hostsArray = hostsFile.readAll().split('\n');
|
||||
for (const QByteArray &lineArray : hostsArray) {
|
||||
QString lineStr = QString::fromUtf8(lineArray).trimmed();
|
||||
if (!lineStr.isEmpty()) {
|
||||
QStringList lineStrList = lineStr.split(',');
|
||||
QString hostStr;
|
||||
QString alternativeStr;
|
||||
if (lineStrList.length() >= 1) {
|
||||
hostStr = lineStrList.at(0);
|
||||
lineStrList.removeAt(0);
|
||||
if (lineStrList.length() >= 1) {
|
||||
alternativeStr = lineStrList.join(','); // Alternative Name in Future Version
|
||||
}
|
||||
p_hostsList += hostStr;
|
||||
}
|
||||
}
|
||||
}
|
||||
hostsFile.close();
|
||||
p_hostsParsed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "Failed read hosts from " << p_hostsFile.toStdString().c_str();
|
||||
}
|
||||
/**
|
||||
Regain here
|
||||
**/
|
||||
}
|
||||
|
||||
void mayu::work()
|
||||
{
|
||||
if (!p_hostsParsed)
|
||||
parse_hosts();
|
||||
QJsonObject jsonObject;
|
||||
const QStringList hostsList = getHosts();
|
||||
for (const QString &host : hostsList) {
|
||||
double result = ping(host, p_tries);
|
||||
jsonObject[host] = result;
|
||||
}
|
||||
QJsonDocument jsonDocument;
|
||||
jsonDocument.setObject(jsonObject);
|
||||
QByteArray jsonArray = jsonDocument.toJson();
|
||||
/**
|
||||
Drop here
|
||||
**/
|
||||
QSaveFile jsonFile(p_jsonFile);
|
||||
if (jsonFile.open(QSaveFile::WriteOnly)) {
|
||||
jsonFile.write(jsonArray);
|
||||
if (!jsonFile.commit()) {
|
||||
cerr << "Failed save result to " << p_jsonFile.toStdString().c_str();
|
||||
p_return = 1;
|
||||
}
|
||||
}
|
||||
/**
|
||||
Regain here
|
||||
**/
|
||||
p_return = 0;
|
||||
}
|
53
mayu.h
Normal file
53
mayu.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*****************************************************************************
|
||||
* mayu Mate Are You Up
|
||||
* Copyright (C) 2018 Syping
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef MAYU_H
|
||||
#define MAYU_H
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QStringList>
|
||||
#include <QObject>
|
||||
|
||||
class mayu : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit mayu(QObject *parent = nullptr);
|
||||
void setHostsFile(const QString &fileName);
|
||||
void setHosts(const QStringList &hostsList);
|
||||
void setJsonFile(const QString &fileName);
|
||||
const QString getHostsFile();
|
||||
const QStringList getHosts();
|
||||
const QString getJsonFile();
|
||||
int getResult();
|
||||
static double ping(const QString &host, int tries, double timeout = 2.5);
|
||||
|
||||
public slots:
|
||||
void parse_hosts();
|
||||
void work();
|
||||
|
||||
private:
|
||||
QStringList p_hostsList;
|
||||
QString p_hostsFile;
|
||||
QString p_jsonFile;
|
||||
bool p_hostsParsed;
|
||||
int p_return;
|
||||
int p_tries;
|
||||
};
|
||||
|
||||
#endif // MAYU_H
|
30
mayu.pro
Normal file
30
mayu.pro
Normal file
|
@ -0,0 +1,30 @@
|
|||
#/*****************************************************************************
|
||||
#* mayu Mate Are You Up
|
||||
#* Copyright (C) 2018 Syping
|
||||
#*
|
||||
#* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
#* you may not use this file except in compliance with the License.
|
||||
#* You may obtain a copy of the License at
|
||||
#*
|
||||
#* http://www.apache.org/licenses/LICENSE-2.0
|
||||
#*
|
||||
#* Unless required by applicable law or agreed to in writing, software
|
||||
#* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
#* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
#* See the License for the specific language governing permissions and
|
||||
#* limitations under the License.
|
||||
#*****************************************************************************/
|
||||
|
||||
QT -= gui
|
||||
QT += network
|
||||
|
||||
LIBS += -loping
|
||||
|
||||
CONFIG += c++11 console
|
||||
CONFIG -= app_bundle
|
||||
|
||||
SOURCES += main.cpp \
|
||||
mayu.cpp
|
||||
|
||||
HEADERS += \
|
||||
mayu.h
|
Loading…
Reference in a new issue