1
0

Use flags instead of config file. Also replaced HttpServer with a new code.

This commit is contained in:
Alexander Andreev 2023-08-06 03:17:18 +04:00
parent 832387f663
commit a1bf9cf30a
Signed by: Arav
GPG Key ID: D22A817D95815393
4 changed files with 60 additions and 29 deletions

View File

@ -1,7 +1,6 @@
package main package main
import ( import (
"dwelling-radio/internal/configuration"
ihttp "dwelling-radio/internal/http" ihttp "dwelling-radio/internal/http"
"dwelling-radio/internal/radio" "dwelling-radio/internal/radio"
"dwelling-radio/web" "dwelling-radio/web"
@ -18,7 +17,12 @@ import (
) )
var ( var (
configPath *string = flag.String("conf", "config.yaml", "path to configuration file") listenAddress = flag.String("listen", "/var/run/dwelling-radio/sock", "listen address (ip:port|unix_path)")
icecastUrl = flag.String("ic-url", "", "URL to an Icecast's status-json.xsl")
icecastPlaylistPath = flag.String("ic-playlist", "/var/log/icecast/playlist.log", "path to an Icecast's playlist.log file")
filelistPath = flag.String("filelist", "/srv/radio/filelist.html", "path to a filelist.html file")
mostListenedSongPath = flag.String("mls-file", "/mnt/data/appdata/mostlistenedsong", "path to a file that stores info about the most listened song")
songListLen = flag.Int("lst-len", 10, "number of songs to show in last N songs table")
showVersion *bool = flag.Bool("v", false, "show version") showVersion *bool = flag.Bool("v", false, "show version")
) )
@ -34,24 +38,19 @@ func main() {
return return
} }
config, err := configuration.Load(*configPath) if data, err := os.ReadFile(*mostListenedSongPath); err == nil {
if err != nil {
log.Fatalln(err)
}
if data, err := os.ReadFile(config.MostListenedSongPath); err == nil {
if err := radio.LoadMostListenedSong(data); err != nil { if err := radio.LoadMostListenedSong(data); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
} }
playlistWatcher := radio.NewPlaylistLogWatcher() playlistWatcher := radio.NewPlaylistLogWatcher()
if err := playlistWatcher.Watch(config.Icecast.Playlist, config.ListLastNSongs); err != nil { if err := playlistWatcher.Watch(*icecastPlaylistPath, *songListLen); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
defer playlistWatcher.Close() defer playlistWatcher.Close()
hand := ihttp.NewHandlers(config) hand := ihttp.NewHandlers(*icecastUrl, *icecastPlaylistPath, *filelistPath, *songListLen)
r := httpr.New() r := httpr.New()
r.Handler(http.MethodGet, "/", hand.Index) r.Handler(http.MethodGet, "/", hand.Index)
@ -70,20 +69,16 @@ func main() {
srv := ihttp.NewHttpServer(r) srv := ihttp.NewHttpServer(r)
if err := srv.Start(config.SplitNetworkAddress()); err != nil { if err := srv.Start(*listenAddress); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
if typ, addr := config.SplitNetworkAddress(); typ == "unix" {
defer os.Remove(addr)
}
doneSignal := make(chan os.Signal, 1) doneSignal := make(chan os.Signal, 1)
signal.Notify(doneSignal, os.Interrupt, syscall.SIGINT, syscall.SIGTERM, syscall.SIGSEGV) signal.Notify(doneSignal, os.Interrupt, syscall.SIGINT, syscall.SIGTERM, syscall.SIGSEGV)
<-doneSignal <-doneSignal
os.WriteFile(config.MostListenedSongPath, radio.StoreMostListenedSong(), fs.ModePerm) os.WriteFile(*mostListenedSongPath, radio.StoreMostListenedSong(), fs.ModePerm)
if err := srv.Stop(); err != nil { if err := srv.Stop(); err != nil {
log.Fatalln(err) log.Fatalln(err)

View File

@ -7,7 +7,12 @@ After=network-online.target icecast.service
Type=simple Type=simple
Restart=on-failure Restart=on-failure
DynamicUser=yes DynamicUser=yes
ExecStart=/usr/bin/dwelling-radio -conf /etc/dwelling/radio.yaml ExecStart=/usr/bin/dwelling-radio -listen /var/run/dwelling-radio/sock \
-ic-url http://radio.arav.home.arpa/status-json.xsl \
-ic-playlist /var/log/icecast/playlist.log \
-filelist /srv/radio/filelist.html \
-mls-file /mnt/data/appdata/mostlistenedsong \
-lst-len 10
ReadOnlyPaths=/ ReadOnlyPaths=/

View File

@ -1,7 +1,6 @@
package http package http
import ( import (
"dwelling-radio/internal/configuration"
"dwelling-radio/internal/radio" "dwelling-radio/internal/radio"
"dwelling-radio/pkg/utils" "dwelling-radio/pkg/utils"
"dwelling-radio/web" "dwelling-radio/web"
@ -15,15 +14,22 @@ import (
const FormatISO8601 = "2006-01-02T15:04:05-0700" const FormatISO8601 = "2006-01-02T15:04:05-0700"
type Handlers struct { type Handlers struct {
conf *configuration.Configuration icecastUrl string
icecastPlaylistPath string
songListLen int
filelistPath string
} }
func NewHandlers(conf *configuration.Configuration) *Handlers { func NewHandlers(icecastUrl, icecastPlaylistPath, filelistPath string, songListLen int) *Handlers {
return &Handlers{conf: conf} return &Handlers{
icecastUrl: icecastUrl,
icecastPlaylistPath: icecastPlaylistPath,
songListLen: songListLen,
filelistPath: filelistPath}
} }
func (h *Handlers) Index(w http.ResponseWriter, r *http.Request) { func (h *Handlers) Index(w http.ResponseWriter, r *http.Request) {
status, err := radio.IcecastGetStatus(h.conf.Icecast.URL) status, err := radio.IcecastGetStatus(h.icecastUrl)
if err != nil { if err != nil {
log.Println("failed to get Icecast status:", err) log.Println("failed to get Icecast status:", err)
} else { } else {
@ -36,7 +42,7 @@ func (h *Handlers) Index(w http.ResponseWriter, r *http.Request) {
} }
} }
songs, err := radio.IcecastLastSongs(h.conf.Icecast.Playlist) songs, err := radio.IcecastLastSongs(h.icecastPlaylistPath)
if err != nil { if err != nil {
log.Println("cannot retrieve last songs:", err) log.Println("cannot retrieve last songs:", err)
} else { } else {
@ -47,11 +53,11 @@ func (h *Handlers) Index(w http.ResponseWriter, r *http.Request) {
} }
} }
web.Index(utils.MainSite(r.Host), h.conf.ListLastNSongs, status, &songs, r, w) web.Index(utils.MainSite(r.Host), h.songListLen, status, &songs, r, w)
} }
func (h *Handlers) Status(w http.ResponseWriter, r *http.Request) { func (h *Handlers) Status(w http.ResponseWriter, r *http.Request) {
status, err := radio.IcecastGetStatus(h.conf.Icecast.URL) status, err := radio.IcecastGetStatus(h.icecastUrl)
if err != nil { if err != nil {
log.Println("cannot retrieve Icecast status:", err) log.Println("cannot retrieve Icecast status:", err)
http.Error(w, "cannot retrieve Icecast status", http.StatusInternalServerError) http.Error(w, "cannot retrieve Icecast status", http.StatusInternalServerError)
@ -71,7 +77,7 @@ func (h *Handlers) Status(w http.ResponseWriter, r *http.Request) {
} }
func (h *Handlers) LastSong(w http.ResponseWriter, r *http.Request) { func (h *Handlers) LastSong(w http.ResponseWriter, r *http.Request) {
song, err := radio.IcecastLastSong(h.conf.Icecast.Playlist) song, err := radio.IcecastLastSong(h.icecastPlaylistPath)
if err != nil { if err != nil {
log.Println("cannot retrieve last songs:", err) log.Println("cannot retrieve last songs:", err)
} }
@ -97,7 +103,7 @@ func (h *Handlers) Playlist(w http.ResponseWriter, _ *http.Request) {
func (h *Handlers) Filelist(w http.ResponseWriter, _ *http.Request) { func (h *Handlers) Filelist(w http.ResponseWriter, _ *http.Request) {
w.Header().Add("Content-Type", "text/html") w.Header().Add("Content-Type", "text/html")
data, _ := os.ReadFile(h.conf.FilelistPath) data, _ := os.ReadFile(h.filelistPath)
w.Write(data) w.Write(data)
} }

View File

@ -5,12 +5,15 @@ import (
"log" "log"
"net" "net"
"net/http" "net/http"
"net/netip"
"os" "os"
"strings"
"time" "time"
) )
type HttpServer struct { type HttpServer struct {
s http.Server s http.Server
addr net.Addr
} }
func NewHttpServer(r http.Handler) *HttpServer { func NewHttpServer(r http.Handler) *HttpServer {
@ -20,7 +23,23 @@ func NewHttpServer(r http.Handler) *HttpServer {
Handler: r}} Handler: r}}
} }
func (s *HttpServer) Start(network, address string) error { func (s *HttpServer) Start(address string) error {
var network string
if !strings.ContainsRune(address, ':') {
network = "unix"
} else {
ap, err := netip.ParseAddrPort(address)
if err != nil {
return err
}
if ap.Addr().Is4() {
network = "tcp4"
} else if ap.Addr().Is6() {
network = "tcp6"
}
}
listener, err := net.Listen(network, address) listener, err := net.Listen(network, address)
if err != nil { if err != nil {
return err return err
@ -30,6 +49,8 @@ func (s *HttpServer) Start(network, address string) error {
os.Chmod(address, 0777) os.Chmod(address, 0777)
} }
s.addr = listener.Addr()
go func() { go func() {
if err = s.s.Serve(listener); err != nil && err != http.ErrServerClosed { if err = s.s.Serve(listener); err != nil && err != http.ErrServerClosed {
log.Fatalln(err) log.Fatalln(err)
@ -43,6 +64,10 @@ func (s *HttpServer) Stop() error {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() defer cancel()
if s.addr.Network() == "unix" {
defer os.Remove(s.addr.String())
}
if err := s.s.Shutdown(ctx); err != nil { if err := s.s.Shutdown(ctx); err != nil {
return err return err
} }