1 package main 2 3 import ( 4 "net/http" 5 "os" 6 "path" 7 "sort" 8 "strconv" 9 "sync" 10 11 "vimagination.zapto.org/minewebgen/internal/data" 12 ) 13 14 type Servers struct { 15 mu sync.RWMutex 16 List []*data.Server 17 } 18 19 func (s *Servers) Get(id int) *data.Server { 20 for _, ser := range s.List { 21 if ser.ID == id { 22 return ser 23 } 24 } 25 return nil 26 } 27 28 func (s *Servers) New(path string) *data.Server { 29 sPath := freePath(path) 30 if sPath == "" { 31 return nil 32 } 33 s.mu.Lock() 34 defer s.mu.Unlock() 35 id := len(s.List) 36 for n, ser := range s.List { 37 if n != ser.ID { 38 id = n 39 break 40 } 41 } 42 ser := &data.Server{ 43 ID: id, 44 Path: sPath, 45 Name: "New Server", 46 Args: []string{"-Xmx1024M", "-Xms1024M"}, 47 Map: -1, 48 } 49 s.List = append(s.List, ser) 50 sort.Sort(s) 51 return ser 52 } 53 54 func (s *Servers) Remove(id int) { 55 s.mu.Lock() 56 s.mu.Unlock() 57 for n, ser := range s.List { 58 if ser.ID == id { 59 copy(s.List[n:], s.List[n+1:]) 60 s.List = s.List[:len(s.List)-1] 61 os.RemoveAll(ser.Path) 62 break 63 } 64 } 65 } 66 67 func (s *Servers) Download(w http.ResponseWriter, r *http.Request) { 68 b := path.Base(r.URL.Path) 69 if len(b) < 5 || b[len(b)-4:] != ".zip" { 70 http.Error(w, "not found", http.StatusNotFound) 71 return 72 } 73 id, err := strconv.Atoi(b[:len(b)-4]) 74 if err != nil { 75 http.Error(w, "not found", http.StatusNotFound) 76 } 77 serv := s.Get(id) 78 if serv == nil { 79 http.Error(w, "unknown sevrer", http.StatusNotFound) 80 return 81 } 82 serv.Lock() 83 defer serv.Unlock() 84 if serv.State != data.StateStopped { 85 http.Error(w, "server running", http.StatusBadGateway) 86 return 87 } 88 serv.State = data.StateBusy 89 serv.Unlock() 90 w.Header().Set("Content-Type", "application/zip") 91 archive(w, serv.Path) 92 serv.Lock() 93 serv.State = data.StateStopped 94 } 95 96 func (s *Servers) Len() int { 97 return len(s.List) 98 } 99 100 func (s *Servers) Less(i, j int) bool { 101 return s.List[i].ID < s.List[j].ID 102 } 103 104 func (s *Servers) Swap(i, j int) { 105 s.List[i], s.List[j] = s.List[j], s.List[i] 106 }