diff --git a/client/client.go b/client/client.go index 3fd7496..68474e3 100644 --- a/client/client.go +++ b/client/client.go @@ -20,7 +20,6 @@ import ( "time" "unsafe" - "repositories.action2quare.com/ayo/gocommon/logger" "repositories.action2quare.com/ayo/houston/shared" "repositories.action2quare.com/ayo/houston/shared/protos" @@ -197,7 +196,7 @@ func NewClient() (HoustonClient, error) { var client *grpc.ClientConn for { - logger.Println("grpc.DialContext :", clientConfig.GrpcAddress) + shared.Logger().Println("grpc.DialContext :", clientConfig.GrpcAddress) dialContext, cancelDial := context.WithTimeout(context.Background(), 15*time.Second) client, err = grpc.DialContext(dialContext, clientConfig.GrpcAddress, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials())) if err == nil { @@ -206,11 +205,11 @@ func NewClient() (HoustonClient, error) { } cancelDial() - logger.Println("grpc.DialContext failed :", err) + shared.Logger().Println("grpc.DialContext failed :", err) time.Sleep(5 * time.Second) } - logger.Println("grpc.DialContext succeeded") + shared.Logger().Println("grpc.DialContext succeeded") exefile, err := os.Executable() if err != nil { return nil, err @@ -284,7 +283,7 @@ func NewClient() (HoustonClient, error) { var dr shared.DeployRequest unmarshal(&dr, resp.Args) - logger.Println(dr.Name, myname) + shared.Logger().Println(dr.Name, myname) if dr.Name == myname { if srcdir, replacer, err := hc.prepareUpdateSelf(&dr); err == nil { args := []string{ @@ -293,14 +292,15 @@ func NewClient() (HoustonClient, error) { filepath.ToSlash(os.Args[0]), } args = append(args, os.Args[1:]...) + shared.Logger().Println(replacer, args) cmd := exec.Command(replacer, args...) if err := cmd.Start(); err != nil { - logger.Println(err) + shared.Logger().Println(err) } else { hc.shutdownFunc() } } else { - logger.Println(err) + shared.Logger().Println(err) } } else { if err := hc.deploy(&dr); err == nil { @@ -308,7 +308,7 @@ func NewClient() (HoustonClient, error) { hc.deploys[dr.Name] = prog op.Refresh(ctx, hc.makeOperationQueryRequest()) } else { - logger.Println(err) + shared.Logger().Println(err) } } @@ -325,35 +325,35 @@ func NewClient() (HoustonClient, error) { } op.Refresh(ctx, hc.makeOperationQueryRequest()) } else { - logger.Println(err) + shared.Logger().Println(err) } case shared.Start: var sr shared.StartProcessRequest unmarshal(&sr, resp.Args) if err := hc.startChildProcess(&sr); err != nil { - logger.Println(err) + shared.Logger().Println(err) } case shared.Stop: var sr shared.StopProcessRequest unmarshal(&sr, resp.Args) if err := hc.stopChildProcess(&sr); err != nil { - logger.Println(err) + shared.Logger().Println(err) } case shared.Restart: var rr shared.RestartProcessRequest unmarshal(&rr, resp.Args) if err := hc.restartChildProcess(&rr); err != nil { - logger.Println(err) + shared.Logger().Println(err) } case shared.Upload: var ur shared.UploadRequest unmarshal(&ur, resp.Args) if err := hc.uploadFiles(&ur); err != nil { - logger.Println(err) + shared.Logger().Println(err) } } } @@ -390,7 +390,7 @@ func (hc *houstonClient) Start() { go func() { c := <-interrupt - logger.Println("interrupt!!!!!!!! :", c.String()) + shared.Logger().Println("interrupt!!!!!!!! :", c.String()) hc.shutdownFunc() }() @@ -402,7 +402,7 @@ func (hc *houstonClient) Start() { default: err := hc.checkOperation() if err != nil { - logger.Println("hc.checkUpdate failed :", err) + shared.Logger().Println("hc.checkUpdate failed :", err) } } } @@ -416,7 +416,7 @@ func (hc *houstonClient) checkOperation() error { defer func() { r := recover() if r != nil { - logger.Error(r) + shared.Logger().Println(r) } }() @@ -438,7 +438,7 @@ func (hc *houstonClient) checkOperation() error { cl.CloseSend() return err } - logger.Println(update) + shared.Logger().Println(update) hc.operationChan <- update } } diff --git a/client/deploy.go b/client/deploy.go index 98ab84d..c8fd6a8 100644 --- a/client/deploy.go +++ b/client/deploy.go @@ -13,8 +13,6 @@ import ( "path/filepath" "strings" - "repositories.action2quare.com/ayo/gocommon/logger" - "repositories.action2quare.com/ayo/houston/shared" "golang.org/x/text/encoding/korean" @@ -258,20 +256,24 @@ func (hc *houstonClient) prepareUpdateSelf(req *shared.DeployRequest) (srcdir st selfname, _ := os.Executable() srcreplacer := path.Join(path.Dir(fname), "replacer") + path.Ext(selfname) - replacer = "replacer" + path.Ext(selfname) + replacer = "./" + filepath.ToSlash("replacer"+path.Ext(selfname)) + err = copy(srcreplacer, replacer) + if err == nil { + err = os.Chmod(replacer, 0775) + } // replacer먼저 가져옴 - return filepath.ToSlash(tempdir), filepath.ToSlash(replacer), copy(srcreplacer, replacer) + return filepath.ToSlash(tempdir), replacer, err } func (hc *houstonClient) deploy(req *shared.DeployRequest) error { - logger.Println("start deploying") + shared.Logger().Println("start deploying") root, err := hc.prepareDeploy(req.Name, req.Version) if err != nil { return err } - logger.Println("start downloading", req.Url) + shared.Logger().Println("start downloading", req.Url) // verpath에 배포 시작 fname, err := download(root, hc.makeDownloadUrl(req.Url), req.AccessToken) if err != nil { diff --git a/client/operation.go b/client/operation.go index dbaaa81..f833f30 100644 --- a/client/operation.go +++ b/client/operation.go @@ -18,8 +18,6 @@ import ( "syscall" "time" - "repositories.action2quare.com/ayo/gocommon/logger" - "repositories.action2quare.com/ayo/houston/shared" "repositories.action2quare.com/ayo/houston/shared/protos" ) @@ -56,7 +54,7 @@ func (hc *houstonClient) uploadZipLogFile(zipFile string, name string, version s req, err := http.NewRequest("POST", hc.httpAddr+"/upload", zf) if err != nil { - logger.Error(err) + shared.Logger().Println(err) } req.Header.Set("Houston-Service-Name", name) req.Header.Set("Houston-Service-Version", version) @@ -121,19 +119,19 @@ func zipLogFiles(req *shared.UploadRequest, start, except string) (string, []str relative := file[len(root)+1:] fw, err := w.Create(relative) if err != nil { - logger.Error(err) + shared.Logger().Println(err) return "", nil, err } src, err := os.Open(file) if err != nil { - logger.Error(err) + shared.Logger().Println(err) return "", nil, err } defer src.Close() if _, err = io.Copy(fw, src); err != nil { - logger.Error(err) + shared.Logger().Println(err) return "", nil, err } } @@ -220,7 +218,7 @@ func (hc *houstonClient) launch(meta *procmeta) error { defer func() { r := recover() if r != nil { - logger.Println(r) + shared.Logger().Println(r) debug.PrintStack() } close(relayChan) @@ -266,10 +264,10 @@ func (hc *houstonClient) launch(meta *procmeta) error { os.Remove(oldf) } } else { - logger.Println("uploadZipLogFile failed :", err) + shared.Logger().Println("uploadZipLogFile failed :", err) } } else if err != nil { - logger.Println("zipLogFiles failed :", err) + shared.Logger().Println("zipLogFiles failed :", err) } }(startFile, nextFile) @@ -325,7 +323,7 @@ func (hc *houstonClient) launch(meta *procmeta) error { var errPrepareprocessLaunchFailed = errors.New("prepareProcessLaunch failed") func (hc *houstonClient) startChildProcess(req *shared.StartProcessRequest) error { - logger.Println("startChildProcess :", *req) + shared.Logger().Println("startChildProcess :", *req) if req.Version == "latest" { // 최신 버전을 찾음 latest, err := shared.FindLastestVersion(req.Name) @@ -503,10 +501,10 @@ func (hc *houstonClient) uploadFiles(req *shared.UploadRequest) error { req.Version = latest } - logger.Println("uploadFiles req :", *req) + shared.Logger().Println("uploadFiles req :", *req) for _, child := range hc.childProcs { if child.version == req.Version && child.name == req.Name { - logger.Println("uploadFiles found :", child.version, child.name) + shared.Logger().Println("uploadFiles found :", child.version, child.name) child.logUploadChan <- req return nil } @@ -521,10 +519,10 @@ func (hc *houstonClient) uploadFiles(req *shared.UploadRequest) error { os.Remove(oldf) } } else { - logger.Println("uploadZipLogFile failed :", err) + shared.Logger().Println("uploadZipLogFile failed :", err) } } else if err != nil { - logger.Println("zipLogFiles failed :", err) + shared.Logger().Println("zipLogFiles failed :", err) } return nil diff --git a/go.mod b/go.mod index 51cdc1d..b96eb6d 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( golang.org/x/text v0.9.0 google.golang.org/grpc v1.55.0 google.golang.org/protobuf v1.30.0 - repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab ) require ( diff --git a/go.sum b/go.sum index 2fd45fc..0b67ae9 100644 --- a/go.sum +++ b/go.sum @@ -18,5 +18,3 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab h1:EMlxwDayv3rn8ttJcJuDLYoHA5odVn85+LjdAuw+2dw= -repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab/go.mod h1:ng62uGMGXyQSeuxePG5gJAMtip4Rnspu5Tu7hgvaXns= diff --git a/main.go b/main.go index 1430f57..dfdb6ab 100644 --- a/main.go +++ b/main.go @@ -3,28 +3,30 @@ package main import ( "flag" - "repositories.action2quare.com/ayo/gocommon/logger" "repositories.action2quare.com/ayo/houston/client" "repositories.action2quare.com/ayo/houston/server" + "repositories.action2quare.com/ayo/houston/shared" ) var runAsClient = flag.Bool("client", false, "") var runAsServer = flag.Bool("server", false, "") func main() { + shared.InitLogger() + if !flag.Parsed() { flag.Parse() } if !*runAsClient && !*runAsServer { - logger.Fatal("client or server flag is needed") + shared.Logger().Fatal("client or server flag is needed") return } if *runAsClient { hc, err := client.NewClient() if err != nil { - logger.Fatal(err) + shared.Logger().Fatal(err) return } hc.Start() diff --git a/replacer/main.go b/replacer/main.go index 3636144..b118af3 100644 --- a/replacer/main.go +++ b/replacer/main.go @@ -2,8 +2,8 @@ package main import ( "errors" - "fmt" "io" + "log" "os" "os/exec" "path" @@ -48,23 +48,28 @@ func copy(src, dst string) error { } func main() { + logfile, _ := os.OpenFile("replacer.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) + defer logfile.Close() + stdlog := log.New(logfile, "", log.LstdFlags) + args := os.Args // args[1] : 나를 시작한 pid. pid가 종료될 때 까지 기다림 // args[2] : target 폴더 // args[3:] : 다시 시작할 때 넘겨줄 arguments(프로세스 이름 포함) - fmt.Println(args) + stdlog.Println(args) pid, err := strconv.Atoi(args[1]) if err != nil { - panic(err) + stdlog.Fatal(err) } proc, err := os.FindProcess(pid) if err != nil { - panic(err) + stdlog.Fatal(err) } proc.Wait() selfext, _ := os.Executable() + selfext = path.Base(selfext) entries, _ := os.ReadDir(args[2]) for _, ent := range entries { @@ -74,16 +79,27 @@ func main() { if ent.IsDir() { if err := os.MkdirAll(ent.Name(), 0775); err != nil { - panic(err) + stdlog.Fatal(err) } } else { if err := copy(path.Join(args[2], ent.Name()), ent.Name()); err != nil { - panic(err) + stdlog.Println("copy failed :", path.Join(args[2], ent.Name()), ent.Name()) + stdlog.Fatal(err) } } } - os.RemoveAll(args[2]) + err = os.RemoveAll(args[2]) + if err != nil { + stdlog.Println("os.RemoveAll failed :", args[2], err) + } + + err = os.Chmod(args[3], 0775) + if err != nil { + stdlog.Println("os.Chmod failed :", err) + } + + stdlog.Println("exec.Command :", args) cmd := exec.Command(args[3], args[4:]...) cmd.Start() } diff --git a/server/http_api.go b/server/http_api.go index 679356d..6c7c423 100644 --- a/server/http_api.go +++ b/server/http_api.go @@ -9,7 +9,6 @@ import ( "strconv" "time" - "repositories.action2quare.com/ayo/gocommon/logger" "repositories.action2quare.com/ayo/houston/shared" ) @@ -26,7 +25,7 @@ func (h *houstonHandler) GetAgents(w http.ResponseWriter, r *http.Request) { func (h *houstonHandler) GetDeploySources(w http.ResponseWriter, r *http.Request) { files, err := os.ReadDir(h.deployPath) if err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusInternalServerError) return } @@ -62,7 +61,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque // file, header, err := r.FormFile("file") if err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -70,7 +69,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque contents, err := io.ReadAll(file) if err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusInternalServerError) return } @@ -89,7 +88,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque } if err = os.MkdirAll(path.Dir(filename), 0775); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusInternalServerError) return } @@ -97,7 +96,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque // 파일 저장 err = os.WriteFile(filename, contents, 0644) if err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusInternalServerError) return } @@ -119,7 +118,7 @@ func (h *houstonHandler) DeleteDeploySource(w http.ResponseWriter, r *http.Reque // deploys 폴더는 파일시스템 서비스이므로 다운로드 가능 targetpath := path.Join(h.deployPath, name, version) if err := os.RemoveAll(targetpath); err != nil { - logger.Println("deleteDeploySource failed :", err) + shared.Logger().Println("deleteDeploySource failed :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -139,7 +138,7 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) { var targets []string if len(traws) > 0 { if err := json.Unmarshal([]byte(traws), &targets); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -153,7 +152,7 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) { relPath := path.Join(h.deployPath, name, version) files, err := os.ReadDir(relPath) if err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -200,7 +199,7 @@ func (h *houstonHandler) Undeploy(w http.ResponseWriter, r *http.Request) { var targets []string if len(traws) > 0 { if err := json.Unmarshal([]byte(traws), &targets); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -236,7 +235,7 @@ func (h *houstonHandler) StartProcess(w http.ResponseWriter, r *http.Request) { var targets []string if len(traws) > 0 { if err := json.Unmarshal([]byte(traws), &targets); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -275,7 +274,7 @@ func (h *houstonHandler) StopProcess(w http.ResponseWriter, r *http.Request) { var targets []string if len(traws) > 0 { if err := json.Unmarshal([]byte(traws), &targets); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } @@ -312,7 +311,7 @@ func (h *houstonHandler) UploadLogs(w http.ResponseWriter, r *http.Request) { } var targets []string if err := json.Unmarshal([]byte(traws), &targets); err != nil { - logger.Error(err) + shared.Logger().Println(err) w.WriteHeader(http.StatusBadRequest) return } diff --git a/server/http_handler.go b/server/http_handler.go index b192120..ee18331 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -10,7 +10,7 @@ import ( "runtime/debug" "strings" - "repositories.action2quare.com/ayo/gocommon/logger" + "repositories.action2quare.com/ayo/houston/shared" ) const ( @@ -57,7 +57,7 @@ func (h *houstonHandler) RegisterHandlers(serveMux *http.ServeMux, prefix string return err } - logger.Printf("houstonHandler registed. deployPath : %s, downloadPath : %s", h.deployPath, h.downloadPath) + shared.Logger().Printf("houstonHandler registed. deployPath : %s, downloadPath : %s", h.deployPath, h.downloadPath) if len(prefix) > 0 { prefix = "/" + prefix @@ -74,7 +74,7 @@ func (h *houstonHandler) RegisterHandlers(serveMux *http.ServeMux, prefix string defer func() { s := recover() if s != nil { - logger.Println(s) + shared.Logger().Println(s) debug.PrintStack() } io.Copy(io.Discard, r.Body) @@ -107,7 +107,7 @@ func (h *houstonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { defer func() { s := recover() if s != nil { - logger.Println(s) + shared.Logger().Println(s) debug.PrintStack() } }() @@ -132,7 +132,7 @@ func (h *houstonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { method, ok := h.methods[strings.ToLower(operation)] if !ok { // 없는 operation - logger.Println("fail to call api. operation is not valid :", operation) + shared.Logger().Println("fail to call api. operation is not valid :", operation) w.WriteHeader(http.StatusBadRequest) return } diff --git a/server/operation.go b/server/operation.go index 7af56ab..1992317 100644 --- a/server/operation.go +++ b/server/operation.go @@ -7,8 +7,6 @@ import ( "reflect" "sync" - "repositories.action2quare.com/ayo/gocommon/logger" - "repositories.action2quare.com/ayo/houston/shared" "repositories.action2quare.com/ayo/houston/shared/protos" ) @@ -75,7 +73,7 @@ func (sp *hostPool) regist(desc *protos.OperationQueryRequest) (string, chan *op sp.hosts[desc.Hostname] = host test, _ := json.Marshal(sp.hosts) - logger.Println(string(test)) + shared.Logger().Println(string(test)) return desc.Hostname, host.opChan } @@ -90,7 +88,7 @@ func (sp *hostPool) refresh(desc *protos.OperationQueryRequest) { } test, _ := json.Marshal(sp.hosts) - logger.Println(string(test)) + shared.Logger().Println(string(test)) } func (sp *hostPool) unregist(key string) { diff --git a/server/server.go b/server/server.go index cef30b3..9214dbe 100644 --- a/server/server.go +++ b/server/server.go @@ -6,7 +6,6 @@ import ( "net" "os" - "repositories.action2quare.com/ayo/gocommon/logger" "repositories.action2quare.com/ayo/houston/shared" "repositories.action2quare.com/ayo/houston/shared/protos" @@ -110,7 +109,7 @@ type Operation interface { func loadServerConfig() serverConfig { configFile, err := os.Open("config.json") if err != nil { - logger.Error(err) + shared.Logger().Println(err) return serverConfig{ GrpcPort: 8080, } @@ -126,14 +125,14 @@ func loadServerConfig() serverConfig { dec := json.NewDecoder(configFile) err = dec.Decode(&config) if err != nil { - logger.Error(err) + shared.Logger().Println(err) return serverConfig{ GrpcPort: 8080, } } if config.Houston == nil { - logger.Error(`"houston" object is missing in config.json`) + shared.Logger().Println(`"houston" object is missing in config.json`) return serverConfig{ GrpcPort: 8080, } @@ -167,7 +166,7 @@ type houstonServer struct { } func (hs *houstonServer) Start() error { - logger.Println("houston server is started at port", hs.port) + shared.Logger().Println("houston server is started at port", hs.port) lis, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", hs.port)) if err != nil { return err diff --git a/shared/logger.go b/shared/logger.go new file mode 100644 index 0000000..2e35f10 --- /dev/null +++ b/shared/logger.go @@ -0,0 +1,28 @@ +package shared + +import ( + "log" + "os" + "path" +) + +var defLogger *log.Logger + +func InitLogger() { + name, _ := os.Executable() + base := path.Base(name) + + logfile, _ := os.OpenFile(base+".log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) + defLogger = log.New(logfile, "", log.LstdFlags) +} + +func Logger() *log.Logger { + return defLogger +} + +func CloseLogger() { + outfile := defLogger.Writer().(*os.File) + if outfile != nil { + outfile.Close() + } +}