|
|
|
@ -343,7 +343,6 @@ RPCConsole::RPCConsole(const PlatformStyle *_platformStyle, QWidget *parent) :
@@ -343,7 +343,6 @@ RPCConsole::RPCConsole(const PlatformStyle *_platformStyle, QWidget *parent) :
|
|
|
|
|
ui(new Ui::RPCConsole), |
|
|
|
|
clientModel(0), |
|
|
|
|
historyPtr(0), |
|
|
|
|
cachedNodeid(-1), |
|
|
|
|
platformStyle(_platformStyle), |
|
|
|
|
peersTableContextMenu(0), |
|
|
|
|
banTableContextMenu(0), |
|
|
|
@ -469,7 +468,7 @@ void RPCConsole::setClientModel(ClientModel *model)
@@ -469,7 +468,7 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|
|
|
|
ui->peerWidget->verticalHeader()->hide(); |
|
|
|
|
ui->peerWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); |
|
|
|
|
ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows); |
|
|
|
|
ui->peerWidget->setSelectionMode(QAbstractItemView::SingleSelection); |
|
|
|
|
ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); |
|
|
|
|
ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu); |
|
|
|
|
ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH); |
|
|
|
|
ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH); |
|
|
|
@ -477,11 +476,11 @@ void RPCConsole::setClientModel(ClientModel *model)
@@ -477,11 +476,11 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|
|
|
|
ui->peerWidget->horizontalHeader()->setStretchLastSection(true); |
|
|
|
|
|
|
|
|
|
// create peer table context menu actions
|
|
|
|
|
QAction* disconnectAction = new QAction(tr("&Disconnect Node"), this); |
|
|
|
|
QAction* banAction1h = new QAction(tr("Ban Node for") + " " + tr("1 &hour"), this); |
|
|
|
|
QAction* banAction24h = new QAction(tr("Ban Node for") + " " + tr("1 &day"), this); |
|
|
|
|
QAction* banAction7d = new QAction(tr("Ban Node for") + " " + tr("1 &week"), this); |
|
|
|
|
QAction* banAction365d = new QAction(tr("Ban Node for") + " " + tr("1 &year"), this); |
|
|
|
|
QAction* disconnectAction = new QAction(tr("&Disconnect"), this); |
|
|
|
|
QAction* banAction1h = new QAction(tr("Ban for") + " " + tr("1 &hour"), this); |
|
|
|
|
QAction* banAction24h = new QAction(tr("Ban for") + " " + tr("1 &day"), this); |
|
|
|
|
QAction* banAction7d = new QAction(tr("Ban for") + " " + tr("1 &week"), this); |
|
|
|
|
QAction* banAction365d = new QAction(tr("Ban for") + " " + tr("1 &year"), this); |
|
|
|
|
|
|
|
|
|
// create peer table context menu
|
|
|
|
|
peersTableContextMenu = new QMenu(); |
|
|
|
@ -514,7 +513,9 @@ void RPCConsole::setClientModel(ClientModel *model)
@@ -514,7 +513,9 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|
|
|
|
this, SLOT(peerSelected(const QItemSelection &, const QItemSelection &))); |
|
|
|
|
// peer table signal handling - update peer details when new nodes are added to the model
|
|
|
|
|
connect(model->getPeerTableModel(), SIGNAL(layoutChanged()), this, SLOT(peerLayoutChanged())); |
|
|
|
|
|
|
|
|
|
// peer table signal handling - cache selected node ids
|
|
|
|
|
connect(model->getPeerTableModel(), SIGNAL(layoutAboutToChange()), this, SLOT(peerLayoutAboutToChange())); |
|
|
|
|
|
|
|
|
|
// set up ban table
|
|
|
|
|
ui->banlistWidget->setModel(model->getBanTableModel()); |
|
|
|
|
ui->banlistWidget->verticalHeader()->hide(); |
|
|
|
@ -527,7 +528,7 @@ void RPCConsole::setClientModel(ClientModel *model)
@@ -527,7 +528,7 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|
|
|
|
ui->banlistWidget->horizontalHeader()->setStretchLastSection(true); |
|
|
|
|
|
|
|
|
|
// create ban table context menu action
|
|
|
|
|
QAction* unbanAction = new QAction(tr("&Unban Node"), this); |
|
|
|
|
QAction* unbanAction = new QAction(tr("&Unban"), this); |
|
|
|
|
|
|
|
|
|
// create ban table context menu
|
|
|
|
|
banTableContextMenu = new QMenu(); |
|
|
|
@ -825,6 +826,17 @@ void RPCConsole::peerSelected(const QItemSelection &selected, const QItemSelecti
@@ -825,6 +826,17 @@ void RPCConsole::peerSelected(const QItemSelection &selected, const QItemSelecti
|
|
|
|
|
updateNodeDetail(stats); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RPCConsole::peerLayoutAboutToChange() |
|
|
|
|
{ |
|
|
|
|
QModelIndexList selected = ui->peerWidget->selectionModel()->selectedIndexes(); |
|
|
|
|
cachedNodeids.clear(); |
|
|
|
|
for(int i = 0; i < selected.size(); i++) |
|
|
|
|
{ |
|
|
|
|
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(selected.at(i).row()); |
|
|
|
|
cachedNodeids.append(stats->nodeStats.nodeid); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RPCConsole::peerLayoutChanged() |
|
|
|
|
{ |
|
|
|
|
if (!clientModel || !clientModel->getPeerTableModel()) |
|
|
|
@ -834,7 +846,7 @@ void RPCConsole::peerLayoutChanged()
@@ -834,7 +846,7 @@ void RPCConsole::peerLayoutChanged()
|
|
|
|
|
bool fUnselect = false; |
|
|
|
|
bool fReselect = false; |
|
|
|
|
|
|
|
|
|
if (cachedNodeid == -1) // no node selected yet
|
|
|
|
|
if (cachedNodeids.empty()) // no node selected yet
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// find the currently selected row
|
|
|
|
@ -846,7 +858,7 @@ void RPCConsole::peerLayoutChanged()
@@ -846,7 +858,7 @@ void RPCConsole::peerLayoutChanged()
|
|
|
|
|
|
|
|
|
|
// check if our detail node has a row in the table (it may not necessarily
|
|
|
|
|
// be at selectedRow since its position can change after a layout change)
|
|
|
|
|
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeid); |
|
|
|
|
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeids.first()); |
|
|
|
|
|
|
|
|
|
if (detailNodeRow < 0) |
|
|
|
|
{ |
|
|
|
@ -872,7 +884,10 @@ void RPCConsole::peerLayoutChanged()
@@ -872,7 +884,10 @@ void RPCConsole::peerLayoutChanged()
|
|
|
|
|
|
|
|
|
|
if (fReselect) |
|
|
|
|
{ |
|
|
|
|
ui->peerWidget->selectRow(detailNodeRow); |
|
|
|
|
for(int i = 0; i < cachedNodeids.size(); i++) |
|
|
|
|
{ |
|
|
|
|
ui->peerWidget->selectRow(clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeids.at(i))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (stats) |
|
|
|
@ -881,9 +896,6 @@ void RPCConsole::peerLayoutChanged()
@@ -881,9 +896,6 @@ void RPCConsole::peerLayoutChanged()
|
|
|
|
|
|
|
|
|
|
void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats) |
|
|
|
|
{ |
|
|
|
|
// Update cached nodeid
|
|
|
|
|
cachedNodeid = stats->nodeStats.nodeid; |
|
|
|
|
|
|
|
|
|
// update the detail ui with latest node information
|
|
|
|
|
QString peerAddrDetails(QString::fromStdString(stats->nodeStats.addrName) + " "); |
|
|
|
|
peerAddrDetails += tr("(node id: %1)").arg(QString::number(stats->nodeStats.nodeid)); |
|
|
|
@ -973,33 +985,44 @@ void RPCConsole::disconnectSelectedNode()
@@ -973,33 +985,44 @@ void RPCConsole::disconnectSelectedNode()
|
|
|
|
|
{ |
|
|
|
|
if(!g_connman) |
|
|
|
|
return; |
|
|
|
|
// Get currently selected peer address
|
|
|
|
|
NodeId id = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::NetNodeId).toInt(); |
|
|
|
|
// Find the node, disconnect it and clear the selected node
|
|
|
|
|
if(g_connman->DisconnectNode(id)) |
|
|
|
|
clearSelectedNode(); |
|
|
|
|
|
|
|
|
|
// Get selected peer addresses
|
|
|
|
|
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->peerWidget, 0); |
|
|
|
|
for(int i = 0; i < nodes.count(); i++) |
|
|
|
|
{ |
|
|
|
|
// Get currently selected peer address
|
|
|
|
|
NodeId id = nodes.at(i).data(PeerTableModel::NetNodeId).toInt(); |
|
|
|
|
// Find the node, disconnect it and clear the selected node
|
|
|
|
|
if(g_connman->DisconnectNode(id)) |
|
|
|
|
clearSelectedNode(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RPCConsole::banSelectedNode(int bantime) |
|
|
|
|
{ |
|
|
|
|
if (!clientModel || !g_connman) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if(cachedNodeid == -1) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Get currently selected peer address
|
|
|
|
|
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeid); |
|
|
|
|
if(detailNodeRow < 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Find possible nodes, ban it and clear the selected node
|
|
|
|
|
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); |
|
|
|
|
if(stats) { |
|
|
|
|
g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); |
|
|
|
|
clearSelectedNode(); |
|
|
|
|
clientModel->getBanTableModel()->refresh(); |
|
|
|
|
|
|
|
|
|
// Get selected peer addresses
|
|
|
|
|
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->peerWidget, 0); |
|
|
|
|
for(int i = 0; i < nodes.count(); i++) |
|
|
|
|
{ |
|
|
|
|
// Get currently selected peer address
|
|
|
|
|
NodeId id = nodes.at(i).data(PeerTableModel::NetNodeId).toInt(); |
|
|
|
|
|
|
|
|
|
// Get currently selected peer address
|
|
|
|
|
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id); |
|
|
|
|
if(detailNodeRow < 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Find possible nodes, ban it and clear the selected node
|
|
|
|
|
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); |
|
|
|
|
if(stats) { |
|
|
|
|
g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
clearSelectedNode(); |
|
|
|
|
clientModel->getBanTableModel()->refresh(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RPCConsole::unbanSelectedNode() |
|
|
|
@ -1007,22 +1030,27 @@ void RPCConsole::unbanSelectedNode()
@@ -1007,22 +1030,27 @@ void RPCConsole::unbanSelectedNode()
|
|
|
|
|
if (!clientModel) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Get currently selected ban address
|
|
|
|
|
QString strNode = GUIUtil::getEntryData(ui->banlistWidget, 0, BanTableModel::Address).toString(); |
|
|
|
|
CSubNet possibleSubnet; |
|
|
|
|
|
|
|
|
|
LookupSubNet(strNode.toStdString().c_str(), possibleSubnet); |
|
|
|
|
if (possibleSubnet.IsValid() && g_connman) |
|
|
|
|
// Get selected ban addresses
|
|
|
|
|
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->banlistWidget, 0); |
|
|
|
|
for(int i = 0; i < nodes.count(); i++) |
|
|
|
|
{ |
|
|
|
|
g_connman->Unban(possibleSubnet); |
|
|
|
|
clientModel->getBanTableModel()->refresh(); |
|
|
|
|
// Get currently selected ban address
|
|
|
|
|
QString strNode = nodes.at(i).data(BanTableModel::Address).toString(); |
|
|
|
|
CSubNet possibleSubnet; |
|
|
|
|
|
|
|
|
|
LookupSubNet(strNode.toStdString().c_str(), possibleSubnet); |
|
|
|
|
if (possibleSubnet.IsValid() && g_connman) |
|
|
|
|
{ |
|
|
|
|
g_connman->Unban(possibleSubnet); |
|
|
|
|
clientModel->getBanTableModel()->refresh(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RPCConsole::clearSelectedNode() |
|
|
|
|
{ |
|
|
|
|
ui->peerWidget->selectionModel()->clearSelection(); |
|
|
|
|
cachedNodeid = -1; |
|
|
|
|
cachedNodeids.clear(); |
|
|
|
|
ui->detailWidget->hide(); |
|
|
|
|
ui->peerHeading->setText(tr("Select a peer to view detailed information.")); |
|
|
|
|
} |
|
|
|
|