|
26 | 26 | #include "linglong/utils/command/env.h" |
27 | 27 | #include "linglong/utils/error/error.h" |
28 | 28 | #include "linglong/utils/finally/finally.h" |
| 29 | +#include "linglong/utils/hooks.h" |
29 | 30 | #include "linglong/utils/packageinfo_handler.h" |
30 | 31 | #include "linglong/utils/serialize/json.h" |
31 | 32 | #include "linglong/utils/transaction.h" |
@@ -738,6 +739,12 @@ QVariantMap PackageManager::installFromLayer(const QDBusUnixFileDescriptor &fd, |
738 | 739 | << "after install" << packageRef.toString() << ":" |
739 | 740 | << ret.error().message(); |
740 | 741 | } |
| 742 | + |
| 743 | + ret = executePostInstallHooks(*newRef); |
| 744 | + if (!ret) { |
| 745 | + taskRef.reportError(std::move(ret).error()); |
| 746 | + return; |
| 747 | + } |
741 | 748 | }; |
742 | 749 |
|
743 | 750 | auto refSpec = |
@@ -768,6 +775,18 @@ QVariantMap PackageManager::installFromUAB(const QDBusUnixFileDescriptor &fd, |
768 | 775 | return toDBusReply(-1, "invalid file descriptor"); |
769 | 776 | } |
770 | 777 |
|
| 778 | + std::unique_ptr<utils::InstallHookManager> installHookManager = |
| 779 | + std::make_unique<utils::InstallHookManager>(); |
| 780 | + auto ret = installHookManager->parseInstallHooks(); |
| 781 | + if (!ret) { |
| 782 | + return toDBusReply(ret); |
| 783 | + } |
| 784 | + |
| 785 | + ret = installHookManager->executeInstallHooks(fd.fileDescriptor()); |
| 786 | + if (!ret) { |
| 787 | + return toDBusReply(-1, "uab package signature verification failed."); |
| 788 | + } |
| 789 | + |
771 | 790 | auto uabRet = package::UABFile::loadFromFile(fd.fileDescriptor()); |
772 | 791 | if (!uabRet) { |
773 | 792 | return toDBusReply(uabRet); |
@@ -1072,6 +1091,12 @@ QVariantMap PackageManager::installFromUAB(const QDBusUnixFileDescriptor &fd, |
1072 | 1091 | } |
1073 | 1092 | } |
1074 | 1093 |
|
| 1094 | + auto ret = executePostInstallHooks(newAppRef); |
| 1095 | + if (!ret) { |
| 1096 | + taskRef.reportError(std::move(ret).error()); |
| 1097 | + return; |
| 1098 | + } |
| 1099 | + |
1075 | 1100 | transaction.commit(); |
1076 | 1101 | taskRef.updateState(linglong::api::types::v1::State::Succeed, "install uab successfully"); |
1077 | 1102 | }; |
@@ -1439,6 +1464,13 @@ void PackageManager::Install(PackageTask &taskContext, |
1439 | 1464 | } |
1440 | 1465 | } |
1441 | 1466 |
|
| 1467 | + auto ret = executePostInstallHooks(newRef); |
| 1468 | + if (!ret) { |
| 1469 | + taskContext.updateState(linglong::api::types::v1::State::Failed, |
| 1470 | + "Failed to execute postInstall hooks.\n" + ret.error().message()); |
| 1471 | + return; |
| 1472 | + } |
| 1473 | + |
1442 | 1474 | transaction.commit(); |
1443 | 1475 | taskContext.updateState(linglong::api::types::v1::State::Succeed, |
1444 | 1476 | "Install " + newRef.toString() + " (from repo: " |
@@ -1713,6 +1745,11 @@ void PackageManager::Uninstall(PackageTask &taskContext, |
1713 | 1745 | return; |
1714 | 1746 | } |
1715 | 1747 |
|
| 1748 | + auto ret = executePostUninstallHooks(ref); |
| 1749 | + if (!ret) { |
| 1750 | + qWarning() << "failed to execute postUninstall hooks" << ret.error(); |
| 1751 | + } |
| 1752 | + |
1716 | 1753 | transaction.commit(); |
1717 | 1754 |
|
1718 | 1755 | taskContext.updateState(linglong::api::types::v1::State::Succeed, |
@@ -2001,12 +2038,25 @@ void PackageManager::pullDependency(PackageTask &taskContext, |
2001 | 2038 | return; |
2002 | 2039 | } |
2003 | 2040 |
|
| 2041 | + auto ret = executePostInstallHooks(*runtime); |
| 2042 | + if (!ret) { |
| 2043 | + taskContext.updateState(linglong::api::types::v1::State::Failed, |
| 2044 | + LINGLONG_ERRV(ret).message()); |
| 2045 | + return; |
| 2046 | + } |
| 2047 | + |
2004 | 2048 | transaction.addRollBack([this, runtimeRef = *runtime, module]() noexcept { |
2005 | 2049 | auto result = this->repo.remove(runtimeRef.reference, module); |
2006 | 2050 | if (!result) { |
2007 | 2051 | qCritical() << result.error(); |
2008 | 2052 | Q_ASSERT(false); |
2009 | 2053 | } |
| 2054 | + |
| 2055 | + result = executePostUninstallHooks(runtimeRef); |
| 2056 | + if (!result) { |
| 2057 | + qCritical() << result.error(); |
| 2058 | + Q_ASSERT(false); |
| 2059 | + } |
2010 | 2060 | }); |
2011 | 2061 | } |
2012 | 2062 | } |
@@ -2041,6 +2091,27 @@ void PackageManager::pullDependency(PackageTask &taskContext, |
2041 | 2091 | if (isTaskDone(taskContext.subState())) { |
2042 | 2092 | return; |
2043 | 2093 | } |
| 2094 | + |
| 2095 | + auto ret = executePostInstallHooks(*base); |
| 2096 | + if (!ret) { |
| 2097 | + taskContext.updateState(linglong::api::types::v1::State::Failed, |
| 2098 | + LINGLONG_ERRV(ret).message()); |
| 2099 | + return; |
| 2100 | + } |
| 2101 | + |
| 2102 | + transaction.addRollBack([this, baseRef = *base, module]() noexcept { |
| 2103 | + auto result = this->repo.remove(baseRef, module); |
| 2104 | + if (!result) { |
| 2105 | + qCritical() << result.error(); |
| 2106 | + Q_ASSERT(false); |
| 2107 | + } |
| 2108 | + |
| 2109 | + result = executePostUninstallHooks(baseRef); |
| 2110 | + if (!result) { |
| 2111 | + qCritical() << result.error(); |
| 2112 | + Q_ASSERT(false); |
| 2113 | + } |
| 2114 | + }); |
2044 | 2115 | } |
2045 | 2116 |
|
2046 | 2117 | transaction.commit(); |
@@ -2431,4 +2502,51 @@ auto PackageManager::GenerateCache(const QString &reference) noexcept -> QVarian |
2431 | 2502 | return result; |
2432 | 2503 | } |
2433 | 2504 |
|
| 2505 | +utils::error::Result<void> |
| 2506 | +PackageManager::executePostInstallHooks(const package::Reference &ref) noexcept |
| 2507 | +{ |
| 2508 | + LINGLONG_TRACE("execute post install hooks for: " + ref.toString()); |
| 2509 | + |
| 2510 | + std::unique_ptr<utils::InstallHookManager> installHookManager = |
| 2511 | + std::make_unique<utils::InstallHookManager>(); |
| 2512 | + auto ret = installHookManager->parseInstallHooks(); |
| 2513 | + if (!ret) { |
| 2514 | + return LINGLONG_ERR(ret); |
| 2515 | + } |
| 2516 | + |
| 2517 | + auto layerDir = this->repo.getLayerDir(ref); |
| 2518 | + if (!layerDir) { |
| 2519 | + return LINGLONG_ERR(layerDir); |
| 2520 | + } |
| 2521 | + |
| 2522 | + auto appPath = layerDir->absolutePath(); |
| 2523 | + |
| 2524 | + ret = installHookManager->executePostInstallHooks(ref.id.toStdString(), appPath.toStdString()); |
| 2525 | + if (!ret) { |
| 2526 | + return LINGLONG_ERR(ret); |
| 2527 | + } |
| 2528 | + |
| 2529 | + return LINGLONG_OK; |
| 2530 | +} |
| 2531 | + |
| 2532 | +utils::error::Result<void> |
| 2533 | +PackageManager::executePostUninstallHooks(const package::Reference &ref) noexcept |
| 2534 | +{ |
| 2535 | + LINGLONG_TRACE("execute post uninstall hooks for: " + ref.toString()); |
| 2536 | + |
| 2537 | + std::unique_ptr<utils::InstallHookManager> installHookManager = |
| 2538 | + std::make_unique<utils::InstallHookManager>(); |
| 2539 | + auto ret = installHookManager->parseInstallHooks(); |
| 2540 | + if (!ret) { |
| 2541 | + return LINGLONG_ERR(ret); |
| 2542 | + } |
| 2543 | + |
| 2544 | + ret = installHookManager->executePostUninstallHooks(ref.id.toStdString()); |
| 2545 | + if (!ret) { |
| 2546 | + return LINGLONG_ERR(ret); |
| 2547 | + } |
| 2548 | + |
| 2549 | + return LINGLONG_OK; |
| 2550 | +} |
| 2551 | + |
2434 | 2552 | } // namespace linglong::service |
0 commit comments