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

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

Fix up all the last bits of clang / HEAD fussiness

  • 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#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 ( lineDNS1->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineDNS1->text() ) && groupDNS->isChecked()) {
848         textGlobalError->setText(tr("Invalid DNS specified"));
849         return;
850     }
851   
852    if ( lineDNS2->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineDNS2->text() ) && groupDNS->isChecked()) {
853         textGlobalError->setText(tr("Invalid DNS specified"));
854         return;
855     }
856   
857   
858     if ( lineGateway->text() != "..."  && ! pcbsd::Utils::validateIPV4(lineGateway->text())  && groupGateway->isChecked() ) {
859         textGlobalError->setText(tr("Invalid Gateway specified"));
860         return;
861     }
862     
863     /**
864     Hostnames must:
865     - Contain only a-z, 0-9, and hyphens (-)
866     - Not have a hyphen as the first or last character
867     **/
868     lineHostname->setText(lineHostname->text().toLower());
869     if (lineHostname->text().isEmpty())
870     {
871       textGlobalError->setText(tr("Please enter a hostname"));
872       return;
873     }
874     else if (hostnameRegExp.indexIn(lineHostname->text()) == -1)
875     {
876        textGlobalError->setText(tr("Hostname may only contain letters and numbers"));
877        return;
878     }
879
880     pushSave->setEnabled(true);
881
882}
883
884void NetworkMan::slotClose()
885{
886   close();
887}
888
889void NetworkMan::slotSave()
890{
891   
892   if ( !lineHostname->text().isEmpty() && (lineHostname->text().toLower() != pcbsd::Utils::getConfFileValue("/etc/rc.conf", "hostname=", 1).toLower() ) ) {
893      pcbsd::Utils::setConfFileValue("/etc/rc.conf", "hostname=", "hostname=\"" + lineHostname->text() + "\"", -1);
894      pcbsd::Utils::setConfFileValue("/etc/hosts", "::1", "::1\t\t\tlocalhost localhost.localdomain " + lineHostname->text() + ".localhost " + lineHostname->text(), -1);
895      pcbsd::Utils::setConfFileValue("/etc/hosts", "127.0.0.1", "127.0.0.1\t\tlocalhost localhost.localdomain " + lineHostname->text() + ".localhost " + lineHostname->text(), -1);
896      QMessageBox::information(this,tr("Computer Restart Required"), tr("You must restart your computer to finish changing your hostname") );
897   }
898   
899   
900   if ( lineGateway->text() == "..." || ! groupGateway->isChecked() ) {
901     pcbsd::Utils::setConfFileValue("/etc/rc.conf", "defaultrouter=", "", -1);
902   } else {
903     pcbsd::Utils::setConfFileValue("/etc/rc.conf", "defaultrouter=", "defaultrouter=\"" + lineGateway->text() + "\"", -1); 
904   }
905   
906   int DNSline = 1;
907   
908   /* Prefer IPv6 nameservers if IPv6 is enabled. */
909    if ( groupIPv6->isChecked() ) {
910        if ( ! lineIPv6DNS1->text().isEmpty() ) {
911            pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineIPv6DNS1->text(), DNSline); 
912            DNSline++;
913        }
914        if ( ! lineIPv6DNS2->text().isEmpty() ) {
915            pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineIPv6DNS2->text(), DNSline); 
916            DNSline++;
917        }
918    }
919   
920   if ( lineDNS1->text() == "..."  || ! groupDNS->isChecked() ) {
921     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "", DNSline);
922   } else {
923     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineDNS1->text(), DNSline); 
924     DNSline++;
925   }   
926   if ( lineDNS2->text() == "..." || ! groupDNS->isChecked() ) {
927     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "", DNSline);
928   } else {
929     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "nameserver", "nameserver " + lineDNS2->text(), DNSline); 
930   }   
931   
932   // If we have custom DNS, make sure it survives a dhclient run
933   if ( lineDNS1->text() != "..." && lineDNS2->text() != "..." && groupDNS->isChecked() )
934     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS1->text() + ", " + lineDNS2->text() +";"); 
935   else if ( lineDNS1->text() != "..." )
936     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS1->text() +";"); 
937   else if ( lineDNS2->text() != "..." )
938     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", "supersede domain-name-servers " + lineDNS2->text() +";"); 
939   else
940     pcbsd::Utils::setConfFileValue("/etc/dhclient.conf", "supersede domain-name-servers", ""); 
941   
942
943   if ( lineSearchDomain->text().isEmpty() || ! groupDNS->isChecked() ) {
944     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "search", "", 1);
945   } else {
946     pcbsd::Utils::setConfFileValue("/etc/resolv.conf", "search", "search " + lineSearchDomain->text(), 1);
947   }
948
949   // Save the IPv6 stuff
950    if ( groupIPv6->isChecked() ) {
951        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_activate_all_interfaces=", "ipv6_activate_all_interfaces=\"YES\"", -1);
952        if ( ! lineIPv6Gateway->text().isEmpty() ) {
953            pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "ipv6_defaultrouter=\"" + lineIPv6Gateway->text() + "\"", -1);
954        } else {
955            pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "", -1);
956        }
957    } else {
958        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_activate_all_interfaces=", "", -1);
959        pcbsd::Utils::setConfFileValue("/etc/rc.conf", "ipv6_defaultrouter=", "", -1);
960    }
961
962    // Save the lagg preference
963    QSettings settings("PCBSD");
964    settings.setValue("/pc-netmanager/useLagg", checkLagg->isChecked());
965
966    // Make sure we enable lagg for this system
967    if ( checkLagg->isChecked() )
968       NetworkInterface::enableLagg(QString("wlan0"));
969
970    // Save the proxy config
971    saveProxyConfig();
972   
973    restartNetwork();
974
975}
976
977void NetworkMan::slotProxyUserChecked() {
978  if ( checkProxyUser->isChecked() ) {
979    lineProxyUser->setEnabled(true);
980    lineProxyPass->setEnabled(true);
981  } else {
982    lineProxyUser->setEnabled(false);
983    lineProxyPass->setEnabled(false);
984  }
985}
986
987void NetworkMan::loadProxyConfig()
988{
989   QString tmp;
990   bool ok;
991
992   tmp = pcbsd::Utils::getProxyURL();
993   if ( tmp.isEmpty() )
994      groupProxySettings->setChecked(false);
995   else
996      groupProxySettings->setChecked(true); 
997
998   lineProxyAddress->setText(tmp);
999
1000   tmp = pcbsd::Utils::getProxyUser();
1001   lineProxyUser->setText(tmp);
1002   if ( tmp.isEmpty() )
1003      checkProxyUser->setChecked(false);
1004   else
1005      checkProxyUser->setChecked(true);
1006
1007   lineProxyPass->setText(pcbsd::Utils::getProxyPass());
1008
1009   tmp = pcbsd::Utils::getProxyPort();
1010   tmp.toInt(&ok);
1011   if ( ok )
1012      spinProxyPort->setValue(tmp.toInt(&ok));
1013   
1014
1015   tmp = pcbsd::Utils::getProxyType();
1016   if ( tmp == "digest" )
1017      radioSOCKSProxy->setChecked(true);
1018   else
1019      radioHTTPProxy->setChecked(true);
1020
1021   slotProxyUserChecked();
1022}
1023
1024void NetworkMan::saveProxyConfig()
1025{
1026   QString tmp;
1027
1028   if ( ! groupProxySettings->isChecked() ) {
1029         pcbsd::Utils::setProxyAuth(QString());
1030         pcbsd::Utils::setProxyAddress(QString());
1031   } else {
1032        pcbsd::Utils::setProxyAddress(lineProxyAddress->text() + ":" + tmp.setNum(spinProxyPort->value()));
1033
1034        QString authLine;
1035        if ( ! checkProxyUser->isChecked() || lineProxyUser->text().isEmpty() ) {
1036          pcbsd::Utils::setProxyAuth(QString());
1037        } else {
1038          if ( radioHTTPProxy->isChecked() )
1039                authLine="basic:*:";
1040          else
1041                authLine="digest:*:";
1042          authLine += lineProxyUser->text() + ":";
1043          authLine += lineProxyPass->text();
1044          pcbsd::Utils::setProxyAuth(authLine);
1045        }
1046        QMessageBox::warning( this, tr("Proxy enabled"), tr("You may need to re-login for proxy settings to take effect."));
1047   }
1048
1049}
1050
1051void NetworkMan::slotPublicDNS1Clicked()
1052{
1053    DNSList* dlg=new DNSList (this);
1054    QString ip;
1055    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV4, ip))
1056    {
1057        lineDNS1->setText(ip);
1058        slotCheckGlobalText();
1059    }
1060}
1061
1062void NetworkMan::slotPublicDNS2Clicked()
1063{
1064    DNSList* dlg=new DNSList (this);
1065    QString ip;
1066    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV4, ip))
1067    {
1068        lineDNS2->setText(ip);
1069        slotCheckGlobalText();
1070    }
1071}
1072
1073void NetworkMan::slotIPV6DNS1Clicked()
1074{
1075    DNSList* dlg=new DNSList (this);
1076    QString ip;
1077    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV6, ip))
1078    {
1079        lineIPv6DNS1->setText(ip);
1080        slotCheckGlobalText();
1081    }
1082}
1083
1084void NetworkMan::slotIPV6DNS2Clicked()
1085{
1086    DNSList* dlg=new DNSList (this);
1087    QString ip;
1088    if ( QDialog::Accepted == dlg->getIP(DNSList::eIPV6, ip))
1089    {
1090        lineIPv6DNS2->setText(ip);
1091        slotCheckGlobalText();
1092    }
1093}
1094
1095void NetworkMan::slotSingleInstance()
1096{
1097  this->show();
1098  this->raise();
1099}
1100
1101
1102void NetworkMan::setInstallerMode()
1103{
1104  checkSysTray->setHidden(true);
1105  groupBoxMisc->setHidden(true);
1106  InstallerMode = true;
1107}
Note: See TracBrowser for help on using the repository browser.