29 #include <QCryptographicHash>
30 #include <QHostAddress>
52 if ( sSecurityPin.isEmpty() )
53 throw( QString(
"No Security Pin assigned. Run mythtv-setup to set one." ));
56 if ((sSecurityPin !=
"0000" ) && ( sPin != sSecurityPin ))
57 throw( QString(
"Not Authorized" ));
70 (sServerIP !=
"localhost"))
87 pDatabase->setPort ( params.
dbPort );
90 pDatabase->setName ( params.
dbName );
91 pDatabase->setType ( params.
dbType );
100 pVersion->setVersion ( MYTH_SOURCE_VERSION );
101 pVersion->setBranch ( MYTH_SOURCE_PATH );
102 pVersion->setProtocol ( MYTH_PROTO_VERSION );
103 pVersion->setBinary ( MYTH_BINARY_VERSION );
104 pVersion->setSchema ( MYTH_DATABASE_VERSION );
120 throw( QString(
"No MythCoreContext in GetHostName." ));
133 throw( QString(
"Database not open while trying to load list of hosts" ));
136 "SELECT DISTINCTROW hostname "
138 "WHERE (not isNull( hostname ))");
144 throw( QString(
"Database Error executing query." ));
154 oList.append( query.
value(0).toString() );
168 throw( QString(
"Database not open while trying to load settings"));
170 query.
prepare(
"SELECT DISTINCTROW value FROM settings;" );
176 throw( QString(
"Database Error executing query." ));
183 QStringList oResults;
188 oResults.append( query.
value(0).toString() );
198 const QString &sHostName )
203 throw( QString(
"Database not open while trying to list "
204 "Storage Group Dirs"));
206 if (!sGroupName.isEmpty() && !sHostName.isEmpty())
208 query.
prepare(
"SELECT id, groupname, hostname, dirname "
210 "WHERE groupname = :GROUP AND hostname = :HOST "
211 "ORDER BY groupname, hostname, dirname" );
215 else if (!sHostName.isEmpty())
217 query.
prepare(
"SELECT id, groupname, hostname, dirname "
219 "WHERE hostname = :HOST "
220 "ORDER BY groupname, hostname, dirname" );
223 else if (!sGroupName.isEmpty())
225 query.
prepare(
"SELECT id, groupname, hostname, dirname "
227 "WHERE groupname = :GROUP "
228 "ORDER BY groupname, hostname, dirname" );
232 query.
prepare(
"SELECT id, groupname, hostname, dirname "
234 "ORDER BY groupname, hostname, dirname" );
240 throw( QString(
"Database Error executing query." ));
253 pStorageGroupDir->setId ( query.
value(0).toInt() );
254 pStorageGroupDir->setGroupName ( query.
value(1).toString() );
255 pStorageGroupDir->setHostName ( query.
value(2).toString() );
256 pStorageGroupDir->setDirName ( query.
value(3).toString() );
267 const QString &sDirName,
268 const QString &sHostName )
273 throw( QString(
"Database not open while trying to add Storage Group "
276 if (sGroupName.isEmpty())
277 throw ( QString(
"Storage Group Required" ));
279 if (sDirName.isEmpty())
280 throw ( QString(
"Directory Name Required" ));
282 if (sHostName.isEmpty())
283 throw ( QString(
"HostName Required" ));
285 query.
prepare(
"SELECT COUNT(*) "
287 "WHERE groupname = :GROUPNAME "
288 "AND dirname = :DIRNAME "
289 "AND hostname = :HOSTNAME;");
290 query.
bindValue(
":GROUPNAME", sGroupName );
292 query.
bindValue(
":HOSTNAME" , sHostName );
297 throw( QString(
"Database Error executing query." ));
302 if (query.
value(0).toInt() > 0)
306 query.
prepare(
"INSERT storagegroup "
307 "( groupname, dirname, hostname ) "
309 "( :GROUPNAME, :DIRNAME, :HOSTNAME );");
310 query.
bindValue(
":GROUPNAME", sGroupName );
312 query.
bindValue(
":HOSTNAME" , sHostName );
318 throw( QString(
"Database Error executing query." ));
329 const QString &sDirName,
330 const QString &sHostName )
335 throw( QString(
"Database not open while trying to remove Storage "
338 if (sGroupName.isEmpty())
339 throw ( QString(
"Storage Group Required" ));
341 if (sDirName.isEmpty())
342 throw ( QString(
"Directory Name Required" ));
344 if (sHostName.isEmpty())
345 throw ( QString(
"HostName Required" ));
349 "WHERE groupname = :GROUPNAME "
350 "AND dirname = :DIRNAME "
351 "AND hostname = :HOSTNAME;");
352 query.
bindValue(
":GROUPNAME", sGroupName );
354 query.
bindValue(
":HOSTNAME" , sHostName );
359 throw( QString(
"Database Error executing query." ));
385 const QString &Application,
388 const QString &Thread,
391 const QString &Function,
392 const QDateTime &FromTime,
393 const QDateTime &ToTime,
394 const QString &Level,
395 const QString &MsgContains )
402 QString sql =
"SELECT DISTINCT host FROM logging ORDER BY host ASC";
403 if (!query.
exec(sql))
406 throw( QString(
"Database Error executing query." ));
411 QString availableHostName = query.
value(0).toString();
412 pLabelValue->setValue ( availableHostName );
413 pLabelValue->setActive ( availableHostName == HostName );
414 pLabelValue->setSelected( availableHostName == HostName );
417 sql =
"SELECT DISTINCT application FROM logging ORDER BY application ASC";
418 if (!query.
exec(sql))
421 throw( QString(
"Database Error executing query." ));
426 QString availableApplication = query.
value(0).toString();
427 pLabelValue->setValue ( availableApplication );
428 pLabelValue->setActive ( availableApplication == Application );
429 pLabelValue->setSelected( availableApplication == Application );
432 if (!HostName.isEmpty() && !Application.isEmpty())
435 sql =
"SELECT host, application, pid, tid, thread, filename, "
436 " line, function, msgtime, level, message "
438 " WHERE host = COALESCE(:HOSTNAME, host) "
439 " AND application = COALESCE(:APPLICATION, application) "
440 " AND pid = COALESCE(:PID, pid) "
441 " AND tid = COALESCE(:TID, tid) "
442 " AND thread = COALESCE(:THREAD, thread) "
443 " AND filename = COALESCE(:FILENAME, filename) "
444 " AND line = COALESCE(:LINE, line) "
445 " AND function = COALESCE(:FUNCTION, function) "
446 " AND msgtime >= COALESCE(:FROMTIME, msgtime) "
447 " AND msgtime <= COALESCE(:TOTIME, msgtime) "
448 " AND level <= COALESCE(:LEVEL, level) "
450 if (!MsgContains.isEmpty())
452 sql.append(
" AND message LIKE :MSGCONTAINS ");
454 sql.append(
" ORDER BY msgtime ASC;");
458 query.
bindValue(
":HOSTNAME", (HostName.isEmpty()) ? QString() : HostName);
459 query.
bindValue(
":APPLICATION", (Application.isEmpty()) ? QString() :
461 query.
bindValue(
":PID", ( PID == 0 ) ? QVariant(QVariant::ULongLong) :
463 query.
bindValue(
":TID", ( TID == 0 ) ? QVariant(QVariant::ULongLong) :
465 query.
bindValue(
":THREAD", (Thread.isEmpty()) ? QString() : Thread);
467 query.
bindValue(
":LINE", ( Line == 0 ) ? QVariant(QVariant::ULongLong) :
469 query.
bindValue(
":FUNCTION", (Function.isEmpty()) ? QString() : Function);
470 query.
bindValue(
":FROMTIME", (FromTime.isValid()) ? FromTime : QDateTime());
471 query.
bindValue(
":TOTIME", (ToTime.isValid()) ? ToTime : QDateTime());
472 query.
bindValue(
":LEVEL", (Level.isEmpty()) ?
473 QVariant(QVariant::ULongLong) :
476 if (!MsgContains.isEmpty())
478 query.
bindValue(
":MSGCONTAINS",
"%" + MsgContains +
"%" );
484 throw( QString(
"Database Error executing query." ));
491 pLogMessage->setHostName( query.
value(0).toString() );
492 pLogMessage->setApplication( query.
value(1).toString() );
493 pLogMessage->setPID( query.
value(2).toInt() );
494 pLogMessage->setTID( query.
value(3).toInt() );
495 pLogMessage->setThread( query.
value(4).toString() );
496 pLogMessage->setFilename( query.
value(5).toString() );
497 pLogMessage->setLine( query.
value(6).toInt() );
498 pLogMessage->setFunction( query.
value(7).toString() );
501 (LogLevel_t)query.
value(9).toInt()) );
502 pLogMessage->setMessage( query.
value(10).toString() );
515 const QString &sDefault )
522 throw( QString(
"Database not open while trying to load setting: %1")
531 pList->setHostName ( sHostName );
543 query.
prepare(
"SELECT data, hostname from settings "
544 "WHERE value = :KEY AND "
545 "(hostname = :HOSTNAME OR hostname IS NULL) "
546 "ORDER BY hostname DESC;" );
549 query.
bindValue(
":HOSTNAME", sHostName );
559 throw( QString(
"Database Error executing query." ));
564 if ( (sHostName.isEmpty()) ||
565 ((!sHostName.isEmpty()) &&
566 (sHostName == query.
value(1).toString())))
568 pList->setHostName( query.
value(1).toString() );
580 if (sHostName.isEmpty())
582 query.
prepare(
"SELECT value, data FROM settings "
583 "WHERE (hostname IS NULL)" );
587 query.
prepare(
"SELECT value, data FROM settings "
588 "WHERE (hostname = :HOSTNAME)" );
590 query.
bindValue(
":HOSTNAME", sHostName );
600 throw( QString(
"Database Error executing query." ));
612 pList->
Settings().insert( sKey, sDefault );
623 const QString &sValue )
625 bool bResult =
false;
635 throw ( QString(
"Key Required" ));
643 const QString &sOldPassword,
644 const QString &sNewPassword )
646 bool bResult =
false;
648 if (sUserName.isEmpty())
650 throw ( QString(
"UserName not supplied when trying to change "
654 if (sOldPassword.isEmpty())
656 throw ( QString(
"Old Password not supplied when trying to change "
657 "password for '%1'." ).arg(sUserName) );
660 if (sNewPassword.isEmpty())
662 throw ( QString(
"New Password not supplied when trying to change "
663 "password for '%1'." ).arg(sUserName) );
666 QCryptographicHash crypto( QCryptographicHash::Sha1 );
668 crypto.addData( sOldPassword.toUtf8() );
670 QString sPasswordHash( crypto.result().toBase64() );
674 throw ( QString(
"Incorrect Old Password supplied when trying to "
675 "change password for '%1'." ).arg(sUserName) );
679 crypto.addData( sNewPassword.toUtf8() );
696 const QString &sUserName,
697 const QString &sPassword,
698 const QString &sDBName,
701 bool bResult =
false;
703 QString db(
"mythconverg");
706 if (!sDBName.isEmpty())
712 bResult =
TestDatabase(sHostName, sUserName, sPassword, db, port);
722 const QString &sAddress,
726 bool bResult =
false;
728 if (sMessage.isEmpty())
731 if (Timeout < 0 || Timeout > 999)
735 "<mythmessage version=\"1\">\n"
736 " <text>" + sMessage +
"</text>\n"
737 " <timeout>" + QString::number(Timeout) +
"</timeout>\n"
740 QHostAddress address = QHostAddress::Broadcast;
741 unsigned short port = 6948;
743 if (!sAddress.isEmpty())
744 address.setAddress(sAddress);
749 QUdpSocket *sock =
new QUdpSocket();
750 QByteArray
utf8 = xmlMessage.toUtf8();
751 int size = utf8.length();
753 if (sock->writeDatagram(utf8.constData(),
size, address, port) < 0)
755 LOG(VB_GENERAL, LOG_ERR,
756 QString(
"Failed to send UDP/XML packet (Message: %1 "
757 "Address: %2 Port: %3")
758 .arg(sMessage).arg(sAddress).arg(port));
762 LOG(VB_GENERAL, LOG_DEBUG,
763 QString(
"UDP/XML packet sent! (Message: %1 Address: %2 Port: %3")
765 .arg(address.toString().toLocal8Bit().constData()).arg(port));
780 bool bResult =
false;
786 LOG(VB_GENERAL, LOG_NOTICE,
"Performing API invoked DB Backup.");
789 status = dbutil->
BackupDB(filename);
793 LOG(VB_GENERAL, LOG_NOTICE,
"Database backup succeeded.");
797 LOG(VB_GENERAL, LOG_ERR,
"Database backup failed.");
810 bool bResult =
false;
814 LOG(VB_GENERAL, LOG_NOTICE,
"Performing API invoked DB Check.");
820 LOG(VB_GENERAL, LOG_NOTICE,
"Database check complete.");
822 LOG(VB_GENERAL, LOG_ERR,
"Database check failed.");
835 bool bResult =
false;
840 LOG(VB_GENERAL, LOG_NOTICE,
"Profile Submission...");
844 LOG(VB_GENERAL, LOG_NOTICE,
"Profile Submitted.");
857 bool bResult =
false;
862 LOG(VB_GENERAL, LOG_NOTICE,
"Profile Deletion...");
866 LOG(VB_GENERAL, LOG_NOTICE,
"Profile Deleted.");
886 LOG(VB_GENERAL, LOG_NOTICE, QString(
"ProfileURL: %1").arg(sProfileURL));
899 QString sProfileUpdate;
907 sProfileUpdate = tUpdated.toString(
912 return sProfileUpdate;
921 QString sProfileText;