├── README.md ├── .gitignore ├── test └── asuka │ └── core_test.clj ├── src └── asuka │ ├── discovery.clj │ ├── util.clj │ └── core.clj ├── resources └── log4j2.xml ├── project.clj └── dev └── user.clj /README.md: -------------------------------------------------------------------------------- 1 | # asuka 2 | 3 | Pretend to be a UPnP device. 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /classes 3 | /checkouts 4 | pom.xml 5 | pom.xml.asc 6 | *.jar 7 | *.class 8 | /.lein-* 9 | /.nrepl-port 10 | .hgignore 11 | .hg/ 12 | -------------------------------------------------------------------------------- /test/asuka/core_test.clj: -------------------------------------------------------------------------------- 1 | (ns asuka.core-test 2 | (:require [clojure.test :refer :all] 3 | [asuka.core :refer :all])) 4 | 5 | (deftest a-test 6 | (testing "plus works" 7 | (is (= (+ 1 1) 2)))) 8 | -------------------------------------------------------------------------------- /src/asuka/discovery.clj: -------------------------------------------------------------------------------- 1 | (ns asuka.discovery 2 | (:require [clojure.tools.logging :as log] 3 | [com.stuartsierra.component :as component])) 4 | 5 | (defrecord Discovery [config] 6 | component/Lifecycle 7 | (start [component] 8 | (log/info "Starting Discovery component..") 9 | component) 10 | (stop [component] 11 | (log/info "Stopping Discovery component..") 12 | component)) 13 | -------------------------------------------------------------------------------- /resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject asuka "0.1.0-SNAPSHOT" 2 | :description "Pretend to be a UPnP device" 3 | :url "https://github.com/marsmining/asuka" 4 | :dependencies [[org.clojure/clojure "1.8.0"] 5 | [org.clojure/tools.logging "0.4.0"] 6 | [org.apache.logging.log4j/log4j-api "2.9.0"] 7 | [org.apache.logging.log4j/log4j-core "2.9.0"] 8 | [com.stuartsierra/component "0.3.2"]] 9 | :main ^:skip-aot asuka.core 10 | :profiles {:uberjar {:aot :all} 11 | :test {:dependencies []} 12 | :dev {:repl-options {:init-ns user} 13 | :source-paths ["dev"] 14 | :dependencies [[org.clojure/tools.namespace "0.2.11"]]}}) 15 | -------------------------------------------------------------------------------- /src/asuka/util.clj: -------------------------------------------------------------------------------- 1 | (ns asuka.util 2 | (:require [clojure.edn :as edn]) 3 | (:import [java.net ServerSocket] 4 | [java.lang.management ManagementFactory RuntimeMXBean])) 5 | 6 | (defn slurp-if-exists [file] 7 | (when (.exists (clojure.java.io/as-file file)) 8 | (slurp file))) 9 | 10 | (defn load-dev-config 11 | ([] 12 | (load-dev-config "./dev-config.edn")) 13 | ([file] 14 | (edn/read-string (slurp-if-exists file)))) 15 | 16 | (defn get-free-port [] 17 | (let [sock (ServerSocket. 0)] 18 | (try 19 | (.getLocalPort sock) 20 | (finally 21 | (.close sock))))) 22 | 23 | (defn get-jvm-args [] 24 | (into [] (-> (ManagementFactory/getRuntimeMXBean) 25 | (.getInputArguments)))) 26 | 27 | (defn get-jvm-collector-info [] 28 | (let [mx (ManagementFactory/getGarbageCollectorMXBeans)] 29 | (mapv #(.getName %) mx))) 30 | -------------------------------------------------------------------------------- /src/asuka/core.clj: -------------------------------------------------------------------------------- 1 | (ns asuka.core 2 | (:require [clojure.tools.logging :as log] 3 | [com.stuartsierra.component :as component] 4 | [asuka.util :refer [get-jvm-args get-jvm-collector-info]] 5 | [asuka.discovery :refer [map->Discovery]]) 6 | (:gen-class)) 7 | 8 | (def main-config {}) 9 | 10 | (defn run 11 | "Initializes and starts the whole system." 12 | [override-config] 13 | (log/info "Asuka booting..") 14 | (log/info "JVM Args:" (get-jvm-args)) 15 | (log/info "JVM Collector Info:" (get-jvm-collector-info)) 16 | (log/info "Override config:" override-config) 17 | (let [config (merge main-config override-config) 18 | system 19 | (component/map->SystemMap 20 | {:discovery (map->Discovery 21 | {:config config})})] 22 | (component/start system))) 23 | 24 | (defn -main 25 | "The actual main for our uberjar." 26 | [& args] 27 | (try 28 | (run {}) 29 | (catch Exception e 30 | (log/error e "Could not start system because of %s." (str e)) 31 | (System/exit 1)))) 32 | -------------------------------------------------------------------------------- /dev/user.clj: -------------------------------------------------------------------------------- 1 | (ns user 2 | (:require [clojure.tools.logging :as log] 3 | [clojure.java.javadoc :refer [javadoc]] 4 | [clojure.pprint :refer [pprint]] 5 | [clojure.reflect :refer [reflect]] 6 | [clojure.test :refer [run-all-tests]] 7 | [clojure.repl :refer [apropos dir doc find-doc pst source]] 8 | [clojure.tools.namespace.repl :refer [refresh refresh-all]] 9 | [com.stuartsierra.component :as component] 10 | [asuka.core :as core] 11 | [asuka.util :as u]) 12 | (:import [org.apache.logging.log4j LogManager])) 13 | 14 | (defonce system nil) 15 | 16 | (defn start 17 | [extra-config] 18 | (.reconfigure (LogManager/getContext false)) 19 | (alter-var-root 20 | #'system 21 | (constantly (core/run (merge (u/load-dev-config) extra-config))))) 22 | 23 | (defn stop [] 24 | (alter-var-root #'system (fn [s] (when s (component/stop s))))) 25 | 26 | (defn go 27 | ([extra-config] 28 | (start extra-config) 29 | :ready) 30 | ([] (go {}))) 31 | 32 | (defn reset [] 33 | (stop) 34 | (refresh :after 'user/go)) 35 | 36 | (defn run-tests [] 37 | (run-all-tests #"asuka.*-test")) 38 | 39 | (defn tests [] 40 | (stop) 41 | (refresh :after 'user/run-tests)) 42 | 43 | (comment 44 | 45 | (reset) 46 | 47 | ) 48 | --------------------------------------------------------------------------------