// This file is part of JustMotion. // JustMotion is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // JustMotion is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. #include "common.h" #include "camera.h" #include "proc_control.h" void showHelp(const QString etcDir) { QTextStream(stdout) << APP_NAME << " " << APP_VERSION << Qt::endl << Qt::endl; QTextStream(stdout) << "Usage: " << APP_TARGET << " " << Qt::endl << Qt::endl; QTextStream(stdout) << "-h : display usage information about this application." << Qt::endl; QTextStream(stdout) << "-d : all valid config files found in " << etcDir << " will be used to" << Qt::endl; QTextStream(stdout) << " create camera instances. (this is blocking, meant to run with systemd)" << Qt::endl; QTextStream(stdout) << "-v : display the current version." << Qt::endl; QTextStream(stdout) << "-u : uninstall the entire app from your system, including the service." << Qt::endl; QTextStream(stdout) << "-f : force an action without pausing for user confirmation." << Qt::endl; QTextStream(stdout) << "-s : view the status of all camera instances." << Qt::endl; QTextStream(stdout) << "-q : kill all camera instances." << Qt::endl; QTextStream(stdout) << "-r : same as -d except it is non-blocking by starting all camera instances" << Qt::endl; QTextStream(stdout) << " via systemd. same as 'systemctl start " << APP_TARGET << "'" << Qt::endl; } int main(int argc, char** argv) { QCoreApplication app(argc, argv); QCoreApplication::setApplicationName(APP_NAME); QCoreApplication::setApplicationVersion(APP_VERSION); auto args = QCoreApplication::arguments(); auto etcDir = "/etc/" + QString(APP_TARGET); auto staDir = QDir::tempPath() + "/" + APP_TARGET + "-stats"; auto procFile = QDir::tempPath() + "/" + APP_TARGET + "-proc"; auto ret = 0; if (!QFileInfo::exists(staDir)) { mkPath(staDir); } if (args.contains("-h")) { showHelp(etcDir); } else if (args.contains("-v")) { QTextStream(stdout) << APP_VERSION << Qt::endl; } else if (args.contains("-d")) { auto confs = lsFilesInDir(etcDir); auto proc = new ProcControl(procFile, staDir, &app); if (!proc->init()) { ret = EACCES; } else { for (auto &&conf : confs) { new Camera(etcDir + "/" + conf, staDir, proc, &app); } ret = app.exec(); } } else if (args.contains("-u")) { if (args.contains("-f")) { ret = QProcess::execute("/opt/" + QString(APP_TARGET) + "/uninstall.sh", QStringList()); } else { char ans; std::cout << "This will completely uninstall " << APP_NAME << " from your system. continue y/n? "; std::cin >> ans; if (ans == 'y' || ans == 'Y') { ret = QProcess::execute("/opt/" + QString(APP_TARGET) + "/uninstall.sh", QStringList()); } } } else if (args.contains("-s")) { auto statFiles = lsFilesInDir(staDir); for (auto &&statFile: statFiles) { QFile file(staDir + "/" + statFile); file.open(QFile::ReadOnly); std::cout << file.readAll().data(); file.close(); } } else if (args.contains("-q")) { QFile::remove(procFile); QThread::currentThread()->sleep(5); } else if (args.contains("-r")) { QProcess::execute("systemctl start " + QString(APP_TARGET)); } else { showHelp(etcDir); } return ret; }