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

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