int setup_basics(const MythCommandLineParser &cmdline) { ofstream pidfs; if (!openPidfile(pidfs, cmdline.GetPIDFilename())) return GENERIC_EXIT_PERMISSIONS_ERROR; if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to ignore SIGPIPE"); if (cmdline.IsDaemonizeEnabled() && (daemon(0, 1) < 0)) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to daemonize" + ENO); return GENERIC_EXIT_DAEMONIZING_ERROR; } QString username = cmdline.GetUsername(); if (!username.isEmpty() && !setUser(username)) return GENERIC_EXIT_PERMISSIONS_ERROR; if (pidfs) { pidfs << getpid() << endl; pidfs.close(); } return GENERIC_EXIT_OK; }
void print_warnings(const MythCommandLineParser &cmdline) { if (!cmdline.IsHouseKeeperEnabled()) { VERBOSE(VB_IMPORTANT, LOC_WARN + "****** The Housekeeper has been DISABLED with " "the --nohousekeeper option ******"); } if (!cmdline.IsSchedulerEnabled()) { VERBOSE(VB_IMPORTANT, LOC_WARN + "********** The Scheduler has been DISABLED with " "the --nosched option **********"); } if (!cmdline.IsAutoExpirerEnabled()) { VERBOSE(VB_IMPORTANT, LOC_WARN + "********* Auto-Expire has been DISABLED with " "the --noautoexpire option ********"); } if (!cmdline.IsJobQueueEnabled()) { VERBOSE(VB_IMPORTANT, LOC_WARN + "********* The JobQueue has been DISABLED with " "the --nojobqueue option *********"); } }
void showUsage(const MythCommandLineParser &cmdlineparser, const QString &version) { QString help = cmdlineparser.GetHelpString(false); QByteArray ahelp = help.toLocal8Bit(); cerr << qPrintable(version) << endl << "Valid options are: " << endl << "-h or --help List valid command line parameters" << endl << ahelp.constData() << endl; }
bool setup_context(const MythCommandLineParser &cmdline) { if (!gContext->Init(false)) { VERBOSE(VB_IMPORTANT, "Failed to init MythContext."); return false; } gCoreContext->SetBackend(!cmdline.HasBackendCommand()); QMap<QString,QString> settingsOverride = cmdline.GetSettingsOverride(); if (settingsOverride.size()) { QMap<QString, QString>::iterator it; for (it = settingsOverride.begin(); it != settingsOverride.end(); ++it) { VERBOSE(VB_IMPORTANT, QString("Setting '%1' being forced to '%2'") .arg(it.key()).arg(*it)); gCoreContext->OverrideSettingForSession(it.key(), *it); } } return true; }
static void showUsage(const MythCommandLineParser &cmdlineparser) { QString help = cmdlineparser.GetHelpString(false); QByteArray ahelp = help.toLocal8Bit(); VERBOSE(VB_IMPORTANT, QString("%1 version: %2 [%3] www.mythtv.org") .arg(MYTH_APPNAME_MYTHWELCOME) .arg(MYTH_SOURCE_PATH) .arg(MYTH_SOURCE_VERSION)); cerr << "Valid options are: " << endl << "-v or --verbose debug-level Use '-v help' for level info" << endl << "-s or --setup Run setup for the mythshutdown program" << endl << "-l or --logfile filename Writes STDERR and STDOUT messages to filename" << endl << ahelp.constData() << endl; }
static void ShowUsage(const MythCommandLineParser &cmdlineparser) { QString help = cmdlineparser.GetHelpString(false); QByteArray ahelp = help.toLocal8Bit(); cerr << "Valid options are: " << endl << "-l or --logfile filename Writes STDERR and STDOUT messages to filename" << endl << "-r or --reset Resets frontend appearance settings and language" << endl << ahelp.constData() << "-p or --prompt Always prompt for Mythbackend selection." << endl << "-d or --disable-autodiscovery Never prompt for Mythbackend selection." << endl << "-u or --upgrade-schema Allow mythfrontend to upgrade the database schema" << endl << "<plugin> Initialize and run this plugin" << endl << endl << "Environment Variables:" << endl << "$MYTHTVDIR Set the installation prefix" << endl << "$MYTHCONFDIR Set the config dir (instead of ~/.mythtv)" << endl; }
int run_backend(const MythCommandLineParser &cmdline) { if (!setup_context(cmdline)) return GENERIC_EXIT_NO_MYTHCONTEXT; bool ismaster = gCoreContext->IsMasterHost(); if (!UpgradeTVDatabaseSchema(ismaster, ismaster)) { VERBOSE(VB_IMPORTANT, "Couldn't upgrade database to new schema"); return GENERIC_EXIT_DB_OUTOFDATE; } /////////////////////////////////////////// g_pUPnp = new MediaServer(ismaster, !cmdline.IsUPnPEnabled() ); if (!ismaster) { int ret = connect_to_master(); if (ret != GENERIC_EXIT_OK) return ret; } QString myip = gCoreContext->GetSetting("BackendServerIP"); int port = gCoreContext->GetNumSetting("BackendServerPort", 6543); if (myip.isEmpty()) { cerr << "No setting found for this machine's BackendServerIP.\n" << "Please run setup on this machine and modify the first page\n" << "of the general settings.\n"; return GENERIC_EXIT_SETUP_ERROR; } MythSystemEventHandler *sysEventHandler = new MythSystemEventHandler(); if (ismaster) { VERBOSE(VB_GENERAL, LOC + "Starting up as the master server."); gCoreContext->LogEntry("mythbackend", LP_INFO, "MythBackend started as master server", ""); } else { VERBOSE(VB_GENERAL, LOC + "Running as a slave backend."); gCoreContext->LogEntry("mythbackend", LP_INFO, "MythBackend started as a slave backend", ""); } print_warnings(cmdline); bool fatal_error = false; bool runsched = setupTVs(ismaster, fatal_error); if (fatal_error) { delete sysEventHandler; return GENERIC_EXIT_SETUP_ERROR; } if (ismaster) { if (runsched) { sched = new Scheduler(true, &tvList); int err = sched->GetError(); if (err) return err; if (!cmdline.IsSchedulerEnabled()) sched->DisableScheduling(); } if (cmdline.IsHouseKeeperEnabled()) housekeeping = new HouseKeeper(true, ismaster, sched); if (cmdline.IsAutoExpirerEnabled()) { expirer = new AutoExpire(&tvList); if (sched) sched->SetExpirer(expirer); } } else if (cmdline.IsHouseKeeperEnabled()) { housekeeping = new HouseKeeper(true, ismaster, NULL); } if (cmdline.IsJobQueueEnabled()) jobqueue = new JobQueue(ismaster); // Setup status server HttpStatus *httpStatus = NULL; HttpServer *pHS = g_pUPnp->GetHttpServer(); if (pHS) { VERBOSE(VB_IMPORTANT, "Main::Registering HttpStatus Extension"); httpStatus = new HttpStatus(&tvList, sched, expirer, ismaster); if (httpStatus) pHS->RegisterExtension(httpStatus); } VERBOSE(VB_IMPORTANT, QString("Enabled verbose msgs: %1") .arg(verboseString)); MainServer *mainServer = new MainServer( ismaster, port, &tvList, sched, expirer); int exitCode = mainServer->GetExitCode(); if (exitCode != GENERIC_EXIT_OK) { VERBOSE(VB_IMPORTANT, "Backend exiting, MainServer initialization " "error."); delete mainServer; return exitCode; } if (httpStatus && mainServer) httpStatus->SetMainServer(mainServer); StorageGroup::CheckAllStorageGroupDirs(); if (gCoreContext->IsMasterBackend()) SendMythSystemEvent("MASTER_STARTED"); /////////////////////////////// /////////////////////////////// exitCode = qApp->exec(); /////////////////////////////// /////////////////////////////// if (gCoreContext->IsMasterBackend()) { SendMythSystemEvent("MASTER_SHUTDOWN"); qApp->processEvents(); } gCoreContext->LogEntry("mythbackend", LP_INFO, "MythBackend exiting", ""); delete sysEventHandler; delete mainServer; return exitCode; }
int handle_command(const MythCommandLineParser &cmdline) { QString eventString = cmdline.GetEventString(); if (!eventString.isEmpty()) { if (gCoreContext->ConnectToMasterServer()) { if (eventString.startsWith("SYSTEM_EVENT")) { eventString += QString(" SENDER %1") .arg(gCoreContext->GetHostName()); } RemoteSendMessage(eventString); return GENERIC_EXIT_OK; } return GENERIC_EXIT_NO_MYTHCONTEXT; } if (cmdline.WantUPnPRebuild()) { VERBOSE(VB_GENERAL, "Rebuilding UPNP Media Map is no longer supported. Rescan videos using MythVideo."); return GENERIC_EXIT_OK; } if (cmdline.SetVerbose()) { if (gCoreContext->ConnectToMasterServer()) { QString message = "SET_VERBOSE "; message += cmdline.GetNewVerbose(); RemoteSendMessage(message); VERBOSE(VB_IMPORTANT, QString("Sent '%1' message").arg(message)); return GENERIC_EXIT_OK; } else { VERBOSE(VB_IMPORTANT, "Unable to connect to backend, verbose level unchanged "); return GENERIC_EXIT_CONNECT_ERROR; } } if (cmdline.ClearSettingsCache()) { if (gCoreContext->ConnectToMasterServer()) { RemoteSendMessage("CLEAR_SETTINGS_CACHE"); VERBOSE(VB_IMPORTANT, "Sent CLEAR_SETTINGS_CACHE message"); return GENERIC_EXIT_OK; } else { VERBOSE(VB_IMPORTANT, "Unable to connect to backend, settings " "cache will not be cleared."); return GENERIC_EXIT_CONNECT_ERROR; } } if (cmdline.IsPrintScheduleEnabled() || cmdline.IsTestSchedulerEnabled()) { sched = new Scheduler(false, &tvList); if (!cmdline.IsTestSchedulerEnabled() && gCoreContext->ConnectToMasterServer()) { cout << "Retrieving Schedule from Master backend.\n"; sched->FillRecordListFromMaster(); } else { cout << "Calculating Schedule from database.\n" << "Inputs, Card IDs, and Conflict info may be invalid " "if you have multiple tuners.\n"; sched->FillRecordListFromDB(); } print_verbose_messages |= VB_SCHEDULE; sched->PrintList(true); return GENERIC_EXIT_OK; } if (cmdline.Reschedule()) { bool ok = false; if (gCoreContext->ConnectToMasterServer()) { VERBOSE(VB_IMPORTANT, "Connected to master for reschedule"); ScheduledRecording::signalChange(-1); ok = true; } else VERBOSE(VB_IMPORTANT, "Cannot connect to master for reschedule"); return (ok) ? GENERIC_EXIT_OK : GENERIC_EXIT_CONNECT_ERROR; } if (cmdline.ScanVideos()) { bool ok = false; if (gCoreContext->ConnectToMasterServer()) { gCoreContext->SendReceiveStringList(QStringList() << "SCAN_VIDEOS"); VERBOSE(VB_IMPORTANT, "Requested video scan"); ok = true; } else VERBOSE(VB_IMPORTANT, "Cannot connect to master for video scan"); return (ok) ? GENERIC_EXIT_OK : GENERIC_EXIT_CONNECT_ERROR; } if (!cmdline.GetPrintExpire().isEmpty()) { expirer = new AutoExpire(); expirer->PrintExpireList(cmdline.GetPrintExpire()); return GENERIC_EXIT_OK; } // This should never actually be reached.. return GENERIC_EXIT_OK; }