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

releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since e3174a0a was e3174a0a, checked in by Kris Moore <kris@…>, 9 months ago

Fix Ticket 995 - Missing quotes around HTTP_PROXY_AUTH in csh.cshrc

While here squelch a clang warning

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