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

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

Fix up the HostName? regex to accept "."

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