diff --git a/tor-daemon/tor-daemon.py b/tor-daemon/tor-daemon.py
--- a/tor-daemon/tor-daemon.py
+++ b/tor-daemon/tor-daemon.py
#
@@ -84,7 +84,125 @@ def get_guard_counts(s):
#
+def get_exit_policy_stats(s):
#
+ ''' Get exit policies (if set) and generate stats based on them
#
+ Returns a list of statistics
#
+ utilities/telegraf-plugins#4
#
+ "name" : "server_mode_enabled",
#
+ # Fetch the ipv4 policy
#
+ res = send_and_respond(s, "GETINFO exit-policy/ipv4")
#
+ if len(res) < 1 or not res[0].startswith("250-"):
#
+ is_relay["value"] = "0"
#
+ stats.append(is_relay)
#
+ # We have exit policies of some form
#
+ stats.append(is_relay)
#
+ val = res[0].split("=")[1]
#
+ ipv4_stats = process_exit_policy(val)
#
+ for stat in ipv4_stats:
#
+ "name" : "ipv4_exit_policy_num_" + stat,
#
+ "value" : ipv4_stats[stat],
#
+ "fieldtype" : "field"
#
+ # Now do the same for ipv6 policies
#
+ res = send_and_respond(s, "GETINFO exit-policy/ipv6")
#
+ if len(res) < 1 or not res[0].startswith("250-"):
#
+ # can't proceed, so return what we've got
#
+ val = res[0].split("=")[1]
#
+ ipv6_stats = process_exit_policy(val)
#
+ for stat in ipv6_stats:
#
+ "name" : "ipv6_exit_policy_num_" + stat,
#
+ "value" : ipv6_stats[stat],
#
+ "fieldtype" : "field"
#
+def process_exit_policy(policy_line):
#
+ ''' Take a policy response line and derive stats from it
#
+ Returns a counters dict
#
+ utilities/telegraf-plugins#4
#
+ # The policies are comma delimited
#
+ policies = policy_line.split(",")
#
+ "total" : len(policies),
#
+ # iterate over the policies and update counters
#
+ for policy in policies:
#
+ parts = policy.split(" ")
#
+ if parts[0].startswith("accept"):
#
+ counters["accept"] += 1
#
+ counters["reject"] += 1
#
+ if parts[1].startswith("*"):
#
+ counters["wildcard"] += 1
#
+ elif parts[1].startswith("1") or parts[1].startswith("2"):
#
+ counters["specific"] += 1
#
+ # ipv6 complicates this a touch
#
+ ip = ":".join(parts[1].split(":")[0:-1])
#
+ port = parts[1].split(":")[-1]
#
+ counters['wildcard_port'] += 1
#
+ counters['specific_port'] += 1
#
+ # Calculate the unique counts
#
+ counters["unique_hosts"] = len(set(hosts))
#
+ counters["unique_ports"] = len(set(ports))
#
def get_accounting_info(s):
#
@@ -324,5 +442,10 @@ state["counters"].append(["guards", get_guard_counts(s)])
#
for v in get_accounting_info(s):
#
state["stats"].append(v)
#
+# Get exit policy info
#
+for v in get_exit_policy_stats(s):
#
+ state["stats"].append(v)
#
print(build_lp(MEASUREMENT, state))