ServeradminParser.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. public function applyConf() {
  60. $conf = $this->getConf();
  61. $result = shell_exec("echo '".$conf."' | serveradmin set");
  62. return $result;
  63. }
  64. // Funkcja dodajaca (ew. modyfikujaca) wpis A (adres IP) w konfiguracji DNS
  65. public function dnsAddIpAddress($domain, $host, $ip, $replace = 0) {
  66. // Weryfikacja argumentow funkcji (TODO nalezy upsrawnic)
  67. if (!strlen($domain)) throw new Exception("Bad domain.");
  68. if (!strlen($ip)) throw new Exception("Bad IP address.");
  69. // Pobranie danych z serverconfig
  70. $this->getData("dns:views:_array_id:com.apple.ServerAdmin.DNS.public:primaryZones:_array_id:".$domain.":machines");
  71. // Sprawdzenie czy domena istnieje, jezeli nie - wyrucenie wyjatku
  72. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain])) {
  73. $this->data = Array();
  74. throw new Exception("Domain ".$domain." not found");
  75. }
  76. // Sprawdzenie czy istnieja jakiekolwiek wpisy A (adresy IP) dla domeny. Jezeli nie - zainicjowanie pustej tablicy
  77. if (!is_array($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"])) {
  78. unset($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_index"] = Array();
  80. }
  81. // Ustawienie wskaznika na tablicy wpisow A
  82. $domainArr = & $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"]["_array_index"];
  83. // Wartosci przekazywane do serveradmin musza byc w nawiasach
  84. if (strlen($host)) $name = '"'.$host.'.'.$domain.'."';
  85. else $name = '"'.$domain.'."';
  86. $ipAddress = '"'.$ip.'"';
  87. // Sprawdzenie czy istnieje juz jakis wpis A dla danego hosta
  88. unset ($ipArr);
  89. foreach ($domainArr as & $domainEl) {
  90. if ($domainEl["name"] == $name) {
  91. $ipArr = & $domainEl["ipAddresses"]["_array_index"]; // Ustawiamy wskaznik do tablicy adresow IP dla danego hosta (oznacza to istnienie danego hosta)
  92. break;
  93. }
  94. }
  95. // Jezeli dany host juz istnieje, dodajemy kolejny adres IP
  96. if (isset($ipArr)) {
  97. foreach ($ipArr as $ipEl) {
  98. if ($ipEl["ipAddress"] == $ipAddress) return false; // Jezeli konkretny wpis dla danego adresu IP juz istnieje, konczymy dzialanie i zwracamy false
  99. }
  100. if ($replace) $ipArr = Array(); // Jezeli funkcja zostala wywolana z replace==true, usuwamy wszystkie dotychczasowe wpisy A dla danego hosta
  101. $ipArr[]["ipAddress"] = $ipAddress;
  102. } else { // Jezeli dany host nie istnieje, definiujemy nowey i dodajemy adres IP
  103. $ipAddresses["_array_index"][]["ipAddress"] = $ipAddress;
  104. $domainArr[] = Array('name' => $name, 'ipAddresses' => $ipAddresses);
  105. }
  106. return true; // Rzadany rekord zostal pomyslnie dodany i zapisany w zmiennej $this->data
  107. }
  108. // Funkcja usuwajaca wpis A (adres IP) z konfiguracji DNS
  109. public function dnsDelIpAddress($domain, $host, $ip, $replace = false) {
  110. // Weryfikacja argumentow funkcji (TODO nalezy upsrawnic)
  111. if (!strlen($domain)) throw new Exception("Bad domain.");
  112. if (!strlen($ip)) throw new Exception("Bad IP address.");
  113. // Pobranie danych z serverconfig
  114. $this->getData("dns:views:_array_id:com.apple.ServerAdmin.DNS.public:primaryZones:_array_id:".$domain.":machines");
  115. // Sprawdzenie czy domena istnieje, jezeli nie - wyrucenie wyjatku
  116. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain])) {
  117. $this->data = Array();
  118. throw new Exception("Domain ".$domain." not found");
  119. }
  120. // Sprawdzenie czy istnieja jakiekolwiek wpisy A (adresy IP) dla domeny. Jezeli nie - wyrzucenie wyjatku
  121. if (!isset($this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"])) {
  122. throw new Exception("Domain ".$domain." has no A entries");
  123. }
  124. // Ustawienie wskaznika na tablicy wpisow A
  125. $domainArr = & $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"]["_array_index"];
  126. // Wartosci przekazywane do serveradmin musza byc w nawiasach
  127. if (strlen($host)) $name = '"'.$host.'.'.$domain.'."';
  128. else $name = '"'.$domain.'."';
  129. $ipAddress = '"'.$ip.'"';
  130. // Wyszukanie czy istnieje jakikolwiek wpis A dla danego hosta i znalezienie klucza w tablicy
  131. unset ($hostKey);
  132. foreach ($domainArr as $key => $domainEl) {
  133. if ($domainEl["name"] == $name) {
  134. $hostKey = $key;
  135. break;
  136. }
  137. }
  138. // Jezeli nie znaleziono danego hosta, wyrzucamy wyjatek.
  139. if (!isset($hostKey)) throw new Exception("No A entries found for host ".$host.".".$domain.".");
  140. // 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)
  141. if (!$ip) {
  142. $lastKey = max(array_keys($domainArr));
  143. $domainArr[$hostKey] = $domainArr[$lastKey];
  144. unset($domainArr[$lastKey]);
  145. } else {
  146. // W przeciwnym wypadku poszukujemy konkretnego rekordu A
  147. unset($ipKey);
  148. foreach ($domainArr[$hostKey]["ipAddresses"]["_array_index"] as $key => $ipArr) {
  149. if ($ipArr["ipAddress"] == $ipAddress) {
  150. $ipKey = $key;
  151. break;
  152. }
  153. }
  154. // Jezelni nie znaleziono danego wpisu A, wyrzucamy wyjatek.
  155. if (!isset($ipKey)) throw new Exception("A entry for host ".$host.".".$domain." and IP address ".$ip." not found.");
  156. // Usuwamy wpis A
  157. $lastKey = max(array_keys($domainArr[$hostKey]["ipAddresses"]["_array_index"]));
  158. $domainArr[$hostKey]["ipAddresses"]["_array_index"][$ipKey]=$domainArr[$hostKey]["ipAddresses"]["_array_index"][$lastKey];
  159. unset($domainArr[$hostKey]["ipAddresses"]["_array_index"][$lastKey]);
  160. // Jezeli nie pozostal zaden wpis A dla danego hosta, usuwamy z domeny definicje wpisow A dla danego hosta
  161. if (!count($domainArr[$hostKey]["ipAddresses"]["_array_index"])) {
  162. $lastKey = max(array_keys($domainArr));
  163. $domainArr[$hostKey] = $domainArr[$lastKey];
  164. unset($domainArr[$lastKey]);
  165. }
  166. }
  167. // Jezeli nie pozostal zaden rekord A dla domeny, nalezy wykasowac tablice i zastapic ja wartoscia _empty_array
  168. if (!count($domainArr)) $this->data["dns"]["views"]["_array_id"]["com.apple.ServerAdmin.DNS.public"]["primaryZones"]["_array_id"][$domain]["machines"] = "_empty_array";
  169. }
  170. }
  171. ?>