@zece14
Devops Engineer

Как на Golang написать http сервер, который по POST запрос будет установлять Cron и удалять через DELETE Crontab job в линуксе?

Как на Golang написать http сервер, который по POST запросу будет установлять Cron и удалять через DELETE Crontab job в линуксе?
На вход должен принимать один аргумент в виде цифры, то есть от 0 до 24, крон будет по часам отрабатывать, в зависимости что прилетело, вообще не силен в го, накидайте примеры плз если есть...
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
@darst
За работоспособность не ручаюсь, но вот код набросанный на коленке. Чтобы было понятно как это делается
package main

import (
	"errors"
	"fmt"
	"net/http"
	"os/exec"
)

func main() {
	handler := http.NewServeMux()
	handler.HandleFunc("/", handlerJob)

	http.ListenAndServe(":9000", handler)
}

func handlerJob(w http.ResponseWriter, r *http.Request) {
	w.Header().Add("Content-type", "application/json")
	switch r.Method {
	case http.MethodPost:
		hour := r.PostFormValue("hour")
		path := r.PostFormValue("path")
		if hour == "" || path == "" {
			fmt.Fprintln(w, "не задан обязательный атрибут")
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		cmd := exec.Command(fmt.Sprintf("(crontab -u mobman -l ; echo \"* %s * * * sh %s\") | crontab -u mobman -", hour, path))
		if errors.Is(cmd.Err, exec.ErrDot) {
			cmd.Err = nil
		}
		if err := cmd.Run(); err != nil {
			fmt.Fprintln(w, "не удалось выполнить команду")
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		w.WriteHeader(http.StatusOK)
	case http.MethodDelete:
		path := r.PostFormValue("path")
		if path == "" {
			fmt.Fprintln(w, "не задан обязательный атрибут")
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		cmd := exec.Command(fmt.Sprintf("crontab -u mobman -l | grep -v '%s' | crontab -u mobman -", path))
		if errors.Is(cmd.Err, exec.ErrDot) {
			cmd.Err = nil
		}
		if err := cmd.Run(); err != nil {
			fmt.Fprintln(w, "не удалось выполнить команду")
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		w.WriteHeader(http.StatusOK)
	default:
		fmt.Fprintln(w, "не верный метод")
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы