1
0
mirror of https://github.com/fwbuilder/fwbuilder synced 2026-06-24 01:49:36 +02:00
Files
fwbuilder/src/libgui/ClusterInterfaceWidget.cpp
2019-07-22 17:08:51 +00:00

262 lines
9.8 KiB
C++

/*
Firewall Builder
Copyright (C) 2009 NetCitadel, LLC
Author: Roman Bovsunivskiy a2k0001@gmail.com
$Id$
This program is free software which we release under the GNU General Public
License. You may redistribute and/or modify this program under the terms
of that license as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
To get a copy of the GNU General Public License, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ClusterInterfaceWidget.h"
#include "FWBSettings.h"
#include "ui_ClusterInterfaceWidget.h"
#include <QSpacerItem>
#include <QDebug>
using namespace libfwbuilder;
using namespace std;
ClusterInterfaceWidget::ClusterInterfaceWidget(QWidget *parent) :
QWidget(parent),
m_ui(new Ui::ClusterInterfaceWidget)
{
cisw = dynamic_cast<ClusterInterfacesSelectorWidget*>(parent);
m_ui->setupUi(this);
interfaceBox = new QHBoxLayout();
this->layout()->addItem(interfaceBox);
this->layout()->addItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Minimum));
}
ClusterInterfaceWidget::~ClusterInterfaceWidget()
{
delete m_ui;
foreach(InterfacesList list, this->lists)
{
delete list.list;
delete list.label;
delete list.layout;
}
}
void ClusterInterfaceWidget::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
m_ui->retranslateUi(this);
break;
default:
break;
}
}
void ClusterInterfaceWidget::setFirewallList(QList<Firewall*> firewalls)
{
foreach ( Firewall* fw, firewalls )
{
os = fw->getStr("host_OS").c_str();
QVBoxLayout *layout = new QVBoxLayout();
//qFindChild<QHBoxLayout*>(this, "interfaceBox")
interfaceBox->addLayout(layout);
//this->m_ui->interfaceBox->addLayout(layout);
//create label with firewall name
QLabel *label = new QLabel(QString::fromUtf8(fw->getName().c_str()), this);
layout->addWidget(label);
// create object tree
QTreeWidget *list = new QTreeWidget(this);
list->header()->setVisible(false);
layout->addWidget(list);
// create firewall item in tree
QTreeWidgetItem* firewall = new QTreeWidgetItem(list, QStringList() << QString::fromUtf8(fw->getName().c_str()));
roots[list] = firewall;
firewall->setIcon(0, QIcon(":/Icons/Firewall/icon-tree"));
// interfaces and subinterfaces creation
FWObjectTypedChildIterator iter = fw->findByType(Interface::TYPENAME);
for ( ; iter != iter.end() ; ++iter )
{
Interface *iface = Interface::cast(*iter);
//if (iface->isLoopback()) continue;
QTreeWidgetItem *ifaceitem = new QTreeWidgetItem(firewall, QStringList() << QString::fromUtf8(iface->getName().c_str()));
ifaceitem->setData(0, Qt::UserRole, qVariantFromValue(iface));//QVariant(QVariant::UserType, iface));
ifaceitem->setIcon(0, QIcon(":/Icons/Interface/icon-tree"));
ifaceitem->setDisabled(!interfaceSelectable(iface));
if (!interfaceSelectable(iface))
// works only for elements which does not have child elements
ifaceitem->setFlags(ifaceitem->flags() & ~Qt::ItemIsSelectable);
else
ifaceitem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
FWObjectTypedChildIterator iter2 = iface->findByType(Interface::TYPENAME);
for ( ; iter2 != iter2.end() ; ++iter2 )
{
//if (iface->isLoopback()) return;
Interface *subiface = Interface::cast(*iter2);
QTreeWidgetItem *subitem = new QTreeWidgetItem(ifaceitem, QStringList() << QString::fromUtf8(subiface->getName().c_str()));
subitem->setData(0, Qt::UserRole, qVariantFromValue(subiface));//QVariant(QVariant::UserType, subitem));
subitem->setDisabled(!interfaceSelectable(subiface));
subitem->setIcon(0, QIcon(":/Icons/Interface/icon-tree"));
if (!interfaceSelectable(subiface))
subitem->setFlags(subitem->flags() & ~Qt::ItemIsSelectable);
else
ifaceitem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
}
list->topLevelItem(0)->setFlags(list->topLevelItem(0)->flags() & ~Qt::ItemIsSelectable);
list->expandAll();
// add data to map
InterfacesList newlist;
newlist.label = label;
newlist.layout = layout;
newlist.list = list;
newlist.firewall = fw;
lists[fw] = newlist;
}
}
bool ClusterInterfaceWidget::setCurrentInterface(const QString& name)
{
string label;
bool setLabel = true;
int gotItems = 0;
foreach(InterfacesList list, this->lists.values())
{
foreach(QTreeWidgetItem *item, list.list->findItems(name, Qt::MatchCaseSensitive | Qt::MatchExactly | Qt::MatchRecursive))
{
Interface *iface = item->data(0, Qt::UserRole).value<Interface*>();
if (iface == nullptr) continue;
if ( item == roots[list.list] ) continue; // skip firewall object
if ( interfaceSelectable(iface) ) // interface is good for use in cluster
{
list.list->setCurrentItem(item);
gotItems++;
if (label.length() == 0) label = iface->getLabel();
else
if (label != iface->getLabel())
setLabel = false;
break;
}
}
}
if (gotItems < this->lists.values().count()) return false;
this->m_ui->name->setText(name);
if (setLabel) this->m_ui->label->setText(QString::fromUtf8(label.c_str()));
return true;
}
void ClusterInterfaceWidget::nameChanged(QString newname)
{
cisw->setTabText(cisw->indexOf(this), newname);
}
ClusterInterfaceData ClusterInterfaceWidget::getInterfaceData()
{
ClusterInterfaceData res;
res.os = os;
res.name = this->m_ui->name->text();
res.label = this->m_ui->label->text();
res.comment = this->m_ui->comment->toPlainText();
foreach(InterfacesList ifacelist, this->lists.values())
{
QTreeWidgetItem *item = ifacelist.list->selectedItems().first();
Interface* iface = item->data(0, Qt::UserRole).value<Interface*>();
FWObject *parent_fw = Host::getParentHost(iface);
res.interfaces.append(qMakePair(Firewall::cast(parent_fw), iface));
}
return res;
}
bool ClusterInterfaceWidget::interfaceSelectable(Interface* iface)
{
libfwbuilder::Cluster cluster;
// cluster.add(iface, false);
cluster.setStr("host_OS", os.toStdString());
Resources* os_res = Resources::os_res[os.toStdString()];
string os_family = os.toStdString();
if (os_res!=nullptr)
os_family = os_res->getResourceStr("/FWBuilderResources/Target/family");
unique_ptr<interfaceProperties> int_prop(
interfacePropertiesObjectFactory::getInterfacePropertiesObject(
os_family));
QString err;
bool res = true;
if (st->getBool("Objects/Interface/autoconfigureInterfaces"))
res = int_prop->validateInterface(&cluster, iface, false, err);
if (res)
res = int_prop->isEligibleForCluster(iface);
if (fwbdebug)
qDebug() << "interface"
<< iface->getName().c_str()
<< "can be used in cluster:" << res;
return res;
}
bool ClusterInterfaceWidget::isValid()
{
// this->lists is QMap<Firewall*, InterfacesList> where
// InterfacesList contains information about object trees and
// labels in this widget. Map this->lists is filled in
// setFirewallList() from the list of firewalls (new InterfacesList is
// created for each firewall)
foreach(InterfacesList ifacelist, this->lists.values())
{
// get selected items of object tree - QTreeWidget pointed by
// ifacelist.list
QList<QTreeWidgetItem*> items = ifacelist.list->selectedItems();
if (items.isEmpty()) // nothing is selected in one of interface lists
{
QMessageBox::warning(this,"Firewall Builder",
tr("Some of the cluster interfaces do not have any "
"member firewall interface selected"),
"&Continue", QString(), QString(), 0, 1 );
return false;
}
if (roots.values().contains(items.first()))
{
// firewall is the item selected in one of interface lists
QMessageBox::warning(this,"Firewall Builder",
tr("Please select interface of the member firewall "
"rather than the firewall object to be used "
"with cluster interface"),
"&Continue", QString(), QString(), 0, 1 );
return false;
}
if (!interfaceSelectable(ifacelist.list->selectedItems().first()->data(0, Qt::UserRole).value<Interface*>()))
{
// selected interface item can not be used in this cluster
QMessageBox::warning(this,"Firewall Builder",
tr("%1 can not be used as cluster interface.")
.arg(ifacelist.list->selectedItems().first()->text(0)),
"&Continue", QString(), QString(), 0, 1 );
return false;
}
}
// at least one item is selected in all object trees and it is not firewall object
return true;
}