DNS.class.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <?php
  2. /**
  3. * DNS
  4. *
  5. * TODO: Too many "if" statements. Code should be refactored in order to not use a lot of "if" conditions
  6. *
  7. * @author vesta, http://vestacp.com/
  8. * @author Dmitry Malishev <dima.malishev@gmail.com>
  9. * @author Dmitry Naumov-Socolov <naumov.socolov@gmail.com>
  10. * @copyright vesta 2010-2011
  11. */
  12. class DNS extends AjaxHandler
  13. {
  14. /**
  15. * Get DNS entries
  16. *
  17. * @param Request $request
  18. * @return string - Ajax Reply
  19. */
  20. public function getListExecute($request)
  21. {
  22. $_user = 'vesta';
  23. $reply = array();
  24. $result = Vesta::execute(Vesta::V_LIST_DNS_DOMAINS, array($_user, Config::get('response_type')));
  25. foreach ($result['data'] as $dns_domain => $details) {
  26. $reply[] = array(
  27. 'DNS_DOMAIN' => $dns_domain,
  28. 'IP' => $details['IP'],
  29. 'TPL' => $details['TPL'],
  30. 'TTL' => $details['TTL'],
  31. 'EXP' => $details['EXP'],
  32. 'SOA' => $details['SOA'],
  33. 'SUSPEND' => $details['SUSPEND'],
  34. 'DATE' => date(Config::get('ui_date_format', strtotime($details['DATE'])))
  35. );
  36. }
  37. if (!$result['status']) {
  38. $this->errors[] = array($result['error_code'] => $result['error_message']);
  39. }
  40. return $this->reply($result['status'], $reply);
  41. }
  42. /**
  43. * Get DNS records
  44. *
  45. * @param Request $request
  46. * @return string - Ajax Reply
  47. */
  48. public function getListRecordsExecute($request)
  49. {
  50. $r = new Request();
  51. $_s = $r->getSpell();
  52. $_user = 'vesta';
  53. $reply = array();
  54. $result = Vesta::execute(Vesta::V_LIST_DNS_DOMAIN_RECORDS, array($_user, $_s['DNS_DOMAIN'], Config::get('response_type')));
  55. foreach ($result['data'] as $record_id => $details) {
  56. $reply[$record_id] = array(
  57. 'RECORD_ID' => $record_id,
  58. 'RECORD' => $details['RECORD'],
  59. 'RECORD_TYPE' => $details['TYPE'],
  60. 'RECORD_VALUE' => $details['VALUE'],
  61. 'SUSPEND' => $details['SUSPEND'],
  62. 'DATE' => date(Config::get('ui_date_format', strtotime($details['DATE'])))
  63. );
  64. }
  65. if (!$result['status']) {
  66. $this->errors[] = array($result['error_code'] => $result['error_message']);
  67. }
  68. return $this->reply($result['status'], $reply);
  69. }
  70. /**
  71. * Add DB entry
  72. *
  73. * v_add_dns_domain user domain ip [template] [exp] [soa] [ttl]
  74. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.add&USER=vesta&DOMAIN=dev.vestacp.com&IP_ADDRESS=95.163.16.160&TEMPLATE=default&EXP=01-01-12&SOA=ns1.vestacp.com&TTL=3600
  75. *
  76. * @param Request $request
  77. * @return string - Ajax Reply
  78. */
  79. public function addExecute($_spell = false)
  80. {
  81. $r = new Request();
  82. if ($_spell) {
  83. $_s = $_spell;
  84. }
  85. else {
  86. $_s = $r->getSpell();
  87. }
  88. $_user = 'vesta';
  89. $params = array(
  90. 'USER' => $_user, /// OWNER ???
  91. 'DNS_DOMAIN' => $_s['DNS_DOMAIN'],
  92. 'IP' => $_s['IP']
  93. );
  94. // TODO: rewrite this block. Get away from if/if/if/if
  95. if ($_s['TPL']) {
  96. $params['TPL'] = $_s['TPL'];
  97. }
  98. if ($_s['EXP']) {
  99. $params['EXP'] = $_s['EXP'];
  100. }
  101. if ($_s['SOA']) {
  102. $params['SOA'] = $_s['SOA'];
  103. }
  104. if ($_s['TTL']) {
  105. $params['TTL'] = $_s['TTL'];
  106. }
  107. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN, $params);
  108. if (!$result['status']) {
  109. $this->errors[] = array($result['error_code'] => $result['error_message']);
  110. }
  111. return $this->reply($result['status'], $result['data']);
  112. }
  113. /**
  114. * Add DNS record
  115. *
  116. * v_add_dns_domain_record user domain record type value [id]
  117. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.addRecord&USER=vesta&DOMAIN=dev.vestacp.com&RECORD=ftp&TYPE=a&VALUE=87.248.190.222
  118. *
  119. * @param Request $request
  120. * @return string - Ajax Reply
  121. */
  122. public function addRecordExecute($request)
  123. {
  124. $r = new Request();
  125. $_s = $r->getSpell();
  126. $_user = 'vesta';
  127. $params = array(
  128. 'USER' => $_s['USER'], /// OWNER ???
  129. 'DOMAIN' => $_s['DOMAIN'],
  130. 'RECORD' => $_s['RECORD'],
  131. 'RECORD_TYPE' => $_s['TYPE'],
  132. 'RECORD_VALUE' => $_s['VALUE'],
  133. 'RECORD_ID' => $_s['RECORD_ID']
  134. );
  135. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN_RECORD, $params);
  136. if (!$result['status']) {
  137. $this->errors[] = array($result['error_code'] => $result['error_message']);
  138. }
  139. return $this->reply($result['status'], $result['data']);
  140. }
  141. /**
  142. * Delete DNS entry
  143. *
  144. * v_del_dns_domain user domain
  145. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.del&USER=vesta&DOMAIN=dev.vestacp.com
  146. *
  147. * @param Request $request
  148. * @return string - Ajax Reply
  149. */
  150. public function delExecute($_spell = false)
  151. {
  152. $r = new Request();
  153. if ($_spell) {
  154. $_s = $_spell;
  155. }
  156. else {
  157. $_s = $r->getSpell();
  158. }
  159. $_user = 'vesta';
  160. $params = array(
  161. 'USER' => $_user, /// OWNER ???
  162. 'DOMAIN' => $_s['DNS_DOMAIN'],
  163. );
  164. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN, $params);
  165. if (!$result['status']) {
  166. $this->errors[] = array($result['error_code'] => $result['error_message']);
  167. }
  168. return $this->reply($result['status'], $result['data']);
  169. }
  170. /**
  171. * Add DNS record
  172. *
  173. * v_del_dns_domain_record user domain id
  174. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.delRecord&USER=vesta&DOMAIN=dev.vestacp.com&RECORD_ID=9
  175. *
  176. * @param Request $request
  177. * @return string - Ajax Reply
  178. */
  179. public function delRecordExecute($request)
  180. {
  181. $r = new Request();
  182. $_s = $r->getSpell();
  183. $_user = 'vesta';
  184. $params = array(
  185. 'USER' => $_user, // TODO: OWNER ???
  186. 'DOMAIN' => $_s['DOMAIN'],
  187. 'RECORD_ID' => $_s['RECORD_ID']
  188. );
  189. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN_RECORD, $params);
  190. if (!$result['status']) {
  191. $this->errors[] = array($result['error_code'] => $result['error_message']);
  192. }
  193. return $this->reply($result['status'], $result['data']);
  194. }
  195. /**
  196. * Change DNS entry
  197. *
  198. * TODO: get away from multiple "if" statements
  199. *
  200. * DNS.change&spell={"old":{"DNS_DOMAIN": "dev.vestacp.com","IP": "95.163.16.160","TPL": "default","TTL": "3377","EXP": "12-12-12","SOA": "ns2.vestacp.com"},"new":{"DNS_DOMAIN": "dev.vestacp.com","IP": "95.163.16.160","TPL": "default","TTL": "3600","EXP": "02-02-12","SOA": "ns1.vestacp.com"}}
  201. *
  202. * @param Request $request
  203. * @return string - Ajax Reply
  204. */
  205. public function changeExecute($request)
  206. {
  207. $r = new Request();
  208. $_s = $r->getSpell();
  209. $_old = $_s['old'];
  210. $_new = $_s['new'];
  211. $_user = 'vesta';
  212. $_DNS_DOMAIN = $_new['DNS_DOMAIN'];
  213. if ($_old['IP'] != $_new['IP']) {
  214. $result = array();
  215. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_IP, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['IP']));
  216. if (!$result['status']) {
  217. $this->status = FALSE;
  218. $this->errors['IP_ADDRESS'] = array($result['error_code'] => $result['error_message']);
  219. }
  220. }
  221. if ($_old['TPL'] != $_new['TPL']) {
  222. $result = array();
  223. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TPL, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['TPL']));
  224. if (!$result['status']) {
  225. $this->status = FALSE;
  226. $this->errors['TPL'] = array($result['error_code'] => $result['error_message']);
  227. }
  228. }
  229. if ($_old['TTL'] != $_new['TTL']) {
  230. $result = array();
  231. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TTL, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['TTL']));
  232. if (!$result['status']) {
  233. $this->status = FALSE;
  234. $this->errors['TTL'] = array($result['error_code'] => $result['error_message']);
  235. }
  236. }
  237. if ($_old['EXP'] != $_new['EXP']) {
  238. $result = array();
  239. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_EXP, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['EXP']));
  240. if (!$result['status']) {
  241. $this->status = FALSE;
  242. $this->errors['EXP'] = array($result['error_code'] => $result['error_message']);
  243. }
  244. }
  245. if ($_old['SOA'] != $_new['SOA']) {
  246. $result = array();
  247. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_SOA, array('USER' => $_user, 'DNS_DOMAIN' => $_new['DNS_DOMAIN'], 'IP' => $_new['SOA']));
  248. if (!$result['status']) {
  249. $this->status = FALSE;
  250. $this->errors['SOA'] = array($result['error_code'] => $result['error_message']);
  251. }
  252. }
  253. if (!$this->status) {
  254. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_IP, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['IP']));
  255. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TPL, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['TPL']));
  256. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TTL, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['TTL']));
  257. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_EXP, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['EXP']));
  258. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_SOA, array('USER' => $_user, 'DNS_DOMAIN' => $_new['DNS_DOMAIN'], 'IP' => $_old['SOA']));
  259. }
  260. return $this->reply($this->status, '');
  261. }
  262. /**
  263. * Change DNS record
  264. *
  265. * @param Request $request
  266. * @return string - Ajax Reply
  267. */
  268. public function changeRecordsExecute($request)
  269. {
  270. $r = new Request();
  271. $_s = $r->getSpell();
  272. $_old = $_s['old'];
  273. $_new = $_s['new'];
  274. $_user = 'vesta';
  275. $_DNS_DOMAIN = $_s['DNS_DOMAIN'];
  276. foreach ($_new as $record_id => $record_data) {
  277. // checking if record existed - update
  278. if (is_array($_old[$record_id])) {
  279. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_RECORD,
  280. array(
  281. 'USER' => $_user,
  282. 'DNS_DOMAIN' => $_DNS_DOMAIN,
  283. 'ID' => $record_id,
  284. 'RECORD' => $record_data['RECORD'],
  285. 'TYPE' => $record_data['RECORD_TYPE'],
  286. 'VALUE' => $record_data['RECORD_VALUE']
  287. ));
  288. if (!$result['status']) {
  289. $this->status = FALSE;
  290. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  291. }
  292. }
  293. else {
  294. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN_RECORD, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'RECORD' => $record_data['RECORD'], 'TYPE' => $record_data['RECORD_TYPE'], 'VALUE' => $record_data['RECORD_VALUE'], 'ID' => $record_id));
  295. if (!$result['status']) {
  296. $this->status = FALSE;
  297. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  298. }
  299. }
  300. unset($_old[$record_id]);
  301. }
  302. // in $_old have remained only record that do not present in new - so they have to be deleted
  303. foreach ($_old as $record_id => $record_data) {
  304. /*
  305. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN_RECORD, array('USER' => $_user, 'DNS_DOMAIN' => $_DNS_DOMAIN, 'ID' => $record_id,));
  306. if (!$result['status']) {
  307. $this->status = FALSE;
  308. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  309. }
  310. */
  311. }
  312. return $this->reply($this->status, '');
  313. }
  314. }