added base code
This commit is contained in:
		
							
								
								
									
										4
									
								
								config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								config.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					listen:
 | 
				
			||||||
 | 
					  address: 0.0.0.0
 | 
				
			||||||
 | 
					  port: 80
 | 
				
			||||||
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					module git.bjphoster.com/source/yaskm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.22.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require (
 | 
				
			||||||
 | 
						github.com/gorilla/mux v1.8.1
 | 
				
			||||||
 | 
						gopkg.in/yaml.v2 v2.4.0
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										6
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 | 
				
			||||||
 | 
					github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
				
			||||||
							
								
								
									
										42
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"os/signal"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var APP_VERSION string = "latest"
 | 
				
			||||||
 | 
					var COMMIT_ID string = "undefined"
 | 
				
			||||||
 | 
					var ws *WebServer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						// Create a channel to receive the OS signals
 | 
				
			||||||
 | 
						sc := make(chan os.Signal, 1)
 | 
				
			||||||
 | 
						signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Initialize the WebService structure
 | 
				
			||||||
 | 
						ws = new(WebServer)
 | 
				
			||||||
 | 
						ws.Initialize()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Start the WebService
 | 
				
			||||||
 | 
						go ws.Start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Wait for a signal
 | 
				
			||||||
 | 
						<-sc
 | 
				
			||||||
 | 
						fmt.Println("Shutting down...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a context with a timeout for graceful shutdown
 | 
				
			||||||
 | 
						shCtx, shCancel := context.WithTimeout(context.Background(), 5*time.Second)
 | 
				
			||||||
 | 
						defer shCancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Shutdown the HTTP server
 | 
				
			||||||
 | 
						err := ws.HTTPServer.Shutdown(shCtx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Printf("Server shutdown error: %s", err)
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								routes.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								routes.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "github.com/gorilla/mux"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *WebServer) Routes(r *mux.Router) {
 | 
				
			||||||
 | 
						r.HandleFunc("/version", handleVersion).Methods("GET")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								templates/html/version.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								templates/html/version.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					    <head>
 | 
				
			||||||
 | 
					        <title>{{.Name}}</title>
 | 
				
			||||||
 | 
					    </head>
 | 
				
			||||||
 | 
					    <body>
 | 
				
			||||||
 | 
					        <p>
 | 
				
			||||||
 | 
					            Version: {{.Version}}<br />
 | 
				
			||||||
 | 
					            Commit ID: {{.CommitId}}
 | 
				
			||||||
 | 
					        </p>
 | 
				
			||||||
 | 
					    </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										67
									
								
								type_webserver.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								type_webserver.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gorilla/mux"
 | 
				
			||||||
 | 
						"gopkg.in/yaml.v2"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WebServer struct {
 | 
				
			||||||
 | 
						HTTPServer *http.Server
 | 
				
			||||||
 | 
						Listen     WSListen `yaml:"listen"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WSListen struct {
 | 
				
			||||||
 | 
						Address string `yaml:"address"`
 | 
				
			||||||
 | 
						Port    string `yaml:"port"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *WebServer) Initialize() {
 | 
				
			||||||
 | 
						// Initialize default values
 | 
				
			||||||
 | 
						s.Listen = WSListen{
 | 
				
			||||||
 | 
							Address: "0.0.0.0",
 | 
				
			||||||
 | 
							Port:    "80",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Attempt to read the config file
 | 
				
			||||||
 | 
						configFile, err := os.ReadFile("config.yml")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
 | 
								// File does not exist, log and use default config
 | 
				
			||||||
 | 
								fmt.Println("Config file not found, using default settings.")
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Some other error occurred when trying to read the file, exit
 | 
				
			||||||
 | 
								fmt.Println("Error reading config file:", err)
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// If the file exists, unmarshal it into the ServiceSettings struct
 | 
				
			||||||
 | 
							err = yaml.Unmarshal(configFile, &s)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Println("Error parsing config file:", err)
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *WebServer) Start() error {
 | 
				
			||||||
 | 
						// Create a new MUX router and an HTTP server
 | 
				
			||||||
 | 
						r := mux.NewRouter()
 | 
				
			||||||
 | 
						s.HTTPServer = &http.Server{
 | 
				
			||||||
 | 
							Addr:    s.Listen.Address + ":" + s.Listen.Port,
 | 
				
			||||||
 | 
							Handler: r,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Associate the various handlers (routes)
 | 
				
			||||||
 | 
						s.Routes(r)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Start the server
 | 
				
			||||||
 | 
						fmt.Println("Listening on", s.Listen.Address+":"+s.Listen.Port)
 | 
				
			||||||
 | 
						err := s.HTTPServer.ListenAndServe()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Return error, or nil
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								version.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								version.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "embed"
 | 
				
			||||||
 | 
						"html/template"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:embed templates/html/version.html
 | 
				
			||||||
 | 
					var versionTemplate string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func handleVersion(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
						type SiteInfo struct {
 | 
				
			||||||
 | 
							CommitId string
 | 
				
			||||||
 | 
							Name     string
 | 
				
			||||||
 | 
							Version  string
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmpl, _ := template.New("version.html").Parse(versionTemplate)
 | 
				
			||||||
 | 
						// Return (write) the version to the response body
 | 
				
			||||||
 | 
						tmpl.Execute(w, SiteInfo{
 | 
				
			||||||
 | 
							CommitId: COMMIT_ID,
 | 
				
			||||||
 | 
							Name:     "YASKM",
 | 
				
			||||||
 | 
							Version:  APP_VERSION,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user