summary refs log tree commit diff
path: root/server.go
blob: 626a542ae3a79d205de20491e13909cc6a64191d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strings"

	"net/http"

	TLE "git.darknebu.la/Satellite/TLE"
	"github.com/gorilla/mux"
)

var (
	categories []string
	port       int
)

func main() {
	initFlags()
	r := mux.NewRouter()

	r.HandleFunc("/", indexHandler)
	r.HandleFunc("/dumpall", dumpallHandler)
	r.HandleFunc("/{station}/{name}", getHandler)

	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), r))
}

func initFlags() {
	flag.IntVar(&port, "p", 8080, "the port the server should listen on")
	flag.Parse()
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "%s", "<h1>Hello World</h1>")
}

// dumpallHandler dumps all categories
func dumpallHandler(w http.ResponseWriter, r *http.Request) {
	log.Println("[ ] Dumping all TLEs")

	// read the name of the categories from the categories.txt file and write
	// the result to the categories slice
	content, err := ioutil.ReadFile("categories.txt")
	if err != nil {
		log.Printf("%s", "could not read categories.txt file!")
	}
	lines := strings.Split(string(content), "\n")

	for _, line := range lines {
		categories = append(categories, line)
	}

	// download all the categories to the data/<category name> directory
	for _, category := range categories {
		downloadCategory(category)
	}

	log.Println("[+] Done dumping all TLEs")
}

// downloadCategory downloads the given category from celestrack
func downloadCategory(categoryName string) {

	// define where to download the TLEs from
	base := "https://celestrak.com/NORAD/elements/"
	downloadURL := fmt.Sprintf("%s%s.txt", base, categoryName)

	// define the HTTP GET request and make it
	resp, err := http.Get(downloadURL)
	if err != nil {
		log.Printf("Could not download %s", categoryName)
	}
	defer resp.Body.Close()

	// read the respose from the GET request
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Printf("Could not read the category %s", categoryName)
	}

	// write the response to the corresponding file
	filename := fmt.Sprintf("data/%s.txt", categoryName)
	f, err := os.Create(filename) // creating the file
	if err != nil {
		fmt.Printf("Could not create file data/%s.txt", categoryName)
	}
	_, err = f.WriteString(string(body)) // writing the TLE to the file
	if err != nil {
		fmt.Printf("Could not write to file data/%s.txt", categoryName)
	}
}

// get Handler returns the specified TLE
func getHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)

	// read the TLEs from the categories file
	//content, err := ioutil.ReadFile("categories.txt")
	//if err != nil {
	//	log.Println("Could note read categories.txt")
	//}

	// handle the response according to the query parameter "format"
	// if ?format=json is given, return
	if r.URL.Query().Get("format") == "json" {
		w.Header().Set("Content-Type", "application/json")

		RawTLE := `ISS (ZARYA)             
1 25544U 98067A   19229.39083552  .00000228  00000-0  11917-4 0  9993
2 25544  51.6447  57.6210 0007373 294.0868 138.8050 15.50381554184754`

		JsonTLE, err := TLE.NewTLE(RawTLE)
		if err != nil {
			fmt.Println(err)
		}

		// convert the TLE to json
		b, err := json.MarshalIndent(JsonTLE, "", " ")
		if err != nil {
			fmt.Println("error: ", err)
		}
		fmt.Fprintf(w, string(b))
		//fmt.Fprintf(w, "{\"response\": \"Getting the TLE for %s/%s as json\"}", vars["station"], vars["name"])
	} else {
		fmt.Fprintf(w, "Getting the TLE for %s/%s raw", vars["station"], vars["name"])
	}

}