From b413c05d6f4c6ef79077599523262a2af83d2150 Mon Sep 17 00:00:00 2001 From: hiro98 Date: Wed, 8 Jul 2020 21:08:59 +0200 Subject: [PATCH] implement higher level interface --- src/stream/commander/api.clj | 109 ++++++++++++++++++++++++++++++- src/stream/commander/systemd.clj | 53 ++++++++++++--- test/stream/commander_test.clj | 99 ++++++++++++++++++++++++++-- 3 files changed, 244 insertions(+), 17 deletions(-) diff --git a/src/stream/commander/api.clj b/src/stream/commander/api.clj index e7adb6e..0a8f130 100644 --- a/src/stream/commander/api.clj +++ b/src/stream/commander/api.clj @@ -1,4 +1,14 @@ -(ns stream.commander.api) +(ns stream.commander.api + (:require [stream.commander.systemd :as sys] + [clojure.string :as string] + [taoensso.timbre :as timbre + :refer [log trace debug info warn error fatal report + logf tracef debugf infof warnf errorf fatalf reportf + spy get-env]] + [clojure.core.async + :as a + :refer [>! !! process id process-name unit-name monitor ffmpeg-config #{})] + (debug "Creating process with ID:" id) + (dosync + (commute processes assoc id process)) + process)) + +(defn delete-process! + "Deletes a process from the process map, stops it and deletes the unit file. + Returns `true` on success, `false` otherwise." + [id] + (debug "Removing process with ID:" id) + (if-let [proc (get @processes id)] + (let [{:keys [unit-name monitor]} proc + [_ close] monitor] + (sys/remove-service! unit-name) + (println close) + (close) + (dosync (commute processes dissoc id)) + true) + false)) + +(defn delete-all-processes! [] + "Deletes all processes." + (doseq [[id _] @processes] + (delete-process! id))) + +(defn get-process! + "Get the process with the id." + [id] + (get @processes id)) diff --git a/src/stream/commander/systemd.clj b/src/stream/commander/systemd.clj index ce77e93..60a9e3e 100644 --- a/src/stream/commander/systemd.clj +++ b/src/stream/commander/systemd.clj @@ -6,7 +6,11 @@ logf tracef debugf infof warnf errorf fatalf reportf spy get-env]] [clojure.java.shell :refer [sh]] - [slingshot.slingshot :refer [throw+]]) + [slingshot.slingshot :refer [throw+]] + [clojure.core.async + :as a + :refer [>! !! map [map] + (reduce (fn [result [key value]] + (assoc result (keyword key) (. value getValue))) + {} map)) + +;; TODO: implement removal +(defn create-monitor! + "Creates a monitoring channel for the service with the name. + Returns a vector with the channel and a function to close it." + [name] + (debug "Creating monitor for service:" name) + (let [chan (chan) + listener + (reify + UnitStateListener + (stateChanged [this unit properties] + (>!! chan (DBusMap->map properties))))] + (. (get-service! name) addListener listener) + [chan (fn [] + (close! chan) + (. (get-service! name) removeListener listener))])) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Graveyard ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/test/stream/commander_test.clj b/test/stream/commander_test.clj index b8ddcf9..35b5961 100644 --- a/test/stream/commander_test.clj +++ b/test/stream/commander_test.clj @@ -2,7 +2,10 @@ (:require [stream.commander.systemd :as systemd] [stream.commander.api :as api] [clojure.test :refer :all] - [clojure.java.io :as io])) + [clojure.java.io :as io] + [slingshot.slingshot :refer [try+]] + [clojure.core.async + :as a])) (deftest unit-files (testing "The rendering." @@ -20,9 +23,9 @@ (is (not (.exists (io/as-file (systemd/get-unit-path name)))))))) (deftest systemd-services - (let [name (str (java.util.UUID/randomUUID)) + (let [name (str "testing-" (java.util.UUID/randomUUID)) unit-path (systemd/create-unit-file! name - "cat /dev/zero" "test service")] + "cat /dev/zero" "test service")] (testing "loading the service" (systemd/reload-systemd!) (is (= :loaded (systemd/get-service-load-state! name)))) @@ -35,6 +38,11 @@ (systemd/stop-service! name) (is (= :inactive (systemd/get-service-state! name)))) + (testing "restarting the service" + (systemd/start-service! name) + (systemd/restart-service! name) + (is (= :active (systemd/get-service-state! name)))) + (testing "enabling the service" (systemd/enable-service! name) (is (= :enabled (systemd/get-service-file-state! name)))) @@ -45,4 +53,87 @@ (testing "removing the service" (systemd/remove-service! name) - (is (= :not-found (systemd/get-service-load-state! name)))))) + (is (= :not-found (systemd/get-service-load-state! name)))) + + (testing "creating a service automatically" + (systemd/create-service! name "cat /dev/zero" "test service") + (is (= :loaded (systemd/get-service-load-state! name)))) + + (let [[channel close] (systemd/create-monitor! name)] + (testing "detecting activity" + (systemd/restart-service! name) + (is (a/