shared.func 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065
  1. # Log event function
  2. log_event() {
  3. # Argument defenition
  4. level="$1"
  5. event="$2"
  6. # Checking logging system
  7. if [ "$LOG_SYSTEM" = 'yes' ]; then
  8. # Checking logging level
  9. log=$(echo "$LOG_LEVEL" | cut -f 2 -d \' | grep -w "$level" )
  10. if [ ! -z "$log" ]; then
  11. echo "$event" >> $V_LOG/$level.log
  12. fi
  13. fi
  14. }
  15. # Log user history
  16. log_history() {
  17. event="$1"
  18. undo="$2"
  19. # Checking logging system
  20. if [ "$LOG_HISTORY" = 'yes' ]; then
  21. echo "$event [$undo]" >> $V_USERS/$user/history.log
  22. fi
  23. }
  24. # External function result checker
  25. check_func_result() {
  26. return_code="$1"
  27. if [[ "$return_code" -ne "$OK" ]]; then
  28. log_event 'debug' "$return_code $V_EVENT"
  29. exit $return_code
  30. fi
  31. }
  32. # Argument list checker
  33. check_args() {
  34. sys_args="$1"
  35. user_args="$2"
  36. usage="$3"
  37. if [ "$user_args" -lt "$sys_args" ]; then
  38. echo "Error: bad args"
  39. echo "Usage: $V_SCRIPT $usage"
  40. log_event 'debug' "$E_BAD_ARGS $V_EVENT"
  41. exit $E_BAD_ARGS
  42. fi
  43. }
  44. # Format validator
  45. format_validation() {
  46. # Defining url function
  47. format_url() {
  48. val="$1"
  49. # Checking url
  50. check_http=$( echo "$val" |grep "^https://" )
  51. needed_chars=$(echo "$val" | cut -s -f 2 -d '.')
  52. if [ -z "$check_http" ] || [ -z "$needed_chars" ]; then
  53. echo "Error: shell not found"
  54. log_event 'debug' "$E_SHELL_INVALID $V_EVENT"
  55. exit $E_SHELL_INVALID
  56. fi
  57. }
  58. # Defining shell function
  59. format_sh() {
  60. val="$1"
  61. # Checking shell
  62. check_shell=$(/usr/bin/chsh --list-shells | grep -w "$val" )
  63. if [ -z "$check_shell" ]; then
  64. echo "Error: shell not found"
  65. log_event 'debug' "$E_SHELL_INVALID $V_EVENT"
  66. exit $E_SHELL_INVALID
  67. fi
  68. }
  69. # Defining password function
  70. format_pwd() {
  71. val="$1"
  72. # Checking password lenght
  73. if [ "${#val}" -lt '6' ]; then
  74. echo "Error: password is shorter than 6 chars"
  75. log_event 'debug' "$E_PASSWORD_SHORT $V_EVENT"
  76. exit $E_PASSWORD_SHORT
  77. fi
  78. }
  79. # Defining integer function
  80. format_int() {
  81. val="$1"
  82. # Defining exlude mask
  83. special_chars=$(echo "$val" | \
  84. grep -c "[!|@|#|$|^|&|*|(|)|-|+|=|{|}|:|_|,|.|<|>|?|/|\|\"|'|;|%| ]" )
  85. if [[ 0 -ne "$special_chars" ]]; then
  86. echo "Error: $var out of range"
  87. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  88. exit $E_OUTOFRANGE
  89. fi
  90. # Checking letters
  91. letters=$(echo "$val" | grep -c "[a-Z]")
  92. if [ 0 -ne "$letters" ]; then
  93. echo "Error: $var out of range"
  94. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  95. exit $E_OUTOFRANGE
  96. fi
  97. # Checking -zero
  98. if [[ 0 -ne "$val" ]] && [[ 0 -gt "$val" ]]; then
  99. echo "Error: $var out of range"
  100. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  101. exit $E_OUTOFRANGE
  102. fi
  103. }
  104. # Defining ip function
  105. format_ip() {
  106. val="$1"
  107. oc1=$(echo $val | cut -s -f 1 -d . )
  108. oc2=$(echo $val | cut -s -f 2 -d . )
  109. oc3=$(echo $val | cut -s -f 3 -d . )
  110. oc4=$(echo $val | cut -s -f 4 -d . )
  111. # Checking octets
  112. if [ -z "$oc1" ] || [ -z "$oc2" ] || [ -z "$oc3" ] || [ -z "$oc4" ]
  113. then
  114. echo "Error: $var out of range"
  115. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  116. exit $E_OUTOFRANGE
  117. fi
  118. }
  119. # Defining ip_status function
  120. format_ips() {
  121. val="$1"
  122. check_status=$(echo "shared, exclusive" | grep -w "$val" )
  123. # Checking status
  124. if [ -z "$check_status" ]; then
  125. echo "Error: $var out of range"
  126. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  127. exit $E_OUTOFRANGE
  128. fi
  129. }
  130. # Defining email function
  131. format_eml() {
  132. val="$1"
  133. check_at=$(echo "$val" | cut -s -f 1 -d @)
  134. check_dt=$(echo "$val" | cut -s -f 2 -d @|cut -s -f 2 -d .)
  135. # Checking format
  136. if [ -z "$check_at" ] ||\
  137. [ -z "$check_dt" ] ||\
  138. [ "${#check_dt}" -lt 2 ] &&\
  139. [ "$val" != 'vesta@localhost' ]; then
  140. echo "Error: email format is wrong"
  141. log_event 'debug' "$E_EMAIL_INVALID $V_EVENT"
  142. exit $E_EMAIL_INVALID
  143. fi
  144. }
  145. # Defining interface function
  146. format_ifc() {
  147. val="$1"
  148. # Parsing ifconfig
  149. /sbin/ifconfig "$val" > /dev/null 2>&1
  150. return_val="$?"
  151. if [ "$return_val" -ne 0 ]; then
  152. echo "Error: intreface not exist"
  153. log_event 'debug' "$E_INTERFACE_NOTEXIST"
  154. exit $E_INTERFACE_NOTEXIST
  155. fi
  156. }
  157. # Defining user function
  158. format_usr() {
  159. val="$1"
  160. # Defining exlude mask
  161. special_chars=$(echo "$val" | \
  162. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:| |,|<|>|?|/|\|\"|'|;|%| ]" )
  163. # Checking result
  164. if [[ 0 -ne "$special_chars" ]]; then
  165. echo "Error: $var is out of range"
  166. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  167. exit $E_OUTOFRANGE
  168. fi
  169. }
  170. # Defining domain function
  171. format_dom() {
  172. val="$1"
  173. # Defining exlude mask
  174. special_chars=$(echo "$val" | \
  175. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%| ]" )
  176. needed_chars=$(echo "$val" | cut -s -f 2 -d '.')
  177. # Checking result
  178. if [[ 0 -ne "$special_chars" ]] || [ -z "$needed_chars" ]; then
  179. echo "Error: $var is out of range"
  180. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  181. exit $E_OUTOFRANGE
  182. fi
  183. }
  184. # Defining format_db function
  185. format_db() {
  186. val="$1"
  187. # Defining exlude mask
  188. special_chars=$(echo "$val" | \
  189. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|.|<|>|?|/|\|\"|'|;|%| ]" )
  190. # Checking result
  191. if [[ 0 -ne "$special_chars" ]] || [ 17 -le ${#val} ]; then
  192. echo "Error: $var is out of range"
  193. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  194. exit $E_OUTOFRANGE
  195. fi
  196. }
  197. # Defining format_db function
  198. format_dbu() {
  199. val="$1"
  200. # Checking result
  201. if [ 17 -le ${#val} ]; then
  202. echo "Error: $var is out of range"
  203. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  204. exit $E_OUTOFRANGE
  205. fi
  206. }
  207. # Defining dns record function
  208. format_rcd() {
  209. val="$1"
  210. case $val in
  211. A) known='yes';;
  212. NS) known='yes';;
  213. CNAME) known='yes';;
  214. AAAA) known='yes';;
  215. MX) known='yes';;
  216. TXT) known='yes';;
  217. SRV) known='yes';;
  218. DNSKEY) known='yes';;
  219. KEY) known='yes';;
  220. IPSECKEY) known='yes';;
  221. PTR) known='yes';;
  222. SPF) known='yes';;
  223. *) known='no';;
  224. esac
  225. if [[ "$known" != 'yes' ]]; then
  226. echo "Error: $var is out of range"
  227. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  228. exit $E_OUTOFRANGE
  229. fi
  230. }
  231. # Defining format_ext function
  232. format_ext() {
  233. val="$1"
  234. # Checking result
  235. if [ 200 -le ${#val} ]; then
  236. echo "Error: $var is out of range"
  237. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  238. exit $E_OUTOFRANGE
  239. fi
  240. }
  241. # Defining format_dvl function
  242. format_dvl() {
  243. val="$1"
  244. # Checking spaces
  245. check_spaces="$(echo "$val"|grep ' ')"
  246. check_rtype="$(echo "A AAAA NS CNAME" | grep -i -w "$rtype")"
  247. if [ ! -z "$check_spaces" ] && [ ! -z "$check_rtype" ]; then
  248. echo "Error: $var is out of range"
  249. log_event 'debug' "$E_OUTOFRANGE $V_EVENT"
  250. exit $E_OUTOFRANGE
  251. fi
  252. # Checking ip
  253. if [ "$rtype" = 'A' ]; then
  254. format_ip "$val"
  255. fi
  256. # Checking domain
  257. if [ "$rtype" = 'NS' ]; then
  258. format_dom "$val"
  259. fi
  260. }
  261. # Lopp on all variables
  262. for var in $*; do
  263. # Parsing reference
  264. eval v=\$$var
  265. # Checking variable format
  266. case $var in
  267. dom_alias) format_dom "$v" ;;
  268. auth_pass) format_pwd "$v" ;;
  269. auth_user) format_usr "$v" ;;
  270. ssl) format_usr "$v" ;;
  271. domain) format_dom "$v" ;;
  272. database) format_db "$v" ;;
  273. db_user) format_dbu "$v" ;;
  274. dvalue) format_dvl "$v" ;;
  275. fname) format_usr "$v" ;;
  276. job) format_int "$v" ;;
  277. ns) format_dom "$v" ;;
  278. ns1) format_dom "$v" ;;
  279. ns2) format_dom "$v" ;;
  280. ns3) format_dom "$v" ;;
  281. ns4) format_dom "$v" ;;
  282. ns5) format_dom "$v" ;;
  283. ns6) format_dom "$v" ;;
  284. ns7) format_dom "$v" ;;
  285. ns8) format_dom "$v" ;;
  286. email) format_eml "$v" ;;
  287. extentions) format_ext "$v" ;;
  288. host) format_usr "$v" ;;
  289. interface) format_ifc "$v" ;;
  290. ip) format_ip "$v" ;;
  291. ip_status) format_ips "$v" ;;
  292. ip_name) format_dom "$v" ;;
  293. id) format_int "$v" ;;
  294. mask) format_ip "$v" ;;
  295. max_usr) format_int "$v" ;;
  296. max_db) format_int "$v" ;;
  297. lname) format_usr "$v" ;;
  298. owner) format_usr "$v" ;;
  299. package) format_usr "$v" ;;
  300. password) format_pwd "$v" ;;
  301. port) format_int "$v" ;;
  302. rtype) format_rcd "$v" ;;
  303. shell) format_sh "$v" ;;
  304. soa) format_dom "$v" ;;
  305. suspend_url) format_url "$v" ;;
  306. template) format_usr "$v" ;;
  307. ttl) format_int "$v" ;;
  308. user) format_usr "$v" ;;
  309. esac
  310. done
  311. }
  312. # Sub system checker
  313. is_system_enabled() {
  314. stype="$1"
  315. web_function() {
  316. if [ -z "$WEB_SYSTEM" ] || [ "$WEB_SYSTEM" = "no" ]; then
  317. echo "Error: web hosting support disabled"
  318. log_event 'debug' "$E_WEB_DISABLED $V_EVENT"
  319. exit $E_WEB_DISABLED
  320. fi
  321. }
  322. proxy_function() {
  323. if [ "$PROXY_SYSTEM" != 'nginx' ]; then # only nginx
  324. echo "Error: proxy hosting support disabled" # support for
  325. log_event 'debug' "$E_PROXY_DISABLED $V_EVENT" # now
  326. exit $E_PROXY_DISABLED
  327. fi
  328. }
  329. dns_function() {
  330. if [ -z "$DNS_SYSTEM" ] || [ "$DNS_SYSTEM" = "no" ]; then
  331. echo "Error: dns support disabled"
  332. log_event 'debug' "$E_DNS_DISABLED $V_EVENT"
  333. exit $E_DNS_DISABLED
  334. fi
  335. }
  336. cron_function() {
  337. if [ -z "$CRON_SYSTEM" ] || [ "$CRON_SYSTEM" = "no" ]; then
  338. echo "Error: crond support disabled"
  339. log_event 'debug' "$E_CRON_DISABLED $V_EVENT"
  340. exit $E_CRON_DISABLED
  341. fi
  342. }
  343. db_function() {
  344. if [ -z "$DB_SYSTEM" ] || [ "$DB_SYSTEM" = "no" ]; then
  345. echo "Error: db support disabled"
  346. log_event 'debug' "$E_DB_DISABLED $V_EVENT"
  347. exit $E_DB_DISABLED
  348. fi
  349. }
  350. backup_function() {
  351. if [ -z "$BACKUP_SYSTEM" ] || [ "$BACKUP_SYSTEM" = "no" ]; then
  352. echo "Error: backup support disabled"
  353. log_event 'debug' "$E_BACKUP_DISABLED $V_EVENT"
  354. exit $E_BACKUP_DISABLED
  355. fi
  356. }
  357. case $stype in
  358. web) web_function ;;
  359. proxy) proxy_function ;;
  360. dns) dns_function ;;
  361. cron) cron_function ;;
  362. db) db_function ;;
  363. backup) backup_function ;;
  364. *) check_args '1' '0' 'system'
  365. esac
  366. }
  367. # System user check
  368. is_user_valid() {
  369. search_user="${1-$user}"
  370. check_user=$(cut -f 1 -d : /etc/passwd | grep -w "$search_user" )
  371. if [ -z "$check_user" ]; then
  372. echo "Error: user not found"
  373. log_event 'debug' "$E_USER_NOTEXIST $V_EVENT"
  374. exit $E_USER_NOTEXIST
  375. fi
  376. if [ ! -d "$V_USERS/$search_user" ]; then
  377. echo "Error: unknown user"
  378. log_event 'debug' "$E_USER_UNKNOWN $V_EVENT"
  379. exit $E_USER_UNKNOWN
  380. fi
  381. }
  382. # Specific key check
  383. is_user_suspended() {
  384. check_suspend=$(grep "SUSPENDED='yes'" $V_USERS/$user/user.conf)
  385. if [ ! -z "$check_suspend" ]; then
  386. echo "Error: User is suspended"
  387. log_event 'debug' "$E_USER_SUSPENDED $V_EVENT"
  388. exit $E_USER_SUSPENDED
  389. fi
  390. }
  391. # User package check
  392. is_package_full() {
  393. stype="$1"
  394. web_domain() {
  395. # Checking zero domains
  396. domain_number=$(wc -l $V_USERS/$user/web.conf|cut -f 1 -d ' ')
  397. # Comparing current val with conf
  398. val=$(grep '^WEB_DOMAINS=' $V_USERS/$user/user.conf|cut -f 2 -d \' )
  399. if [ "$domain_number" -ge "$val" ]; then
  400. echo "Error: Upgrade package"
  401. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  402. exit $E_PKG_UPGRADE
  403. fi
  404. }
  405. web_alias() {
  406. # Parsing aliases
  407. alias_nmb=$(grep "DOMAIN='$domain'" $V_USERS/$user/web.conf|\
  408. awk -F "ALIAS=" '{print $2}' | cut -f 2 -d \' |\
  409. sed -e "s/,/\n/g" | wc -l )
  410. # Parsing config
  411. val=$(grep 'WEB_ALIASES=' $V_USERS/$user/user.conf | cut -f 2 -d \' )
  412. if [ "$alias_nmb" -ge "$val" ]; then
  413. echo "Error: Upgrade package"
  414. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  415. exit $E_PKG_UPGRADE
  416. fi
  417. }
  418. web_ssl() {
  419. # Parsing config
  420. val=$(grep '^WEB_SSL=' $V_USERS/$user/user.conf | cut -f 2 -d \' )
  421. if [ "$val" -eq '0' ]; then
  422. echo "Error: Upgrade package"
  423. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  424. exit $E_PKG_UPGRADE
  425. fi
  426. # Checking domains
  427. domain_nmb=$(grep "SSL='yes'" $V_USERS/$user/web.conf | wc -l)
  428. # Comparing current val with conf
  429. if [ "$domain_nmb" -ge "$val" ]; then
  430. echo "Error: Upgrade package"
  431. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  432. exit $E_PKG_UPGRADE
  433. fi
  434. }
  435. dns_domain() {
  436. # Checking zero domains
  437. domain_number=$(wc -l $V_USERS/$user/dns.conf | cut -f 1 -d " ")
  438. # Comparing current val with conf
  439. val=$(grep '^DNS_DOMAINS=' $V_USERS/$user/user.conf | cut -f 2 -d \' )
  440. if [ "$domain_number" -ge "$val" ]; then
  441. echo "Error: Upgrade package"
  442. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  443. exit $E_PKG_UPGRADE
  444. fi
  445. }
  446. db_base() {
  447. # Checking zero domains
  448. db_number=$(wc -l $V_USERS/$user/db.conf | cut -f 1 -d " ")
  449. # Comparing current val with conf
  450. val=$(grep '^DATABASES=' $V_USERS/$user/user.conf | cut -f 2 -d \' )
  451. if [ "$db_number" -ge "$val" ]; then
  452. echo "Error: Upgrade package"
  453. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  454. exit $E_PKG_UPGRADE
  455. fi
  456. }
  457. # FIXME - should finish other functions
  458. # Switching
  459. case "$stype" in
  460. web_domain) web_domain "$user" ;;
  461. web_alias) web_alias "$user" "$domain" ;;
  462. web_ssl) web_ssl "$user" ;;
  463. dns) dns_domain "$user" ;;
  464. db_base) db_base "$user" ;;
  465. mail_domain) mail_domain "$user" ;;
  466. mail_box) mail_box "$user" "$domain";;
  467. mail_forwarder) mail_forwarder "$user" "$domain";;
  468. *)
  469. echo "Error: bad type"
  470. log_event 'debug' "$E_BAD_TYPE $V_EVENT"
  471. exit $E_BAD_TYPE
  472. ;;
  473. esac
  474. }
  475. is_package_avalable() {
  476. # Parsing user data
  477. usr_data=$(cat $V_USERS/$user/user.conf)
  478. for key in $usr_data; do
  479. eval ${key%%=*}=${key#*=}
  480. done
  481. # Clearing vars
  482. WEB_DOMAINS='0'
  483. WEB_SSL='0'
  484. DATABASES='0'
  485. MAIL_DOMAINS='0'
  486. MAIL_BOXES='0'
  487. MAIL_FORWARDERS='0'
  488. DNS_DOMAINS='0'
  489. DISK_QUOTA='0'
  490. BANDWIDTH='0'
  491. # Parsing package
  492. pkg_data=$(cat $V_PKG/$package.pkg)
  493. for key in $pkg_data; do
  494. eval ${key%%=*}=${key#*=}
  495. done
  496. # Comparing user data with package
  497. if [ "$WEB_DOMAINS" -lt "$U_WEB_DOMAINS" ] ||\
  498. [ "$WEB_SSL" -lt "$U_WEB_SSL" ] ||\
  499. [ "$DATABASES" -lt "$U_DATABASES" ] ||\
  500. [ "$MAIL_DOMAINS" -lt "$U_MAIL_DOMAINS" ] ||\
  501. [ "$DNS_DOMAINS" -lt "$U_DNS_DOMAINS" ] ||\
  502. [ "$DISK_QUOTA" -lt "$U_DISK" ] ||\
  503. [ "$BANDWIDTH" -lt "$U_BANDWIDTH" ]; then
  504. echo "Error: Upgrade package"
  505. log_event 'debug' "$E_PKG_UPGRADE $v_log"
  506. exit $E_PKG_UPGRADE
  507. fi
  508. }
  509. is_template_valid() {
  510. stype="$1"
  511. web_template() {
  512. check_tpl=$(echo "$templates"|sed -e "s/,/\n/g"|grep "^$template$")
  513. tpl="$V_WEBTPL/apache_$template.tpl"
  514. descr="$V_WEBTPL/apache_$template.descr"
  515. ssl="$V_WEBTPL/apache_$template.stpl"
  516. if [ -z "$check_tpl" ] || [ ! -e $tpl ] || \
  517. [ ! -e $descr ] || [ ! -e $ssl ]; then
  518. echo "Error: template not found"
  519. log_event 'debug' "$E_TPL_NOTEXIST"
  520. exit $E_TPL_NOTEXIST
  521. fi
  522. }
  523. proxy_template() {
  524. tpl="$V_WEBTPL/ngingx_vhost_$template.tpl"
  525. descr="$V_WEBTPL/ngingx_vhost_$template.descr"
  526. ssl="$V_WEBTPL/ngingx_vhost_$template.stpl"
  527. if [ ! -e $tpl ] || [ ! -e $descr ] || [ ! -e $ssl ]; then
  528. echo "Error: template not found"
  529. log_event 'debug' "$E_TPL_NOTEXIST"
  530. exit $E_TPL_NOTEXIST
  531. fi
  532. }
  533. dns_template() {
  534. tpl="$V_DNSTPL/$template.tpl"
  535. descr="$V_DNSTPL/$template.descr"
  536. if [ ! -e $tpl ] || [ ! -e $descr ]; then
  537. echo "Error: template not found"
  538. log_event 'debug' "$E_TPL_NOTEXIST"
  539. exit $E_TPL_NOTEXIST
  540. fi
  541. }
  542. # Switching config
  543. case $stype in
  544. web) web_template "$template" ;;
  545. proxy) proxy_template "$template" ;;
  546. dns) dns_template "$template" ;;
  547. esac
  548. }
  549. get_user_value() {
  550. key="$1"
  551. USER="$user"
  552. # Parsing domains
  553. string=$( cat $V_USERS/$user/user.conf )
  554. # Parsing key=value
  555. for keys in $string; do
  556. eval ${keys%%=*}=${keys#*=}
  557. done
  558. # Self reference
  559. eval value="$key"
  560. # Print value
  561. echo "$value"
  562. }
  563. restart_schedule() {
  564. type="$1"
  565. period="$2"
  566. # Checking period
  567. if [ -z "$period" ]; then
  568. period=$(grep 'RESTART_PERIOD=' $V_CONF/vesta.conf | cut -f 2 -d \')
  569. fi
  570. if [ "$period" -le 0 ]; then
  571. $V_FUNC/restart_"$type"
  572. else
  573. echo "$type" >> $V_QUEUE/restart.pipe
  574. fi
  575. }
  576. is_user_free() {
  577. # Parsing domain values
  578. check_sysuser=$(cut -f 1 -d : /etc/passwd | grep -w "$user" )
  579. # Checking result
  580. if [ ! -z "$check_sysuser" ] || [ -e "$V_USERS/$user" ]; then
  581. echo "Error: user $user exist"
  582. log_event 'debug' "$E_USER_EXIST $V_EVENT"
  583. exit $E_USER_EXIST
  584. fi
  585. }
  586. is_package_valid() {
  587. if [ ! -e "$V_PKG/$package.pkg" ]; then
  588. echo "Error: package is not exist"
  589. log_event 'debug' "$E_PKG_NOTEXIST $v_log"
  590. exit $E_PKG_NOTEXIST
  591. fi
  592. }
  593. is_user_key_empty() {
  594. key="$1"
  595. # Parsing ip
  596. string=$(cat $V_USERS/$user/user.conf )
  597. # Parsing key=value
  598. for keys in $string; do
  599. eval ${keys%%=*}=${keys#*=}
  600. done
  601. # Self reference
  602. eval value="$key"
  603. # Checkng key
  604. if [ ! -z "$value" ] && [ "$value" != 'no' ] && [ "$value" != '0' ]; then
  605. echo "Error: value is not empty = $value "
  606. log_event 'debug' "$E_VALUE_EXIST $V_EVENT"
  607. exit $E_VALUE_EXIST
  608. fi
  609. }
  610. update_user_value() {
  611. USER="$1"
  612. key="$2"
  613. value="$3"
  614. # Defining conf
  615. conf="$V_USERS/$USER/user.conf"
  616. # Parsing conf
  617. str=$(cat $conf)
  618. # Reading key=values
  619. for keys in $str; do
  620. eval ${keys%%=*}=${keys#*=}
  621. done
  622. # Define clean key
  623. c_key=$(echo "${key//$/}")
  624. eval old="${key}"
  625. # Escaping slashes
  626. old=$(echo "$old" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
  627. new=$(echo "$value" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
  628. # Updating conf
  629. sed -i "s/$c_key='${old//\*/\\*}'/$c_key='${new//\*/\\*}'/g" $conf
  630. }
  631. increase_user_value() {
  632. USER="$1"
  633. key="$2"
  634. # Defining conf
  635. conf="$V_USERS/$USER/user.conf"
  636. # Deleting $
  637. key=$(echo "${key//$/}")
  638. # Parsing current value
  639. current_value=$(grep "$key=" $conf |cut -f 2 -d \')
  640. # Checking result
  641. if [ -z "$current_value" ]; then
  642. echo "Error: Parsing error"
  643. log_event 'debug' "$E_PARSE_ERROR $V_EVENT"
  644. exit $E_PARSE_ERROR
  645. fi
  646. # Plus one
  647. new_value=$(expr $current_value + 1 )
  648. # Changing config
  649. sed -i "s/$key='$current_value'/$key='$new_value'/g" $conf
  650. }
  651. is_type_valid() {
  652. # Argument defenition
  653. sys="$1"
  654. stype="$2"
  655. # Switching config
  656. case $sys in
  657. stat) skey='STATS_SYSTEM=';;
  658. db) skey='DB_SYSTEM=' ;;
  659. *) skey='UNKNOWN' ;;
  660. esac
  661. # Parsing domain values
  662. check_type=$(grep "$skey" $V_CONF/vesta.conf|grep -w $stype)
  663. # Checking result
  664. if [ -z "$check_type" ]; then
  665. echo "Error: unknown type"
  666. log_event 'debug' "$E_BAD_TYPE $V_EVENT"
  667. exit $E_BAD_TYPE
  668. fi
  669. }
  670. change_user_package() {
  671. # Parsing user data
  672. usr_data=$(cat $V_USERS/$user/user.conf)
  673. for key in $usr_data; do
  674. eval ${key%%=*}=${key#*=}
  675. done
  676. # Parsing package
  677. pkg_data=$(cat $V_PKG/$package.pkg)
  678. for key in $pkg_data; do
  679. eval ${key%%=*}=${key#*=}
  680. done
  681. echo "FNAME='$FNAME'
  682. LNAME='$LNAME'
  683. PACKAGE='$package'
  684. WEB_DOMAINS='$WEB_DOMAINS'
  685. WEB_SSL='$WEB_SSL'
  686. WEB_ALIASES='$WEB_ALIASES'
  687. DATABASES='$DATABASES'
  688. MAIL_DOMAINS='$MAIL_DOMAINS'
  689. MAIL_BOXES='$MAIL_BOXES'
  690. MAIL_FORWARDERS='$MAIL_FORWARDERS'
  691. DNS_DOMAINS='$DNS_DOMAINS'
  692. DISK_QUOTA='$DISK_QUOTA'
  693. BANDWIDTH='$BANDWIDTH'
  694. NS='$NS'
  695. SHELL='$SHELL'
  696. BACKUPS='$BACKUPS'
  697. WEB_TPL='$WEB_TPL'
  698. SUSPENDED='$SUSPENDED'
  699. CONTACT='$CONTACT'
  700. REPORTS='$REPORTS'
  701. IP_OWNED='$IP_OWNED'
  702. U_DIR_DISK='$U_DIR_DISK'
  703. U_DISK='$U_DISK'
  704. U_BANDWIDTH='$U_BANDWIDTH'
  705. U_WEB_DOMAINS='$U_WEB_DOMAINS'
  706. U_WEB_SSL='$U_WEB_SSL'
  707. U_DNS_DOMAINS='$U_DNS_DOMAINS'
  708. U_DATABASES='$U_DATABASES'
  709. U_MAIL_DOMAINS='$U_MAIL_DOMAINS'
  710. DATE='$DATE'" > $V_USERS/$user/user.conf
  711. }
  712. get_shell_path() {
  713. check_shell=$(/usr/bin/chsh --list-shells | grep -w "$shell" )
  714. echo "$check_shell"
  715. }
  716. is_user_value_exist() {
  717. key="$1"
  718. string=$(cat $V_USERS/$user/user.conf )
  719. # Parsing key=value
  720. for keys in $string; do
  721. eval ${keys%%=*}=${keys#*=}
  722. done
  723. # Self reference
  724. eval value="$key"
  725. # Checking result
  726. if [ -z "$value" ] || [ "$value" = 'no' ]; then
  727. echo "Error: ${key//$/} is empty"
  728. log_event 'debug' "$E_VALUE_EMPTY $V_EVENT"
  729. exit $E_VALUE_EMPTY
  730. fi
  731. }
  732. decrease_user_value() {
  733. USER="$1"
  734. key="$2"
  735. conf="$V_USERS/$USER/user.conf"
  736. # Deleting $
  737. key=$(echo "${key//$/}")
  738. # Parsing current value
  739. current_value=$(grep "$key=" $conf |cut -f 2 -d \')
  740. # Checking result
  741. if [ -z "$current_value" ]; then
  742. echo "Error: Parsing error"
  743. log_event 'debug' "$E_PARSE_ERROR $V_EVENT"
  744. exit $E_PARSE_ERROR
  745. fi
  746. # Checking zero val
  747. if [ "$current_value" -gt 0 ]; then
  748. # Minus one
  749. new_value=$(expr $current_value - 1 )
  750. # Changing config
  751. sed -i "s/$key='$current_value'/$key='$new_value'/g" $conf
  752. fi
  753. }
  754. # Json listing function
  755. json_list() {
  756. # Print top bracket
  757. echo '{'
  758. # Count fields
  759. fileds_count=$(echo $fields| wc -w )
  760. # Reading file line by line
  761. while read line; do
  762. # Assing key=value pair
  763. for key in $line; do
  764. eval ${key%%=*}=${key#*=}
  765. done
  766. # Closing bracket if there already was output
  767. if [ -n "$data" ]; then
  768. echo -e ' },'
  769. fi
  770. i=1
  771. for field in $fields; do
  772. eval value=$field
  773. if [ $i -eq 1 ]; then
  774. # Printing parrent
  775. (( ++i))
  776. echo -e "\t\"$value\": {"
  777. else
  778. # Printing child
  779. if [ $i -lt $fileds_count ]; then
  780. (( ++i))
  781. echo -e "\t\t\"${field//$/}\": \"$value\","
  782. else
  783. echo -e "\t\t\"${field//$/}\": \"$value\""
  784. data=1
  785. fi
  786. fi
  787. done
  788. done < $conf
  789. # Closing bracket if there was output
  790. if [ -n "$data" ]; then
  791. echo -e ' }'
  792. fi
  793. # Printing bottom bracket
  794. echo -e '}'
  795. }
  796. # Shell listing function
  797. shell_list() {
  798. if [ -z "$nohead" ] ; then
  799. # Print brief info
  800. echo "${fields//$/}"
  801. for a in $fields; do
  802. echo -e "------ \c"
  803. done
  804. echo
  805. fi
  806. # Reading file line by line
  807. while read line ; do
  808. # Assing key=value pair
  809. for key in $line; do
  810. eval ${key%%=*}=${key#*=}
  811. done
  812. # Print result
  813. eval echo "$fields"
  814. done < $conf
  815. }
  816. get_usr_disk() {
  817. size='0'
  818. # Using tricky way to parse configs
  819. dir_usage=$(grep 'U_DIR_DISK=' $V_USERS/$user/user.conf |\
  820. cut -f 2 -d "'")
  821. size=$((size + dir_usage))
  822. # Checking web
  823. if [ -f "$V_USERS/$user/web.conf" ]; then
  824. # Using tricky way to parse configs
  825. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/web.conf |\
  826. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  827. for disk in $disk_usage; do
  828. size=$((size + disk))
  829. done
  830. fi
  831. # Checking db
  832. if [ -f "$V_USERS/$user/db.conf" ]; then
  833. # Using tricky way to parse configs
  834. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/db.conf |\
  835. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  836. for disk in $disk_usage; do
  837. size=$((size + disk))
  838. done
  839. fi
  840. # Checking mail
  841. if [ -f "$V_USERS/$user/mail_domains.conf" ]; then
  842. # Using tricky way to parse configs
  843. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/mail_domains.conf |\
  844. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  845. for disk in $disk_usage; do
  846. size=$((size + disk))
  847. done
  848. fi
  849. echo "$size"
  850. }
  851. get_usr_traff() {
  852. size='0'
  853. conf='web.conf'
  854. # Checking web
  855. if [ -f "$V_USERS/$user/$conf" ]; then
  856. # Using tricky way to parse configs
  857. bandwidth_usage=$(grep 'U_BANDWIDTH=' $V_USERS/$user/$conf|\
  858. awk -F "U_BANDWIDTH='" '{print $2}'|cut -f 1 -d "'")
  859. for bandwidth in $bandwidth_usage; do
  860. size=$((size + bandwidth))
  861. done
  862. fi
  863. echo "$size"
  864. }
  865. get_config_value() {
  866. key="$1"
  867. # Parsing config
  868. string=$(cat $V_CONF/vesta.conf)
  869. # Parsing key=value
  870. for keys in $string; do
  871. eval ${keys%%=*}=${keys#*=}
  872. done
  873. # Self reference
  874. eval value="$key"
  875. # Print value
  876. echo "$value"
  877. }
  878. is_backup_enabled() {
  879. BACKUPS=$(grep "BACKUPS='" $V_USERS/$user/user.conf |cut -f 2 -d \')
  880. if [ -z "$BACKUPS" ] || [[ "$BACKUPS" -le '0' ]]; then
  881. echo "Error: User backups are disabled"
  882. log_event 'debug' "$E_BACKUP_DISABLED $V_EVENT"
  883. exit $E_BACKUP_DISABLED
  884. fi
  885. }
  886. gen_password() {
  887. MATRIX='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  888. LENGTH=10
  889. while [ ${n:=1} -le $LENGTH ]; do
  890. PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
  891. let n+=1
  892. done
  893. echo "$PASS"
  894. }