diff --git a/docker-compose.yml b/docker-compose.yml index 03e7af2..8165d97 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,7 @@ services: signal-cli-rest-api: build: "." environment: + - USE_NATIVE=1 - PORT=8080 ports: - "8080:8080" #map docker port 8080 to host port 8080. diff --git a/src/api/api.go b/src/api/api.go index 9b87642..e25cbe1 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -22,6 +22,7 @@ import ( "github.com/h2non/filetype" log "github.com/sirupsen/logrus" qrcode "github.com/skip2/go-qrcode" + utils "github.com/bbernhard/signal-cli-rest-api/utils" ) const signalCliV2GroupError = "Cannot create a V2 group as self does not have a versioned profile" @@ -319,10 +320,21 @@ func runSignalCli(wait bool, args []string, stdin string) (string, error) { } else { log.Debug("*) docker exec -it /bin/bash") } - log.Debug("*) su signal-api") - log.Debug("*) signal-cli ", strings.Join(args, " ")) - cmd := exec.Command("signal-cli", args...) + signalCliBinary := "signal-cli" + if utils.GetEnv("USE_NATIVE", "0") == "1" { + if utils.GetEnv("SUPPORTS_NATIVE", "0") == "1" { + signalCliBinary = "signal-cli-native" + } else { + log.Error("signal-cli-native is not support on this system...falling back to signal-cli") + signalCliBinary = "signal-cli" + } + } + + log.Debug("*) su signal-api") + log.Debug("*) ", signalCliBinary, " ", strings.Join(args, " ")) + + cmd := exec.Command(signalCliBinary, args...) if stdin != "" { cmd.Stdin = strings.NewReader(stdin) } diff --git a/src/main.go b/src/main.go index a796fd5..47414b6 100644 --- a/src/main.go +++ b/src/main.go @@ -2,14 +2,15 @@ package main import ( "flag" - "os" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" "github.com/bbernhard/signal-cli-rest-api/api" + "github.com/bbernhard/signal-cli-rest-api/utils" _ "github.com/bbernhard/signal-cli-rest-api/docs" + "os" ) @@ -57,6 +58,16 @@ func main() { log.Info("Started Signal Messenger REST API") + supportsSignalCliNative := "0" + if _, err := os.Stat("/usr/bin/signal-cli-native"); err == nil { + supportsSignalCliNative = "1" + } + + err := os.Setenv("SUPPORTS_NATIVE", supportsSignalCliNative) + if err != nil { + log.Fatal("Couldn't set env variable: ", err.Error()) + } + api := api.NewApi(*signalCliConfig, *attachmentTmpDir, *avatarTmpDir) v1 := router.Group("/v1") { @@ -135,7 +146,7 @@ func main() { } } - swaggerPort := getEnv("PORT", "8080") + swaggerPort := utils.GetEnv("PORT", "8080") swaggerUrl := ginSwagger.URL("http://127.0.0.1:" + string(swaggerPort) + "/swagger/doc.json") router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, swaggerUrl)) @@ -143,9 +154,4 @@ func main() { router.Run() } -func getEnv(key string, defaultVal string) string { - if value, exists := os.LookupEnv(key); exists { - return value - } - return defaultVal -} +