DNS.class.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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 $request)
  21. {
  22. $user = $this->getLoggedUser();
  23. $reply = array();
  24. $result = Vesta::execute(Vesta::V_LIST_DNS_DOMAINS, array($user['uid'], 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 $request)
  49. {
  50. $_s = $request->getParameter('spell');
  51. $user = $this->getLoggedUser();
  52. $reply = array();
  53. $params = array(
  54. 'USER' => $user['uid'],
  55. 'DOMAIN' => $_s['DNS_DOMAIN']
  56. );
  57. $result = Vesta::execute(Vesta::V_LIST_DNS_DOMAIN_RECORDS, $params, self::JSON);
  58. foreach ($result['data'] as $record_id => $details) {
  59. $reply[$record_id] = array(
  60. 'ID' => $record_id,
  61. 'RECORD_ID' => $record_id,
  62. 'RECORD' => $details['RECORD'],
  63. 'RECORD_TYPE' => $details['TYPE'],
  64. 'RECORD_VALUE' => str_replace('"', '', $details['VALUE']),
  65. 'SUSPEND' => $details['SUSPEND'],
  66. 'DATE' => date(Config::get('ui_date_format', strtotime($details['DATE'])))
  67. );
  68. }
  69. if (!$result['status']) {
  70. $this->errors[] = array($result['error_code'] => $result['error_message']);
  71. }
  72. return $this->reply($result['status'], $reply);
  73. }
  74. /**
  75. * Add DNS entry
  76. *
  77. * v_add_dns_domain user domain ip [template] [exp] [soa] [ttl]
  78. * 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
  79. *
  80. * @param Request $request
  81. * @return string - Ajax Reply
  82. */
  83. public function addExecute(Request $request)
  84. {
  85. $user = $this->getLoggedUser();
  86. $_s = $request->getParameter('spell');
  87. $params = array(
  88. 'USER' => $user['uid'], /// OWNER ???
  89. 'DNS_DOMAIN' => $_s['DNS_DOMAIN'],
  90. 'IP' => $_s['IP']
  91. );
  92. // TODO: rewrite this block. Get away from if/if/if/if
  93. if ($_s['TPL']) {
  94. $params['TPL'] = $_s['TPL'];
  95. }
  96. if ($_s['EXP']) {
  97. $params['EXP'] = $_s['EXP'];
  98. }
  99. if ($_s['SOA']) {
  100. $params['SOA'] = $_s['SOA'];
  101. }
  102. if ($_s['TTL']) {
  103. $params['TTL'] = $_s['TTL'];
  104. }
  105. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN, $params);
  106. if (!$result['status']) {
  107. $this->errors[] = array($result['error_code'] => $result['error_message']);
  108. }
  109. if ($_s['SUSPEND'] == 'on') {
  110. if($result['status']){
  111. $result = array();
  112. $result = Vesta::execute(Vesta::V_SUSPEND_DNS_DOMAIN, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_s['DNS_DOMAIN']));
  113. if (!$result['status']) {
  114. $this->status = FALSE;
  115. $this->errors['SUSPEND'] = array($result['error_code'] => $result['error_message']);
  116. }
  117. }
  118. }
  119. return $this->reply($result['status'], $result['data']);
  120. }
  121. /**
  122. * Add DNS record
  123. *
  124. * v_add_dns_domain_record user domain record type value [id]
  125. * 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
  126. *
  127. * @param Request $request
  128. * @return string - Ajax Reply
  129. */
  130. public function addRecordExecute(Request $request)
  131. {
  132. $user = $this->getLoggedUser();
  133. $_s = $request->getParameter('spell');
  134. $params = array(
  135. 'USER' => $user['uid'],
  136. 'DOMAIN' => $_s['DOMAIN'],
  137. 'RECORD' => $_s['RECORD'],
  138. 'RECORD_TYPE' => $_s['TYPE'],
  139. 'RECORD_VALUE' => $_s['VALUE'],
  140. 'RECORD_ID' => $_s['RECORD_ID']
  141. );
  142. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN_RECORD, $params);
  143. if (!$result['status']) {
  144. $this->errors[] = array($result['error_code'] => $result['error_message']);
  145. }
  146. return $this->reply($result['status'], $result['data']);
  147. }
  148. /**
  149. * Delete DNS entry
  150. *
  151. * v_delete_dns_domain user domain
  152. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.del&USER=vesta&DOMAIN=dev.vestacp.com
  153. *
  154. * @param Request $request
  155. * @return string - Ajax Reply
  156. */
  157. public function deleteExecute(Request $request)
  158. {
  159. $user = $this->getLoggedUser();
  160. $_s = $request->getParameter('spell');
  161. $params = array(
  162. 'USER' => $user['uid'], /// OWNER ???
  163. 'DOMAIN' => $_s['DNS_DOMAIN'],
  164. );
  165. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN, $params);
  166. if (!$result['status']) {
  167. $this->errors[] = array($result['error_code'] => $result['error_message']);
  168. }
  169. return $this->reply($result['status'], $result['data']);
  170. }
  171. /**
  172. * Add DNS record
  173. *
  174. * v_delete_dns_domain_record user domain id
  175. * http://95.163.16.160:8083/dispatch.php?jedi_method=DNS.delRecord&USER=vesta&DOMAIN=dev.vestacp.com&RECORD_ID=9
  176. *
  177. * @param Request $request
  178. * @return string - Ajax Reply
  179. */
  180. public function deleteRecordExecute(Request $request)
  181. {
  182. $_s = $request->getParameter('spell');
  183. $dns = $request->getParameter('dns');
  184. $user = $this->getLoggedUser();
  185. $params = array(
  186. 'USER' => $user['uid'], // TODO: OWNER ???
  187. 'DOMAIN' => $dns['DNS_DOMAIN'],
  188. 'RECORD_ID' => $_s['RECORD_ID']
  189. );
  190. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN_RECORD, $params);
  191. if (!$result['status']) {
  192. $this->errors[] = array($result['error_code'] => $result['error_message']);
  193. }
  194. return $this->reply($result['status'], $result['data']);
  195. }
  196. /**
  197. * Change DNS entry
  198. *
  199. * TODO: get away from multiple "if" statements
  200. *
  201. * 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"}}
  202. *
  203. * @param Request $request
  204. * @return string - Ajax Reply
  205. */
  206. public function changeExecute(Request $request)
  207. {
  208. $_old = $request->getParameter('old');
  209. $_new = $request->getParameter('new');
  210. $user = $this->getLoggedUser();
  211. $_DNS_DOMAIN = $_old['DNS_DOMAIN'];
  212. $result = array();
  213. if($_new['SUSPEND'] == 'on'){
  214. $result = Vesta::execute(Vesta::V_SUSPEND_DNS_DOMAIN, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN));
  215. return $this->reply($result['status']);
  216. }
  217. else{
  218. $result = Vesta::execute(Vesta::V_UNSUSPEND_DNS_DOMAIN, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN));
  219. }
  220. if (!$result['status']) {
  221. $this->status = FALSE;
  222. $this->errors['SUSPEND'] = array($result['error_code'] => $result['error_message']);
  223. }
  224. if ($_old['IP'] != $_new['IP']) {
  225. $result = array();
  226. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_IP, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['IP']));
  227. if (!$result['status']) {
  228. $this->status = FALSE;
  229. $this->errors['IP_ADDRESS'] = array($result['error_code'] => $result['error_message']);
  230. }
  231. }
  232. if ($_old['TPL'] != $_new['TPL']) {
  233. $result = array();
  234. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TPL, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['TPL']));
  235. if (!$result['status']) {
  236. $this->status = FALSE;
  237. $this->errors['TPL'] = array($result['error_code'] => $result['error_message']);
  238. }
  239. }
  240. if ($_old['TTL'] != $_new['TTL']) {
  241. $result = array();
  242. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TTL, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['TTL']));
  243. if (!$result['status']) {
  244. $this->status = FALSE;
  245. $this->errors['TTL'] = array($result['error_code'] => $result['error_message']);
  246. }
  247. }
  248. if ($_old['EXP'] != $_new['EXP']) {
  249. $result = array();
  250. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_EXP, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_new['EXP']));
  251. if (!$result['status']) {
  252. $this->status = FALSE;
  253. $this->errors['EXP'] = array($result['error_code'] => $result['error_message']);
  254. }
  255. }
  256. if ($_old['SOA'] != $_new['SOA']) {
  257. $result = array();
  258. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_SOA, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_new['DNS_DOMAIN'], 'IP' => $_new['SOA']));
  259. if (!$result['status']) {
  260. $this->status = FALSE;
  261. $this->errors['SOA'] = array($result['error_code'] => $result['error_message']);
  262. }
  263. }
  264. if (!$this->status) {
  265. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_IP, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['IP']));
  266. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TPL, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['TPL']));
  267. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_TTL, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['TTL']));
  268. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_EXP, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN, 'IP' => $_old['EXP']));
  269. Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_SOA, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_new['DNS_DOMAIN'], 'IP' => $_old['SOA']));
  270. if($_old['SUSPEND'] == 'on'){
  271. $result = Vesta::execute(Vesta::V_SUSPEND_DNS_DOMAIN, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN));
  272. }
  273. else{
  274. $result = Vesta::execute(Vesta::V_UNSUSPEND_DNS_DOMAIN, array('USER' => $user['uid'], 'DNS_DOMAIN' => $_DNS_DOMAIN));
  275. }
  276. }
  277. return $this->reply($this->status, '');
  278. }
  279. /**
  280. * Change DNS record
  281. *
  282. * @param Request $request
  283. * @return string - Ajax Reply
  284. */
  285. public function changeRecordsExecute(Request $request)
  286. {
  287. $records = $request->getParameter('spell');
  288. $dns = $request->getParameter('dns');
  289. $user = $this->getLoggedUser();
  290. $domain = $dns['DNS_DOMAIN'];
  291. // Get current records
  292. $curr_records = array();
  293. $params = array(
  294. 'USER' => $user['uid'],
  295. 'DOMAIN' => $domain
  296. );
  297. $result = Vesta::execute(Vesta::V_LIST_DNS_DOMAIN_RECORDS, $params, self::JSON);
  298. foreach ($result['data'] as $record_id => $details) {
  299. $curr_records[] = $record_id;
  300. }
  301. $new_records = array();
  302. foreach ($records as $record) {
  303. if ((int)$record['RECORD_ID'] > 0) {
  304. $new_records[] = $record['RECORD_ID'];
  305. }
  306. }
  307. $delete = array_diff(array_values($curr_records), array_values($new_records));
  308. foreach ($records as $record) {
  309. if (((int)$record['RECORD_ID'] > 0) == false) {
  310. $params = array(
  311. 'USER' => $user['uid'],
  312. 'DOMAIN' => $domain,
  313. 'RECORD' => $record['RECORD'],
  314. 'RECORD_TYPE' => $record['RECORD_TYPE'],
  315. 'RECORD_VALUE' => $record['RECORD_VALUE']
  316. );
  317. $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN_RECORD, $params);
  318. if (!$result['status']) {
  319. $this->status = FALSE;
  320. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  321. }
  322. }
  323. else {
  324. $params = array(
  325. 'USER' => $user['uid'],
  326. 'DOMAIN' => $domain,
  327. 'ID' => (int)$record['RECORD_ID'],
  328. 'RECORD' => $record['RECORD'],
  329. 'RECORD_TYPE' => $record['RECORD_TYPE'],
  330. 'RECORD_VALUE' => $record['RECORD_VALUE']
  331. );
  332. $result = Vesta::execute(Vesta::V_CHANGE_DNS_DOMAIN_RECORD, $params);
  333. if (!$result['status']) {
  334. $this->status = FALSE;
  335. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  336. }
  337. }
  338. }
  339. foreach ($delete as $record_id) {
  340. $params = array(
  341. 'USER' => $user['uid'],
  342. 'DOMAIN' => $domain,
  343. 'ID' => $record_id
  344. );
  345. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN_RECORD, $params);
  346. if (!$result['status']) {
  347. $this->status = FALSE;
  348. $this->errors[$record_id] = array($result['error_code'] => $result['error_message']);
  349. }
  350. }
  351. return $this->reply($this->status, '');
  352. }
  353. public function getTemplateInfoExecute($request)
  354. {
  355. $spell = $request->getParameter('spell');
  356. $result = Vesta::execute('v_list_user_packages', null, self::JSON);
  357. $reply = $result['data'];
  358. if (isset($spell['PACKAGE'])) {
  359. $reply = $result['data'][$spell['PACKAGE']];
  360. }
  361. return $this->reply(true, $reply);
  362. }
  363. public function massiveSuspendExecute(Request $request)
  364. {
  365. $user = $this->getLoggedUser();
  366. $_entities = $request->getParameter('entities');
  367. foreach($_entities as $entity){
  368. $result = Vesta::execute(Vesta::V_SUSPEND_DNS_DOMAIN, array('USER' => $user, $entity['DNS_DOMAIN']));
  369. }
  370. }
  371. public function massiveUnsuspendExecute(Request $request)
  372. {
  373. $user = $this->getLoggedUser();
  374. $_entities = $request->getParameter('entities');
  375. foreach($_entities as $entity){
  376. $result = Vesta::execute(Vesta::V_UNUSPEND_DNS_DOMAIN, array('USER' => $user, $entity['DNS_DOMAIN']));
  377. }
  378. }
  379. public function massiveDeleteExecute(Request $request)
  380. {
  381. $user = $this->getLoggedUser();
  382. $_entities = $request->getParameter('entities');
  383. foreach($_entities as $entity){
  384. $result = Vesta::execute(Vesta::V_DEL_DNS_DOMAIN, array('USER' => $user, $entity['DNS_DOMAIN']));
  385. }
  386. }
  387. }