github.com/Cloud-Foundations/Dominator@v0.3.4/dom/herd/showImagesForSubs.go (about) 1 package herd 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "net/http" 8 "strings" 9 10 "github.com/Cloud-Foundations/Dominator/lib/constants" 11 "github.com/Cloud-Foundations/Dominator/lib/html" 12 "github.com/Cloud-Foundations/Dominator/lib/srpc" 13 "github.com/Cloud-Foundations/Dominator/lib/tags/tagmatcher" 14 "github.com/Cloud-Foundations/Dominator/lib/url" 15 proto "github.com/Cloud-Foundations/Dominator/proto/dominator" 16 ) 17 18 func (herd *Herd) getInfoForSubs(request proto.GetInfoForSubsRequest) ( 19 []proto.SubInfo, error) { 20 selectFunc := makeSelector(request.LocationsToMatch, 21 request.StatusesToMatch, tagmatcher.New(request.TagsToMatch, false)) 22 if len(request.Hostnames) < 1 { 23 herd.RLock() 24 defer herd.RUnlock() 25 subInfos := make([]proto.SubInfo, 0, len(herd.subsByIndex)) 26 for _, sub := range herd.subsByIndex { 27 if selectFunc(sub) { 28 subInfos = append(subInfos, sub.makeInfo()) 29 } 30 } 31 return subInfos, nil 32 } 33 subInfos := make([]proto.SubInfo, 0, len(request.Hostnames)) 34 herd.RLock() 35 defer herd.RUnlock() 36 for _, hostname := range request.Hostnames { 37 if sub, ok := herd.subsByName[hostname]; ok { 38 if selectFunc(sub) { 39 subInfos = append(subInfos, sub.makeInfo()) 40 } 41 } 42 } 43 return subInfos, nil 44 } 45 46 func (herd *Herd) listImagesForSubsHandler(w http.ResponseWriter, 47 req *http.Request) { 48 querySelectFunc := makeUrlQuerySelector(req.URL.Query()) 49 selectFunc := func(sub *Sub) bool { 50 return selectAliveSub(sub) && querySelectFunc(sub) 51 } 52 writer := bufio.NewWriter(w) 53 defer writer.Flush() 54 parsedQuery := url.ParseQuery(req.URL) 55 switch parsedQuery.OutputType() { 56 case url.OutputTypeCsv: 57 herd.showSubsCSV(writer, selectFunc) 58 case url.OutputTypeHtml: // Want the benchmarking endpoint instead. 59 fmt.Fprintln(writer, "HTML output not supported") 60 case url.OutputTypeJson: 61 herd.showSubsJSON(writer, selectFunc) 62 case url.OutputTypeText: 63 fmt.Fprintln(writer, "Text output not supported") 64 default: 65 fmt.Fprintln(writer, "Unknown output type") 66 } 67 } 68 69 func (herd *Herd) showImagesForSubsHandler(w io.Writer, req *http.Request) { 70 querySelectFunc := makeUrlQuerySelector(req.URL.Query()) 71 herd.showImagesForSubsHTML(w, func(sub *Sub) bool { 72 return selectAliveSub(sub) && querySelectFunc(sub) 73 }) 74 } 75 76 func (herd *Herd) showImagesForSubsHTML(writer io.Writer, 77 selectFunc func(*Sub) bool) { 78 fmt.Fprintf(writer, "<title>Dominator images for subs</title>") 79 fmt.Fprintln(writer, `<style> 80 table, th, td { 81 border-collapse: collapse; 82 } 83 </style>`) 84 if srpc.CheckTlsRequired() { 85 fmt.Fprintln(writer, "<body>") 86 } else { 87 fmt.Fprintln(writer, "<body bgcolor=\"#ffb0b0\">") 88 fmt.Fprintln(writer, 89 `<h1><center><font color="red">Running in insecure mode. You can get pwned!!!</center></font></h1>`) 90 } 91 if herd.updatesDisabledReason != "" { 92 fmt.Fprintf(writer, "<center>") 93 herd.writeDisableStatus(writer) 94 fmt.Fprintln(writer, "</center>") 95 } 96 fmt.Fprintln(writer, `<table border="1" style="width:100%">`) 97 tw, _ := html.NewTableWriter(writer, true, "Name", "Required Image", 98 "Planned Image", "Status", "Last Image Update", "Last Note") 99 subs := herd.getSelectedSubs(selectFunc) 100 for _, sub := range subs { 101 showImagesForSub(tw, sub) 102 } 103 tw.Close() 104 } 105 106 func showImagesForSub(tw *html.TableWriter, sub *Sub) { 107 var background string 108 if sub.isInsecure { 109 background = "yellow" 110 } 111 tw.OpenRow("", background) 112 defer tw.CloseRow() 113 subURL := fmt.Sprintf("http://%s:%d/", 114 strings.SplitN(sub.String(), "*", 2)[0], constants.SubPortNumber) 115 tw.WriteData("", fmt.Sprintf("<a href=\"%s\">%s</a>", subURL, sub)) 116 sub.herd.showImage(tw, sub.mdb.RequiredImage, true) 117 sub.herd.showImage(tw, sub.mdb.PlannedImage, false) 118 tw.WriteData("", 119 fmt.Sprintf("<a href=\"showSub?%s\">%s</a>", 120 sub.mdb.Hostname, sub.publishedStatus.html())) 121 sub.herd.showImage(tw, sub.lastSuccessfulImageName, false) 122 tw.WriteData("", sub.lastNote) 123 }