source: src-qt4/libpcbsd/utils/utils.cpp @ 1c4b1ae

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

Fix a bug getting <key>=<value> from SH files without quotes around

  • Property mode set to 100644
File size: 24.1 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 false;
141
142  QTextStream stream( &confFile );
143  QString line;
144  while ( !stream.atEnd() ) {
145     line = stream.readLine();
146     if ( line.indexOf(envVal + "=") == 0 ) {
147        // Strip any ""
148        line.replace(envVal + "=", "");
149
150        if ( line.indexOf('"') == 0 ) {
151           line = line.section('"', 1, 1);
152           line = line.section('"', 0, 0);
153        }
154
155        confFile.close();
156        return line.simplified();
157     }
158  }
159  confFile.close();
160
161  return QString();
162}
163
164QString Utils::getValFromCSHFile(QString envFile, QString envVal)
165{
166  QFile confFile(envFile);
167  if ( ! confFile.open( QIODevice::ReadOnly ) )
168        return false;
169
170  QTextStream stream( &confFile );
171  QString line;
172  while ( !stream.atEnd() ) {
173     line = stream.readLine();
174     if ( line.indexOf("setenv " + envVal + " ") == 0 ) {
175        line.replace("setenv " + envVal + " ", "");
176        confFile.close();
177        return line;
178     }
179  }
180  confFile.close();
181
182  return QString();
183}
184
185
186bool Utils::setValSHFile(QString envFile, QString envName, QString envVal)
187{
188  QFile confFile(envFile);
189  if ( ! confFile.open( QIODevice::ReadOnly ) )
190        return false;
191
192  QStringList shConf;
193  bool added = false;
194
195  QTextStream stream( &confFile );
196  QString line;
197  while ( !stream.atEnd() ) {
198     line = stream.readLine();
199     if ( line.indexOf(envName + "=") == 0 ) {
200        if ( ! envVal.isEmpty() && ! added )
201          shConf << envName + "=\"" + envVal + "\" ; export " + envName;
202        added = true;
203     } else {
204        shConf << line;
205     }
206     
207  }
208  confFile.close();
209
210  if (! added && ! envVal.isEmpty() )
211    shConf << envName + "=\"" + envVal + "\" ; export " + envName;
212
213  if ( confFile.open( QIODevice::WriteOnly ) ) {
214        QTextStream stream( &confFile );
215        for (int i = 0; i < shConf.count(); ++i)
216                stream << shConf.at(i) << "\n";
217        confFile.close();
218        return true;
219  }
220
221  return false;
222}
223
224bool Utils::setValCSHFile(QString envFile, QString envName, QString envVal)
225{
226  QFile confFile(envFile);
227  if ( ! confFile.open( QIODevice::ReadOnly ) )
228        return false;
229
230  QStringList shConf;
231  bool added = false;
232
233  QTextStream stream( &confFile );
234  QString line;
235  while ( !stream.atEnd() ) {
236     line = stream.readLine();
237     if ( line.indexOf("setenv " + envName + " ") == 0 ) {
238        if ( ! envVal.isEmpty() && ! added )
239          shConf << "setenv " + envName + " " + envVal;
240        added = true;
241     } else {
242        shConf << line;
243     }
244     
245  }
246  confFile.close();
247
248  if (! added && ! envVal.isEmpty() )
249    shConf << "setenv "  + envName + " " + envVal;
250
251  if ( confFile.open( QIODevice::WriteOnly ) ) {
252        QTextStream stream( &confFile );
253        for (int i = 0; i < shConf.count(); ++i)
254                stream << shConf.at(i) << "\n";
255        confFile.close();
256        return true;
257  }
258
259  return false;
260}
261
262QString Utils::getProxyURL() {
263        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY");
264        if ( val.isEmpty() )
265           return QString();
266        return val.section(":", 0, 0);
267}
268
269QString Utils::getProxyUser() {
270        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
271        if ( val.isEmpty() )
272           return QString();
273        return val.section(":", 2, 2);
274}
275
276QString Utils::getProxyPass() {
277        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
278        if ( val.isEmpty() )
279           return QString();
280        return val.section(":", 3, 3);
281}
282
283QString Utils::getProxyType() {
284        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY_AUTH");
285        if ( val.isEmpty() )
286           return QString();
287        return val.section(":", 0, 0);
288}
289
290QString Utils::getProxyPort() {
291        QString val = getValFromSHFile("/etc/profile", "HTTP_PROXY");
292        if ( val.isEmpty() )
293           return QString();
294        return val.section(":", 1, 1);
295}
296
297QString Utils::getMasterMirror() {
298        return getValFromPCBSDConf("PCBSD_MIRROR");
299}
300
301
302bool Utils::setValPBIConf(QString key, QString val)
303{
304        return setValPCConf(PBI_ETCCONF, key, val);
305}
306
307bool Utils::setValPCBSDConf(QString key, QString val)
308{
309        return setValPCConf(PCBSD_ETCCONF, key, val);
310}
311
312bool Utils::setValPCConf(QString conf, QString key, QString val)
313{
314  bool savedLine, added;
315  QStringList pbiConf;
316
317  // Read PBI_ETCCONF into memory
318  QFile confFile(conf);
319  if ( ! confFile.open( QIODevice::ReadOnly ) )
320        return false;
321
322  QTextStream stream( &confFile );
323  QString line;
324  added = false;
325
326  while ( !stream.atEnd() ) {
327        savedLine = false;
328        line = stream.readLine();
329
330        if ( line.indexOf(key + ": ") == 0 ) {
331          if ( ! val.isEmpty() )
332             pbiConf << key + ": " + val;
333             added = true;
334             savedLine = true;
335          }
336
337          if (!savedLine )
338            pbiConf << line;
339       }
340
341  confFile.close();
342
343  if (! added && ! val.isEmpty() )
344    pbiConf << key + ": " + val;
345
346  if ( confFile.open( QIODevice::WriteOnly ) ) {
347        QTextStream stream( &confFile );
348        for (int i = 0; i < pbiConf.count(); ++i)
349                stream << pbiConf.at(i) << "\n";
350        confFile.close();
351        return true;
352  }
353       
354  return false;
355}
356
357bool Utils::setProxyAddress(QString val) {
358   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTP_PROXY"), val);
359   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTPS_PROXY"), val);
360   setValCSHFile(QString("/etc/csh.cshrc"), QString("NO_PROXY"), "127.0.0.1,localhost");
361   setValCSHFile(QString("/etc/csh.cshrc"), QString("http_proxy"), val);
362   setValCSHFile(QString("/etc/csh.cshrc"), QString("https_proxy"), val);
363   setValCSHFile(QString("/etc/csh.cshrc"), QString("no_proxy"), "127.0.0.1,localhost");
364   setValSHFile(QString("/etc/profile"), QString("HTTP_PROXY"), val);
365   setValSHFile(QString("/etc/profile"), QString("HTTPS_PROXY"), val);
366   setValSHFile(QString("/etc/profile"), QString("NO_PROXY"), "127.0.0.1,localhost");
367   setValSHFile(QString("/etc/profile"), QString("http_proxy"), val);
368   setValSHFile(QString("/etc/profile"), QString("https_proxy"), val);
369   setValSHFile(QString("/etc/profile"), QString("no_proxy"), "127.0.0.1,localhost");
370   return true;
371}
372
373bool Utils::setProxyAuth(QString val) {
374   setValCSHFile(QString("/etc/csh.cshrc"), QString("HTTP_PROXY_AUTH"), val);
375   return setValSHFile(QString("/etc/profile"), QString("HTTP_PROXY_AUTH"), val);
376}
377
378bool Utils::setMasterMirror(QString val) {
379   return setValPCBSDConf("PCBSD_MIRROR", val);
380}
381
382QString Utils::getConfFileValue( QString oFile, QString Key )
383{
384   return getConfFileValue(oFile, Key, 1);
385}
386
387QString Utils::getConfFileValue( QString oFile, QString Key, int occur )
388{
389        int found = 1;
390   
391        QFile file( oFile );
392        if ( ! file.open( QIODevice::ReadOnly ) ) {
393                return QString();
394        }
395
396        QTextStream stream( &file );
397        QString line;
398        while ( !stream.atEnd() ) {
399                line = stream.readLine(); // line of text excluding '\n'
400           
401                // If the KEY is found in the line, continue processing
402                if ( line.trimmed().indexOf("#", 0) == 0 || line.indexOf(Key, 0) == -1 || line.indexOf(Key, 0) > 0)
403                        continue;
404               
405                if ( found == occur) {
406                        line.remove(line.indexOf(Key, 0), Key.length());
407   
408                        // Remove any quotes
409                        if ( line.indexOf('"') == 0 )
410                                line = line.remove(0, 1);
411   
412                        if ( line.indexOf('"') != -1  )
413                                line.truncate(line.indexOf('"'));
414
415                        file.close();
416                        return line;
417                } else {
418                        found++; 
419                }
420        }
421
422        file.close();
423        return QString();
424}
425
426QString Utils::getConfFileValue( QString oFile, QString Key, QString ValRx, int occur )
427{
428        int found = 1;
429   
430        QFile file( oFile );
431        if ( ! file.open( QIODevice::ReadOnly ) ) {
432                return QString();
433        }
434
435        QString rxStr ( Key );
436        rxStr.append( ValRx );
437        QRegExp rx(rxStr);
438        QTextStream stream( &file );
439        QString line;
440        while ( !stream.atEnd() ) {
441                line = stream.readLine(); // line of text excluding '\n'
442           
443                // If the KEY is not found in the line, continue processing
444                if ( line.trimmed().indexOf("#", 0) == 0 || line.indexOf(rx, 0) == -1 || line.indexOf(rx, 0) > 0)
445                        continue;
446
447                if ( found == occur ) {
448                        line.remove(line.indexOf(Key, 0), Key.length());
449   
450                        // Remove any quotes
451                        if ( line.indexOf('"') == 0 )
452                                line = line.remove(0, 1);
453   
454                        if ( line.indexOf('"') != -1  )
455                                line.truncate(line.indexOf('"'));
456
457                        file.close();
458                        return line;
459                } else {
460                        found++; 
461                }
462        }
463
464        file.close();
465        return QString();
466}
467
468bool Utils::setConfFileValue( QString oFile, QString oldKey, QString newKey )
469{
470        return setConfFileValue(oFile, oldKey, newKey, -1);
471}
472
473bool Utils::setConfFileValue( QString oFile, QString oldKey, QString newKey, int occur )
474{
475        // Lets the dev save a value into a specified config file.
476        // The occur value tells which occurance of "oldKey" to replace
477        // If occur is set to -1, it will remove any duplicates of "oldKey"
478   
479        //copy the original file to create a temporary file for editing
480        QString oFileTmp = oFile + ".tmp";
481        QString cmd = "cp "+oFile+" "+oFileTmp;
482        runShellCommand(cmd);
483       
484        //Continue evaluating the temporary file
485        QStringList SavedFile;
486        int found = 1;
487
488        // Load the old file, find the oldKey, remove it and replace with newKey
489        QFile file( oFileTmp );
490        if ( ! file.open( QIODevice::ReadOnly ) )
491                return false;
492
493        QTextStream stream( &file );
494        QString line;
495        while ( !stream.atEnd() ) {
496                line = stream.readLine(); // line of text excluding '\n'
497           
498                // Key is not found at all
499                if ( line.indexOf(oldKey, 0) == -1 ) {
500                        SavedFile << line ;
501                        continue;
502                }
503
504                // Found the key, but it is commented out, so don't worry about this line
505                if ( line.trimmed().indexOf("#", 0) == 0 ) {
506                        SavedFile << line ;
507                        continue;
508                }
509
510                // If the KEY is found, and we are just on wrong occurance, save it and continue to search 
511                if ( occur != -1 && found != occur ) {
512                        SavedFile << line ;
513                        found++;
514                        continue;
515                }
516
517                // If the KEY is found in the line and this matches the occurance that must be processed
518                if ( ! newKey.isEmpty() && found == occur )
519                {
520                        SavedFile << newKey ;
521                        newKey.clear();
522                        found++;
523                        continue;
524                } 
525
526                // If the KEY is found and we just want one occurance of the key
527                if ( occur == -1 && ! newKey.isEmpty() ) {
528                        SavedFile << newKey ;
529                        newKey.clear();
530                        found++;       
531                        continue;
532                }
533
534        }
535
536        file.close();
537
538        // Didn't find the key? Write it!
539        if ( ! newKey.isEmpty() )
540            SavedFile << newKey;
541       
542   
543        // Save the new file
544        QFile fileout( oFileTmp );
545        if ( ! fileout.open( QIODevice::WriteOnly ) )
546                return false;
547
548        QTextStream streamout( &fileout );
549        for (int i = 0; i < SavedFile.size(); ++i)
550                streamout << SavedFile.at(i) << "\n";
551
552        fileout.close();
553
554        //Have the temporary file with new changes overwrite the original file
555        cmd = "mv "+oFileTmp+" "+oFile;
556        runShellCommand(cmd);   
557       
558        return true;
559   
560}
561
562//Run a shell command (return a list of lines)
563QStringList Utils::runShellCommand( QString command )
564{
565 //split the command string with individual commands seperated by a ";" (if any)
566 QStringList cmdl = command.split(";");
567 QString outstr;
568 //run each individual command
569 for(int i=0;i<cmdl.length();i++){ 
570   QProcess p; 
571   //Make sure we use the system environment to properly read system variables, etc.
572   p.setProcessEnvironment(QProcessEnvironment::systemEnvironment());
573   //Merge the output channels to retrieve all output possible
574   p.setProcessChannelMode(QProcess::MergedChannels);   
575   p.start(cmdl[i]);
576   while(p.state()==QProcess::Starting || p.state() == QProcess::Running){
577     p.waitForFinished(200);
578     QCoreApplication::processEvents();
579   }
580   QString tmp = p.readAllStandardOutput();
581   outstr.append(tmp);
582 }
583 if(outstr.endsWith("\n")){outstr.chop(1);} //remove the newline at the end
584 QStringList out = outstr.split("\n");
585 //qDebug() << command;
586 //for(int j=0; j<out.length();j++){ qDebug() << out[j];}
587 return out;
588}
589
590//Run a shell command and return only lines with a specific search term
591//Example command: ls | grep X -> runShellCommandSearch("ls","X")
592QString Utils::runShellCommandSearch( QString command, QString sch)
593{
594 QStringList L = listShellCommandSearch(command,sch);
595 QString outstr = L.join("\n"); //combine the remaining lines into a single string
596 return outstr;
597}
598
599// Function which displays a info box and restarts networking
600void Utils::restartNetworking()
601{
602   
603   QMessageBox infoBox;
604   infoBox.setWindowModality(Qt::ApplicationModal);
605   infoBox.setWindowTitle(QObject::tr("Restarting network..."));
606   infoBox.setInformativeText(QObject::tr("Network is restarting, please wait..."));
607   infoBox.setStandardButtons(QMessageBox::NoButton);
608   infoBox.show();
609
610   QProcess cmd;
611   cmd.start(QString("/etc/rc.d/netif"), QStringList() << "restart" );
612   while ( cmd.state() != QProcess::NotRunning ) {
613       cmd.waitForFinished(100);
614       QCoreApplication::processEvents();
615   }
616
617   // Set the gateway device name
618   QString route = getConfFileValue("/etc/rc.conf", "defaultrouter=", 1);
619   if ( ! route.isEmpty() ) {
620     infoBox.setInformativeText(QObject::tr("Setting default route..."));
621     cmd.start(QString("route"), QStringList() << "delete" << "default" );
622     while ( cmd.state() != QProcess::NotRunning ) {
623         cmd.waitForFinished(100);
624         QCoreApplication::processEvents();
625     }
626
627     cmd.start(QString("route"), QStringList() << "add" << "default" << route );
628     while ( cmd.state() != QProcess::NotRunning ) {
629         cmd.waitForFinished(100);
630         QCoreApplication::processEvents();
631     }
632   }
633
634   // Check for any devices to run DHCP on
635   QStringList ifs = NetworkInterface::getInterfaces();
636   for ( QStringList::Iterator it = ifs.begin(); it != ifs.end(); ++it )
637   {
638       QString dev = *it;
639
640       // Devices we can safely skip
641       if (dev.indexOf("lo") == 0 
642           || dev.indexOf("fwe") == 0 
643           || dev.indexOf("ipfw") == 0
644           || dev.indexOf("plip") == 0
645           || dev.indexOf("pfsync") == 0
646           || dev.indexOf("pflog") == 0
647           || dev.indexOf("usbus") == 0
648           || dev.indexOf("vboxnet") == 0
649           || dev.indexOf("tun") == 0)
650          continue;
651
652        // Check if this device has DHCP enabled
653        if ( Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_" + dev + "=", 1 ).indexOf("DHCP") != -1 )
654        {
655           qDebug() << "Running DHCP on " << dev;
656           infoBox.setInformativeText(QObject::tr("Running DHCP..."));
657           cmd.start(QString("/etc/rc.d/dhclient"), QStringList() << "start" << dev );
658           while ( cmd.state() != QProcess::NotRunning ) {
659             cmd.waitForFinished(100);
660             QCoreApplication::processEvents();
661           }
662        }
663   }
664
665   infoBox.close();
666}
667
668void Utils::runInTerminal(QString command, QString windowTitle)
669{
670    QStringList out = Utils::runShellCommand("de-info");
671    QString terminal_app="xterm";
672    QString terminal_title="-T";
673    QString terminal_comm="-e";
674    bool separateArgs=false;
675
676    for(int i=0; i<out.size(); i++)
677    {
678        QString str = out.at(i).trimmed();       
679        if (str.indexOf("Terminal:")>=0)
680        {
681            terminal_app = str.replace("Terminal:","");
682            continue;
683        }
684        if(str.indexOf("Terminal title switch:")>=0)
685        {
686            terminal_title = str.replace("Terminal title switch:","");
687            continue;
688        }
689        if (str.indexOf("Terminal command switch:")>=0)
690        {
691            terminal_comm = str.replace("Terminal command switch:","");
692            continue;
693        }
694        if (str.indexOf("Terminal command separate args:")>=0)
695        {
696            separateArgs = (str.replace("Terminal command separate args:","").trimmed() == QString("YES"));
697        }
698    }//for all strings
699    if (!terminal_app.length())
700        return;   
701
702    QStringList args;
703    QStringList comm;
704    if (separateArgs)
705        comm=command.split(" ");
706    else
707        comm<<command.trimmed();
708
709    if (windowTitle.length())
710    {
711        args<<terminal_title.trimmed();
712        args<<windowTitle.trimmed();
713    }
714    args<<terminal_comm.trimmed()<<comm;
715
716    qDebug() << terminal_app.trimmed() << args;
717
718    QProcess::startDetached(terminal_app.trimmed(), args);
719}
720
721void Utils::openInFileManager(QString location)
722{
723    //TODO: Process quotes for location
724    QString exec = Utils::runShellCommand("de-info -fileman").at(0);
725    exec = exec.replace("%s", location);
726    QProcess::startDetached(exec);
727}
728
729QStringList Utils::listShellCommandSearch( QString command, QString sch)
730{
731  QStringList L = Utils::runShellCommand(command);
732  QStringList schList = sch.split(" "); //make a list of the words to search for in a single line
733  for(int i=0; i<schList.size(); i++){
734    L = L.filter(schList[i]);
735  }
736  return L;
737}
738
739bool Utils::validateIPV6( QString IP )
740{
741  bool ok;
742
743  if ( IP.count(":") < 2)
744     return false;
745
746  // Validate the V6 blocks
747  for ( int i = 0; i <= 7; ++i )
748  {
749     if ( IP.section(":", i, i).isEmpty() )
750       continue;
751
752     // Check if valid hex
753     IP.section(":", i,i).toInt(&ok, 16);
754     if (!ok)
755        return false;
756  }
757
758  return true;
759}
760
761bool Utils::validateIPV4( QString IP )
762{
763  int num;
764  bool ok;
765
766  if ( IP.indexOf(".") == -1 )
767     return false;
768
769  // Make sure this is a number after the . is taken out
770  QString tmp;
771  tmp = IP;
772  tmp.replace(".", "");
773  tmp.toLong(&ok);
774  if (!ok)
775     return false;
776   
777  if ( IP.count(".") != 3)
778     return false;
779
780  // Validate the V4 blocks
781  for ( int i = 0; i <= 3; ++i )
782  {
783     if ( IP.section(".", i, i).isEmpty() )
784        return false;
785
786     if ( IP.section(".", i, i).size() > 3 )
787        return false;
788
789     num = IP.section(".", i,i).toInt(&ok);
790     if (!ok)
791        return false;
792
793     if ( num > 255 || num < 0)
794        return false;
795  }
796   
797  return TRUE;
798}
799
800#define TRY_GET_VALUE_STR(val_name, field)\
801if (Str.contains(val_name)){\
802                            Entry.field = Str.replace(val_name,"").trimmed();\
803                                          continue;}\
804
805#define TRY_GET_VALUE_BOOL(val_name, field, true_val)\
806if (Str.contains(val_name)){\
807                            Entry.field = Str.replace(val_name,"").trimmed().toLower() == QString(true_val).toLower();\
808                                          continue;}\
809
810
811static int de_info(bool isCurrent, QVector<DesktopEnvironmentInfo>& retVal)
812{
813    static const char* const DE_NAME = "DE name:";
814    static const char* const DE_ACTIVE = "Current DE:";
815    static const char* const DE_XDG = "XDG compatible:";
816    static const char* const DE_INSTALLED = "Installed:";
817    static const char* const DE_SUDO = "Sudo command:";
818    static const char* const DE_FILE_MANAGER = "File manager:";
819    static const char* const DE_TERMINAL = "Terminal:";
820
821    retVal.clear();
822
823    QStringList flags;
824    if (!isCurrent)
825        flags<<"-i";
826
827    QProcess* deinfo = new QProcess();
828    deinfo->setProcessChannelMode(QProcess::MergedChannels);
829    deinfo->start(QString("/usr/local/bin/de-info"), flags);
830    deinfo->waitForFinished(-1);
831    DesktopEnvironmentInfo Entry;
832    QString Str;
833
834    while ( deinfo->canReadLine() )
835    {
836        Str = deinfo->readLine().simplified();
837        if (Str.contains(DE_NAME))
838        {
839            if (Entry.Name.length())
840            {
841                retVal.push_back(Entry);
842                Entry = DesktopEnvironmentInfo();
843            }
844            Entry.Name = Str.replace(DE_NAME,"").trimmed();
845            continue;
846        }//if found 'DE name'
847
848        TRY_GET_VALUE_BOOL(DE_ACTIVE, isActive, "yes");
849        TRY_GET_VALUE_BOOL(DE_INSTALLED, isInstalled, "yes");
850        TRY_GET_VALUE_BOOL(DE_XDG, isXDG, "yes");
851        TRY_GET_VALUE_STR(DE_SUDO, SudoCommand);
852        TRY_GET_VALUE_STR(DE_FILE_MANAGER, FileManager);
853        TRY_GET_VALUE_STR(DE_TERMINAL, TerminalCommand);
854        //TODO: another fields
855    }//while process output reading
856
857    if (Entry.Name.length())
858        retVal.push_back(Entry);
859
860    return retVal.size();
861}
862
863
864#undef TRY_GET_VALUE_STR
865#undef TRY_GET_VALUE_BOOL
866
867QVector<DesktopEnvironmentInfo> Utils::installedDesktops()
868{
869    QVector<DesktopEnvironmentInfo> retVal;
870    de_info(false, retVal);
871    return retVal;
872}
873
874DesktopEnvironmentInfo Utils::currentDesktop()
875{
876    QVector<DesktopEnvironmentInfo> script_result;
877    if (de_info(true, script_result) != 0)
878    {
879        return script_result[0];
880    }
881    return DesktopEnvironmentInfo();
882}
883
884
Note: See TracBrowser for help on using the repository browser.