ServeradminParser.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. /*
  3. Klasa do zarzadania konfiguracja serveradmin
  4. Przyklad uzycia:
  5. $test = new ServeradminParser();
  6. $test->dnsDelIpAddress("procesy5.pl", "demo3"); - usuwa wszystkie wpisy A dla hosta demo3.procesy5.pl w domenie procesy5.pl
  7. $test->dnsDelIpAddress("biall.pl", "", "94.158.130.34"); - usuwa adres IP z rekordu biall..pl
  8. $test->dnsAddIpAddress("biall.pl", "", "94.158.130.34"); - dodaje adres IP do rekordu biall.pl
  9. echo $test->getConf();
  10. echo $test->applyConf();
  11. */
  12. class ServeradminParser {
  13. private $data = Array();
  14. private $result;
  15. // Funkcja inicjujaca objekt
  16. public function serveradminParser($key = "") {
  17. if (strlen($key)) $this->getData($key); // Opcjonalne pobranie danych z serveradmin
  18. }
  19. // Funkcja pobierajaca dane z serveradmin i wywolujaca funkcje parsujaca dane tekstowe do arraya
  20. private function getData($key) {
  21. $conf = shell_exec("sudo serveradmin set ".$key);
  22. $this->data = $this->txtToArr($conf);
  23. }
  24. // Funkcja parsujaca dane tekstowe do arraya
  25. private function txtToArr($conf) {
  26. $data = Array();
  27. $lines = explode("\n", $conf);
  28. foreach ($lines as $line) {
  29. $lineArr = explode(' = ', $line);
  30. if (count($lineArr)==2) {
  31. $keys=$lineArr[0];
  32. $value=$lineArr[1];
  33. $keysArr = explode(':', $keys);
  34. $lastRoot = & $data;
  35. $lastKey = array_pop($keysArr);
  36. foreach ($keysArr as $key) {
  37. if (!array_key_exists($key, $lastRoot)) $lastRoot[$key] = Array();
  38. $lastRoot = & $lastRoot[$key];
  39. }
  40. $lastRoot[$lastKey] = $value;
  41. }
  42. }
  43. return $data;
  44. }
  45. // Funkcja konwertujaca dane z arraya do postaci tekstowej rozumianej przez serveradmin
  46. private function arrToTxt($arr, $keys = Array(), $key = "") {
  47. if (strlen($key)) $keys[] = $key;
  48. foreach ($arr as $key => $value) {
  49. if (is_array($value)) $this->arrToTxt($value, $keys, $key);
  50. else $this->result .= implode(":", array_merge($keys,array($key)))." = ".$value."\n";
  51. }
  52. }
  53. // Funkcja zwracajaca bierzaca konfiguracje do serveradmin (testowa public)
  54. public function getConf() {
  55. $this->result="";
  56. $this->arrToTxt($this->data);
  57. return $this->result;
  58. }
  59. // Funkcja wprowadzajaca zmiany w zycie
  60. public function applyConf() {
  61. $conf = $this->getConf();
  62. $result = shell_exec("echo '".$conf."' | serveradmin set");
  63. return $result;
  64. }
  65. // Funkcja dodajaca (ew. modyfikujaca) wpis A (adres IP) w konfiguracji DNS
  66. public function dnsAddIpAddress($domain, $host, $ip, $replace = 0) {
  67. // Weryfikacja argumentow funkcji (TODO nalezy upsrawnic)
  68. if (!strlen($domain)) throw new Exception("Bad domain.");
  69. if (!strlen($ip)) throw new Exception("Bad IP address.");
  70. // Pobranie danych z serverconfig
  71. $this->getData("dns:views:_array_id:com.apple.ServerAdmin.DNS.public:primaryZones:_array_id:".$domain.":machines");
  72. // Sprawdzenie czy domena istnieje, jezeli nie - wyrucenie wyjatku
  73. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain])) {
  74. $this->data = Array();
  75. throw new Exception("Domain ".$domain." not found");
  76. }
  77. // Sprawdzenie czy istnieja jakiekolwiek wpisy A (adresy IP) dla domeny. Jezeli nie - zainicjowanie pustej tablicy
  78. if (!is_array($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"])) {
  79. $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"] = Array();
  80. $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"]["_array_index"] = Array();
  81. }
  82. // Ustawienie wskaznika na tablicy wpisow A
  83. $domainArr = & $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"]["_array_index"];
  84. // Wartosci przekazywane do serveradmin musza byc w nawiasach
  85. if (strlen($host)) $name = '"'.$host.'.'.$domain.'."';
  86. else $name = '"'.$domain.'."';
  87. $ipAddress = '"'.$ip.'"';
  88. // Sprawdzenie czy istnieje juz jakis wpis A dla danego hosta
  89. unset ($ipArr);
  90. foreach ($domainArr as $key => $domainEl) {
  91. if ($domainEl["name"] == $name) {
  92. $ipArr = & $domainArr[$key]["ipAddresses"]["_array_index"]; // Ustawiamy wskaznik do tablicy adresow IP dla danego hosta (oznacza to istnienie danego hosta)
  93. break;
  94. }
  95. }
  96. // Jezeli dany host juz istnieje, dodajemy kolejny adres IP
  97. if (isset($ipArr)) {
  98. foreach ($ipArr as $ipEl) {
  99. if ($ipEl["ipAddress"] == $ipAddress) return false; // Jezeli konkretny wpis dla danego adresu IP juz istnieje, konczymy dzialanie i zwracamy false
  100. }
  101. if ($replace) $ipArr = Array(); // Jezeli funkcja zostala wywolana z replace==true, usuwamy wszystkie dotychczasowe wpisy A dla danego hosta
  102. $ipArr[]["ipAddress"] = $ipAddress;
  103. } else { // Jezeli dany host nie istnieje, definiujemy nowey i dodajemy adres IP
  104. $ipAddresses["_array_index"][]["ipAddress"] = $ipAddress;
  105. $domainArr[] = Array('name' => $name, 'ipAddresses' => $ipAddresses);
  106. }
  107. return true; // Rzadany rekord zostal pomyslnie dodany i zapisany w zmiennej $this->data
  108. }
  109. // Funkcja usuwajaca wpis A (adres IP) z konfiguracji DNS
  110. public function dnsDelIpAddress($domain, $host, $ip, $replace = false) {
  111. // Weryfikacja argumentow funkcji (TODO nalezy upsrawnic)
  112. if (!strlen($domain)) throw new Exception("Bad domain.");
  113. if (!strlen($ip)) throw new Exception("Bad IP address.");
  114. // Pobranie danych z serverconfig
  115. $this->getData("dns:views:_array_id:com.apple.ServerAdmin.DNS.public:primaryZones:_array_id:".$domain.":machines");
  116. // Sprawdzenie czy domena istnieje, jezeli nie - wyrucenie wyjatku
  117. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain])) {
  118. $this->data = Array();
  119. throw new Exception("Domain ".$domain." not found");
  120. }
  121. // Sprawdzenie czy istnieja jakiekolwiek wpisy A (adresy IP) dla domeny. Jezeli nie - wyrzucenie wyjatku
  122. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"])) {
  123. throw new Exception("Domain ".$domain." has no A entries");
  124. }
  125. // Ustawienie wskaznika na tablicy wpisow A
  126. $domainArr = & $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"]["_array_index"];
  127. // Wartosci przekazywane do serveradmin musza byc w nawiasach
  128. if (strlen($host)) $name = '"'.$host.'.'.$domain.'."';
  129. else $name = '"'.$domain.'."';
  130. $ipAddress = '"'.$ip.'"';
  131. // Wyszukanie czy istnieje jakikolwiek wpis A dla danego hosta i znalezienie klucza w tablicy
  132. unset ($hostKey);
  133. foreach ($domainArr as $key => $domainEl) {
  134. if ($domainEl["name"] == $name) {
  135. $hostKey = $key;
  136. break;
  137. }
  138. }
  139. // Jezeli nie znaleziono danego hosta, wyrzucamy wyjatek.
  140. if (!isset($hostKey)) throw new Exception("No A entries found for host ".$host.".".$domain.".");
  141. // Jezeli nie zdefiniowano konkretnego adres IP do usuniecia, od razu usuwamy wszystkie wpisy A dla dajego hosta (przesuwamy ostatni element tablicy w miejsce danego wpisu)
  142. if (!$ip) {
  143. $lastKey = max(array_keys($domainArr));
  144. $domainArr[$hostKey] = $domainArr[$lastKey];
  145. unset($domainArr[$lastKey]);
  146. } else {
  147. // W przeciwnym wypadku poszukujemy konkretnego rekordu A
  148. unset($ipKey);
  149. foreach ($domainArr[$hostKey]["ipAddresses"]["_array_index"] as $key => $ipArr) {
  150. if ($ipArr["ipAddress"] == $ipAddress) {
  151. $ipKey = $key;
  152. break;
  153. }
  154. }
  155. // Jezelni nie znaleziono danego wpisu A, wyrzucamy wyjatek.
  156. if (!isset($ipKey)) throw new Exception("A entry for host ".$host.".".$domain." and IP address ".$ip." not found.");
  157. // Usuwamy wpis A
  158. $lastKey = max(array_keys($domainArr[$hostKey]["ipAddresses"]["_array_index"]));
  159. $domainArr[$hostKey]["ipAddresses"]["_array_index"][$ipKey]=$domainArr[$hostKey]["ipAddresses"]["_array_index"][$lastKey];
  160. unset($domainArr[$hostKey]["ipAddresses"]["_array_index"][$lastKey]);
  161. // Jezeli nie pozostal zaden wpis A dla danego hosta, usuwamy z domeny definicje wpisow A dla danego hosta
  162. if (!count($domainArr[$hostKey]["ipAddresses"]["_array_index"])) {
  163. $lastKey = max(array_keys($domainArr));
  164. $domainArr[$hostKey] = $domainArr[$lastKey];
  165. unset($domainArr[$lastKey]);
  166. }
  167. }
  168. // Jezeli nie pozostal zaden rekord A dla domeny, nalezy wykasowac tablice i zastapic ja wartoscia _empty_array
  169. if (!count($domainArr)) $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"] = "_empty_array";
  170. }
  171. }
  172. ?>