Add configuration age to listnetworks results and GUI.

This commit is contained in:
Adam Ierymenko 2013-11-21 15:11:22 -05:00
parent 31d718c4a4
commit 4296db2358
9 changed files with 130 additions and 57 deletions

View File

@ -1,11 +1,17 @@
#include "aboutwindow.h"
#include "ui_aboutwindow.h"
#include <QMessageBox>
#include "../node/Defaults.hpp"
AboutWindow::AboutWindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::AboutWindow)
{
ui->setupUi(this);
#ifndef __APPLE__
ui->uninstallButton->hide();
#endif
}
AboutWindow::~AboutWindow()
@ -15,4 +21,11 @@ AboutWindow::~AboutWindow()
void AboutWindow::on_uninstallButton_clicked()
{
// Apple only... other OSes have more intrinsic mechanisms for uninstalling.
QMessageBox::information(
this,
"Uninstalling ZeroTier One",
QString("Uninstalling ZeroTier One is easy!\n\nJust remove ZeroTier One from your Applications folder and the service will automatically shut down within a few seconds. Then, on your next reboot, all other support files will be automatically deleted.\n\nIf you wish to uninstall the service and support files now, you can run the 'uninstall.sh' script found in ") + ZeroTier::ZT_DEFAULTS.defaultHomePath.c_str() + " using the 'sudo' command in a terminal.",
QMessageBox::Ok,
QMessageBox::NoButton);
}

View File

@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
<string>About ZeroTier One</string>
</property>
<property name="windowIcon">
<iconset resource="resources.qrc">

View File

@ -52,9 +52,10 @@ MainWindow::MainWindow(QWidget *parent) :
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->startTimer(1000);
this->startTimer(1000); // poll service every second
this->setEnabled(false); // gets enabled when updates are received
mainWindow = this;
this->cyclesSinceResponseFromService = 0;
}
MainWindow::~MainWindow()
@ -101,6 +102,11 @@ void MainWindow::timerEvent(QTimerEvent *event)
zeroTierClient = new ZeroTier::Node::LocalClient(authToken.c_str(),0,&handleZTMessage,this);
}
// TODO: do something more user-friendly here... or maybe try to restart
// the service?
if (++this->cyclesSinceResponseFromService == 3)
QMessageBox::critical(this,"No Response from Service","The ZeroTier One service does not appear to be running.",QMessageBox::Ok,QMessageBox::NoButton);
zeroTierClient->send("info");
zeroTierClient->send("listnetworks");
zeroTierClient->send("listpeers");
@ -119,9 +125,7 @@ void MainWindow::customEvent(QEvent *event)
if (hdr[0] != "200")
return;
// Enable main window on valid communication with service
if (!this->isEnabled())
this->setEnabled(true);
this->cyclesSinceResponseFromService = 0;
if (hdr[1] == "info") {
if (hdr.size() >= 3)
@ -134,8 +138,8 @@ void MainWindow::customEvent(QEvent *event)
std::map< std::string,std::vector<std::string> > byNwid;
for(unsigned long i=1;i<m->ztMessage.size();++i) {
std::vector<std::string> l(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[i]));
// 200 listnetworks <nwid> <name> <status> <type> <dev> <ips>
if ((l.size() == 8)&&(l[2].length() == 16))
// 200 listnetworks <nwid> <name> <status> <config age> <type> <dev> <ips>
if ((l.size() == 9)&&(l[2].length() == 16))
byNwid[l[2]] = l;
}
@ -149,10 +153,10 @@ void MainWindow::customEvent(QEvent *event)
if (byNwid.count(i->first)) {
std::vector<std::string> &l = byNwid[i->first];
i->second.second->setNetworkName(l[3]);
i->second.second->setStatus(l[4]);
i->second.second->setNetworkType(l[5]);
i->second.second->setNetworkDeviceName(l[6]);
i->second.second->setIps(l[7]);
i->second.second->setStatus(l[4],l[5]);
i->second.second->setNetworkType(l[6]);
i->second.second->setNetworkDeviceName(l[7]);
i->second.second->setIps(l[8]);
} else {
delete ui->networkListWidget->takeItem(i->second.first);
}
@ -163,10 +167,10 @@ void MainWindow::customEvent(QEvent *event)
std::vector<std::string> &l = i->second;
Network *nw = new Network((QWidget *)0,i->first);
nw->setNetworkName(l[3]);
nw->setStatus(l[4]);
nw->setNetworkType(l[5]);
nw->setNetworkDeviceName(l[6]);
nw->setIps(l[7]);
nw->setStatus(l[4],l[5]);
nw->setNetworkType(l[6]);
nw->setNetworkDeviceName(l[7]);
nw->setIps(l[8]);
QListWidgetItem *item = new QListWidgetItem();
item->setSizeHint(nw->sizeHint());
ui->networkListWidget->addItem(item);
@ -186,13 +190,23 @@ void MainWindow::customEvent(QEvent *event)
QString st(this->myAddress);
st += " (";
st += this->myStatus;
st += ", v";
st += this->myVersion;
st += ", ";
st += QString::number(this->numPeers);
st += " peers)";
while (st.size() < 38)
while (st.size() < 45)
st += QChar::Space;
ui->statusAndAddressButton->setText(st);
}
if (this->myStatus == "ONLINE") {
if (!this->isEnabled())
this->setEnabled(true);
} else {
if (this->isEnabled())
this->setEnabled(false);
}
}
void MainWindow::on_joinNetworkButton_clicked()
@ -217,12 +231,6 @@ void MainWindow::on_actionAbout_triggered()
about->show();
}
void MainWindow::on_actionJoin_Network_triggered()
{
// Does the same thing as clicking join button on main UI
on_joinNetworkButton_clicked();
}
void MainWindow::on_networkIdLineEdit_textChanged(const QString &text)
{
QString newText;

View File

@ -45,8 +45,7 @@ protected:
private slots:
void on_joinNetworkButton_clicked();
void on_actionAbout_triggered();
void on_actionJoin_Network_triggered();
void on_networkIdLineEdit_textChanged(const QString &arg1);
void on_networkIdLineEdit_textChanged(const QString &text);
void on_statusAndAddressButton_clicked();
private:
@ -56,6 +55,7 @@ private:
QString myStatus;
QString myVersion;
unsigned int numPeers;
unsigned int cyclesSinceResponseFromService;
};
#endif // MAINWINDOW_H

View File

@ -110,7 +110,7 @@
<string notr="true">border: 0;</string>
</property>
<property name="text">
<string>0000000000 (OFFLINE, 0 peers) </string>
<string>0000000000 (OFFLINE, v0.0.0, 0 peers) </string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
@ -203,7 +203,6 @@
<property name="title">
<string>File</string>
</property>
<addaction name="actionJoin_Network"/>
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
@ -215,11 +214,6 @@
<string>About</string>
</property>
</action>
<action name="actionJoin_Network">
<property name="text">
<string>Join Network</string>
</property>
</action>
<action name="actionExit">
<property name="text">
<string>Exit</string>

View File

@ -28,9 +28,12 @@ Network::~Network()
delete ui;
}
void Network::setStatus(const std::string &status)
void Network::setStatus(const std::string &status,const std::string &age)
{
ui->statusLabel->setText(QString(status.c_str()));
if (status == "OK")
ui->ageLabel->setText(QString("(configuration is ") + age.c_str() + " seconds old)");
else ui->ageLabel->setText(QString());
}
void Network::setNetworkName(const std::string &name)

View File

@ -17,7 +17,7 @@ public:
explicit Network(QWidget *parent = 0,const std::string &nwid = std::string());
virtual ~Network();
void setStatus(const std::string &status);
void setStatus(const std::string &status,const std::string &age);
void setNetworkName(const std::string &name);
void setNetworkType(const std::string &type);
void setNetworkDeviceName(const std::string &dev);

View File

@ -174,28 +174,6 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>?</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
@ -222,6 +200,76 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>12</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>?</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="ageLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>(configuration is 0 seconds old)</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>

View File

@ -200,7 +200,7 @@ std::vector<std::string> NodeConfig::execute(const char *command)
_r->topology->eachPeer(_DumpPeerStatistics(r));
} else if (cmd[0] == "listnetworks") {
Mutex::Lock _l(_networks_m);
_P("200 listnetworks <nwid> <name> <status> <type> <dev> <ips>");
_P("200 listnetworks <nwid> <name> <status> <config age> <type> <dev> <ips>");
for(std::map< uint64_t,SharedPtr<Network> >::const_iterator nw(_networks.begin());nw!=_networks.end();++nw) {
std::string tmp;
std::set<InetAddress> ips(nw->second->tap().ips());
@ -211,10 +211,17 @@ std::vector<std::string> NodeConfig::execute(const char *command)
}
SharedPtr<NetworkConfig> nconf(nw->second->config2());
_P("200 listnetworks %.16llx %s %s %s %s %s",
long long age = (nconf) ? ((long long)Utils::now() - (long long)nconf->timestamp()) : (long long)0;
if (age < 0)
age = 0;
age /= 1000;
_P("200 listnetworks %.16llx %s %s %lld %s %s %s",
(unsigned long long)nw->first,
((nconf) ? nconf->name().c_str() : "?"),
Network::statusString(nw->second->status()),
age,
((nconf) ? (nconf->isOpen() ? "public" : "private") : "?"),
nw->second->tap().deviceName().c_str(),
((tmp.length() > 0) ? tmp.c_str() : "-"));