Vesta.class.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. /**
  3. * Api Main class
  4. * Calls / Executes native vesta methods
  5. *
  6. * @author vesta, http://vestacp.com/
  7. * @author Dmitry Malishev <[email protected]>
  8. * @author Dmitry Naumov-Socolov <[email protected]>
  9. * @copyright vesta 2010-2011
  10. */
  11. class Vesta
  12. {
  13. const SAME_PASSWORD = '********';
  14. const ADMIN = 1;
  15. const USER = 0;
  16. const PARAM_DELIMETER = ' ';
  17. // commands
  18. const V_LIST_SYS_CONFIG = 'v_list_sys_config';
  19. // USER
  20. const V_GET_SYS_USER_VALUE = 'v_get_user_value';
  21. const V_LIST_SYS_USERS = 'v_list_users';
  22. const V_LIST_SYS_USER = 'v_list_user';
  23. const V_LIST_USER_PACKAGES = 'v_list_user_packages';
  24. const V_ADD_SYS_USER = 'v_add_user';
  25. const V_ADD_SYS_USER_REPORTS = 'v_add_user_reports';
  26. const V_CHANGE_SYS_USER_CONTACT = 'v_change_user_contact';
  27. const V_CHANGE_SYS_USER_NS = 'v_change_user_ns';
  28. const V_CHANGE_SYS_USER_PACKAGE = 'v_change_user_package';
  29. const V_CHANGE_SYS_USER_PASSWORD = 'v_change_user_password';
  30. const V_CHANGE_SYS_USER_SHELL = 'v_change_user_shell';
  31. const V_CHANGE_SYS_USER_ROLE = 'v_change_sys_user_role';
  32. const V_CHANGE_SYS_USER_NAME = 'v_change_user_name';
  33. const V_SUSPEND_SYS_USER = 'v_suspend_user';
  34. const V_UNSUSPEND_SYS_USER = 'v_unsuspend_user';
  35. const V_DEL_SYS_USER = 'v_delete_user';
  36. const V_DEL_SYS_USER_REPORTS = 'v_delete_user_reports';
  37. // WEB_DOMAIN
  38. const V_LIST_WEB_DOMAINS = 'v_list_web_domains';
  39. const V_LIST_WEB_DOMAINS_ALIAS = 'v_list_web_domains_alias';
  40. const V_LIST_WEB_DOMAINS_ELOG = 'v_list_web_domains_elog';
  41. const V_LIST_WEB_DOMAINS_PROXY = 'v_list_web_domains_proxy';
  42. const V_LIST_WEB_DOMAINS_SSL = 'v_list_web_domains_ssl';
  43. const V_LIST_WEB_DOMAINS_STATS = 'v_list_web_domains_stats';
  44. const V_LIST_WEB_DOMAIN_SSL = 'v_list_web_domain_ssl';
  45. const V_LIST_WEB_TEMPLATES = 'v_list_web_templates';
  46. const V_ADD_WEB_DOMAIN = 'v_add_web_domain';
  47. const V_ADD_WEB_DOMAIN_ALIAS = 'v_add_web_domain_alias';
  48. const V_ADD_WEB_DOMAIN_STAT = 'v_add_web_domain_stat';
  49. const V_ADD_WEB_DOMAIN_STAT_AUTH = 'v_add_web_domain_stat_auth';
  50. const V_ADD_WEB_DOMAIN_SSL = 'v_add_web_domain_ssl';
  51. const V_ADD_WEB_DOMAIN_ELOG = 'v_add_web_domain_elog';
  52. const V_ADD_WEB_DOMAIN_CGI = 'v_add_web_domain_cgi';
  53. const V_CHANGE_WEB_DOMAIN_IP = 'v_change_web_domain_ip';
  54. const V_CHANGE_WEB_DOMAIN_SSL = 'v_change_web_domain_sslcert';
  55. const V_CHANGE_WEB_DOMAIN_SSLHOME = 'v_change_web_domain_sslhome';
  56. const V_CHANGE_WEB_DOMAIN_TPL = 'v_change_web_domain_tpl';
  57. const V_DEL_WEB_DOMAIN_CGI = 'v_delete_web_domain_cgi';
  58. const V_DEL_WEB_DOMAIN_ELOG = 'v_delete_web_domain_elog';
  59. const V_DEL_WEB_DOMAIN_SSL = 'v_delete_web_domain_ssl';
  60. const V_DEL_WEB_DOMAIN_STAT = 'v_delete_web_domain_stat';
  61. const V_DEL_WEB_DOMAIN_STAT_AUTH = 'v_delete_web_domain_stat_auth';
  62. const V_DEL_WEB_DOMAIN_ALIAS = 'v_delete_web_domain_alias';
  63. const V_UPD_WEB_DOMAIN_DISK = 'v_update_web_domain_disk';
  64. const V_UPD_WEB_DOMAINS_DISK = 'v_update_web_domains_disk';
  65. const V_UPD_WEB_DOMAIN_TRAFF = 'v_update_web_domain_traff';
  66. const V_UPD_WEB_DOMAINS_TRAFF = 'v_update_web_domains_traff';
  67. const V_SUSPEND_WEB_DOMAIN = 'v_suspend_web_domain';
  68. const V_SUSPEND_WEB_DOMAINS = 'v_suspend_web_domains';
  69. const V_UNSUSPEND_WEB_DOMAIN = 'v_unsuspend_web_domain';
  70. const V_UNSUSPEND_WEB_DOMAINS = 'v_unsuspend_web_domains';
  71. const V_DEL_WEB_DOMAIN = 'v_delete_web_domain';
  72. // BACKUP
  73. const V_LIST_SYS_USER_BACKUPS = 'v_list_user_backups';
  74. // IP
  75. const V_LIST_SYS_IPS = 'v_list_sys_ips';
  76. const V_LIST_USER_IPS = 'v_list_user_ips';
  77. const V_LIST_SYS_USER_IPS = 'v_list_sys_user_ips';
  78. const V_ADD_SYS_IP = 'v_add_sys_ip';
  79. const V_ADD_SYS_USER_IP = 'v_add_user_ip';
  80. const V_CHANGE_SYS_IP_OWNER = 'v_change_sys_ip_owner';
  81. const V_CHANGE_SYS_IP_NAME = 'v_change_sys_ip_name';
  82. const V_CHANGE_SYS_IP_STATUS = 'v_change_sys_ip_status';
  83. const V_DEL_SYS_IP = 'v_delete_sys_ip';
  84. const V_UPD_SYS_IP = 'v_update_sys_ip';
  85. const V_LIST_SYS_INTERFACES = 'v_list_sys_interfaces';
  86. // DNS
  87. const V_LIST_DNS_DOMAINS = 'v_list_dns_domains';
  88. const V_LIST_DNS_DOMAIN_RECORDS = 'v_list_dns_domain';
  89. const V_LIST_DNS_TEMPLATES = 'v_list_dns_templates';
  90. const V_ADD_DNS_DOMAIN = 'v_add_dns_domain';
  91. const V_ADD_DNS_DOMAIN_RECORD = 'v_add_dns_domain_record';
  92. const V_CHANGE_DNS_DOMAIN_IP = 'v_change_dns_domain_ip';
  93. const V_CHANGE_DNS_DOMAIN_SOA = 'v_change_dns_domain_soa';
  94. const V_CHANGE_DNS_DOMAIN_TPL = 'v_change_dns_domain_tpl';
  95. const V_CHANGE_DNS_DOMAIN_TTL = 'v_change_dns_domain_ttl';
  96. const V_CHANGE_DNS_DOMAIN_EXP = 'v_change_dns_domain_exp';
  97. const V_CHANGE_DNS_DOMAIN_RECORD = 'v_change_dns_domain_record';
  98. const V_SUSPEND_DNS_DOMAIN = 'v_suspend_dns_domain';
  99. const V_UNSUSPEND_DNS_DOMAIN = 'v_unsuspend_dns_domain';
  100. const V_DEL_DNS_DOMAIN = 'v_delete_dns_domain';
  101. const V_DEL_DNS_DOMAIN_RECORD = 'v_delete_dns_domain_record';
  102. // DB
  103. const V_LIST_DB_BASES = 'v_list_db_bases';
  104. const V_LIST_DB_HOSTS = 'v_list_db_hosts';
  105. const V_LIST_WEB_DOMAIN_ALIAS = 'v_list_web_domain_alias';
  106. const V_ADD_DB_BASE = 'v_add_db_base';
  107. const V_ADD_DB_HOST = 'v_add_db_host';
  108. const V_CHANGE_DB_PASSWORD = 'v_change_db_password';
  109. const V_UPD_DB_BASE_DISK = 'v_update_db_base_disk';
  110. const V_UPD_DB_BASES_DISK = 'v_update_db_bases_disk';
  111. const V_SUSPEND_DB_BASE = 'v_suspend_db_base';
  112. const V_SUSPEND_DB_BASES = 'v_suspend_db_bases';
  113. const V_UNSUSPEND_DB_BASE = 'v_unsuspend_db_base';
  114. const V_UNSUSPEND_DB_BASES = 'v_unsuspend_db_bases';
  115. const V_DEL_DB_BASE = 'v_delete_db_base';
  116. const V_DEL_DB_HOST = 'v_delete_db_host';
  117. // CRON
  118. const V_LIST_CRON_JOBS = 'v_list_cron_jobs';
  119. const V_ADD_CRON_JOB = 'v_add_cron_job';
  120. // const V_ADD_SYS_USER_REPORTS = 'v_add_user_reports';
  121. const V_CHANGE_CRON_JOB = 'v_change_cron_job';
  122. const V_SUSPEND_CRON_JOB = 'v_suspend_cron_job';
  123. const V_SUSPEND_CRON_JOBS = 'v_suspend_cron_jobs';
  124. const V_UNSUSPEND_CRON_JOB = 'v_unsuspend_cron_job';
  125. const V_UNSUSPEND_CRON_JOBS = 'v_unsuspend_cron_jobs';
  126. const V_DEL_CRON_JOB = 'v_delete_cron_job';
  127. // const V_DEL_SYS_USER_REPORTS = 'v_delete_user_reports';
  128. // STATS
  129. const V_LIST_SYS_RRD = 'v_list_sys_rrd json';
  130. const V_UPDATE_SYS_RRD = 'v_update_sys_rrd';
  131. /**
  132. * Execute vesta command
  133. *
  134. * @param string $cms_command
  135. * @param array $parameters
  136. * @return string
  137. */
  138. static function execute($cmd_command, $parameters = array(), $reply = '')
  139. {
  140. $r = new Request();
  141. $_DEBUG = $r->getParameter("debug", FALSE);
  142. if (!isset($cmd_command)) {
  143. throw new ProtectionException('No function name passed into Vesta::execute'); // TODO: move msg to Messages::
  144. }
  145. if(!self::hasRights((int)VestaSession::getInstance()->getUserRole(), $cmd_command)){
  146. return array('status' => 'TRUE');
  147. }
  148. $reply_type = $reply;
  149. if ($reply != AjaxHandler::JSON) {
  150. $reply = '';
  151. }
  152. $params = array(
  153. 'sudo' => Config::get('sudo_path'),
  154. 'functions' => Config::get('vesta_functions_path'),
  155. 'parameters' => is_array($parameters) ? "'".implode("' '", $parameters)."'" : $parameters,
  156. 'reply' => $reply
  157. );
  158. // e.g.: /usr/bin/sudo /usr/local/vesta/bin/v_list_users vesta json
  159. $cmd = "{$params['sudo']} {$params['functions']}{$cmd_command} {$params['parameters']} {$params['reply']}";
  160. exec($cmd, $output, $return);
  161. $result = 0;
  162. $result = array(
  163. 'status' => TRUE,
  164. 'data' => '',
  165. 'error_code' => '',
  166. 'error_message' => ''
  167. );
  168. // TODO: please remove this later :)
  169. if ($_DEBUG) {
  170. $result['debug'] = array(
  171. "cmd" => $cmd,
  172. "output" => $output,
  173. "return" => $return
  174. );
  175. if ($_DEBUG == 2) {
  176. echo '<p>'.$cmd;
  177. echo '<br> output: '; print_r($output);
  178. echo '<br> return: '.$return;
  179. echo '</p>';
  180. }
  181. }
  182. if (!!(int)$return) {
  183. $result['status'] = FALSE;
  184. $result['error_code'] = (int)$return;
  185. $result['error_message'] = implode('', $output);
  186. return $result;
  187. }
  188. if ($reply_type == 'text') {
  189. $result['data'] = implode('', $output);
  190. }
  191. else {
  192. $result['data'] = json_decode(implode('', $output), true);
  193. }
  194. return $result;
  195. }
  196. /**
  197. * User Rights management
  198. *
  199. * @params array $commands
  200. * @params int $role
  201. * @return BOOL
  202. */
  203. public function hasRights($role, $command)
  204. {
  205. // return TRUE;
  206. // echo 'role - '.$role;
  207. // exit();
  208. $rights = array(
  209. self::ADMIN => array(),
  210. self::USER => array(
  211. // sys
  212. self::V_LIST_SYS_CONFIG,
  213. // user
  214. self::V_GET_SYS_USER_VALUE, self::V_LIST_SYS_USERS, self::V_ADD_SYS_USER, self::V_CHANGE_SYS_USER_CONTACT, self::V_CHANGE_SYS_USER_NS, self::V_CHANGE_SYS_USER_PACKAGE, self::V_CHANGE_SYS_USER_PASSWORD, self::V_CHANGE_SYS_USER_SHELL, self::V_CHANGE_SYS_USER_ROLE, self::V_CHANGE_SYS_USER_NAME, self::V_SUSPEND_SYS_USER, self::V_UNSUSPEND_SYS_USER, self::V_DEL_SYS_USER,
  215. 'login_as',
  216. // ip
  217. self::V_LIST_SYS_IPS, self::V_ADD_SYS_IP, self::V_ADD_SYS_USER_IP, self::V_DEL_SYS_IP, self::V_UPD_SYS_IP, self::V_CHANGE_SYS_IP_OWNER, self::V_CHANGE_SYS_IP_NAME, self::V_CHANGE_SYS_IP_STATUS, self::V_UPD_SYS_IP, self::V_LIST_SYS_INTERFACES,
  218. // web domain
  219. self::V_UPD_WEB_DOMAIN_DISK, self::V_UPD_WEB_DOMAINS_DISK, self::V_UPD_WEB_DOMAIN_TRAFF, self::V_UPD_WEB_DOMAINS_TRAFF, self::V_SUSPEND_WEB_DOMAIN, self::V_SUSPEND_WEB_DOMAINS, self::V_UNSUSPEND_WEB_DOMAIN, self::V_UNSUSPEND_WEB_DOMAINS,
  220. // dns
  221. self::V_SUSPEND_DNS_DOMAIN, self::V_UNSUSPEND_DNS_DOMAIN,
  222. // db
  223. self::V_ADD_DB_HOST, self::V_DEL_DB_HOST, self::V_UPD_DB_BASE_DISK, self::V_UPD_DB_BASES_DISK, self::V_SUSPEND_DB_BASE, self::V_SUSPEND_DB_BASES, self::V_UNSUSPEND_DB_BASE, self::V_UNSUSPEND_DB_BASES,
  224. // cron
  225. self::V_ADD_SYS_USER_REPORTS, self::V_DEL_SYS_USER_REPORTS, self::V_SUSPEND_CRON_JOB, self::V_SUSPEND_CRON_JOBS, self::V_UNSUSPEND_CRON_JOB, self::V_UNSUSPEND_CRON_JOBS,
  226. // backups
  227. self::V_LIST_SYS_USER_BACKUPS
  228. )
  229. );
  230. if(in_array($command, $rights[$role])){
  231. return FALSE;
  232. }
  233. return TRUE;
  234. }
  235. }