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

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since e4632f9 was e4632f9, checked in by Kris Moore <kris@…>, 16 months ago

Be sure to raise() the window when another instance is started

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