source: src-qt4/libpcbsd/utils/utils.cpp @ 6019880

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

Fix compilation of libpcbsd on 10.x

  • Property mode set to 100644
File size: 24.4 KB
Line 
1/***************************************************************************
2 *   Copyright (C) 2008 by Tim McCormick                                   *
3 *   tim@pcbsd.org                                                         *
4 *                                                                         *
5 *   Permission is hereby granted, free of charge, to any person obtaining *
6 *   a copy of this software and associated documentation files (the       *
7 *   "Software"), to deal in the Software without restriction, including   *
8 *   without limitation the rights to use, copy, modify, merge, publish,   *
9 *   distribute, sublicense, and/or sell copies of the Software, and to    *
10 *   permit persons to whom the Software is furnished to do so, subject to *
11 *   the following conditions:                                             *
12 *                                                                         *
13 *   The above copyright notice and this permission notice shall be        *
14 *   included in all copies or substantial portions of the Software.       *
15 *                                                                         *
16 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
17 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
18 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
20 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
21 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
22 *   OTHER DEALINGS IN THE SOFTWARE.                                       *
23 ***************************************************************************/
24
25#include <sys/types.h>
26#include <sys/sysctl.h>
27
28#include <QRegExp>
29#include <QString>
30#include <QStringList>
31#include <QFile>
32#include <QTextStream>
33#include <QProcess>
34#include <QApplication>
35#include <QDebug>
36
37#include <QObject>
38
39
40#include "pcbsd-netif.h"
41#include "pcbsd-utils.h"
42
43
44#include "../../config.h"
45
46using namespace pcbsd;
47
48// The default pbi.conf file
49QString PBI_ETCCONF(PREFIX + "/etc/pbi.conf");
50QString PCBSD_ETCCONF(PREFIX + "/etc/pcbsd.conf");
51
52QString Utils::getLineFromCommandOutput( QString cmd )
53{
54        FILE *file = popen(cmd.toLatin1(),"r");
55 
56        char buffer[100];
57 
58        QString line = "";
59        char firstChar;
60   
61        if ((firstChar = fgetc(file)) != -1){
62                line += firstChar;
63                line += fgets(buffer,100,file);
64        }
65        pclose(file);
66        return line.simplified();
67}
68
69QString Utils::sysctl(QString sysctl)
70{
71   char result[1000];
72   size_t len = sizeof(result);
73   sysctlbyname(sysctl.toAscii(), result, &len, NULL, 0);
74   result[len] = '\0';
75   return QString(result);
76}
77
78long long Utils::sysctlAsInt(QString sysctl)
79{
80   long long result = 0;
81   size_t len = sizeof(result);
82   sysctlbyname(sysctl.toAscii(), &result, &len, NULL, 0);
83   return result;
84}
85
86QString Utils::bytesToHumanReadable(long long bytes)
87{
88   float num = bytes;
89   QStringList list;
90   list << "KB" << "MB" << "GB" << "TB";
91
92   QStringListIterator i(list);
93   QString unit("bytes");
94
95   while(num >= 1024.0 && i.hasNext())
96   {
97     unit = i.next();
98     num /= 1024.0;
99   }
100   return QString().setNum(num,'f',2)+" "+unit;
101}
102
103
104// Function to get a value from a specific key in the pbi.conf file
105QString Utils::getValFromPBIConf(QString key) {
106        return getValFromPCConf(PBI_ETCCONF, key);
107}
108
109// Function to get a value from a specific key in the pcbsd.conf file
110QString Utils::getValFromPCBSDConf(QString key) {
111        return getValFromPCConf(PCBSD_ETCCONF, key);
112}
113
114QString Utils::getValFromPCConf(QString conf, QString key) {
115 
116  // Load from conf the requested key
117  QFile confFile(conf);
118  if ( confFile.open( QIODevice::ReadOnly ) ) {
119        QTextStream stream( &confFile );
120        stream.setCodec("UTF-8");
121        QString line;
122        while ( !stream.atEnd() ) {
123            line = stream.readLine().simplified();
124            if ( line.indexOf(key + ": ") == 0 ) {
125                confFile.close();
126                return line.replace(key + ": ", "");
127            }
128
129        }
130   confFile.close();
131  }
132
133  return QString();
134}
135
136QString Utils::getValFromSHFile(QString envFile, QString envVal)
137{
138  QFile confFile(envFile);
139  if ( ! confFile.open( QIODevice::ReadOnly ) )
140        return "";
141
142  QTextStream stream( &confFile );
143  QString line;
144  while ( !stream.atEnd() ) {
145     line = stream.readLine();
146     if ( line.indexOf(envVal + "=") == 0 ) {
147        line.replace(envVal + "=", "");
148
149        // Remove the ' or " from variable
150        if ( line.indexOf("'") == 0 ) {
151           line = line.section("'", 1, 1);
152           line = line.section("'", 0, 0);
153        } 
154        if ( line.indexOf('"') == 0 ) {
155           line = line.section('"', 1, 1);
156           line = line.section('"', 0, 0);
157        }
158
159        confFile.close();
160        return line.simplified();
161     }
162  }
163  confFile.close();
164
165  return QString();
166}
167
168QString Utils::getValFromCSHFile(QString envFile, QString envVal)
169{
170  QFile confFile(envFile);
171  if ( ! confFile.open( QIODevice::ReadOnly ) )
172        return "";
173
174  QTextStream stream( &confFile );
175  QString line;
176  while ( !stream.atEnd() ) {
177     line = stream.readLine();
178     if ( line.indexOf("setenv " + envVal + " ") == 0 ) {
179        line.replace("setenv " + envVal + " ", "");
180        confFile.close();
181        return line;
182     }
183  }
184  confFile.close();
185
186  return QString();
187}
188
189bool Utils::setValSHFile(QString envFile, QString envName, QString envVal)
190{
191        return setValSHFile(envFile, envName, envVal, QString('"'));
192}
193
194bool Utils::setValSHFile(QString envFile, QString envName, QString envVal, QString quote)
195{
196  QFile confFile(envFile);
197  if ( ! confFile.open( QIODevice::ReadOnly ) )
198        return false;
199
200  QStringList shConf;
201  bool added = false;
202
203  QTextStream stream( &confFile );
204  QString line;
205  while ( !stream.atEnd() ) {
206     line = stream.readLine();
207     if ( line.indexOf(envName + "=") == 0 ) {
208        if ( ! envVal.isEmpty() && ! added )
209          shConf << envName + "=" + quote + envVal + quote + " ; export " + envName;
210        added = true;
211     } else {
212        shConf << line;
213     }
214     
215  }
216  confFile.close();
217
218  if (! added && ! envVal.isEmpty() )
219    shConf << envName + "=" + quote + envVal + quote + " ; export " + envName;
220
221  if ( confFile.open( QIODevice::WriteOnly ) ) {
222        QTextStream stream( &confFile );
223        for (int i = 0; i < shConf.count(); ++i)
224                stream << shConf.at(i) << "\n";
225        confFile.close();
226        return true;
227  }
228
229  return false;
230}
231
232bool Utils::setValCSHFile(QString envFile, QString envName, QString envVal)
233{
234  QFile confFile(envFile);
235  if ( ! confFile.open( QIODevice::ReadOnly ) )
236        return false;
237
238  QStringList shConf;
239  bool added = false;
240
241  QTextStream stream( &confFile );
242  QString line;
243  while ( !stream.atEnd() ) {
244     line = stream.readLine();
245     if ( line.indexOf("setenv " + envName + " ") == 0 ) {
246        if ( ! envVal.isEmpty() && ! added )
247          shConf << "setenv " + envName + " " + envVal;
248        added = true;
249     } else {
250        shConf << line;
251     }
252     
253  }
254  confFile.close();
255
256  if (! added && ! envVal.isEmpty() )
257    shConf << "setenv "  + envName + " " + envVal;
258
259  if ( confFile.open( QIODevice::WriteOnly ) ) {
260        QTextStream stream( &confFile );
261        for (int i = 0; i < shConf.count(); ++i)
262                stream << shConf.at(i) << "\n";
263        confFile.close();
264        return true;
265  }
266
267  return false;
268}
269
270QString Utils::getProxyURL() {
271        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY");
272        if ( val.isEmpty() )
273           return QString();
274        return val.section(":", 0, 0);
275}
276
277QString Utils::getProxyUser() {
278        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
279        if ( val.isEmpty() )
280           return QString();
281        return val.section(":", 2, 2);
282}
283
284QString Utils::getProxyPass() {
285        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
286        if ( val.isEmpty() )
287           return QString();
288        return val.section(":", 3, 3);
289}
290
291QString Utils::getProxyType() {
292        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
293        if ( val.isEmpty() )
294           return QString();
295        return val.section(":", 0, 0);
296}
297
298QString Utils::getProxyPort() {
299        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY");
300        if ( val.isEmpty() )
301           return QString();
302        return val.section(":", 1, 1);
303}
304
305QString Utils::getMasterMirror() {
306        return getValFromPCBSDConf("PCBSD_MIRROR");
307}
308
309
310bool Utils::setValPBIConf(QString key, QString val)
311{
312        return setValPCConf(PBI_ETCCONF, key, val);
313}
314
315bool Utils::setValPCBSDConf(QString key, QString val)
316{
317        return setValPCConf(PCBSD_ETCCONF, key, val);
318}
319
320bool Utils::setValPCConf(QString conf, QString key, QString val)
321{
322  bool savedLine, added;
323  QStringList pbiConf;
324
325  // Read PBI_ETCCONF into memory
326  QFile confFile(conf);
327  if ( ! confFile.open( QIODevice::ReadOnly ) )
328        return false;
329
330  QTextStream stream( &confFile );
331  QString line;
332  added = false;
333
334  while ( !stream.atEnd() ) {
335        savedLine = false;
336        line = stream.readLine();
337
338        if ( line.indexOf(key + ": ") == 0 ) {
339          if ( ! val.isEmpty() )
340             pbiConf << key + ": " + val;
341             added = true;
342             savedLine = true;
343          }
344
345          if (!savedLine )
346            pbiConf << line;
347       }
348
349  confFile.close();
350
351  if (! added && ! val.isEmpty() )
352    pbiConf << key + ": " + val;
353
354  if ( confFile.open( QIODevice::WriteOnly ) ) {
355        QTextStream stream( &confFile );
356        for (int i = 0; i < pbiConf.count(); ++i)
357                stream << pbiConf.at(i) << "\n";
358        confFile.close();
359        return true;
360  }
361       
362  return false;
363}
364
365bool Utils::setProxyAddress(QString val) {
366   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTP_PROXY"), val);
367   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTPS_PROXY"), val);
368   setValCSHFile(QString("/etc/csh.cshrc"), QString("NO_PROXY"), "127.0.0.1,localhost");
369   setValCSHFile(QString("/etc/csh.cshrc"), QString("http_proxy"), val);
370   setValCSHFile(QString("/etc/csh.cshrc"), QString("https_proxy"), val);
371   setValCSHFile(QString("/etc/csh.cshrc"), QString("no_proxy"), "127.0.0.1,localhost");
372   setValSHFile(QString("/etc/profile"), QString("HTTP_PROXY"), val, "'");
373   setValSHFile(QString("/etc/profile"), QString("HTTPS_PROXY"), val, "'");
374   setValSHFile(QString("/etc/profile"), QString("NO_PROXY"), "127.0.0.1,localhost");
375   setValSHFile(QString("/etc/profile"), QString("http_proxy"), val, "'");
376   setValSHFile(QString("/etc/profile"), QString("https_proxy"), val, "'");
377   setValSHFile(QString("/etc/profile"), QString("no_proxy"), "127.0.0.1,localhost");
378   return true;
379}
380
381bool Utils::setProxyAuth(QString val) {
382   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTP_PROXY_AUTH"), val);
383   return setValSHFile(QString("/etc/profile"), QString("HTTP_PROXY_AUTH"), val, "'");
384}
385
386bool Utils::setMasterMirror(QString val) {
387   return setValPCBSDConf("PCBSD_MIRROR", val);
388}
389
390QString Utils::getConfFileValue( QString oFile, QString Key )
391{
392   return getConfFileValue(oFile, Key, 1);
393}
394
395QString Utils::getConfFileValue( QString oFile, QString Key, int occur )
396{
397        int found = 1;
398   
399        QFile file( oFile );
400        if ( ! file.open( QIODevice::ReadOnly ) ) {
401                return QString();
402        }
403
404        QTextStream stream( &file );
405        QString line;
406        while ( !stream.atEnd() ) {
407                line = stream.readLine(); // line of text excluding '\n'
408           
409                // If the KEY is found in the line, continue processing
410                if ( line.trimmed().indexOf("#", 0) == 0 || line.indexOf(Key, 0) == -1 || line.indexOf(Key, 0) > 0)
411                        continue;
412               
413                if ( found == occur) {
414                        line.remove(line.indexOf(Key, 0), Key.length());
415   
416                        // Remove any quotes
417                        if ( line.indexOf('"') == 0 )
418                                line = line.remove(0, 1);
419   
420                        if ( line.indexOf('"') != -1  )
421                                line.truncate(line.indexOf('"'));
422
423                        file.close();
424                        return line;
425                } else {
426                        found++; 
427                }
428        }
429
430        file.close();
431        return QString();
432}
433
434QString Utils::getConfFileValue( QString oFile, QString Key, QString ValRx, int occur )
435{
436        int found = 1;
437   
438        QFile file( oFile );
439        if ( ! file.open( QIODevice::ReadOnly ) ) {
440                return QString();
441        }
442
443        QString rxStr ( Key );
444        rxStr.append( ValRx );
445        QRegExp rx(rxStr);
446        QTextStream stream( &file );
447        QString line;
448        while ( !stream.atEnd() ) {
449                line = stream.readLine(); // line of text excluding '\n'
450           
451                // If the KEY is not found in the line, continue processing
452                if ( line.trimmed().indexOf("#", 0) == 0 || line.indexOf(rx, 0) == -1 || line.indexOf(rx, 0) > 0)
453                        continue;
454
455                if ( found == occur ) {
456                        line.remove(line.indexOf(Key, 0), Key.length());
457   
458                        // Remove any quotes
459                        if ( line.indexOf('"') == 0 )
460                                line = line.remove(0, 1);
461   
462                        if ( line.indexOf('"') != -1  )
463                                line.truncate(line.indexOf('"'));
464
465                        file.close();
466                        return line;
467                } else {
468                        found++; 
469                }
470        }
471
472        file.close();
473        return QString();
474}
475
476bool Utils::setConfFileValue( QString oFile, QString oldKey, QString newKey )
477{
478        return setConfFileValue(oFile, oldKey, newKey, -1);
479}
480
481bool Utils::setConfFileValue( QString oFile, QString oldKey, QString newKey, int occur )
482{
483        // Lets the dev save a value into a specified config file.
484        // The occur value tells which occurance of "oldKey" to replace
485        // If occur is set to -1, it will remove any duplicates of "oldKey"
486   
487        //copy the original file to create a temporary file for editing
488        QString oFileTmp = oFile + ".tmp";
489        QString cmd = "cp "+oFile+" "+oFileTmp;
490        runShellCommand(cmd);
491       
492        //Continue evaluating the temporary file
493        QStringList SavedFile;
494        int found = 1;
495
496        // Load the old file, find the oldKey, remove it and replace with newKey
497        QFile file( oFileTmp );
498        if ( ! file.open( QIODevice::ReadOnly ) )
499                return false;
500
501        QTextStream stream( &file );
502        QString line;
503        while ( !stream.atEnd() ) {
504                line = stream.readLine(); // line of text excluding '\n'
505           
506                // Key is not found at all
507                if ( line.indexOf(oldKey, 0) == -1 ) {
508                        SavedFile << line ;
509                        continue;
510                }
511
512                // Found the key, but it is commented out, so don't worry about this line
513                if ( line.trimmed().indexOf("#", 0) == 0 ) {
514                        SavedFile << line ;
515                        continue;
516                }
517
518                // If the KEY is found, and we are just on wrong occurance, save it and continue to search 
519                if ( occur != -1 && found != occur ) {
520                        SavedFile << line ;
521                        found++;
522                        continue;
523                }
524
525                // If the KEY is found in the line and this matches the occurance that must be processed
526                if ( ! newKey.isEmpty() && found == occur )
527                {
528                        SavedFile << newKey ;
529                        newKey.clear();
530                        found++;
531                        continue;
532                } 
533
534                // If the KEY is found and we just want one occurance of the key
535                if ( occur == -1 && ! newKey.isEmpty() ) {
536                        SavedFile << newKey ;
537                        newKey.clear();
538                        found++;       
539                        continue;
540                }
541
542        }
543
544        file.close();
545
546        // Didn't find the key? Write it!
547        if ( ! newKey.isEmpty() )
548            SavedFile << newKey;
549       
550   
551        // Save the new file
552        QFile fileout( oFileTmp );
553        if ( ! fileout.open( QIODevice::WriteOnly ) )
554                return false;
555
556        QTextStream streamout( &fileout );
557        for (int i = 0; i < SavedFile.size(); ++i)
558                streamout << SavedFile.at(i) << "\n";
559
560        fileout.close();
561
562        //Have the temporary file with new changes overwrite the original file
563        cmd = "mv "+oFileTmp+" "+oFile;
564        runShellCommand(cmd);   
565       
566        return true;
567   
568}
569
570//Run a shell command (return a list of lines)
571QStringList Utils::runShellCommand( QString command )
572{
573 //split the command string with individual commands seperated by a ";" (if any)
574 QStringList cmdl = command.split(";");
575 QString outstr;
576 //run each individual command
577 for(int i=0;i<cmdl.length();i++){ 
578   QProcess p; 
579   //Make sure we use the system environment to properly read system variables, etc.
580   p.setProcessEnvironment(QProcessEnvironment::systemEnvironment());
581   //Merge the output channels to retrieve all output possible
582   p.setProcessChannelMode(QProcess::MergedChannels);   
583   p.start(cmdl[i]);
584   while(p.state()==QProcess::Starting || p.state() == QProcess::Running){
585     p.waitForFinished(200);
586     QCoreApplication::processEvents();
587   }
588   QString tmp = p.readAllStandardOutput();
589   outstr.append(tmp);
590 }
591 if(outstr.endsWith("\n")){outstr.chop(1);} //remove the newline at the end
592 QStringList out = outstr.split("\n");
593 //qDebug() << command;
594 //for(int j=0; j<out.length();j++){ qDebug() << out[j];}
595 return out;
596}
597
598//Run a shell command and return only lines with a specific search term
599//Example command: ls | grep X -> runShellCommandSearch("ls","X")
600QString Utils::runShellCommandSearch( QString command, QString sch)
601{
602 QStringList L = listShellCommandSearch(command,sch);
603 QString outstr = L.join("\n"); //combine the remaining lines into a single string
604 return outstr;
605}
606
607// Function which displays a info box and restarts networking
608void Utils::restartNetworking()
609{
610   
611   QMessageBox infoBox;
612   infoBox.setWindowModality(Qt::ApplicationModal);
613   infoBox.setWindowTitle(QObject::tr("Restarting network..."));
614   infoBox.setInformativeText(QObject::tr("Network is restarting, please wait..."));
615   infoBox.setStandardButtons(QMessageBox::NoButton);
616   infoBox.show();
617
618   QProcess cmd;
619   cmd.start(QString("/etc/rc.d/netif"), QStringList() << "restart" );
620   while ( cmd.state() != QProcess::NotRunning ) {
621       cmd.waitForFinished(100);
622       QCoreApplication::processEvents();
623   }
624
625   // Set the gateway device name
626   QString route = getConfFileValue("/etc/rc.conf", "defaultrouter=", 1);
627   if ( ! route.isEmpty() ) {
628     infoBox.setInformativeText(QObject::tr("Setting default route..."));
629     cmd.start(QString("route"), QStringList() << "delete" << "default" );
630     while ( cmd.state() != QProcess::NotRunning ) {
631         cmd.waitForFinished(100);
632         QCoreApplication::processEvents();
633     }
634
635     cmd.start(QString("route"), QStringList() << "add" << "default" << route );
636     while ( cmd.state() != QProcess::NotRunning ) {
637         cmd.waitForFinished(100);
638         QCoreApplication::processEvents();
639     }
640   }
641
642   // Check for any devices to run DHCP on
643   QStringList ifs = NetworkInterface::getInterfaces();
644   for ( QStringList::Iterator it = ifs.begin(); it != ifs.end(); ++it )
645   {
646       QString dev = *it;
647
648       // Devices we can safely skip
649       if (dev.indexOf("lo") == 0 
650           || dev.indexOf("fwe") == 0 
651           || dev.indexOf("ipfw") == 0
652           || dev.indexOf("plip") == 0
653           || dev.indexOf("pfsync") == 0
654           || dev.indexOf("pflog") == 0
655           || dev.indexOf("usbus") == 0
656           || dev.indexOf("vboxnet") == 0
657           || dev.indexOf("tun") == 0)
658          continue;
659
660        // Check if this device has DHCP enabled
661        if ( Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_" + dev + "=", 1 ).indexOf("DHCP") != -1 )
662        {
663           qDebug() << "Running DHCP on " << dev;
664           infoBox.setInformativeText(QObject::tr("Running DHCP..."));
665           cmd.start(QString("/etc/rc.d/dhclient"), QStringList() << "start" << dev );
666           while ( cmd.state() != QProcess::NotRunning ) {
667             cmd.waitForFinished(100);
668             QCoreApplication::processEvents();
669           }
670        }
671   }
672
673   infoBox.close();
674}
675
676void Utils::runInTerminal(QString command, QString windowTitle)
677{
678    QStringList out = Utils::runShellCommand("de-info");
679    QString terminal_app="xterm";
680    QString terminal_title="-T";
681    QString terminal_comm="-e";
682    bool separateArgs=false;
683
684    for(int i=0; i<out.size(); i++)
685    {
686        QString str = out.at(i).trimmed();       
687        if (str.indexOf("Terminal:")>=0)
688        {
689            terminal_app = str.replace("Terminal:","");
690            continue;
691        }
692        if(str.indexOf("Terminal title switch:")>=0)
693        {
694            terminal_title = str.replace("Terminal title switch:","");
695            continue;
696        }
697        if (str.indexOf("Terminal command switch:")>=0)
698        {
699            terminal_comm = str.replace("Terminal command switch:","");
700            continue;
701        }
702        if (str.indexOf("Terminal command separate args:")>=0)
703        {
704            separateArgs = (str.replace("Terminal command separate args:","").trimmed() == QString("YES"));
705        }
706    }//for all strings
707    if (!terminal_app.length())
708        return;   
709
710    QStringList args;
711    QStringList comm;
712    if (separateArgs)
713        comm=command.split(" ");
714    else
715        comm<<command.trimmed();
716
717    if (windowTitle.length())
718    {
719        args<<terminal_title.trimmed();
720        args<<windowTitle.trimmed();
721    }
722    args<<terminal_comm.trimmed()<<comm;
723
724    qDebug() << terminal_app.trimmed() << args;
725
726    QProcess::startDetached(terminal_app.trimmed(), args);
727}
728
729void Utils::openInFileManager(QString location)
730{
731    //TODO: Process quotes for location
732    QString exec = Utils::runShellCommand("de-info -fileman").at(0);
733    exec = exec.replace("%s", location);
734    QProcess::startDetached(exec);
735}
736
737QStringList Utils::listShellCommandSearch( QString command, QString sch)
738{
739  QStringList L = Utils::runShellCommand(command);
740  QStringList schList = sch.split(" "); //make a list of the words to search for in a single line
741  for(int i=0; i<schList.size(); i++){
742    L = L.filter(schList[i]);
743  }
744  return L;
745}
746
747bool Utils::validateIPV6( QString IP )
748{
749  bool ok;
750
751  if ( IP.count(":") < 2)
752     return false;
753
754  // Validate the V6 blocks
755  for ( int i = 0; i <= 7; ++i )
756  {
757     if ( IP.section(":", i, i).isEmpty() )
758       continue;
759
760     // Check if valid hex
761     IP.section(":", i,i).toInt(&ok, 16);
762     if (!ok)
763        return false;
764  }
765
766  return true;
767}
768
769bool Utils::validateIPV4( QString IP )
770{
771  int num;
772  bool ok;
773
774  if ( IP.indexOf(".") == -1 )
775     return false;
776
777  // Make sure this is a number after the . is taken out
778  QString tmp;
779  tmp = IP;
780  tmp.replace(".", "");
781  tmp.toLong(&ok);
782  if (!ok)
783     return false;
784   
785  if ( IP.count(".") != 3)
786     return false;
787
788  // Validate the V4 blocks
789  for ( int i = 0; i <= 3; ++i )
790  {
791     if ( IP.section(".", i, i).isEmpty() )
792        return false;
793
794     if ( IP.section(".", i, i).size() > 3 )
795        return false;
796
797     num = IP.section(".", i,i).toInt(&ok);
798     if (!ok)
799        return false;
800
801     if ( num > 255 || num < 0)
802        return false;
803  }
804   
805  return TRUE;
806}
807
808#define TRY_GET_VALUE_STR(val_name, field)\
809if (Str.contains(val_name)){\
810                            Entry.field = Str.replace(val_name,"").trimmed();\
811                                          continue;}\
812
813#define TRY_GET_VALUE_BOOL(val_name, field, true_val)\
814if (Str.contains(val_name)){\
815                            Entry.field = Str.replace(val_name,"").trimmed().toLower() == QString(true_val).toLower();\
816                                          continue;}\
817
818
819static int de_info(bool isCurrent, QVector<DesktopEnvironmentInfo>& retVal)
820{
821    static const char* const DE_NAME = "DE name:";
822    static const char* const DE_ACTIVE = "Current DE:";
823    static const char* const DE_XDG = "XDG compatible:";
824    static const char* const DE_INSTALLED = "Installed:";
825    static const char* const DE_SUDO = "Sudo command:";
826    static const char* const DE_FILE_MANAGER = "File manager:";
827    static const char* const DE_TERMINAL = "Terminal:";
828
829    retVal.clear();
830
831    QStringList flags;
832    if (!isCurrent)
833        flags<<"-i";
834
835    QProcess* deinfo = new QProcess();
836    deinfo->setProcessChannelMode(QProcess::MergedChannels);
837    deinfo->start(QString("/usr/local/bin/de-info"), flags);
838    deinfo->waitForFinished(-1);
839    DesktopEnvironmentInfo Entry;
840    QString Str;
841
842    while ( deinfo->canReadLine() )
843    {
844        Str = deinfo->readLine().simplified();
845        if (Str.contains(DE_NAME))
846        {
847            if (Entry.Name.length())
848            {
849                retVal.push_back(Entry);
850                Entry = DesktopEnvironmentInfo();
851            }
852            Entry.Name = Str.replace(DE_NAME,"").trimmed();
853            continue;
854        }//if found 'DE name'
855
856        TRY_GET_VALUE_BOOL(DE_ACTIVE, isActive, "yes");
857        TRY_GET_VALUE_BOOL(DE_INSTALLED, isInstalled, "yes");
858        TRY_GET_VALUE_BOOL(DE_XDG, isXDG, "yes");
859        TRY_GET_VALUE_STR(DE_SUDO, SudoCommand);
860        TRY_GET_VALUE_STR(DE_FILE_MANAGER, FileManager);
861        TRY_GET_VALUE_STR(DE_TERMINAL, TerminalCommand);
862        //TODO: another fields
863    }//while process output reading
864
865    if (Entry.Name.length())
866        retVal.push_back(Entry);
867
868    return retVal.size();
869}
870
871
872#undef TRY_GET_VALUE_STR
873#undef TRY_GET_VALUE_BOOL
874
875QVector<DesktopEnvironmentInfo> Utils::installedDesktops()
876{
877    QVector<DesktopEnvironmentInfo> retVal;
878    de_info(false, retVal);
879    return retVal;
880}
881
882DesktopEnvironmentInfo Utils::currentDesktop()
883{
884    QVector<DesktopEnvironmentInfo> script_result;
885    if (de_info(true, script_result) != 0)
886    {
887        return script_result[0];
888    }
889    return DesktopEnvironmentInfo();
890}
891
892
Note: See TracBrowser for help on using the repository browser.