diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..08f2a5e --- /dev/null +++ b/config.yml @@ -0,0 +1,9 @@ +# Uses the system's CURL binary to do so. +fetch_onion_instance_stats: true + +# TOR's Sock proxy address that CURL uses to connect to hidden services +tor_sock_proxy_address: "127.0.0.1" +tor_sock_proxy_port: 9050 + +# Minutes before refreshing the instance stats +minutes_between_refresh: 30 \ No newline at end of file diff --git a/src/helpers/helpers.cr b/src/helpers/helpers.cr new file mode 100644 index 0000000..8308c13 --- /dev/null +++ b/src/helpers/helpers.cr @@ -0,0 +1,7 @@ +require "yaml" + +def load_config() + config = YAML.parse(File.read("config.yml")) + return config +end + diff --git a/src/instances.cr b/src/instances.cr index 71c4551..67a36a1 100644 --- a/src/instances.cr +++ b/src/instances.cr @@ -18,6 +18,10 @@ require "http/client" require "kemal" require "uri" +require "./helpers/*" + +CONFIG = load_config() + Kemal::CLI.new ARGV macro rendered(filename) @@ -68,6 +72,23 @@ spawn do case type = host.split(".")[-1] when "onion" + type = "onion" + + if CONFIG["fetch_onion_instance_stats"]? + begin + args = Process.parse_arguments("--socks5-hostname '#{CONFIG["tor_sock_proxy_address"]}:#{CONFIG["tor_sock_proxy_port"]}' 'http://#{uri.host}/api/v1/stats'") + response = nil + Process.run("curl", args: args) do |result| + data = result.output.read_line + response = JSON.parse(data) + end + + stats = response + + rescue ex + stats = nil + end + end when "i2p" else type = uri.scheme.not_nil! @@ -88,7 +109,7 @@ spawn do INSTANCES.clear INSTANCES.merge! instances - sleep 5.minutes + sleep CONFIG["minutes_between_refresh"].as_i.minutes end end