source: src-qt4/pc-netmanager/src/ethernetconfig/ethernetconfig.cpp @ 0cfe72f

9.1-release9.2-releasereleng/10.0releng/10.0.1
Last change on this file since 0cfe72f was 0cfe72f, checked in by Kris Moore <kris@…>, 12 months ago

Add all the changes for related using of split pcbsd-utils libs

  • Property mode set to 100644
File size: 15.4 KB
Line 
1/***************************************************************************
2 *   Copyright (C) 2007 by Kris Moore   *
3 *   kris@pcbsd.com   *
4 *                                                                         *
5 *   Permission is hereby granted, free of charge, to any person obtaining *
6 *   a copy of this software and associated documentation files (the       *
7 *   "Software"), to deal in the Software without restriction, including   *
8 *   without limitation the rights to use, copy, modify, merge, publish,   *
9 *   distribute, sublicense, and/or sell copies of the Software, and to    *
10 *   permit persons to whom the Software is furnished to do so, subject to *
11 *   the following conditions:                                             *
12 *                                                                         *
13 *   The above copyright notice and this permission notice shall be        *
14 *   included in all copies or substantial portions of the Software.       *
15 *                                                                         *
16 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
17 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
18 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
20 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
21 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
22 *   OTHER DEALINGS IN THE SOFTWARE.                                       *
23 ***************************************************************************/
24
25#include <iostream>
26#include <QCheckBox>
27#include <QDesktopWidget>
28#include <QFile>
29#include <QGroupBox>
30#include <QLabel>
31#include <QLineEdit>
32#include <QMessageBox>
33#include <QPushButton>
34#include <QSettings>
35#include <QTabWidget>
36#include <QTextStream>
37#include <QTimer>
38#include <QTranslator>
39
40#include <pcbsd-netif.h>
41#include <pcbsd-utils.h>
42
43#include "ethernetconfig.h"
44#include "ui_ethernetconfig.h"
45
46
47using namespace std;
48
49QString DeviceName;
50
51
52
53void ethernetconfig::slot_close()
54{
55   exit(0);
56}
57
58// Function to check if we have wlan devices on this system
59bool ethernetconfig::isWifiEnabled() {
60        QString command = "ifconfig -l";
61        QString inputLine = getLineFromCommandOutput(command);
62        if ( inputLine.indexOf("wlan") != -1 )
63                return true;
64        else
65                return false;
66}
67
68void ethernetconfig::slot_apply()
69{
70
71   QString ifConfigLine;
72
73    if ( ! buttonApply->isEnabled() )
74        return;
75
76
77    // If the user disabled the device, do so now
78    if ( checkDisableNetwork->isChecked() )
79    {
80      pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "=", "", -1);
81      runCommand("ifconfig " + DeviceName + " down");
82      buttonApply->setEnabled(FALSE);
83      return;
84    }
85
86   
87    if ( groupStatic->isChecked() )
88    {
89        if ( lineIP->text() == "..." || lineNetmask->text() == "..." ) {
90            QMessageBox::information( this, tr("Missing Fields"),
91                    tr("You must enter an IP and Netmask to continue!\n") );
92            return;
93        }
94       
95        if ( ! pcbsd::Utils::validateIPV4(lineIP->text() ) ) {
96            QMessageBox::warning( this, tr("Warning"),
97            tr("IP Address is out of range! (") + lineIP->text() + tr(") Fields must be between 0-255.") );
98           return;
99               }
100       
101        if ( ! pcbsd::Utils::validateIPV4(lineNetmask->text() ) ) {
102            QMessageBox::warning( this, tr("Warning"),
103            tr("Netmask is out of range! (") + lineNetmask->text() + tr(") Fields must be between 0-255.") );
104           return;
105               }
106
107        if ( groupWPAE->isChecked() )
108          ifConfigLine="WPA ";
109       
110        if ( checkMAC->isChecked() ) 
111            ifConfigLine+=lineIP->text() + " netmask " + lineNetmask->text();
112        else
113            ifConfigLine+=lineIP->text() \
114                        +" netmask " + lineNetmask->text() \
115                        + " ether " + lineMAC->text();
116       
117    } else {
118        // Using WPAE config?
119        if ( groupWPAE->isChecked() )
120          ifConfigLine="WPA SYNCDHCP";
121        else
122          ifConfigLine="DHCP";
123    }
124
125    if ( checkIPv6Enable->isChecked() ) {
126       // Get rid of the ifconfig line for the ipv6 interface
127       // Remove old deprecated syntax as well:
128       pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ipv6_ifconfig_" + DeviceName + "=", "", -1);
129       pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "_ipv6=", "", -1);
130       // Set accept_rtadv
131       pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "_ipv6=", "ifconfig_" + DeviceName + "_ipv6=\"inet6 accept_rtadv\"", -1);
132    } else {
133       // Set static address and disbale accept_rtadv.  This means someone will also have to set
134       // the default gateway which currently is configured form the advanced tab.  This should
135       // move here or all should move to a dedicated IPv6 tab like "General" is IPv4ish.
136       if (lineIPv6Address->text() != "") {
137          QString tmp = lineIPv6Address->text();
138          if (!tmp.contains(QRegExp("^inet6 "))) {
139             tmp.prepend("inet6 ");
140          }
141          pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "_ipv6=", "ifconfig_" + DeviceName + "_ipv6=\"" + tmp + " -accept_rtadv\"", -1);
142       }
143    }
144
145   pcbsd::Utils::setConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "=", "ifconfig_" + DeviceName + "=\"" + ifConfigLine + "\"", -1); 
146
147   // See if we need to enable lagg on this device
148   if ( isWifiEnabled() && useLagg )
149      NetworkInterface::enableLagg(QString("wlan0"));
150   
151   pcbsd::Utils::restartNetworking();
152
153   // Done, now set the apply button to off
154   buttonApply->setEnabled(FALSE);
155}
156
157void ethernetconfig::slotIPCheckbox()
158{
159   // Done, now set the apply button to on
160   buttonApply->setEnabled(TRUE);
161}
162
163void ethernetconfig::programInit()
164{
165   // See if we need to enable / disable the IP setup
166   slotIPCheckbox();
167   // Done, now set the apply button to on
168   buttonApply->setEnabled(FALSE);
169
170   // Connect our buttons / slots
171   connect(buttonClose, SIGNAL(clicked()), this, SLOT(slot_close()) );
172   connect(buttonApply, SIGNAL(clicked()), this, SLOT(slot_apply()) );
173   connect(checkDisableNetwork, SIGNAL(clicked()), this, SLOT(slotDisableCheck()) );
174   connect(groupStatic, SIGNAL(clicked()), this, SLOT(slotIPCheckbox()) );
175   connect(groupWPAE, SIGNAL(clicked()), this, SLOT(slotIPCheckbox()) );
176   connect(buttonOK, SIGNAL(clicked()), this, SLOT(slotOK()) );
177   connect(checkMAC, SIGNAL(clicked()), this, SLOT(slotMacClicked()) );
178   connect(lineIP, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText() ) );
179   connect(lineNetmask, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText() ) );
180   connect(checkIPv6Enable, SIGNAL(clicked()), this, SLOT(slotIPv6clicked() ) );
181   connect(lineIPv6Address, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText() ) );
182   connect(lineMAC, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText() ) );
183   connect(pushWPAE, SIGNAL(clicked()), this, SLOT(slotConfigWPA()) );
184}
185
186void ethernetconfig::setDevice(QString Device)
187{
188   
189   buttonApply->setEnabled(FALSE);
190
191   DeviceName = Device;
192
193
194   this->setWindowTitle(DeviceName + " " + tr("configuration") );
195
196   // Connect the slot to load the values
197   QTimer::singleShot(100,  this,  SLOT(slotFinishLoad()));
198
199   
200 
201
202}
203
204void ethernetconfig::runCommand( QString command )
205{
206        FILE *file = popen(command.toLatin1(),"r"); 
207        pclose(file);
208}
209
210
211void ethernetconfig::slotDisableCheck()
212{
213  if ( checkDisableNetwork->isChecked() )
214  {
215        tabMainWidget->setEnabled(FALSE);
216  } else {
217        tabMainWidget->setEnabled(TRUE);
218  }
219   // Done, now set the apply button to on
220   buttonApply->setEnabled(TRUE);
221}
222
223void ethernetconfig::slotOK()
224{
225  slot_apply();
226  exit(0);
227}
228
229void ethernetconfig::slotIPv6clicked()
230{
231        if ( checkIPv6Enable->isChecked() ) {
232                groupIPv6->setEnabled(FALSE);
233        } else {
234                groupIPv6->setEnabled(TRUE);
235        }
236
237   // Done, now set the apply button to on
238   buttonApply->setEnabled(TRUE);
239}
240
241void ethernetconfig::slotMacClicked()
242{
243   if ( checkMAC->isChecked() ) {
244        groupMAC->setEnabled(FALSE);
245   } else {
246        groupMAC->setEnabled(TRUE);
247   }
248   // Done, now set the apply button to on
249   buttonApply->setEnabled(TRUE);
250}
251
252void ethernetconfig::loadInfo()
253{
254  QString tmp;
255
256  // Get all the device information for the info tab
257  if ( textInfoName->text().isEmpty() ) {
258  tmp = getNameForIdent(DeviceName);
259  tmp.truncate(25);
260  textInfoName->setText(tmp);
261  }
262
263  QString fDev = DeviceName ;
264  if ( useLagg )
265    fDev = "lagg0" ;
266
267  textIP->setText(getIpForIdent(fDev) );
268  textNetmask->setText(getNetmaskForIdent(fDev) );
269  textMac->setText(getMacForIdent( DeviceName ) );
270  textStatus->setText(getStatusForIdent( DeviceName ) );
271  textIPv6->setText(getIPv6ForIdent( DeviceName) );
272  textGateway->setText(getGatewayForIdent(fDev) );
273  tmp = getMediaForIdent(DeviceName);
274  tmp.truncate(20);
275  textMedia->setText(tmp);
276
277  // Get the packet status for this device
278  textPacketsIn->setText(getInPacketsForIdent( DeviceName) );
279  textPacketsInErrors->setText( getInErrorsForIdent( DeviceName) );
280  textPacketsOut->setText(getOutPacketsForIdent( DeviceName) );
281  textPacketsOutErrors->setText(getOutErrorsForIdent( DeviceName) );
282
283  // Connect the slot to refresh
284  QTimer::singleShot(3000,  this,  SLOT(loadInfo()));
285}
286
287QString ethernetconfig::getNameForIdent( QString ident )
288{
289    NetworkInterface ifr(ident);
290    return ifr.desc();
291}
292
293QString ethernetconfig::getIpForIdent( QString ident )
294{
295   NetworkInterface ifr(ident);
296   return ifr.ipAsString();
297}
298
299QString ethernetconfig::getMacForIdent( QString ident )
300{
301   NetworkInterface ifr(ident);
302   return ifr.macAsString();
303}
304
305QString ethernetconfig::getStatusForIdent( QString ident )
306{
307   NetworkInterface ifr(ident);
308   return ifr.mediaStatusAsString();
309}
310
311QString ethernetconfig::getInPacketsForIdent(QString ident)
312{
313   NetworkInterface ifr(ident);
314   return QString::number(ifr.packetsRx());
315}
316
317QString ethernetconfig::getInErrorsForIdent(QString ident)
318{
319   NetworkInterface ifr(ident);
320   return QString::number(ifr.errorsRx());
321}
322
323QString ethernetconfig::getOutPacketsForIdent(QString ident)
324{
325   NetworkInterface ifr(ident);
326   return QString::number(ifr.packetsTx());
327}
328
329QString ethernetconfig::getOutErrorsForIdent(QString ident)
330{
331   NetworkInterface ifr(ident);
332   return QString::number(ifr.errorsTx());
333}
334
335QString ethernetconfig::getNetmaskForIdent( QString ident )
336{
337   NetworkInterface ifr(ident);
338   return ifr.netmaskAsString();
339}
340
341QString ethernetconfig::getLineFromCommandOutput( QString command )
342{
343        FILE *file = popen(command.toLatin1(),"r"); 
344       
345        char buffer[100];
346       
347        QString line = ""; 
348        char firstChar;
349       
350        if ((firstChar = fgetc(file)) != -1){
351                line += firstChar;
352                line += fgets(buffer,100,file);
353        }
354       
355       
356        pclose(file);
357       
358       
359        return line;
360}
361
362void ethernetconfig::showInfo()
363{
364        tabMainWidget->setCurrentWidget( tabMainWidget->widget(2) );
365}
366
367void ethernetconfig::slotFinishLoad()
368{
369   QString tmp, tmp2;
370
371   QSettings settings("PCBSD");
372   useLagg = settings.value("/pc-netmanager/useLagg", false).toBool();
373
374   // Start loading the device information
375   if ( useLagg )
376      tmp = pcbsd::Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_lagg0=", 1 );
377
378   if ( tmp.isEmpty() )
379      tmp = pcbsd::Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "=", 1 );
380
381   // Using WPAE config?
382   if ( tmp.indexOf("WPA") != -1 )
383      groupWPAE->setChecked(true);
384
385   if ( tmp.isEmpty() ) {
386      checkDisableNetwork->setChecked(TRUE);
387      tabMainWidget->setEnabled(FALSE);
388   } else if ( tmp.indexOf("DHCP") != -1 ) {
389
390      groupStatic->setChecked(FALSE);
391      lineNetmask->setText("255.255.255.0");
392
393      // Look for the mac address change
394        if ( tmp.indexOf("ether") != -1 ) {
395                tmp2 = tmp;
396                tmp2 = tmp2.remove(0, tmp.indexOf("ether") + 6 );
397                //if ( tmp.indexOf(" ") != -1 ) {
398                //  tmp2.truncate(tmp.indexOf(" ") );
399                //}
400                lineMAC->setText(tmp2);
401                checkMAC->setChecked(FALSE);
402                groupMAC->setEnabled(TRUE);
403        } 
404
405   } else {
406        // Look for an IP configuration
407        groupStatic->setChecked(TRUE);
408        tmp2 = tmp;
409
410        // Using the lagg port
411        if ( useLagg ) {
412                tmp2.remove(0, tmp2.lastIndexOf("laggport") + 9);
413                tmp2 = tmp2.simplified(); 
414                tmp2.remove(0, tmp2.indexOf(" "));
415        }
416
417        tmp2 = tmp2.simplified(); 
418
419        // Remove any WPA line
420        tmp2.replace("WPA ", "");
421
422        tmp2.truncate(tmp2.indexOf(" "));
423
424        if ( ! tmp2.isEmpty())
425        {
426           lineIP->setText(tmp2);
427
428           // Look for the netmask
429           if ( tmp.indexOf("netmask") != -1 ) {
430                        tmp2 = tmp;
431                        tmp2 = tmp2.simplified();
432                        tmp2 = tmp2.remove(0, tmp.indexOf("netmask") + 8 );
433                        if ( tmp.indexOf("ether") != -1 ) {
434                        tmp2.truncate(tmp.indexOf("ether") );
435                        }
436                        lineNetmask->setText(tmp2);
437                } else {
438                   lineNetmask->setText("255.255.255.0");
439                }
440
441                // Look for the mac address change
442                if ( tmp.indexOf("ether") != -1 ) {
443                        tmp2 = tmp;
444                        tmp2 = tmp2.remove(0, tmp.indexOf("ether") + 6 );
445                        tmp2 = tmp2.simplified();
446                        lineMAC->setText(tmp2);
447                        checkMAC->setChecked(FALSE);
448                        groupMAC->setEnabled(TRUE);
449                } 
450
451        }
452
453
454   }
455
456
457  // Check for the IPv6 Configuration
458  // Start loading the device information
459   tmp = pcbsd::Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_" + DeviceName + "_ipv6=", 1 );
460   if ( tmp.isEmpty() ) {
461        // Check for backward compat.
462        tmp = pcbsd::Utils::getConfFileValue( "/etc/rc.conf", "ipv6_ifconfig_" + DeviceName + "=", 1 );
463   }
464   if ( ! tmp.isEmpty() ) {
465        // remove the SLAAC default.
466        tmp.remove(QRegExp("inet6 "));
467        tmp.remove(QRegExp("accept_rtadv"));
468        tmp.remove(QRegExp("^\\s*"));
469        tmp.remove(QRegExp("\\s*$"));
470   }
471   if ( tmp.isEmpty() ) {
472        checkIPv6Enable->setChecked(TRUE);
473   } else {
474        checkIPv6Enable->setChecked(FALSE);
475        lineIPv6Address->setText(tmp);
476   }
477
478  slotIPv6clicked();
479
480  // Starts grabbing information for the info tab
481  loadInfo();
482
483
484  buttonApply->setEnabled(FALSE);
485}
486
487QString ethernetconfig::getIPv6ForIdent(QString ident)
488{
489        QString command = "nice ifconfig " +ident + " | grep \"inet6 \"";
490        QString inputLine = getLineFromCommandOutput(command);
491        QString ip= "";
492       
493        if (inputLine != "" && inputLine.indexOf("inet6 ") != -1){
494               
495                ip = inputLine.remove(0, inputLine.indexOf("inet6 ") + 5);
496                ip.truncate(ip.indexOf("%"));
497               
498               
499        }
500       
501        return ip;
502}
503
504QString ethernetconfig::getGatewayForIdent(QString ident)
505{
506        QString command = "nice netstat -n -r | grep \"default\" | grep " + ident;
507        QString inputLine = getLineFromCommandOutput(command);
508        QString packets = "";
509       
510        if (inputLine != "" ){
511                inputLine = inputLine.simplified();
512                packets = inputLine.section(' ', 1, 1 );
513        }
514       
515        return packets;
516}
517
518QString ethernetconfig::getMediaForIdent( QString ident )
519{
520        QString command = "nice ifconfig " +ident + " | grep \"media:\"";
521        QString inputLine = getLineFromCommandOutput(command);
522        QString status = "";
523       
524        if (inputLine != "" && inputLine.indexOf("media:") != -1){
525                status = inputLine.remove(0, inputLine.indexOf("media:") + 7);
526                status.truncate(inputLine.indexOf("\n") );
527                if ( status.indexOf("(") != -1)
528                {
529                   status.remove(0, status.indexOf("(") + 1);
530                }
531                if ( status.indexOf(")") != -1)
532                {
533                   status.truncate(status.indexOf(")"));
534                }
535
536        }
537       
538        return status;
539}
540
541void ethernetconfig::slotCheckGlobalText()
542{
543  // Done, now set the apply button to off
544  buttonApply->setEnabled(TRUE);
545}
546
547void ethernetconfig::slotConfigWPA()
548{
549   // Bring up the WPA-Enterprise config dialog
550   QProcess::execute("/usr/local/bin/pc-wificonfig", QStringList() << "wpaonly" << DeviceName);
551}
Note: See TracBrowser for help on using the repository browser.