11package exporter
22
33import (
4+ "bytes"
5+ "crypto/tls"
46 "encoding/json"
57 "fmt"
68 "github.com/coder/quartz"
79 "log"
810 "net/http"
11+ "net/url"
912 "regexp"
1013 "strings"
1114 "time"
1215)
1316
17+ // Struct for the JSON body of POST requests
18+ type FrmApiRequest struct {
19+ Function string `json:"function"`
20+ Endpoint string `json:"endpoint"`
21+ }
22+
23+ // Reusable HTTP client for HTTPS w/ self-signed certs
24+ var tlsClient = & http.Client {
25+ Timeout : 10 * time .Second ,
26+ Transport : & http.Transport {
27+ TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
28+ },
29+ }
30+
1431var timeRegex = regexp .MustCompile (`\d\d:\d\d:\d\d` )
1532
1633var Clock = quartz .NewReal ()
@@ -35,7 +52,7 @@ func parseBool(b bool) float64 {
3552 }
3653}
3754
38- func retrieveData (frmAddress string , details any ) error {
55+ func retrieveDataViaGET (frmAddress string , details any ) error {
3956 resp , err := http .Get (frmAddress )
4057
4158 if err != nil {
@@ -53,3 +70,58 @@ func retrieveData(frmAddress string, details any) error {
5370 err = decoder .Decode (& details )
5471 return err
5572}
73+
74+ func retrieveDataViaPOST (frmApiUrl string , endpointName string , details any ) error {
75+ reqBody := FrmApiRequest {
76+ Function : "frm" ,
77+ Endpoint : endpointName ,
78+ }
79+ jsonData , err := json .Marshal (reqBody )
80+ if err != nil {
81+ log .Printf ("error marshalling request body: %s\n " , err )
82+ return err
83+ }
84+
85+ req , err := http .NewRequest ("POST" , frmApiUrl , bytes .NewBuffer (jsonData ))
86+ if err != nil {
87+ log .Printf ("error creating POST request: %s\n " , err )
88+ return err
89+ }
90+ req .Header .Set ("Content-Type" , "application/json" )
91+
92+ resp , err := tlsClient .Do (req )
93+ if err != nil {
94+ log .Printf ("error fetching statistics from FRM: %s\n " , err )
95+ return err
96+ }
97+ defer resp .Body .Close ()
98+
99+ if resp .StatusCode != 200 {
100+ return fmt .Errorf ("non-200 returned when retrieving data: %d" , resp .StatusCode )
101+ }
102+
103+ decoder := json .NewDecoder (resp .Body )
104+ err = decoder .Decode (& details )
105+ return err
106+ }
107+
108+ func retrieveData (frmAddress string , endpoint string , details any ) error {
109+ u , err := url .Parse (frmAddress )
110+ if err != nil {
111+ return fmt .Errorf ("invalid FRM address URL: %s" , err )
112+ }
113+
114+ // Check if we're using the Dedicated Server API (1.1)
115+ if strings .HasSuffix (u .Path , "/api/v1" ) {
116+ // Dedicated server mode.
117+ // frmAddress is "https://host:7777/api/v1"
118+ // endpoint is "/getPower", so we strip the slash
119+ endpointName := strings .TrimPrefix (endpoint , "/" )
120+ return retrieveDataViaPOST (frmAddress , endpointName , details )
121+ } else {
122+ // Web server mode.
123+ // frmAddress is "http://host:8080"
124+ // endpoint is "/getPower"
125+ return retrieveDataViaGET (frmAddress + endpoint , details )
126+ }
127+ }
0 commit comments