ServeradminParser.php 8.7 KB

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