void UpdateInfoPlugin::startCheckForUpdates() { stopCheckForUpdates(); d->m_checkUpdatesCommand = new ShellCommand(QString(), QProcessEnvironment()); connect(d->m_checkUpdatesCommand, &ShellCommand::stdOutText, this, &UpdateInfoPlugin::collectCheckForUpdatesOutput); connect(d->m_checkUpdatesCommand, &ShellCommand::finished, this, &UpdateInfoPlugin::checkForUpdatesFinished); d->m_checkUpdatesCommand->addJob(Utils::FileName(QFileInfo(d->m_maintenanceTool)), QStringList(QLatin1String("--checkupdates"))); d->m_checkUpdatesCommand->execute(); emit checkForUpdatesRunningChanged(true); }
void QProcessEnvironmentfromScriptValue(const QScriptValue &obj, QProcessEnvironment &item) { item = QProcessEnvironment(); QScriptValueIterator it(obj); while (it.hasNext()) { it.next(); if (it.flags() & QScriptValue::SkipInEnumeration) continue; item.insert(it.name(), it.value().toString()); } }
QProcessEnvironment QAuthApp::authenticated(const QString &user) { Msg m = Msg::MSG_UNKNOWN; QProcessEnvironment response; SafeDataStream str(m_socket); str << Msg::AUTHENTICATED << user; str.send(); if (user.isEmpty()) return response; str.receive(); str >> m >> response; if (m != AUTHENTICATED) { response = QProcessEnvironment(); qCritical() << "Received a wrong opcode instead of AUTHENTICATED:" << m; } return response; }
void tst_QProcessEnvironment::operator_eq() { QProcessEnvironment e1; QVERIFY(e1 == e1); e1.clear(); QVERIFY(e1 == e1); e1 = QProcessEnvironment(); QProcessEnvironment e2; QVERIFY(e1 == e2); e1.clear(); QVERIFY(e1 != e2); e2.clear(); QVERIFY(e1 == e2); }
static bool runProcess(const QString &binary, const QStringList &arguments, QString *errorMessage, const QString &workingDir = QString(), const QProcessEnvironment &env = QProcessEnvironment(), int timeOut = 5000, QByteArray *stdOut = Q_NULLPTR, QByteArray *stdErr = Q_NULLPTR) { QProcess process; if (!env.isEmpty()) process.setProcessEnvironment(env); if (!workingDir.isEmpty()) process.setWorkingDirectory(workingDir); qDebug().noquote().nospace() << "Running: " << QDir::toNativeSeparators(binary) << ' ' << arguments.join(QLatin1Char(' ')); process.start(binary, arguments, QIODevice::ReadOnly); if (!process.waitForStarted()) { *errorMessage = msgProcessError(process, "Failed to start"); return false; } if (!process.waitForFinished(timeOut)) { *errorMessage = msgProcessError(process, "Timed out"); process.terminate(); if (!process.waitForFinished(300)) process.kill(); return false; } if (stdOut) *stdOut = process.readAllStandardOutput(); if (stdErr) *stdErr= process.readAllStandardError(); if (process.exitStatus() != QProcess::NormalExit) { *errorMessage = msgProcessError(process, "Crashed"); return false; } if (process.exitCode() != QProcess::NormalExit) { *errorMessage = msgProcessError(process, "Exit code " + QString::number(process.exitCode())); return false; } return true; }
Gui::Gui(){ setupUi(this); pref = new Preferences(this); myOutput = new QTextStream(stdout); if(!QProcessEnvironment().isEmpty()) shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL="); if(shell.isEmpty() && QFile("/bin/bash").exists()) shell = "/bin/bash"; else *myOutput << "E: No shells found! qprogram-starter might not work as expected..."; //Versioning QFile versionFile(":version"); versionFile.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream in(&versionFile); statusBar()->showMessage(tr("Version ") + in.readLine(),15000); versionFile.close(); aborted = false; process2Started = false; dateEdit->setMinimumDate(QDate::currentDate()); dateTimeTimer = new QTimer(this); dateTimeTimer->start(1000); timer = new QTimer(this); process1 = new QProcess(this); process2 = new QProcess(this); logBox1 = new QTextEdit; logBox1->setReadOnly(true); logBox1->resize(520,450); logBox1->setWindowTitle("error log 1"); logBox1->setWindowModality(Qt::NonModal); logBox2 = new QTextEdit; logBox2->setReadOnly(true); logBox2->resize(520,450); logBox2->setWindowTitle("error log 2"); logBox2->setWindowModality(Qt::NonModal); hintMsgBox = new QTextEdit; hintMsgBox->setReadOnly(true); hintMsgBox->resize(520,450); hintMsgBox->setWindowTitle("Info"); hintMsgBox->setWindowModality(Qt::NonModal); hintMsgBox->setHtml(tr("The command in the second text editor (if there is any) will be executed after the first one. The message boxes will close themselves after 10 seconds.<br/>To start a program just type i.e. \"firefox\" or \"firefox www.google.com\" and then click on Start. Commands etc. can be linked by \"&&\" etc. <br/><br/>If the process is \"finished\" although it is still running, then try the --nofork option (i.e. kopete --nofork). Note that this will also occure for some programs like gedit, firefox or gnome-terminal if they are already running.<br/><br/>When you want to start a program or command with sudo, please use for example gksu(do) or kdesu(do).<br/><br/>make examples:<br/> make -C /path/to/project<br/> make clean -C /path/to/project<br/><br/>About Errors:<br/>Because almost every program gives a different error code, it is impossible to say what happend. So just log the output and see what kind of error occured. The output files can be found at <i>~/.qprogram-starter/</i>.<br/><br/>If the shutdown won't work, it means that \"sudo shutdown -P now\" is used. This needs root permissions. You can do the this:<br/><br/>Post the following in a terminal:<pre>EDITOR=nano sudo -E visudo</pre> and add this line:<pre>* ALL = NOPASSWD:/sbin/shutdown</pre> whereas * replaces the username or %groupname.<br/><br/>The configuration-file can be found at <i>~/.qprogram-starter/</i>.")); connect(action_Configure, SIGNAL(triggered(bool)), pref, SLOT(show())); connect(dateTimeTimer, SIGNAL(timeout()), this, SLOT(currentDateAndTime())); connect(startB, SIGNAL(clicked(bool)), this, SLOT(run())); connect(abortB, SIGNAL(clicked(bool)), this, SLOT(abortProcesses())); connect(saveButton, SIGNAL(clicked(bool)), this, SLOT(saveData())); connect(timer, SIGNAL(timeout()), this, SLOT(check())); connect(browse1, SIGNAL(clicked(bool)), this, SLOT(getProgram1())); connect(browse2, SIGNAL(clicked(bool)), this, SLOT(getProgram2())); connect(process1, SIGNAL(readyReadStandardOutput()), this, SLOT(output1())); connect(process1, SIGNAL(readyReadStandardError()), this, SLOT(errorOutput1())); connect(process1, SIGNAL(finished(int)), this, SLOT(checkForProcess2())); connect(process1, SIGNAL(error(QProcess::ProcessError)), this, SLOT(message())); connect(process2, SIGNAL(readyReadStandardOutput()), this, SLOT(output2())); connect(process2, SIGNAL(readyReadStandardError()), this, SLOT(errorOutput2())); connect(process2, SIGNAL(finished(int)), this, SLOT(shutdown_or_message())); connect(process2, SIGNAL(error(QProcess::ProcessError)), this, SLOT(message())); connect(this, SIGNAL(finished()), this, SLOT(shutdown_or_message())); connect(action_Hints, SIGNAL(triggered(bool)), this, SLOT(info_hint())); connect(showLogsButton, SIGNAL(clicked(bool)), this, SLOT(showLogs())); }
int main(int argc, char *argv[]){ // here the QT_program is created QApplication app(argc, argv); //Qt translations QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); //My translations QTranslator translator; QString trDir = "/usr/share/qshutdown/translations/"; translator.load(trDir + "qshutdown-" + QLocale::system().name()); app.installTranslator(&translator); QTextStream myOutput(stdout); if(!QProcessEnvironment().isEmpty()) shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL="); if(shell.isEmpty() && QFile("/bin/bash").exists()) shell = "/bin/bash"; else myOutput << "E: No shell found! Custom commands won't work!"; QString infoStr = QString(QObject::tr("qshutdown will show itself 3 times as a warning " "if there are less than 70 seconds left.<br/><br/>This program uses qdbus to send a " "shutdown/reboot/suspend/hibernate request to either the gnome- or " "kde-session-manager, to HAL/ConsoleKit/DeviceKit/UPower and if none of these works, the " "command 'sudo shutdown' will be used (note that when sending the shutdown request to HAL or " "ConsoleKit, or the shutdown command is used, the Session will never be saved. If the " "shutdown command is used, the program will only be able to shutdown and reboot). So " "if nothing happens when the shutdown- or reboot-time is reached, it means that one " "lacks the rights for the shutdown command. In this case one can do the following:" "<br/><br/>Paste the following in a terminal:<pre>EDITOR=nano sudo -E visudo</pre>and " "add this line:<pre>* ALL = NOPASSWD:/sbin/shutdown</pre>whereas * replaces the " "user name or %group name.<br/><br/>The maximum Number of countdown_minutes is " "1440 (24 hours).<br/>The configuration file (and logfile) is located at " "<i>~/.qshutdown/</i> (under Linux/Unix).<br/><br/><b>For admins:</b><br/>If you want " "qshutdown to run with \"parental lock\" for every user, you can do " "\"sudo cp /usr/share/qshutdown/autostart/99qshutdown /etc/X11/Xsession.d/\" " "and set the option Lock_all in /root/.qshutdown/qshutdown.conf to true. Note that " "qshutdown has to start once to generate the qshutdown.conf. Furthermore there is a " "need to add the following line to the sudoers (as above):" "<pre>* ALL = NOPASSWD:/usr/bin/qshutdown</pre><br/>If you should ever forget " "your set password, just remove the whole line starting with \"Password\" manually from " "the qshutdown.conf.<br/><br/><b>Hints on usage:</b><br/>If you want qshutdown to stop " "\"bugging\" you, just remove the hook from " "\"warnings on?\".<br/><br/><b>Hotkeys:</b><table border=\"1\"><tr><td>Ctrl+I</td><td>(this)" " information window</td></tr><tr><td>Ctrl+Q</td><td>Quit</td></tr><tr><td>Ctrl+P</td>" "<td>Preferences</td></tr><tr><td>Ctrl+L</td><td>write the run time once into the logfile (works " "only if qshutdown quits. To make it permanent set it in the preferences.)</td></tr><tr>" "<td>Ctrl+S</td><td>set to shutdown</td></tr><tr><td>Ctrl+R</td><td>set to restart</td></tr>" "<tr><td>Ctrl+U</td><td>set to suspend to RAM</td></tr><tr><td>Ctrl+H</td><td>set to hibernate" "</td></tr><tr><td>Ctrl+E</td><td>stop countdown (only if the countdown has started and the admin " "didn't restrict the access)</td></tr><tr><td>Shift+E</td><td>to edit the configuration file (for " "this a password is necessary. If you are a user, you can set an \"empty password\" (leave the " "password field empty)).</td></tr></table>")); QTextDocumentFragment infoDoc; infoDoc = QTextDocumentFragment::fromHtml(infoStr); QString info = infoDoc.toPlainText(); //Get the arguments passed from the terminal QStringList args = QApplication::arguments(); args.removeFirst(); //this is just the program for(int i=1; i<args.size();args.removeLast()); if(!args.empty()){ QString arg = args[0]; if(arg[0] == '-'){ if(arg[1] == 'h' || arg == "--help") myOutput << "\nqshutdown [ options ... ]\n\nOptions are:\n\t-h " << "or --help\tPrints this message.\n\t-i\t\tPrints " << "information.\n\t-v\t\tPrints all errors and warnings.\n" << "\t-s or --start\tStarts the countdown for the set time." << endl; if(arg[1] == 'i') myOutput << info << endl; } if(arg != "-h" && arg != "--help" && arg != "-i" && !((arg[0] == '-' && (arg.contains("s") || arg.contains("v"))) || args.contains("--start"))) myOutput << "Wrong options! Try qshutdown -h" << endl; if(arg.contains("-") && arg.contains("-v")) verbose = true; } if(!args.empty() && !((args[0][0] == '-' && (args[0].contains("v") || args[0].contains("s"))) || args.contains("--start"))) exit(0); Gui window; //Create the main widget #ifndef Q_OS_WIN32 QDBusConnection::sessionBus().registerObject(OBJECT_NAME, &window, QDBusConnection::ExportScriptableSlots); if(QDBusConnection::sessionBus().registerService(SERVICE_NAME)){ //if possible register qshutdown as a service in the session bus #endif //Q_OS_WIN32 window.information = infoStr; window.loadSettings(); window.center(); window.show(); app.setQuitOnLastWindowClosed(false); if(!args.empty() && ((args[0][0] == '-' && args[0].contains("s")) || args.contains("--start"))) window.set(); return app.exec(); #ifndef Q_OS_WIN32 } else{ //if registering qshutdown fails (also because it is already // registered, show window myOutput << "\nqshutdown is already running!\n" << endl; QDBusInterface iface(SERVICE_NAME, OBJECT_NAME, "", QDBusConnection::sessionBus(), &window); QDBusMessage response = iface.call("showRunningProgram"); if(response.type() == QDBusMessage::ErrorMessage){ if(verbose) myOutput << "QDBusInterface " << iface.interface() << " seems to be valid... -> " << (iface.isValid()? "true":"false") << "\nW: " << response.errorName() << ": " << response.errorMessage() << "\nYou can ignore this.\n\n" << endl; QDBusInterface iface2(SERVICE_NAME, OBJECT_NAME, "local.Gui", QDBusConnection::sessionBus(), &window); QDBusMessage response2 = iface2.call("showRunningProgram"); if(response2.type() == QDBusMessage::ErrorMessage) myOutput << "QDBusInterface " << iface2.interface() << " seems to be valid... -> " << (iface2.isValid()? "true":"false") << "\nW: " << response2.errorName() << ": " << response2.errorMessage() << "\nPlease report this." << endl; else if(!args.empty() && ((args[0][0] == '-' && args[0].contains("s")) || args.contains("--start"))) iface2.call("set"); } else if(!args.empty() && ((args[0][0] == '-' && args[0].contains("s")) || args.contains("--start"))) iface.call("set"); } if(!args.empty() && ((args[0][0] == '-' && args[0].contains("s")) || args.contains("--start"))) myOutput << "Starting countdown!\n"; #endif //Q_OS_WIN32 }