MythSocket *MythCoreContext::ConnectEventSocket(const QString &hostname, int port) { MythSocket *eventSock = new MythSocket(); while (eventSock->state() != MythSocket::Idle) { usleep(5000); } // Assume that since we _just_ connected the command socket, // this one won't need multiple retries to work... if (!eventSock->connect(hostname, port)) { LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to connect event " "socket to master backend"); eventSock->DecrRef(); return NULL; } eventSock->Lock(); QString str = QString("ANN Monitor %1 %2") .arg(d->m_localHostname).arg(true); QStringList strlist(str); eventSock->writeStringList(strlist); bool ok = true; if (!eventSock->readStringList(strlist) || strlist.empty() || (strlist[0] == "ERROR")) { if (!strlist.empty()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Problem connecting event socket to master backend"); } else { LOG(VB_GENERAL, LOG_ERR, LOC + "Timeout connecting event socket to master backend"); } ok = false; } eventSock->Unlock(); if (ok) { eventSock->setCallbacks(this); } else { eventSock->DecrRef(); eventSock = NULL; } return eventSock; }
/** * \brief Can we talk to port on host? */ bool telnet(const QString &host, int port) { MythSocket *s = new MythSocket(); bool connected = s->connect(host, port); s->DownRef(); return connected; }
int connect_to_master(void) { MythSocket *tempMonitorConnection = new MythSocket(); if (tempMonitorConnection->connect( gCoreContext->GetSetting("MasterServerIP", "127.0.0.1"), gCoreContext->GetNumSetting("MasterServerPort", 6543))) { if (!gCoreContext->CheckProtoVersion(tempMonitorConnection)) { VERBOSE(VB_IMPORTANT, "Master backend is incompatible with " "this backend.\nCannot become a slave."); return GENERIC_EXIT_CONNECT_ERROR; } QStringList tempMonitorDone("DONE"); QStringList tempMonitorAnnounce("ANN Monitor tzcheck 0"); tempMonitorConnection->writeStringList(tempMonitorAnnounce); tempMonitorConnection->readStringList(tempMonitorAnnounce); if (tempMonitorAnnounce.empty() || tempMonitorAnnounce[0] == "ERROR") { tempMonitorConnection->DownRef(); tempMonitorConnection = NULL; if (tempMonitorAnnounce.empty()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to open event socket, timeout"); } else { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to open event socket" + ((tempMonitorAnnounce.size() >= 2) ? QString(", error was %1").arg(tempMonitorAnnounce[1]) : QString(", remote error"))); } } QStringList tzCheck("QUERY_TIME_ZONE"); if (tempMonitorConnection) { tempMonitorConnection->writeStringList(tzCheck); tempMonitorConnection->readStringList(tzCheck); } if (tzCheck.size() && !checkTimeZone(tzCheck)) { // Check for different time zones, different offsets, different // times VERBOSE(VB_IMPORTANT, "The time and/or time zone settings on " "this system do not match those in use on the master " "backend. Please ensure all frontend and backend " "systems are configured to use the same time zone and " "have the current time properly set."); VERBOSE(VB_IMPORTANT, "Unable to run with invalid time settings. Exiting."); tempMonitorConnection->writeStringList(tempMonitorDone); tempMonitorConnection->DownRef(); return GENERIC_EXIT_INVALID_TIMEZONE; } else { VERBOSE(VB_IMPORTANT, QString("Backend is running in %1 time zone.") .arg(getTimeZoneID())); } if (tempMonitorConnection) tempMonitorConnection->writeStringList(tempMonitorDone); } if (tempMonitorConnection) tempMonitorConnection->DownRef(); return GENERIC_EXIT_OK; }
MythSocket *RemoteFile::openSocket(bool control) { QUrl qurl(path); QString dir; QString host = qurl.host(); int port = qurl.port(); dir = qurl.path(); if (qurl.hasQuery()) dir += "?" + QUrl::fromPercentEncoding(qurl.encodedQuery()); if (qurl.hasFragment()) dir += "#" + qurl.fragment(); QString sgroup = qurl.userName(); MythSocket *lsock = new MythSocket(); QString stype = (control) ? "control socket" : "file data socket"; QString loc_err = QString("RemoteFile::openSocket(%1), Error: ").arg(stype); if (port <= 0) { port = GetMythDB()->GetSettingOnHost("BackendServerPort", host).toInt(); // if we still have no port use the default if (port <= 0) port = 6543; } if (!lsock->connect(host, port)) { LOG(VB_GENERAL, LOG_ERR, QString("Could not connect to server %1:%2") .arg(host).arg(port)); lsock->DownRef(); return NULL; } QString hostname = GetMythDB()->GetHostName(); QStringList strlist; if (control) { strlist.append(QString("ANN Playback %1 %2").arg(hostname).arg(false)); lsock->writeStringList(strlist); if (!lsock->readStringList(strlist, true)) { LOG(VB_GENERAL, LOG_ERR, QString("\n\t\t\tCould not read string list from server " "%1:%2").arg(host).arg(port)); lsock->DownRef(); return NULL; } } else { strlist.push_back(QString("ANN FileTransfer %1 %2 %3 %4") .arg(hostname).arg(writemode) .arg(usereadahead).arg(timeout_ms)); strlist << QString("%1").arg(dir); strlist << sgroup; QStringList::const_iterator it = possibleauxfiles.begin(); for (; it != possibleauxfiles.end(); ++it) strlist << *it; if (!lsock->writeStringList(strlist) || !lsock->readStringList(strlist, true)) { LOG(VB_GENERAL, LOG_ERR, QString("Did not get proper response from %1:%2") .arg(host).arg(port)); strlist.clear(); strlist.push_back("ERROR"); strlist.push_back("invalid response"); } if (strlist.size() >= 3) { it = strlist.begin(); ++it; recordernum = (*it).toInt(); ++it; filesize = (*(it)).toLongLong(); ++it; for (; it != strlist.end(); ++it) auxfiles << *it; } else if (0 < strlist.size() && strlist.size() < 3 && strlist[0] != "ERROR") { LOG(VB_GENERAL, LOG_ERR, QString("Did not get proper response from %1:%2") .arg(host).arg(port)); strlist.clear(); strlist.push_back("ERROR"); strlist.push_back("invalid response"); } } if (strlist.empty() || strlist[0] == "ERROR") { lsock->DownRef(); lsock = NULL; if (strlist.empty()) { LOG(VB_GENERAL, LOG_ERR, "Failed to open socket, timeout"); } else { LOG(VB_GENERAL, LOG_ERR, "Failed to open socket" + ((strlist.size() >= 2) ? QString(", error was %1").arg(strlist[1]) : QString(", remote error"))); } } return lsock; }
MythSocket *MythCoreContext::ConnectCommandSocket( const QString &hostname, int port, const QString &announce, bool *p_proto_mismatch, bool gui, int maxConnTry, int setup_timeout) { MythSocket *serverSock = NULL; { QMutexLocker locker(&d->m_WOLInProgressLock); d->WaitForWOL(); } QString WOLcmd = GetSetting("WOLbackendCommand", ""); if (maxConnTry < 1) maxConnTry = max(GetNumSetting("BackendConnectRetry", 1), 1); int WOLsleepTime = 0, WOLmaxConnTry = 0; if (!WOLcmd.isEmpty()) { WOLsleepTime = GetNumSetting("WOLbackendReconnectWaitTime", 0); WOLmaxConnTry = max(GetNumSetting("WOLbackendConnectRetry", 1), 1); maxConnTry = max(maxConnTry, WOLmaxConnTry); } bool we_attempted_wol = false; if (setup_timeout <= 0) setup_timeout = MythSocket::kShortTimeout; bool proto_mismatch = false; for (int cnt = 1; cnt <= maxConnTry; cnt++) { LOG(VB_GENERAL, LOG_INFO, LOC + QString("Connecting to backend server: %1:%2 (try %3 of %4)") .arg(hostname).arg(port).arg(cnt).arg(maxConnTry)); serverSock = new MythSocket(); int sleepms = 0; if (serverSock->connect(hostname, port)) { if (SetupCommandSocket( serverSock, announce, setup_timeout, proto_mismatch)) { break; } if (proto_mismatch) { if (p_proto_mismatch) *p_proto_mismatch = true; serverSock->DecrRef(); serverSock = NULL; break; } setup_timeout = (int)(setup_timeout * 1.5f); } else if (!WOLcmd.isEmpty() && (cnt < maxConnTry)) { if (!we_attempted_wol) { QMutexLocker locker(&d->m_WOLInProgressLock); if (d->m_WOLInProgress) { d->WaitForWOL(); continue; } d->m_WOLInProgress = we_attempted_wol = true; } myth_system(WOLcmd, kMSDontDisableDrawing | kMSDontBlockInputDevs | kMSProcessEvents); sleepms = WOLsleepTime * 1000; } serverSock->DecrRef(); serverSock = NULL; if (!serverSock && (cnt == 1)) { QCoreApplication::postEvent( d->m_GUIcontext, new MythEvent("CONNECTION_FAILURE")); } if (sleepms) usleep(sleepms * 1000); } if (we_attempted_wol) { QMutexLocker locker(&d->m_WOLInProgressLock); d->m_WOLInProgress = false; d->m_WOLInProgressWaitCondition.wakeAll(); } if (!serverSock && !proto_mismatch) { LOG(VB_GENERAL, LOG_ERR, "Connection to master server timed out.\n\t\t\t" "Either the server is down or the master server settings" "\n\t\t\t" "in mythtv-settings does not contain the proper IP address\n"); } else { QCoreApplication::postEvent( d->m_GUIcontext, new MythEvent("CONNECTION_RESTABLISHED")); } return serverSock; }