initial commit for fuelprices
This commit is contained in:
commit
3e9262e843
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*.ini
|
||||||
|
fuelprices
|
12
common.ini.sample
Normal file
12
common.ini.sample
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[fuelprices]
|
||||||
|
remote_url=https://donnees.roulez-eco.fr/opendata/instantane
|
||||||
|
remote_filename=PrixCarburants_instantane.xml
|
||||||
|
xpath_base=.//pdv[@id='%s']/prix[@nom='%s']
|
||||||
|
pos=50000007
|
||||||
|
types=Gazole,SP95,SP98
|
||||||
|
tmp_dir=/tmp/
|
||||||
|
influx_host=nuc
|
||||||
|
influx_db=me
|
||||||
|
influx_port=8086
|
||||||
|
influx_user=influx
|
||||||
|
influx_pass=blablabla
|
99
fuelprices.go
Normal file
99
fuelprices.go
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
client "github.com/influxdata/influxdb1-client/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Srcfile source file
|
||||||
|
type Srcfile struct {
|
||||||
|
Filename string
|
||||||
|
Filepath string
|
||||||
|
Content []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type Outfile struct {
|
||||||
|
Content []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type FuelPricesConfig struct {
|
||||||
|
RemoteURL string
|
||||||
|
RemoteFilename string
|
||||||
|
XPathBase string
|
||||||
|
Pos []string
|
||||||
|
Types []string
|
||||||
|
TmpDir string
|
||||||
|
InfluxHost string
|
||||||
|
InfluxPort int
|
||||||
|
InfluxUser string
|
||||||
|
InfluxPass string
|
||||||
|
InfluxDB string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Price struct {
|
||||||
|
Id string
|
||||||
|
Fuel string
|
||||||
|
Amount float64
|
||||||
|
}
|
||||||
|
|
||||||
|
var szip Srcfile
|
||||||
|
var sxml Srcfile
|
||||||
|
var ofile Outfile
|
||||||
|
var err error
|
||||||
|
var zipfile *zip.Reader
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var fpc FuelPricesConfig
|
||||||
|
GetConfig("common.ini", &fpc)
|
||||||
|
|
||||||
|
sxml.Filename = fpc.RemoteFilename
|
||||||
|
sxml.Filepath = fmt.Sprintf("%s/%s", fpc.TmpDir, sxml.Filename)
|
||||||
|
|
||||||
|
httpClient, err := client.NewHTTPClient(client.HTTPConfig{
|
||||||
|
Addr: fmt.Sprintf("http://%s:%d", fpc.InfluxHost, fpc.InfluxPort),
|
||||||
|
Username: fpc.InfluxUser,
|
||||||
|
Password: fpc.InfluxPass,
|
||||||
|
})
|
||||||
|
|
||||||
|
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
|
||||||
|
Database: fpc.InfluxDB,
|
||||||
|
})
|
||||||
|
|
||||||
|
err = DownloadFile(fpc.RemoteURL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to download file")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ExtractZip()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable extract file")
|
||||||
|
}
|
||||||
|
|
||||||
|
var prices *[]Price
|
||||||
|
var now = time.Now()
|
||||||
|
|
||||||
|
GetPrices(&prices, fpc.Pos, fpc.Types, fpc.XPathBase)
|
||||||
|
|
||||||
|
for _, p := range *prices {
|
||||||
|
|
||||||
|
tags := map[string]string{"pdv": p.Id, "fuel": p.Fuel}
|
||||||
|
fields := map[string]interface{}{"value": p.Amount}
|
||||||
|
|
||||||
|
point, _ := client.NewPoint(
|
||||||
|
"fuel_price",
|
||||||
|
tags,
|
||||||
|
fields,
|
||||||
|
now,
|
||||||
|
)
|
||||||
|
|
||||||
|
bp.AddPoint(point)
|
||||||
|
err = httpClient.Write(bp)
|
||||||
|
HandleError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
143
functions.go
Normal file
143
functions.go
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"bytes"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/antchfx/xmlquery"
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ParseArgs() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetConfig(configfile string, fuelpricesconfig *FuelPricesConfig) error {
|
||||||
|
flag.Usage = Usage
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
config, err := ini.Load(configfile)
|
||||||
|
HandleFatalError(err)
|
||||||
|
|
||||||
|
var fpc FuelPricesConfig
|
||||||
|
|
||||||
|
fuelpricesSection := config.Section("fuelprices")
|
||||||
|
fpc.RemoteURL = fuelpricesSection.Key("remote_url").String()
|
||||||
|
fpc.RemoteFilename = fuelpricesSection.Key("remote_filename").String()
|
||||||
|
fpc.XPathBase = fuelpricesSection.Key("xpath_base").String()
|
||||||
|
fpc.InfluxHost = fuelpricesSection.Key("influx_host").String()
|
||||||
|
fpc.InfluxPort, err = fuelpricesSection.Key("influx_port").Int()
|
||||||
|
HandleError(err)
|
||||||
|
fpc.InfluxUser = fuelpricesSection.Key("influx_user").String()
|
||||||
|
fpc.InfluxPass = fuelpricesSection.Key("influx_pass").String()
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
fpc.InfluxDB = fuelpricesSection.Key("influx_db").String()
|
||||||
|
|
||||||
|
fpc.Pos = strings.Split(fuelpricesSection.Key("pos").String(), ",")
|
||||||
|
fpc.Types = strings.Split(fuelpricesSection.Key("types").String(), ",")
|
||||||
|
|
||||||
|
*fuelpricesconfig = fpc
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func DownloadFile(url string) error {
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
szip.Content, err = ioutil.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = resp.Body.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExtractZip() error {
|
||||||
|
|
||||||
|
zipfile, err = zip.NewReader(bytes.NewReader(szip.Content), int64(len(szip.Content)))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Unable to open zipfile")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range zipfile.File {
|
||||||
|
if f.Name == sxml.Filename {
|
||||||
|
rc, err := f.Open()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ofile.Content, err = ioutil.ReadAll(rc)
|
||||||
|
rc.Close()
|
||||||
|
} else {
|
||||||
|
log.Fatal("File not found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPrices(prices **[]Price, spos []string, stypes []string, sxpathbase string) error {
|
||||||
|
|
||||||
|
var pr []Price
|
||||||
|
var xml *xmlquery.Node
|
||||||
|
f := bytes.NewReader(ofile.Content)
|
||||||
|
xml, err = xmlquery.Parse(f)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
for _, station := range spos {
|
||||||
|
for _, fuel := range stypes {
|
||||||
|
query := fmt.Sprintf(sxpathbase, station, fuel)
|
||||||
|
list := xmlquery.FindOne(xml, query)
|
||||||
|
|
||||||
|
for _, i := range list.Attr {
|
||||||
|
if i.Name.Local == "valeur" {
|
||||||
|
var val float64
|
||||||
|
if s, err := strconv.ParseFloat(i.Value, 64); err == nil {
|
||||||
|
val = s
|
||||||
|
}
|
||||||
|
pr = append(pr, Price{Id: station, Fuel: fuel, Amount: val})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*prices = &pr
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandleError(err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleFatalError fatal errors
|
||||||
|
func HandleFatalError(err error) {
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usage displays possible arguments
|
||||||
|
func Usage() {
|
||||||
|
fmt.Fprintf(os.Stderr, "Usage: fuelprices [configfile]\n")
|
||||||
|
flag.PrintDefaults()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user