install_plugin.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "mime/multipart"
  7. "github.com/gin-gonic/gin"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
  9. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  10. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/verifier"
  11. "github.com/langgenius/dify-plugin-daemon/internal/db"
  12. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  13. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  14. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  15. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  16. "github.com/langgenius/dify-plugin-daemon/internal/types/models/curd"
  17. "github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
  18. )
  19. func InstallPluginFromPkg(config *app.Config, c *gin.Context, tenant_id string, dify_pkg_file multipart.File) {
  20. manager := plugin_manager.Manager()
  21. plugin_file, err := io.ReadAll(dify_pkg_file)
  22. if err != nil {
  23. c.JSON(200, entities.NewErrorResponse(-500, err.Error()))
  24. return
  25. }
  26. decoder, err := decoder.NewZipPluginDecoder(plugin_file)
  27. if err != nil {
  28. c.JSON(200, entities.NewErrorResponse(-500, err.Error()))
  29. return
  30. }
  31. if config.ForceVerifyingSignature {
  32. err := verifier.VerifyPlugin(decoder)
  33. if err != nil {
  34. c.JSON(200, entities.NewErrorResponse(-500, errors.Join(err, errors.New(
  35. "force verification has been enabled, and the plugin you want to install has a bad signature",
  36. )).Error()))
  37. return
  38. }
  39. }
  40. baseSSEService(
  41. func() (*stream.Stream[plugin_manager.PluginInstallResponse], error) {
  42. return manager.Install(tenant_id, decoder)
  43. },
  44. c,
  45. 3600,
  46. )
  47. }
  48. func InstallPluginFromIdentifier(
  49. tenant_id string,
  50. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  51. ) *entities.Response {
  52. // check if identifier exists
  53. plugin, err := db.GetOne[models.Plugin](
  54. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  55. )
  56. if err == db.ErrDatabaseNotFound {
  57. return entities.NewErrorResponse(-404, "Plugin not found")
  58. }
  59. if err != nil {
  60. return entities.NewErrorResponse(-500, err.Error())
  61. }
  62. if plugin.InstallType == plugin_entities.PLUGIN_RUNTIME_TYPE_REMOTE {
  63. return entities.NewErrorResponse(-500, "remote plugin not supported")
  64. }
  65. declaration := plugin.Declaration
  66. // install to this workspace
  67. if _, _, err := curd.InstallPlugin(tenant_id, plugin_unique_identifier, plugin.InstallType, &declaration); err != nil {
  68. return entities.NewErrorResponse(-500, err.Error())
  69. }
  70. return entities.NewSuccessResponse(true)
  71. }
  72. func FetchPluginFromIdentifier(
  73. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  74. ) *entities.Response {
  75. _, err := db.GetOne[models.Plugin](
  76. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  77. )
  78. if err == db.ErrDatabaseNotFound {
  79. return entities.NewSuccessResponse(false)
  80. }
  81. if err != nil {
  82. return entities.NewErrorResponse(-500, err.Error())
  83. }
  84. return entities.NewSuccessResponse(true)
  85. }
  86. func UninstallPlugin(
  87. tenant_id string,
  88. plugin_installation_id string,
  89. ) *entities.Response {
  90. // Check if the plugin exists for the tenant
  91. installation, err := db.GetOne[models.PluginInstallation](
  92. db.Equal("tenant_id", tenant_id),
  93. db.Equal("id", plugin_installation_id),
  94. )
  95. if err == db.ErrDatabaseNotFound {
  96. return entities.NewErrorResponse(-404, "Plugin installation not found for this tenant")
  97. }
  98. if err != nil {
  99. return entities.NewErrorResponse(-500, err.Error())
  100. }
  101. // Uninstall the plugin
  102. _, err = curd.UninstallPlugin(
  103. tenant_id,
  104. plugin_entities.PluginUniqueIdentifier(installation.PluginUniqueIdentifier),
  105. installation.ID,
  106. )
  107. if err != nil {
  108. return entities.NewErrorResponse(-500, fmt.Sprintf("Failed to uninstall plugin: %s", err.Error()))
  109. }
  110. return entities.NewSuccessResponse(true)
  111. }