package backend import ( "os" "os/exec" "path/filepath" "encoding/json" "errors" "git.noctra.dev/noctra/servtex/globals" "time" ) func getLocalTime() time.Time { timezone, _ := time.LoadLocation(globals.AppConfig.Timezone) return time.Now().In(timezone) } func getLocalTimePretty() string { return getLocalTime().Format("02.01.2006 15:04") } func LogLine(message string) { logline := "\n" + getLocalTime().Format(time.RFC3339) + " - " + message globals.LogFile.WriteString(logline) } // Helper for configReader() that does the actual reading // Also validates the populated fields func configReaderParse(filePath string, configOptionStorage *globals.Config) error { jsonData, err := os.ReadFile(filePath) if err == nil { err = json.Unmarshal(jsonData, &configOptionStorage) if err != nil { return errors.New("Config file could not be read") } } else { return errors.New("Config file does not exist") } return configValidator(*configOptionStorage) } func configValidator(config globals.Config) error { return nil } // Reads config file and stores the options in configOptionStorage // Tries executable/path/configFileName // %LOCALAPPDATA%\servtex\configFileName // ~/.config/servtex/configFileName func ConfigReader(configFileName string, configOptionStorage *globals.Config) error { exePath, err := os.Executable() if err == nil { path := filepath.Join(filepath.Dir(exePath), configFileName) err = configReaderParse(path, configOptionStorage) if err == nil { return nil } } localappdata := os.Getenv("LOCALAPPDATA") if localappdata != "" { path := filepath.Join(localappdata, "servtex", configFileName) err = configReaderParse(path, configOptionStorage) if err == nil { return nil } } path := filepath.Join("~", ".config", "servtex", configFileName) err = configReaderParse(path, configOptionStorage) if err == nil { return nil } return err } // Watches a specified directory and calls a function on change // Optionally, a minimum time to wait for consecutive changes can be specified func ChangeWatch(path string, callOnChange func()) { LogLine("File change noticed") } // Intended to be run as goroutine func LatexCompile(config globals.Config, execution *globals.LatexExecution) error { if !execution.ExecutionLock.TryLock() { LogLine("LaTeX execution already underway") return errors.New("Execution already in progress") } LogLine("LaTeX execution started") execution.ExecutionState = "Started" var latexCommand *exec.Cmd switch config.LatexEngine { case "lualatex": latexCommand = exec.Command( "lualatex", "-output-directory=" + config.LatexOutputPath, "-jobname=servtex", config.LatexSourceFilePath, ) default: execution.ExecutionState = "Unknown Latex Engine" execution.Output = []byte{} execution.Timestamp = getLocalTimePretty() execution.ExecutionLock.Unlock() return errors.New("Unknown Latex Engine") } execution.ExecutionState = "Running" stdout, err := latexCommand.Output() if err != nil { execution.ExecutionState = "Failed" return err } execution.Output = stdout execution.Timestamp = getLocalTimePretty() execution.ExecutionState = "Done" execution.ExecutionLock.Unlock() return nil }