|
@@ -1,12 +1,18 @@
|
|
|
package remote_manager
|
|
|
|
|
|
import (
|
|
|
+ "bufio"
|
|
|
"context"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "net"
|
|
|
+ "os"
|
|
|
+ "os/exec"
|
|
|
+ "strings"
|
|
|
"sync"
|
|
|
|
|
|
"github.com/langgenius/dify-plugin-daemon/internal/types/app"
|
|
|
+ "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
|
|
|
"github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
|
|
|
"github.com/panjf2000/gnet/v2"
|
|
|
|
|
@@ -52,7 +58,23 @@ func (r *RemotePluginServer) Stop() error {
|
|
|
|
|
|
// Launch starts the server
|
|
|
func (r *RemotePluginServer) Launch() error {
|
|
|
- err := gnet.Run(
|
|
|
+ // kill the process if port is already in use
|
|
|
+ listener, err := net.Listen("tcp", fmt.Sprintf(":%d", r.server.port))
|
|
|
+ if err != nil && strings.Contains(err.Error(), "address already in use") {
|
|
|
+ scanner := bufio.NewScanner(os.Stdin)
|
|
|
+ log.Info("Port is already in use, do you want to kill the process using the port? (y/n)")
|
|
|
+ for scanner.Scan() {
|
|
|
+ if scanner.Text() == "y" {
|
|
|
+ exec.Command("fuser", "-k", "tcp", fmt.Sprintf("%d", r.server.port)).Run()
|
|
|
+ } else if scanner.Text() == "n" {
|
|
|
+ return errors.New("port is already in use")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ listener.Close()
|
|
|
+ }
|
|
|
+
|
|
|
+ err = gnet.Run(
|
|
|
r.server, r.server.addr, gnet.WithMulticore(r.server.multicore),
|
|
|
gnet.WithNumEventLoop(r.server.num_loops),
|
|
|
)
|
|
@@ -79,6 +101,7 @@ func NewRemotePluginServer(config *app.Config) *RemotePluginServer {
|
|
|
multicore := true
|
|
|
s := &DifyServer{
|
|
|
addr: addr,
|
|
|
+ port: config.PluginRemoteInstallingPort,
|
|
|
multicore: multicore,
|
|
|
num_loops: config.PluginRemoteInstallServerEventLoopNums,
|
|
|
response: response,
|