source: src-qt4/pc-netmanager/src/NetworkManager/networkman.cpp @ f75599e

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since f75599e was f75599e, checked in by Ken Moore <ken@…>, 6 months ago

Fix a bug where a blank DNS can be saved in pc-netmanager.
TRAC: https://trac.pcbsd.org/ticket/688

  • Property mode set to 100644
File size: 32.8 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include <iostream>
13#include <QDir>
14#include <QFile>
15#include <QtNetwork/QHostAddress>
16#include <QMenu>
17#include <QSettings>
18#include <QString>
19#include <QTemporaryFile>
20#include <QTextStream>
21#include <pcbsd-netif.h>
22#include <pcbsd-utils.h>
23#include <unistd.h>
24#include <sys/types.h>
25
26#include "networkman.h"
27#include "ui_networkman.h"
28#include "../../../config.h"
29#include "dnslist.h"
30
31// Set our max number of wlan[0-9] devices we'll support
32#define MAX_WLAN_DEVICES 10
33
34using namespace std;
35
36void NetworkMan::Init()
37{
38    InstallerMode = false;
39    Changed = FALSE;
40   
41    colourWhite = QColor(255, 255, 255);
42    colourRed = QColor(255, 78, 78);
43   
44    // Set tray icon disabled, since we may be running under root mode
45    //checkSysTray->setEnabled(FALSE);
46    //checkSysTray->setHidden(TRUE);
47   
48   
49    // Let the list box know to add new devices
50    firstUpdate = 0;
51   
52    // Make sure we are running as root
53    if ( getuid() != 0 )
54    {
55         QMessageBox::critical( this, tr("Need Root Access"),
56          tr("This program must be run as root!") );
57         exit(1);
58    }
59
60    // Get the username we're running under
61    username = QString::fromLocal8Bit(getenv("LOGNAME"));
62       
63    // Set global slots
64    connect(pushSave, SIGNAL(clicked()), this, SLOT(slotSave()) );
65    connect(pushClose, SIGNAL(clicked()), this, SLOT(slotClose()) );
66
67    // Set slots for the network devices tab
68    connect(listNetDev, SIGNAL(itemSelectionChanged()), this, SLOT(DevSelectionChanged()) );
69    connect(pushConfigure, SIGNAL(clicked()), this, SLOT(PropertiesSlot()) );
70    connect(checkSysTray, SIGNAL(clicked()), this, SLOT(slotSysTray()) );
71    listNetDev->setContextMenuPolicy( Qt::CustomContextMenu );
72    connect(listNetDev, SIGNAL(itemDoubleClicked( QListWidgetItem *) ), this, SLOT(slotDoubleClick(QListWidgetItem *) ) );
73    connect(listNetDev, SIGNAL(customContextMenuRequested( const QPoint &) ), this, SLOT(slotListRightClick(const QPoint &) ) );
74
75    // Set slots for proxy stuff
76    connect( checkProxyUser, SIGNAL( clicked() ), this, SLOT( slotProxyUserChecked() ) );
77
78    // Set the slots for the advanced tab
79    connect(lineDNS1, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
80    connect(lineDNS2, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
81    connect(lineIPv6DNS1, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
82    connect(lineIPv6DNS2, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
83    connect(lineGateway, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
84    connect(lineIPv6Gateway, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
85    connect(lineHostname, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
86    connect(lineSearchDomain, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
87
88   
89    connect(lineProxyAddress, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
90    connect(lineProxyUser, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
91    connect(lineProxyPass, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckGlobalText()) );
92    connect(checkProxyUser, SIGNAL(clicked()), this, SLOT(slotCheckGlobalText()) );
93    connect(radioHTTPProxy, SIGNAL(clicked()), this, SLOT(slotCheckGlobalText()) );
94    connect(radioSOCKSProxy, SIGNAL(clicked()), this, SLOT(slotCheckGlobalText()) );
95    connect(spinProxyPort, SIGNAL(valueChanged(int)), this, SLOT(slotCheckGlobalText()) );
96
97    connect(groupDNS, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
98    connect(groupGateway, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
99    connect(groupIPv6, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
100    connect(groupIPv6, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
101    connect(checkLagg, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
102    connect(groupProxySettings, SIGNAL(clicked(bool)), this, SLOT(slotCheckGlobalText()) );
103
104    connect(PublicDNS1, SIGNAL(clicked()), this, SLOT(slotPublicDNS1Clicked()) );
105    connect(PublicDNS2, SIGNAL(clicked()), this, SLOT(slotPublicDNS2Clicked()) );
106    connect(IPV6DNS1Button, SIGNAL(clicked()), this, SLOT(slotIPV6DNS1Clicked()) );
107    connect(IPV6DNS2Button, SIGNAL(clicked()), this, SLOT(slotIPV6DNS2Clicked()) );
108
109    // Get the FreeBSD Major version we are using
110    checkFreeBSDVer();
111   
112    // Load any global settings
113    loadGlobals();
114   
115     // Start the device detection process
116    detectDev();
117   
118    // Mark selection as changed
119    DevSelectionChanged();
120}
121
122
123void NetworkMan::checkFreeBSDVer()
124{
125   QString command = "uname -r";
126   QString unameoutput = getLineFromCommandOutput(command);
127   unameoutput = unameoutput.remove(1, unameoutput.length());
128   bool ok;
129   FreeBSDMajor = unameoutput.toInt(&ok);
130   if ( ! ok  ) {
131     FreeBSDMajor = -1;
132   }
133
134}
135
136void NetworkMan::detectDev()
137{
138    QString tmp;
139    bool foundDev;
140
141    listNetDev->clear();
142    textGlobalError->setText(tr("Detecting Devices...") );
143    pushConfigure->setEnabled(FALSE);
144   
145    QStringList ifs = NetworkInterface::getInterfaces();
146    uint i = 0;
147    for ( QStringList::Iterator it = ifs.begin(); it != ifs.end(); ++it )
148    {
149       foundDev = false;
150
151       QString dev = *it;
152       if (dev.indexOf("lo") != 0 
153           && dev.indexOf("fwe") == -1
154           && dev.indexOf("ipfw") == -1
155           && dev.indexOf("lagg") == -1
156           && dev.indexOf("plip") == -1
157           && dev.indexOf("pfsync") == -1
158           && dev.indexOf("pflog") == -1
159           && dev.indexOf("usbus") == -1
160           && dev.indexOf("vboxnet") == -1
161           && dev.indexOf("tun") == -1)
162       {
163           if ( FreeBSDMajor >= 8 )
164           {
165             tmp = getTypeForIdent(dev);
166             if ( tmp == "Wireless" && dev.indexOf("wlan") != 0 ) {
167               // Found a wireless device, confirm that it has corrisponding wlan device
168               if ( ! checkWifiWlans("wlans_" + dev) ) {
169                  // This device does NOT have a wlan[0-9] child, lets prompt the user to create it now
170
171                  // Place a message box prompt here
172                  QMessageBox msgBox;
173                  msgBox.setText("A new wireless device (" + dev + ") has been detected.");
174                  msgBox.setInformativeText("Do you want to enable this device now?");
175                  msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
176                  msgBox.setDefaultButton(QMessageBox::Yes);
177                  int ret = msgBox.exec();
178                  if ( ret == QMessageBox::Yes )
179                  {
180                    // Get the next available wlan[0-9] device
181                    tmp = getNextAvailWlan();
182
183                    QTemporaryFile tmpfile;
184                    if ( tmpfile.open() ) {
185                    QTextStream streamout( &tmpfile );
186                      streamout << "#!/bin/sh\n";
187                      streamout << IFCONFIG + tmp + " create wlandev " + dev + "\n";
188                      streamout << "echo 'wlans_" + dev + "=\"" + tmp + "\"' >>/etc/rc.conf\n";
189                      tmpfile.close();
190                    }
191
192                    // Create our script to setup the child wlan device
193                    system("sh " + tmpfile.fileName().toLatin1());
194     
195                    // re-start the device detection process
196                    QTimer::singleShot(100,  this,  SLOT(detectDev()));
197                  }
198               } 
199
200             } else {
201
202
203               // Using a regular ethernet device or a wlan[0-9] device
204               //qDebug("Found device: " + dev);
205               Devs[i] = dev;
206
207               // Determine if its a wireless or wired device
208               DevsType[i] = tmp;
209
210
211               // If we've found a wifi device, with name of wlan[0-9]
212               // Then set the Parent name to pull info direct from device
213               if ( tmp == "Wireless" ) {
214                 DevsParent[i] = getWifiParent(dev);
215
216                 // Get HW Identify line
217                 DevsName[i] = getNameForIdent(DevsParent[i]);
218
219                 //QMessageBox::warning( this, "Testing", DevsName[i]);
220                 // If the name comes up bogus for some reason
221                 if( DevsName[i].isEmpty() ) {
222                   DevsName[i] = tr("Unknown Wireless Device");
223                 }
224               } else {
225                 // Get HW Identify line
226                 DevsName[i] = getNameForIdent(Devs[i]);
227               }
228
229               foundDev = true;   
230               
231             }
232           } else {
233             //qDebug("Found device: " + dev);
234             Devs[i] = dev;
235             // Determine if its a wireless or wired device
236             DevsType[i] = getTypeForIdent(Devs[i]);
237             // Get HW Idtentify line
238             DevsName[i] = getNameForIdent(Devs[i]);
239             foundDev = true;   
240           
241           }
242
243         if(foundDev) {
244           pushConfigure->setEnabled(TRUE);
245           i++;
246         }
247       }
248   }
249
250    // Mark the last device as unused
251    Devs[i] = "";
252
253    textGlobalError->setText("");
254    refreshDevices();
255    DevSelectionChanged();
256
257}
258
259// Function which locates the parent device of a wlan child device
260QString NetworkMan::getWifiParent(QString dev)
261{ 
262   dev.remove(0, dev.size() -1 );
263   QString DevNum = dev;
264   return pcbsd::Utils::sysctl("net.wlan." + DevNum + ".%parent");
265}
266
267QString NetworkMan::getNextAvailWlan()
268{
269   QString tmp;
270   QString line;
271   bool avail;
272
273   QFile file( "/etc/rc.conf" );
274   if ( file.open( QIODevice::ReadOnly ) ) {
275     QTextStream stream( &file );
276
277     for ( int i = 0; i< MAX_WLAN_DEVICES; i++)
278     {
279        // Jump back to beginning of file
280        stream.seek(0);
281        avail = true;
282
283        while ( !stream.atEnd() ) {
284          line = stream.readLine(); // line of text excluding '\n'
285
286          // If the KEY is found in the line, continue processing
287          if ( line.indexOf("wlans_", 0) != -1 && line.indexOf("=") != -1 )
288          {
289             // Found a wlan_ line, check the wlan device to see if its available
290             if ( line.indexOf("wlan" + tmp.setNum(i) ) != -1)
291               avail = false;           
292          }
293        }
294
295        if (avail) {
296          line = "wlan" + tmp.setNum(i);
297          return line;
298        }
299      }
300
301
302     file.close();
303   } 
304
305   tmp = "";
306   return tmp;
307
308}
309
310QString NetworkMan::getLineFromCommandOutput( QString command )
311{
312        FILE *file = popen(command.toLatin1(),"r"); 
313       
314        char buffer[100];
315       
316        QString line = ""; 
317        char firstChar;
318       
319        if ((firstChar = fgetc(file)) != -1){
320                line += firstChar;
321                line += fgets(buffer,100,file);
322        }
323       
324       
325        pclose(file);
326       
327       
328        return line;
329}
330
331
332QString NetworkMan::getNameForIdent( QString ident )
333{
334    NetworkInterface ifr(ident);
335    return ifr.desc();
336}
337
338
339QString NetworkMan::getIpForIdent( QString ident )
340{
341   QString cmd = IFCONFIG + " lagg0 2>/dev/null | grep " + ident;
342   QString checkLagg = getLineFromCommandOutput(cmd.toLatin1());
343   if ( ! checkLagg.isEmpty() )
344    ident = "lagg0";
345
346   NetworkInterface ifr(ident);
347   return ifr.ipAsString();
348}
349
350
351QString NetworkMan::getMacForIdent( QString ident )
352{
353   NetworkInterface ifr(ident);
354   return ifr.macAsString();
355}
356
357
358QString NetworkMan::getStatusForIdent( QString ident )
359{
360   NetworkInterface ifr(ident);
361   return ifr.mediaStatusAsString();
362}
363
364void NetworkMan::DevSelectionChanged()
365{
366   int sel = listNetDev->currentRow();
367   
368   if ( sel != -1 ) {
369   
370   pushConfigure->setEnabled(TRUE);
371
372       
373   // Check to see if the network tray icon is enabled or not
374   QString filename = PREFIX + "/share/pcbsd/xstartup/tray-" + Devs[sel] + ".sh";
375
376
377   // First run a check to if we need to enable or disable the checkbox
378   if ( QFile::exists( filename ) )
379   {
380     checkSysTray->setChecked(TRUE);
381   } else {
382     checkSysTray->setChecked(FALSE);
383   }
384   
385   
386   DevsIP[sel] = getIpForIdent(Devs[sel]);
387   DevsStatus[sel] = getStatusForIdent(Devs[sel]);
388   DevsNetmask[sel] = getNetmaskForIdent(Devs[sel]);
389   
390   textStatusLabel1->setText(tr("Address:"));   
391   textStatus1->setText(tr("IP: ") + DevsIP[sel] + " / " + tr("Netmask: ") + DevsNetmask[sel]);
392
393   if ( getTypeForIdent(Devs[sel]) == "Wireless" )
394   {
395     checkSysTray->setVisible(FALSE);
396     textStatusLabel2->setText(tr("SSID:"));
397     QString SSID = ""; 
398     QString tmp;
399       
400     QProcess *getIfProc = new QProcess();
401     getIfProc->start(IFCONFIG, QStringList() << Devs[sel]);
402     if (getIfProc->waitForFinished(2000)) {
403       tmp = getIfProc->readAllStandardOutput().simplified();
404     }
405
406     getIfProc->kill();
407     delete getIfProc;
408
409     if (tmp != "" && tmp.indexOf("ssid ") != -1){
410        SSID = tmp.remove(0, tmp.indexOf("ssid ") + 5);
411        SSID.truncate(tmp.indexOf("channel") - 1 );
412     }
413
414     textStatus2->setText(SSID);
415   } else {
416     if ( ! InstallerMode )
417       checkSysTray->setVisible(TRUE);
418     textStatusLabel2->setText(tr("MAC Address:"));
419     textStatus2->setText(DevsMAC[sel]);
420   }
421   
422   textStatusLabel3->setText(tr("Status:"));
423   textStatus3->setText(DevsStatus[sel]);
424   
425  }
426   
427}
428
429bool NetworkMan::checkWifiWlans( QString Key )
430{
431QFile file( "/etc/rc.conf" );
432    if ( file.open( QIODevice::ReadOnly ) ) {
433        QTextStream stream( &file );
434        QString line;
435        while ( !stream.atEnd() ) {
436            line = stream.readLine(); // line of text excluding '\n'
437
438          // If the KEY is found in the line, continue processing
439          if ( line.indexOf(Key, 0) != -1)
440          {
441            return TRUE;
442          }
443        }
444        file.close();
445    }
446
447    return FALSE;
448}
449
450bool NetworkMan::checkValue( QString File, QString Key, QString Value )
451{
452QFile file( File );
453    if ( file.open( QIODevice::ReadOnly ) ) {
454        QTextStream stream( &file );
455        QString line;
456        while ( !stream.atEnd() ) {
457            line = stream.readLine(); // line of text excluding '\n'
458           
459               // If the KEY is found in the line, continue processing
460        if ( line.indexOf(Key, 0) != -1)
461        {
462            line.remove(line.indexOf(Key, 0), Key.length());
463            if ( line.indexOf(Value, 0) != -1)
464            {
465                return TRUE;
466            }
467           
468        }
469           
470           
471           
472        }
473        file.close();
474    }
475   
476    return FALSE;
477}
478
479void NetworkMan::PropertiesSlot()
480{
481    QString program;
482    QStringList arguments;
483   
484    workingDev = listNetDev->currentRow();
485   
486    if ( workingDev != -1) {
487   
488    if ( DevsType[workingDev] == "Wireless" )
489    {
490        // If we are running as root
491        if ( getuid() != 0 )
492        {
493          program = "pc-su";
494          arguments.clear();
495          arguments << "-d" << "--noignorebutton" << "pc-wificonfig" << Devs[workingDev];
496         } else {
497          program = "pc-wificonfig";
498          arguments.clear();
499          arguments << Devs[workingDev];
500         }
501
502         ConfigDevice = new QProcess( this );
503         ConfigDevice->start(program, arguments); 
504
505    } else {
506   
507        // If we are running as root
508        if ( getuid() != 0 )
509        {
510          program = "pc-su";
511          arguments.clear();
512          arguments << "-d" << "--noignorebutton" << "pc-ethernetconfig" << Devs[workingDev];
513         } else {
514          program = "pc-ethernetconfig";
515          arguments.clear();
516          arguments << Devs[workingDev];
517         }
518
519         ConfigDevice = new QProcess( this );
520         ConfigDevice->start(program, arguments); 
521
522   }
523   
524  }
525     
526}
527
528
529
530
531
532void NetworkMan::runCommand( QString command )
533{
534        FILE *file = popen(command.toLatin1(),"r"); 
535        pclose(file);
536}
537
538
539void NetworkMan::loadGlobals()
540{   
541    QString tmp;
542    lineHostname->setText(pcbsd::Utils::getConfFileValue("/etc/rc.conf", "hostname=", 1));
543
544    tmp = pcbsd::Utils::getConfFileValue("/etc/rc.conf", "defaultrouter=", 1);
545    if ( tmp.isEmpty() )
546    {
547       groupGateway->setChecked(false);
548       // Check the default route
549       QString checkRoute = getLineFromCommandOutput("route get default | grep gateway").simplified();
550       if ( checkRoute.indexOf("gateway:") != -1 )
551         lineGateway->setText(checkRoute.section(" ", 1, 1));
552    } else {
553        groupGateway->setChecked(true);
554        lineGateway->setText(pcbsd::Utils::getConfFileValue("/etc/rc.conf", "defaultrouter=", 1) );
555    }
556
557    /* Use simple regular expressions to distinguish IPv4 and IPv6 addresses. */
558    lineDNS1->setText(pcbsd::Utils::getConfFileValue("/etc/resolv.conf", "nameserver ", "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b", 1) );
559    lineDNS2->setText(pcbsd::Utils::getConfFileValue("/etc/resolv.conf", "nameserver ", "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b", 2) );
560    // Check if we are using custom DNS
561    tmp = pcbsd::Utils::getConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", 1);
562    if ( tmp.isEmpty() )
563       groupDNS->setChecked(false);
564    else
565       groupDNS->setChecked(true);
566
567
568    lineIPv6DNS1->setText(pcbsd::Utils::getConfFileValue("/etc/resolv.conf", "nameserver ", "\\b.*:.*:.*\\b", 1) );
569    lineIPv6DNS2->setText(pcbsd::Utils::getConfFileValue("/etc/resolv.conf", "nameserver ", "\\b.*:.*:.*\\b", 2) );
570    lineSearchDomain->setText(pcbsd::Utils::getConfFileValue("/etc/resolv.conf", "search ", 1) );
571
572    // Check for IPv6 settings
573    lineIPv6Gateway->setText(pcbsd::Utils::getConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", 1) );
574    tmp = pcbsd::Utils::getConfFileValue("/etc/rc.conf", "ipv6_activate_all_interfaces=", 1) ;
575    if ( tmp == "YES" )
576        groupIPv6->setChecked(TRUE);
577    else
578        groupIPv6->setChecked(FALSE);
579
580
581    // Check if we want to use the lagg interface
582    QSettings settings("PCBSD");
583    checkLagg->setChecked(settings.value("/pc-netmanager/useLagg", false).toBool());
584   
585    // Load Proxy Stuff
586    loadProxyConfig();
587       
588}
589
590
591QString NetworkMan::getNetmaskForIdent( QString ident )
592{
593   QString cmd = IFCONFIG + " lagg0 2>/dev/null | grep " + ident;
594   QString checkLagg = getLineFromCommandOutput(cmd.toLatin1());
595   if ( ! checkLagg.isEmpty() )
596    ident = "lagg0";
597
598   NetworkInterface ifr(ident);
599   return ifr.netmaskAsString();
600}
601
602
603void NetworkMan::restartNetwork()
604{
605   pcbsd::Utils::restartNetworking();
606}
607
608
609QString NetworkMan::getTypeForIdent( QString ident )
610{
611   NetworkInterface ifr(ident);
612   if (ifr.isWireless()) return "Wireless";
613   return "Ethernet";
614}
615
616
617void NetworkMan::refreshDevices()
618{
619   
620    int i = 0;
621    listNetDev->clear(); 
622    while (! Devs[i].isEmpty() )
623    {
624       
625                DevsIP[i] = getIpForIdent(Devs[i]);
626                DevsStatus[i] = getStatusForIdent(Devs[i]);
627                DevsUp[i] = getUpStatusForIdent(Devs[i]);
628                DevsNetmask[i] = getNetmaskForIdent(Devs[i]);
629               
630                if ( firstUpdate == 0) {
631                  DevsMAC[i] = getMacForIdent(Devs[i]);
632                  listNetDev->setCurrentRow(0);
633                }
634
635                if ( DevsType[i] == "Wireless")
636                {
637                   
638                    QPixmap PixmapIcon( PREFIX + "/share/pcbsd/pc-netmanager/pics/network_wifi.png");
639                    listNetDev->addItem(new QListWidgetItem(PixmapIcon.scaled(32,32), Devs[i] + " (" +DevsName[i] + ")") );
640                   
641                 } else {
642                    // If we are looking at a regular Ethernet device 
643                    QPixmap PixmapIcon( PREFIX + "/share/pcbsd/pc-netmanager/pics/network_local.png");
644                    listNetDev->addItem(new QListWidgetItem(PixmapIcon.scaled(32,32), Devs[i] + " (" +DevsName[i] + ")") );
645                }
646       
647        i++;
648    }
649                           
650}
651
652
653void NetworkMan::slotSysTray()
654{
655    int  sel = listNetDev->currentRow();
656    if ( sel == -1 )
657       return; 
658   
659    QString Type;
660    QString Command;
661   
662    // Start the tray applet
663    if (checkSysTray->isChecked() )
664    { 
665        // Save the new file
666        QFile fileout( PREFIX + "/share/pcbsd/xstartup/tray-" + Devs[sel] + ".sh");
667        if ( fileout.open( QIODevice::WriteOnly ) ) {
668          QTextStream streamout( &fileout );
669          streamout << "sudo pc-nettray " + Devs[sel] + " &";
670          fileout.close();
671           
672          runCommand("chmod 755 \"" + PREFIX + "/share/pcbsd/xstartup/tray-" + Devs[sel] + ".sh\"");
673          runCommand("sync");
674
675          // Now start the tray icon
676          QString sCmd = "su " + username + " -c \"sudo pc-nettray " + Devs[sel] + "\" &";
677          system(sCmd.toLatin1());
678                   
679        }
680       
681    } else {
682        // Kill the tray applet
683        runCommand("rm -f \"" + PREFIX + "/share/pcbsd/xstartup/tray-" + Devs[sel] + ".sh\"");
684    }
685
686}
687
688
689void NetworkMan::slotDoubleClick( QListWidgetItem *item __unused )
690{
691    // Start the configuration dialog
692    PropertiesSlot();
693}
694
695void NetworkMan::slotTimerRefresh()
696{
697    QTimer::singleShot( 10000, this, SLOT(refreshDevices()) );
698}
699
700
701void NetworkMan::slotListRightClick( const QPoint &pos __unused )
702{
703    int currentItem = listNetDev->currentRow();
704    if ( currentItem != -1 ) {
705          popup = new QMenu();
706          popup->addAction( tr("Configure ") + Devs[currentItem], this, SLOT(PropertiesSlot()));
707          popup->addAction( tr("Device Information"), this, SLOT(slotShowInfoConfig()));
708          // If we are running as root
709          if ( getuid() == 0 )
710          {
711          popup->addSeparator();
712          if ( DevsUp[currentItem] == "DOWN" ) {
713            popup->addAction( tr("Enable device"), this, SLOT(slotEnableDevice()));
714                } else {
715            popup->addAction( tr("Disable device"), this, SLOT(slotDisableDevice()));
716                }
717                popup->addSeparator();
718                popup->addAction( tr("Restart the Network"), this, SLOT(restartNetwork()));
719          }
720          popup->exec( QCursor::pos() );
721    }
722
723}
724
725
726void NetworkMan::slotDisableDevice()
727{
728        int currentItem = listNetDev->currentRow();
729    if ( currentItem != -1 ) {
730        runCommand(IFCONFIG + " " + Devs[currentItem] + " down");
731    }
732
733}
734
735
736
737
738void NetworkMan::slotEnableDevice()
739{
740        int currentItem = listNetDev->currentRow();
741    if ( currentItem != -1 ) {
742        runCommand(IFCONFIG + " " + Devs[currentItem] + " up");         
743    }   
744}
745
746
747void NetworkMan::slotShowInfoConfig()
748{
749   QString program;
750   QStringList arguments;
751
752   workingDev = listNetDev->currentRow();
753   
754   if ( workingDev != -1) {
755   
756    if ( DevsType[workingDev] == "Wireless" )
757    {
758
759        // If we are running as root
760        if ( getuid() != 0 )
761        {
762          program = "pc-su";
763          arguments.clear();
764          arguments << "-d" << "--noignorebutton" << "pc-wificonfig" << "info" << Devs[workingDev];
765         } else {
766          program = "pc-wificonfig";
767          arguments.clear();
768          arguments << "info" << Devs[workingDev];
769         }
770
771         ConfigDevice = new QProcess( this );
772         ConfigDevice->start(program, arguments); 
773
774    } else {
775   
776        // If we are running as root
777        if ( getuid() != 0 )
778        {
779          program = "pc-su";
780          arguments.clear();
781          arguments << "-d" << "--noignorebutton" << "pc-ethernetconfig" << "info" << Devs[workingDev];
782         } else {
783          program = "pc-ethernetconfig";
784          arguments.clear();
785          arguments << "info" << Devs[workingDev];
786         }
787
788         ConfigDevice = new QProcess( this );
789         ConfigDevice->start(program, arguments); 
790   }
791   
792  }
793}
794
795
796void NetworkMan::setNotRoot()
797{
798    // Disable functionality since we are not running as root
799    checkSysTray->setEnabled(FALSE);
800    checkSysTray->setHidden(TRUE);
801    lineDNS1->setEnabled(FALSE);
802    lineDNS2->setEnabled(FALSE);
803    lineIPv6DNS1->setEnabled(FALSE);
804    lineIPv6DNS2->setEnabled(FALSE);
805    lineHostname->setEnabled(FALSE);
806    lineGateway->setEnabled(FALSE);
807    lineIPv6Gateway->setEnabled(FALSE);
808}
809
810
811QString NetworkMan::getUpStatusForIdent( QString ident )
812{
813   NetworkInterface ifr(ident);
814   if (ifr.isUp()) return "UP";
815   return "DOWN";
816}
817
818void NetworkMan::slotCheckGlobalText()
819{
820
821   pushSave->setEnabled(false);
822   QRegExp hostnameRegExp("^(([a-z0-9][a-z0-9-].*[a-z0-9])|([a-z0-9]+))$");
823   textGlobalError->setText("");
824
825    if ( groupIPv6->isChecked() ) {
826        QHostAddress addr;
827        if ( ! lineIPv6DNS1->text().isEmpty() ) {
828            if ( addr.setAddress(lineIPv6DNS1->text()) == false || addr.protocol() != QAbstractSocket::IPv6Protocol ) {
829                textGlobalError->setText(tr("Invalid IPv6 DNS specified"));
830                return;
831            }
832        }
833        if ( ! lineIPv6DNS2->text().isEmpty() ) {
834            if ( addr.setAddress(lineIPv6DNS2->text()) == false || addr.protocol() != QAbstractSocket::IPv6Protocol ) {
835                textGlobalError->setText(tr("Invalid IPv6 DNS specified"));
836                return;
837            }
838        }
839        if ( ! lineIPv6Gateway->text().isEmpty() ) {
840            if ( addr.setAddress(lineIPv6Gateway->text()) == false || addr.protocol() != QAbstractSocket::IPv6Protocol ) {
841                textGlobalError->setText(tr("Invalid IPv6 Gateway specified"));
842                return;
843            }
844        }
845    }
846   
847     if(groupDNS->isChecked()){
848       if( lineDNS1->text() == "..." && lineDNS2->text() == "..." ){ return; }
849       if ( lineDNS1->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineDNS1->text() ) ) {
850         textGlobalError->setText(tr("Invalid DNS specified"));
851         return;
852       }
853       if ( lineDNS2->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineDNS2->text() ) ) {
854         textGlobalError->setText(tr("Invalid DNS specified"));
855         return;
856       }
857     }
858   
859   
860     if ( lineGateway->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineGateway->text())  && groupGateway->isChecked() ) {
861         textGlobalError->setText(tr("Invalid Gateway specified"));
862         return;
863     }
864     
865     /**
866     Hostnames must:
867     - Contain only a-z, 0-9, and hyphens (-)
868     - Not have a hyphen as the first or last character
869     **/
870     lineHostname->setText(lineHostname->text().toLower());
871     if (lineHostname->text().isEmpty())
872     {
873       textGlobalError->setText(tr("Please enter a hostname"));
874       return;
875     }
876     else if (hostnameRegExp.indexIn(lineHostname->text()) == -1)
877     {
878        textGlobalError->setText(tr("Hostname may only contain letters and numbers"));
879        return;
880     }
881
882     pushSave->setEnabled(true);
883
884}
885
886void NetworkMan::slotClose()
887{
888   close();
889}
890
891void NetworkMan::slotSave()
892{
893   
894   if ( !lineHostname->text().isEmpty() && (lineHostname->text().toLower() != pcbsd::Utils::getConfFileValue("/etc/rc.conf", "hostname=", 1).toLower() ) ) {
895      pcbsd::Utils::setConfFileValue("/etc/rc.conf", "hostname=", "hostname=\"" + lineHostname->text() + "\"", -1);
896      pcbsd::Utils::setConfFileValue("/etc/hosts", "::1", "::1\t\t\tlocalhost localhost.localdomain " + lineHostname->text() + ".localhost " + lineHostname->text(), -1);
897      pcbsd::Utils::setConfFileValue("/etc/hosts", "127.0.0.1", "127.0.0.1\t\tlocalhost localhost.localdomain " + lineHostname->text() + ".localhost " + lineHostname->text(), -1);
898      QMessageBox::information(this,tr("Computer Restart Required"), tr("You must restart your computer to finish changing your hostname") );
899   }
900   
901   
902   if ( lineGateway->text() == "..." || ! groupGateway->isChecked() ) {
903     pcbsd::Utils::setConfFileValue("/etc/rc.conf", "defaultrouter=", "", -1);
904   } else {
905     pcbsd::Utils::setConfFileValue("/etc/rc.conf", "defaultrouter=", "defaultrouter=\"" + lineGateway->text() + "\"", -1); 
906   }
907   
908   int DNSline = 1;
909   
910   /* Prefer IPv6 nameservers if IPv6 is enabled. */
911    if ( groupIPv6->isChecked() ) {
912        if ( ! lineIPv6DNS1->text().isEmpty() ) {
913            pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineIPv6DNS1->text(), DNSline); 
914            DNSline++;
915        }
916        if ( ! lineIPv6DNS2->text().isEmpty() ) {
917            pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineIPv6DNS2->text(), DNSline); 
918            DNSline++;
919        }
920    }
921   
922   if ( lineDNS1->text() == "..."  || ! groupDNS->isChecked() ) {
923     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "", DNSline);
924   } else {
925     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineDNS1->text(), DNSline); 
926     DNSline++;
927   }   
928   if ( lineDNS2->text() == "..." || ! groupDNS->isChecked() ) {
929     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "", DNSline);
930   } else {
931     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineDNS2->text(), DNSline); 
932   }   
933   
934   // If we have custom DNS, make sure it survives a dhclient run
935   if ( lineDNS1->text() != "..." && lineDNS2->text() != "..." && groupDNS->isChecked() )
936     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS1->text() + ", " + lineDNS2->text() +";"); 
937   else if ( lineDNS1->text() != "..." )
938     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS1->text() +";"); 
939   else if ( lineDNS2->text() != "..." )
940     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS2->text() +";"); 
941   else
942     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", ""); 
943   
944
945   if ( lineSearchDomain->text().isEmpty() || ! groupDNS->isChecked() ) {
946     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "search", "", 1);
947   } else {
948     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "search", "search " + lineSearchDomain->text(), 1);
949   }
950
951   // Save the IPv6 stuff
952    if ( groupIPv6->isChecked() ) {
953        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_activate_all_interfaces=", "ipv6_activate_all_interfaces=\"YES\"", -1);
954        if ( ! lineIPv6Gateway->text().isEmpty() ) {
955            pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "ipv6_defaultrouter=\"" + lineIPv6Gateway->text() + "\"", -1);
956        } else {
957            pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "", -1);
958        }
959    } else {
960        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_activate_all_interfaces=", "", -1);
961        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "", -1);
962    }
963
964    // Save the lagg preference
965    QSettings settings("PCBSD");
966    settings.setValue("/pc-netmanager/useLagg", checkLagg->isChecked());
967
968    // Make sure we enable lagg for this system
969    if ( checkLagg->isChecked() )
970       NetworkInterface::enableLagg(QString("wlan0"));
971
972    // Save the proxy config
973    saveProxyConfig();
974   
975    restartNetwork();
976
977}
978
979void NetworkMan::slotProxyUserChecked() {
980  if ( checkProxyUser->isChecked() ) {
981    lineProxyUser->setEnabled(true);
982    lineProxyPass->setEnabled(true);
983  } else {
984    lineProxyUser->setEnabled(false);
985    lineProxyPass->setEnabled(false);
986  }
987}
988
989void NetworkMan::loadProxyConfig()
990{
991   QString tmp;
992   bool ok;
993
994   tmp = pcbsd::Utils::getProxyURL();
995   if ( tmp.isEmpty() )
996      groupProxySettings->setChecked(false);
997   else
998      groupProxySettings->setChecked(true); 
999
1000   lineProxyAddress->setText(tmp);
1001
1002   tmp = pcbsd::Utils::getProxyUser();
1003   lineProxyUser->setText(tmp);
1004   if ( tmp.isEmpty() )
1005      checkProxyUser->setChecked(false);
1006   else
1007      checkProxyUser->setChecked(true);
1008
1009   lineProxyPass->setText(pcbsd::Utils::getProxyPass());
1010
1011   tmp = pcbsd::Utils::getProxyPort();
1012   tmp.toInt(&ok);
1013   if ( ok )
1014      spinProxyPort->setValue(tmp.toInt(&ok));
1015   
1016
1017   tmp = pcbsd::Utils::getProxyType();
1018   if ( tmp == "digest" )
1019      radioSOCKSProxy->setChecked(true);
1020   else
1021      radioHTTPProxy->setChecked(true);
1022
1023   slotProxyUserChecked();
1024}
1025
1026void NetworkMan::saveProxyConfig()
1027{
1028   QString tmp;
1029
1030   if ( ! groupProxySettings->isChecked() ) {
1031         pcbsd::Utils::setProxyAuth(QString());
1032         pcbsd::Utils::setProxyAddress(QString());
1033   } else {
1034        pcbsd::Utils::setProxyAddress(lineProxyAddress->text() + ":" + tmp.setNum(spinProxyPort->value()));
1035
1036        QString authLine;
1037        if ( ! checkProxyUser->isChecked() || lineProxyUser->text().isEmpty() ) {
1038          pcbsd::Utils::setProxyAuth(QString());
1039        } else {
1040          if ( radioHTTPProxy->isChecked() )
1041                authLine="basic:*:";
1042          else
1043                authLine="digest:*:";
1044          authLine += lineProxyUser->text() + ":";
1045          authLine += lineProxyPass->text();
1046          pcbsd::Utils::setProxyAuth(authLine);
1047        }
1048        QMessageBox::warning( this, tr("Proxy enabled"), tr("You may need to re-login for proxy settings to take effect."));
1049   }
1050
1051}
1052
1053void NetworkMan::slotPublicDNS1Clicked()
1054{
1055    DNSList* dlg=new DNSList (this);
1056    QString ip;
1057    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV4, ip))
1058    {
1059        lineDNS1->setText(ip);
1060        slotCheckGlobalText();
1061    }
1062}
1063
1064void NetworkMan::slotPublicDNS2Clicked()
1065{
1066    DNSList* dlg=new DNSList (this);
1067    QString ip;
1068    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV4, ip))
1069    {
1070        lineDNS2->setText(ip);
1071        slotCheckGlobalText();
1072    }
1073}
1074
1075void NetworkMan::slotIPV6DNS1Clicked()
1076{
1077    DNSList* dlg=new DNSList (this);
1078    QString ip;
1079    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV6, ip))
1080    {
1081        lineIPv6DNS1->setText(ip);
1082        slotCheckGlobalText();
1083    }
1084}
1085
1086void NetworkMan::slotIPV6DNS2Clicked()
1087{
1088    DNSList* dlg=new DNSList (this);
1089    QString ip;
1090    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV6, ip))
1091    {
1092        lineIPv6DNS2->setText(ip);
1093        slotCheckGlobalText();
1094    }
1095}
1096
1097void NetworkMan::slotSingleInstance()
1098{
1099  this->show();
1100  this->raise();
1101}
1102
1103
1104void NetworkMan::setInstallerMode()
1105{
1106  checkSysTray->setHidden(true);
1107  groupBoxMisc->setHidden(true);
1108  InstallerMode = true;
1109}
Note: See TracBrowser for help on using the repository browser.