Создание запуска из командной строки и конвертации в файл

This commit is contained in:
Anatoly Prohacky 2023-04-29 10:24:01 +10:00
parent d3397d8e4c
commit 73013604c9
10 changed files with 119 additions and 87 deletions

View File

@ -1,8 +1,8 @@
build:
go build -v ./cmd/apisirius
go build -v ./cmd/sirius
run:
go run ./cmd/apisirius
go run ./cmd/sirius
.DEFAULT_GOAL := build

15
README.md Normal file
View File

@ -0,0 +1,15 @@
Онлайн конвертер конфураций ППКУП "Сириус" v1.03.022 (Болид)
Предназначен для конвертации сохраненой конфигурации c ППКУП "Сириус" v1.03.022 в формате "json", в удобно читаемый формат файла типа exel, для последующей работы с ним (например создании инструкций).
В выходном файле присутствуют поля. Номер зоны, Наименование зоны, Адреса прибора и шлейфы входящие в данную зону.
Запуск конвертации из командной строки и из файла
./sirius --file --conv-path="./converts" --conv-file="sirius.json"
Запуск API Сервера
./sirius --api --conf-path="./configs" --conf-file="config.yml"

View File

@ -1,27 +0,0 @@
package main
import (
"flag"
"fmt"
"gitstore.ru/tolikproh/sirius/internal/server"
)
func main() {
flag.Parse()
cfg, err := initConfig()
if err != nil {
fmt.Printf("Error initializing configs file (configs set default): %s\n", err.Error())
}
log := NewLogger(cfg)
app := server.New(cfg, log)
fmt.Printf("Start server on lister port: %s\n", cfg.Srv.Port)
if err := app.Run(); err != nil {
log.Fatalf("%s", err.Error())
}
}

25
cmd/cli/main.go Normal file
View File

@ -0,0 +1,25 @@
package main
import (
"flag"
"fmt"
)
func main() {
wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("numb", 42, "an int")
forkPtr := flag.Bool("api", false, "Start Api Server")
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
flag.Parse()
fmt.Println("word:", *wordPtr)
fmt.Println("numb:", *numbPtr)
fmt.Println("api:", *forkPtr)
fmt.Println("svar:", svar)
fmt.Println("tail:", flag.Args())
}

View File

@ -8,13 +8,21 @@ import (
)
var (
configPath string
configFile string = "config"
apiPtr *bool
configPath string
configFile string = "config"
filePtr *bool
filePathConv string
fileConv string = "sirius.json"
)
func init() {
apiPtr = flag.Bool("api", false, "Start Api Server")
flag.StringVar(&configPath, "conf-path", "configs", "path to config file 'config.yml'")
flag.StringVar(&configFile, "conf-file", "config", "name file to config")
filePtr = flag.Bool("file", false, "File converted cli")
flag.StringVar(&filePathConv, "conv-path", "converts", "path to converts file 'sirius.json'")
flag.StringVar(&fileConv, "conv-file", "sirius.json", "name file to converting")
}
func initConfig() (*model.Config, error) {

37
cmd/sirius/main.go Normal file
View File

@ -0,0 +1,37 @@
package main
import (
"flag"
"fmt"
"gitstore.ru/tolikproh/sirius/internal/controller/file"
"gitstore.ru/tolikproh/sirius/internal/server"
)
func main() {
flag.Parse()
if *apiPtr {
cfg, err := initConfig()
if err != nil {
fmt.Printf("Error initializing configs file (configs set default): %s\n", err.Error())
}
log := NewLogger(cfg)
app := server.New(cfg, log)
fmt.Printf("Start server on lister port: %s\n", cfg.Srv.Port)
if err := app.Run(); err != nil {
log.Fatalf("%s", err.Error())
}
return
}
if *filePtr {
file.FileConvert(filePathConv + "/" + fileConv)
return
}
fmt.Println("For help, used flags --help")
}

16
init/sirius.service Normal file
View File

@ -0,0 +1,16 @@
[Unit]
Description=Sirius
After=syslog.target
After=network.target
After=nginx.service
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/sirius
ExecStart=/opt/sirius/sirius --api
Restart=always
[Install]
WantedBy=multi-user.target

View File

@ -1,75 +1,33 @@
package file
import (
"errors"
"net/http"
"os"
"path"
"strings"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
"gitstore.ru/tolikproh/sirius/internal/model"
"gitstore.ru/tolikproh/sirius/internal/service"
)
type Handler struct {
log *logrus.Logger
cfg *model.Config
}
func FileConvert(srcFilePathName string) error {
var (
TEXT_TYPES = map[string]interface{}{
"text/plain; charset=utf-8": nil,
}
)
srcDir, srcFileName := path.Split(srcFilePathName)
func New(cfg *model.Config, log *logrus.Logger) *Handler {
// HTTP Server
return &Handler{cfg: cfg, log: log}
}
dstFileName := strings.Split(srcFileName, ".")[0] + ".xlsx"
func (s *Handler) GinConvert(c *gin.Context) {
sessionId := uuid.New().String()
s.log.Printf("start convert. session id: %s; user agent: %s; remote addr: %s; file size [byte]: %d",
sessionId, c.Request.UserAgent(), c.Request.RemoteAddr, c.Request.ContentLength)
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, s.cfg.Srv.MaxSizeFile<<20)
file, fileHeader, err := c.Request.FormFile("file")
buffer, err := os.ReadFile(srcDir + srcFileName)
if err != nil {
s.log.Errorf("session id: %s. error code: 001. %s", sessionId, err.Error())
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
defer file.Close()
buffer := make([]byte, fileHeader.Size)
file.Read(buffer)
fileType := http.DetectContentType(buffer)
// Validate File Type
if _, ex := TEXT_TYPES[fileType]; !ex {
s.log.Errorf("session id: %s. error code: 002. formated data not text/plain", sessionId)
c.JSON(http.StatusBadRequest, gin.H{
"error": errors.New("formated data not text/plain").Error(),
})
return
return err
}
respBuff, err := service.SiriusConv(buffer)
if err != nil {
s.log.Errorf("session id: %s. error code: 004. %s", sessionId, err.Error())
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
return err
}
c.Data(200, "application/vnd.ms-excel", respBuff.Bytes())
s.log.Printf("session id: %s.converted: ok. filename: %s; file size: %d bytes", sessionId, fileHeader.Filename, fileHeader.Size)
err = os.WriteFile(srcDir+dstFileName, respBuff.Bytes(), 0644)
if err != nil {
return err
}
return nil
}