+function summarize_detail_badhost($progress = array())
+{
+ if (! isset($progress['blocked']) || empty($progress['blocked'])) return '';
+
+ // Flat per group
+ $blocked = array();
+ foreach($progress['blocked'] as $list => $lvalue) {
+ foreach($lvalue as $group => $gvalue) {
+ $flat = implode(', ', array_flat_leaves($gvalue));
+ if ($flat === $group) {
+ $blocked[$list][] = $flat;
+ } else {
+ $blocked[$list][$group] = $flat;
+ }
+ }
+ }
+
+ // Shrink per list
+ // From: 'A-1' => array('ie.to')
+ // To: 'A-1' => 'ie.to'
+ foreach($blocked as $list => $lvalue) {
+ if (is_array($lvalue) &&
+ count($lvalue) == 1 &&
+ is_numeric(key($lvalue))) {
+ $blocked[$list] = current($lvalue);
+ }
+ }
+
+ return var_export_shrink($blocked, TRUE, TRUE);
+}
+
+function summarize_detail_newtral($progress = array())
+{
+ if (! isset($progress['hosts']) ||
+ ! is_array($progress['hosts']) ||
+ empty($progress['hosts'])) return '';
+
+ // Generate a responsible $trie
+ $trie = array();
+ foreach($progress['hosts'] as $value) {
+ // 'A.foo.bar.example.com'
+ $resp = whois_responsibility($value); // 'example.com'
+ if (empty($resp)) {
+ // One or more test, or do nothing here
+ $resp = strval($value);
+ $rest = '';
+ } else {
+ $rest = rtrim(substr($value, 0, - strlen($resp)), '.'); // 'A.foo.bar'
+ }
+ $trie = array_merge_recursive($trie, array($resp => array($rest => NULL)));
+ }
+
+ // Format: var_export_shrink() -like output
+ $result = array();
+ ksort_by_domain($trie);
+ foreach(array_keys($trie) as $key) {
+ ksort_by_domain($trie[$key]);
+ if (count($trie[$key]) == 1 && key($trie[$key]) == '') {
+ // Just one 'responsibility.example.com'
+ $result[] = ' \'' . $key . '\',';
+ } else {
+ // One subdomain-or-host, or several ones
+ $subs = array();
+ foreach(array_keys($trie[$key]) as $sub) {
+ if ($sub == '') {
+ $subs[] = $key;
+ } else {
+ $subs[] = $sub . '.' . $key;
+ }
+ }
+ $result[] = ' \'' . $key . '\' => \'' . implode(', ', $subs) . '\',';
+ }
+ unset($trie[$key]);
+ }
+ return
+ 'array (' . "\n" .
+ implode("\n", $result) . "\n" .
+ ')';
+}
+
+// ksort() by domain
+function ksort_by_domain(& $array)
+{
+ $sort = array();
+ foreach(array_keys($array) as $key) {
+ $sort[delimiter_reverse($key)] = $key;
+ }
+ ksort($sort, SORT_STRING);
+ $result = array();
+ foreach($sort as $key) {
+ $result[$key] = & $array[$key];
+ }
+ $array = $result;
+}
+
+// Check responsibility-root of the FQDN
+// 'foo.bar.example.com' => 'example.com' (.com has the last whois for it)
+// 'foo.bar.example.au' => 'example.au' (.au has the last whois for it)
+// 'foo.bar.example.edu.au' => 'example.edu.au' (.edu.au has the last whois for it)
+// 'foo.bar.example.act.edu.au' => 'example.act.edu.au' (.act.edu.au has the last whois for it)
+function whois_responsibility($fqdn = 'foo.bar.example.com', $parent = FALSE, $implicit = TRUE)
+{
+ static $domain;
+
+ if ($fqdn === NULL) {
+ $domain = NULL; // Unset
+ return '';
+ }
+ if (! is_string($fqdn)) return '';
+
+ if (is_ip($fqdn)) return $fqdn;
+
+ if (! isset($domain)) {
+ $domain = array();
+ if (file_exists(DOMAIN_INI_FILE)) {
+ include(DOMAIN_INI_FILE); // Set
+ }
+ }
+
+ $result = array();
+ $dcursor = & $domain;
+ $array = array_reverse(explode('.', $fqdn));
+ $i = 0;
+ while(TRUE) {
+ if (! isset($array[$i])) break;
+ $acursor = $array[$i];
+ if (is_array($dcursor) && isset($dcursor[$acursor])) {
+ $result[] = & $array[$i];
+ $dcursor = & $dcursor[$acursor];
+ } else {
+ if (! $parent && isset($acursor)) {
+ $result[] = & $array[$i]; // Whois servers must know this subdomain
+ }
+ break;
+ }
+ ++$i;
+ }
+
+ // Implicit responsibility: Top-Level-Domains must not be yours
+ // 'bar.foo.something' => 'foo.something'
+ if ($implicit && count($result) == 1 && count($array) > 1) {
+ $result[] = & $array[1];
+ }
+
+ return $result ? implode('.', array_reverse($result)) : '';
+}
+
+