shared.func 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  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. log=$(echo "$LOG_LEVEL" | grep -w "$level" )
  9. if [ -n "$log" ]; then
  10. echo "$event" >> $V_LOG/$level.log
  11. fi
  12. fi
  13. }
  14. # Log user history
  15. log_history() {
  16. event="$1"
  17. undo="$2"
  18. # Checking logging system
  19. if [ "$LOG_HISTORY" = 'yes' ]; then
  20. echo "$event [$undo]" >> $V_USERS/$user/history.log
  21. fi
  22. }
  23. # Argument list checker
  24. check_args() {
  25. sys_args="$1"
  26. user_args="$2"
  27. usage="$3"
  28. if [ "$user_args" -lt "$sys_args" ]; then
  29. echo "Error: bad args"
  30. echo "Usage: $V_SCRIPT $usage"
  31. log_event 'debug' "$E_ARGS $V_EVENT"
  32. exit $E_ARGS
  33. fi
  34. }
  35. # Format validator
  36. format_validation() {
  37. # Defining url function
  38. format_url() {
  39. val="$1"
  40. # Checking url
  41. check_http=$( echo "$val" |grep "^https://" )
  42. needed_chars=$(echo "$val" | cut -s -f 2 -d '.')
  43. if [ -z "$check_http" ] || [ -z "$needed_chars" ]; then
  44. echo "Error: invalid url"
  45. log_event 'debug' "$E_INVALID $V_EVENT"
  46. exit $E_INVALID
  47. fi
  48. }
  49. # Defining shell function
  50. format_sh() {
  51. val="$1"
  52. # Checking shell
  53. check_shell=$(/usr/bin/chsh --list-shells | grep -w "$val" )
  54. if [ -z "$1" ] || [ -z "$check_shell" ]; then
  55. echo "Error: shell not found"
  56. log_event 'debug' "$E_NOTEXIST $V_EVENT"
  57. exit $E_NOTEXIST
  58. fi
  59. }
  60. # Defining password function
  61. format_pwd() {
  62. val="$1"
  63. # Checking password lenght
  64. if [ "${#val}" -lt '6' ]; then
  65. echo "Error: password is shorter than 6 chars"
  66. log_event 'debug' "$E_PASSWORD $V_EVENT"
  67. exit $E_PASSWORD
  68. fi
  69. }
  70. # Defining integer function
  71. format_int() {
  72. val="$1"
  73. # Defining exlude mask
  74. special_chars=$(echo "$val" | \
  75. grep -c "[!|@|#|$|^|&|*|(|)|-|+|=|{|}|:|_|,|.|<|>|?|/|\|\"|'|;|%| ]" )
  76. if [[ 0 -ne "$special_chars" ]]; then
  77. echo "Error: $var out of range"
  78. log_event 'debug' "$E_INVALID $V_EVENT"
  79. exit $E_INVALID
  80. fi
  81. # Checking letters
  82. letters=$(echo "$val" | grep -c "[a-Z]")
  83. if [ 0 -ne "$letters" ]; then
  84. echo "Error: $var out of range"
  85. log_event 'debug' "$E_INVALID $V_EVENT"
  86. exit $E_INVALID
  87. fi
  88. # Checking -zero
  89. if [[ 0 -ne "$val" ]] && [[ 0 -gt "$val" ]]; then
  90. echo "Error: $var out of range"
  91. log_event 'debug' "$E_INVALID $V_EVENT"
  92. exit $E_INVALID
  93. fi
  94. }
  95. # Defining ip function
  96. format_ip() {
  97. val="$1"
  98. oc1=$(echo $val | cut -s -f 1 -d . )
  99. oc2=$(echo $val | cut -s -f 2 -d . )
  100. oc3=$(echo $val | cut -s -f 3 -d . )
  101. oc4=$(echo $val | cut -s -f 4 -d . )
  102. # Checking octets
  103. if [ -z "$oc1" ] || [ -z "$oc2" ] || [ -z "$oc3" ] || [ -z "$oc4" ]
  104. then
  105. echo "Error: $var out of range"
  106. log_event 'debug' "$E_INVALID $V_EVENT"
  107. exit $E_INVALID
  108. fi
  109. }
  110. # Defining ip_status function
  111. format_ips() {
  112. val="$1"
  113. check_status=$(echo "shared, exclusive" | grep -w "$val" )
  114. # Checking status
  115. if [ -z "$check_status" ]; then
  116. echo "Error: $var out of range"
  117. log_event 'debug' "$E_INVALID $V_EVENT"
  118. exit $E_INVALID
  119. fi
  120. }
  121. # Defining email function
  122. format_eml() {
  123. val="$1"
  124. check_at=$(echo "$val" | cut -s -f 1 -d @)
  125. check_dt=$(echo "$val" | cut -s -f 2 -d @|cut -s -f 2 -d .)
  126. # Checking format
  127. if [ -z "$check_at" ] ||\
  128. [ -z "$check_dt" ] ||\
  129. [ "${#check_dt}" -lt 2 ] &&\
  130. [ "$val" != 'admin@localhost' ]; then
  131. echo "Error: email format is wrong"
  132. log_event 'debug' "$E_INVALID $V_EVENT"
  133. exit $E_INVALID
  134. fi
  135. }
  136. # Defining interface function
  137. format_ifc() {
  138. val="$1"
  139. # Parsing ifconfig
  140. /sbin/ifconfig "$val" > /dev/null 2>&1
  141. return_val="$?"
  142. if [ "$return_val" -ne 0 ]; then
  143. echo "Error: intreface not exist"
  144. log_event 'debug' "$E_NOTEXIST"
  145. exit $E_NOTEXIST
  146. fi
  147. }
  148. # Defining user function
  149. format_usr() {
  150. val="$1"
  151. # Defining exlude mask
  152. special_chars=$(echo "$val" | \
  153. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:| |,|<|>|?|/|\|\"|'|;|%| ]" )
  154. # Checking result
  155. if [[ 0 -ne "$special_chars" ]]; then
  156. echo "Error: $var is out of range"
  157. log_event 'debug' "$E_INVALID $V_EVENT"
  158. exit $E_INVALID
  159. fi
  160. }
  161. # Defining domain function
  162. format_dom() {
  163. val="$1"
  164. # Defining exlude mask
  165. special_chars=$(echo "$val" | \
  166. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%| ]" )
  167. needed_chars=$(echo "$val" | cut -s -f 2 -d '.')
  168. # Checking result
  169. if [[ 0 -ne "$special_chars" ]] || [ -z "$needed_chars" ]; then
  170. echo "Error: $var is out of range"
  171. log_event 'debug' "$E_INVALID $V_EVENT"
  172. exit $E_INVALID
  173. fi
  174. }
  175. # Defining format_db function
  176. format_db() {
  177. val="$1"
  178. # Defining exlude mask
  179. special_chars=$(echo "$val" | \
  180. grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|.|<|>|?|/|\|\"|'|;|%| ]" )
  181. # Checking result
  182. if [[ 0 -ne "$special_chars" ]] || [ 17 -le ${#val} ]; then
  183. echo "Error: $var is out of range"
  184. log_event 'debug' "$E_INVALID $V_EVENT"
  185. exit $E_INVALID
  186. fi
  187. }
  188. # Defining format_db function
  189. format_dbu() {
  190. val="$1"
  191. # Checking result
  192. if [ 17 -le ${#val} ]; then
  193. echo "Error: $var is out of range"
  194. log_event 'debug' "$E_INVALID $V_EVENT"
  195. exit $E_INVALID
  196. fi
  197. }
  198. # Defining dns record function
  199. format_rcd() {
  200. val="$1"
  201. case $val in
  202. A) known='yes';;
  203. NS) known='yes';;
  204. CNAME) known='yes';;
  205. AAAA) known='yes';;
  206. MX) known='yes';;
  207. TXT) known='yes';;
  208. SRV) known='yes';;
  209. DNSKEY) known='yes';;
  210. KEY) known='yes';;
  211. IPSECKEY) known='yes';;
  212. PTR) known='yes';;
  213. SPF) known='yes';;
  214. *) known='no';;
  215. esac
  216. if [[ "$known" != 'yes' ]]; then
  217. echo "Error: $var is out of range"
  218. log_event 'debug' "$E_INVALID $V_EVENT"
  219. exit $E_INVALID
  220. fi
  221. }
  222. # Define minute/hour/day/month validator
  223. format_mhd() {
  224. val="$1"
  225. digit=$val
  226. limit=60
  227. if [ "$var" = 'day' ]; then
  228. limit=31
  229. fi
  230. if [ "$var" = 'month' ]; then
  231. limit=12
  232. fi
  233. if [ "$var" = 'wday' ]; then
  234. limit=7
  235. fi
  236. letters=$(echo "$val"|grep -c "[a-Z]")
  237. lslash=$(echo "$val"| grep "^/")
  238. if [ -z "$val" ] || [ 0 -ne "$letters" ] || [ -n "$lslash" ]; then
  239. echo "Error: $var is out of range"
  240. log_event 'debug' "$E_INVALID $V_EVENT"
  241. exit $E_INVALID
  242. fi
  243. special_chars=$(echo "$val" | \
  244. grep -c "[!|@|#|$|^|&|(|)|+|=|{|}|:|,|.|<|>|?|\|\"|'|;|%| ]" )
  245. if [[ 0 -ne "$special_chars" ]] || [ 5 -le ${#val} ]; then
  246. echo "Error: $var is out of range"
  247. log_event 'debug' "$E_INVALID $V_EVENT"
  248. exit $E_INVALID
  249. fi
  250. star=$(echo "$val" |grep '*')
  251. if [ ! -z "$star" ]; then
  252. slash=$(echo $val |grep "^*/")
  253. if [ "$val" != '*' ] && [ -z "$slash" ]; then
  254. echo "Error: $var is out of range"
  255. log_event 'debug' "$E_INVALID $V_EVENT"
  256. exit $E_INVALID
  257. else
  258. if [ -n "$slash" ]; then
  259. digit=$(echo $val | cut -f 2 -d / )
  260. fi
  261. if [ "$val" = '*' ]; then
  262. digit=0
  263. fi
  264. fi
  265. fi
  266. if [ "$limit" -lt "$digit" ]; then
  267. echo "Error: $var is out of range"
  268. log_event 'debug' "$E_INVALID $V_EVENT"
  269. exit $E_INVALID
  270. fi
  271. }
  272. # Defining format_boolean function
  273. format_bool() {
  274. val="$1"
  275. if [ "$val" != 'yes' ] && [ "$val" != 'no' ]; then
  276. echo "Error: $var is out of range"
  277. log_event 'debug' "$E_INVALID $V_EVENT"
  278. exit $E_INVALID
  279. fi
  280. }
  281. # Defining format_bit function
  282. format_bit() {
  283. val="$1"
  284. case $val in
  285. 128) known='yes';;
  286. 256) known='yes';;
  287. 512) known='yes';;
  288. 768) known='yes';;
  289. 1024) known='yes';;
  290. 2048) known='yes';;
  291. *) known='no';;
  292. esac
  293. if [[ "$known" != 'yes' ]]; then
  294. echo "Error: $var is out of range"
  295. log_event 'debug' "$E_INVALID $V_EVENT"
  296. exit $E_INVALID
  297. fi
  298. }
  299. # Defining format_ext function
  300. format_ext() {
  301. val="$1"
  302. # Checking result
  303. if [ 200 -le ${#val} ]; then
  304. echo "Error: $var is out of range"
  305. log_event 'debug' "$E_INVALID $V_EVENT"
  306. exit $E_INVALID
  307. fi
  308. }
  309. # Defining format_dvl function
  310. format_dvl() {
  311. val="$1"
  312. # Checking spaces
  313. check_spaces="$(echo "$val"|grep ' ')"
  314. check_rtype="$(echo "A AAAA NS CNAME" | grep -i -w "$rtype")"
  315. if [ ! -z "$check_spaces" ] && [ ! -z "$check_rtype" ]; then
  316. echo "Error: $var is out of range"
  317. log_event 'debug' "$E_INVALID $V_EVENT"
  318. exit $E_INVALID
  319. fi
  320. # Checking ip
  321. if [ "$rtype" = 'A' ]; then
  322. format_ip "$val"
  323. fi
  324. # Checking domain
  325. if [ "$rtype" = 'NS' ]; then
  326. format_dom "$val"
  327. fi
  328. }
  329. # Lopp on all variables
  330. for var in $*; do
  331. # Parsing reference
  332. eval v=\$$var
  333. # Checking variable format
  334. case $var in
  335. antispam) format_bool "$v" ;;
  336. antivirus) format_bool "$v" ;;
  337. auth_pass) format_pwd "$v" ;;
  338. auth_user) format_usr "$v" ;;
  339. database) format_db "$v" ;;
  340. day) format_mhd "$v" ;;
  341. db_user) format_dbu "$v" ;;
  342. domain) format_dom "$v" ;;
  343. dom_alias) format_dom "$v" ;;
  344. dkim) format_bool "$v" ;;
  345. dkim_size) format_bit "$v" ;;
  346. dvalue) format_dvl "$v" ;;
  347. fname) format_usr "$v" ;;
  348. job) format_int "$v" ;;
  349. ns) format_dom "$v" ;;
  350. ns1) format_dom "$v" ;;
  351. ns2) format_dom "$v" ;;
  352. ns3) format_dom "$v" ;;
  353. ns4) format_dom "$v" ;;
  354. ns5) format_dom "$v" ;;
  355. ns6) format_dom "$v" ;;
  356. ns7) format_dom "$v" ;;
  357. ns8) format_dom "$v" ;;
  358. email) format_eml "$v" ;;
  359. extentions) format_ext "$v" ;;
  360. hour) format_mhd "$v" ;;
  361. host) format_usr "$v" ;;
  362. interface) format_ifc "$v" ;;
  363. ip) format_ip "$v" ;;
  364. ip_status) format_ips "$v" ;;
  365. ip_name) format_dom "$v" ;;
  366. id) format_int "$v" ;;
  367. mask) format_ip "$v" ;;
  368. max_usr) format_int "$v" ;;
  369. max_db) format_int "$v" ;;
  370. min) format_mhd "$v" ;;
  371. month) format_mhd "$v" ;;
  372. lname) format_usr "$v" ;;
  373. owner) format_usr "$v" ;;
  374. package) format_usr "$v" ;;
  375. password) format_pwd "$v" ;;
  376. port) format_int "$v" ;;
  377. rtype) format_rcd "$v" ;;
  378. ssl) format_usr "$v" ;;
  379. shell) format_sh "$v" ;;
  380. soa) format_dom "$v" ;;
  381. suspend_url) format_url "$v" ;;
  382. template) format_usr "$v" ;;
  383. ttl) format_int "$v" ;;
  384. user) format_usr "$v" ;;
  385. wday) format_mhd "$v" ;;
  386. esac
  387. done
  388. }
  389. # Sub system checker
  390. is_system_enabled() {
  391. eval system=\$$1
  392. if [ -z "$system" ] || [ "$system" = "no" ]; then
  393. echo "Error: $system disabled"
  394. log_event 'debug' "$E_DISABLED $V_EVENT"
  395. exit $E_DISABLED
  396. fi
  397. }
  398. # System user check
  399. is_user_valid() {
  400. search_user="${1-$user}"
  401. check_user=$(grep -w "$search_user" /etc/passwd )
  402. if [ -z "$check_user" ]; then
  403. echo "Error: user not found"
  404. log_event 'debug' "$E_NOTEXIST $V_EVENT"
  405. exit $E_NOTEXIST
  406. fi
  407. if [ ! -d "$V_USERS/$search_user" ]; then
  408. echo "Error: unknown user"
  409. log_event 'debug' "$E_USER_NOTEXIST $V_EVENT"
  410. exit $E_USER_NOTEXIST
  411. fi
  412. }
  413. # Specific key check
  414. is_user_suspended() {
  415. check_suspend=$(grep "SUSPENDED='yes'" $V_USERS/$user/user.conf)
  416. if [ ! -z "$check_suspend" ]; then
  417. echo "Error: User is suspended"
  418. log_event 'debug' "$E_SUSPENDED $V_EVENT"
  419. exit $E_SUSPENDED
  420. fi
  421. }
  422. # User package check
  423. is_package_full() {
  424. limit=$(grep "^$1=" $V_USERS/$user/user.conf | cut -f 2 -d \' )
  425. # Switching on
  426. case "$1" in
  427. WEB_DOMAINS) used=$(wc -l $V_USERS/$user/web.conf|cut -f1 -d \ );;
  428. WEB_ALIASES) used=$(grep "DOMAIN='$domain'" $V_USERS/$user/web.conf |\
  429. awk -F "ALIAS='" '{print $2}' | cut -f 1 -d \' |\
  430. tr ',' '\n'| wc -l );;
  431. DNS_DOMAINS) used=$(wc -l $V_USERS/$user/dns.conf|cut -f1 -d \ );;
  432. DNS_RECORDS) used=$(wc -l $V_USERS/$user/dns/$domain|cut -f1 -d \ );;
  433. MAIL_DOMAINS) used=$(wc -l $V_USERS/$user/mail.conf|cut -f1 -d \ );;
  434. DATABASES) used=$(wc -l $V_USERS/$user/db.conf|cut -f1 -d \ );;
  435. CRON_JOBS) used=$(wc -l $V_USERS/$user/cron.conf|cut -f1 -d \ );;
  436. esac
  437. if [ "$used" -ge "$limit" ]; then
  438. echo "Error: Upgrade package"
  439. log_event 'debug' "$E_LIMIT $v_log"
  440. exit $E_LIMIT
  441. fi
  442. }
  443. is_template_valid() {
  444. stype="$1"
  445. web_template() {
  446. check_tpl=$(echo "$templates"|sed -e "s/,/\n/g"|grep "^$template$")
  447. tpl="$V_WEBTPL/apache_$template.tpl"
  448. descr="$V_WEBTPL/apache_$template.descr"
  449. ssl="$V_WEBTPL/apache_$template.stpl"
  450. if [ -z "$check_tpl" ] || [ ! -e $tpl ] || \
  451. [ ! -e $descr ] || [ ! -e $ssl ]; then
  452. echo "Error: template not found"
  453. log_event 'debug' "$E_NOTEXIST"
  454. exit $E_NOTEXIST
  455. fi
  456. }
  457. proxy_template() {
  458. tpl="$V_WEBTPL/ngingx_vhost_$template.tpl"
  459. descr="$V_WEBTPL/ngingx_vhost_$template.descr"
  460. ssl="$V_WEBTPL/ngingx_vhost_$template.stpl"
  461. if [ ! -e $tpl ] || [ ! -e $descr ] || [ ! -e $ssl ]; then
  462. echo "Error: template not found"
  463. log_event 'debug' "$E_NOTEXIST"
  464. exit $E_NOTEXIST
  465. fi
  466. }
  467. dns_template() {
  468. tpl="$V_DNSTPL/$template.tpl"
  469. descr="$V_DNSTPL/$template.descr"
  470. if [ ! -e $tpl ] || [ ! -e $descr ]; then
  471. echo "Error: template not found"
  472. log_event 'debug' "$E_NOTEXIST"
  473. exit $E_NOTEXIST
  474. fi
  475. }
  476. # Switching config
  477. case $stype in
  478. web) web_template "$template" ;;
  479. proxy) proxy_template "$template" ;;
  480. dns) dns_template "$template" ;;
  481. esac
  482. }
  483. get_user_value() {
  484. key="$1"
  485. USER="$user"
  486. source $V_USERS/$user/user.conf
  487. eval value="$key"
  488. echo "$value"
  489. }
  490. restart_schedule() {
  491. type="$1"
  492. if [ -z "$RESTART_PERIOD" ]; then
  493. $V_BIN/v_restart_"$type" "$V_EVENT"
  494. else
  495. echo "$type" >> $V_QUEUE/restart.pipe
  496. fi
  497. }
  498. is_package_valid() {
  499. if [ ! -e "$V_PKG/$package.pkg" ]; then
  500. echo "Error: package is not exist"
  501. log_event 'debug' "$E_NOTEXIST $v_log"
  502. exit $E_NOTEXIST
  503. fi
  504. }
  505. update_user_value() {
  506. USER="$1"
  507. key="${2//$}"
  508. value="$3"
  509. conf="$V_USERS/$USER/user.conf"
  510. old=$(grep "$key=" $conf | cut -f 2 -d \')
  511. # Updating conf
  512. sed -i "s/$key='$old'/$key='$value'/g" $conf
  513. }
  514. increase_user_value() {
  515. USER="$1"
  516. key="${2//$}"
  517. factor="${3-1}"
  518. # Parsing current value
  519. conf="$V_USERS/$USER/user.conf"
  520. old=$(grep "$key=" $conf | cut -f 2 -d \')
  521. if [ -z "$old" ]; then
  522. old=0
  523. fi
  524. # Increasing
  525. new=$((old + factor))
  526. sed -i "s/$key='$old'/$key='$new'/g" $conf
  527. }
  528. is_type_valid() {
  529. # Argument defenition
  530. sys="$1"
  531. stype="$2"
  532. # Switching config
  533. case $sys in
  534. stat) skey='STATS_SYSTEM=';;
  535. db) skey='DB_SYSTEM=' ;;
  536. *) skey='UNKNOWN' ;;
  537. esac
  538. # Parsing domain values
  539. check_type=$(grep "$skey" $V_CONF/vesta.conf|grep -w $stype)
  540. # Checking result
  541. if [ -z "$check_type" ]; then
  542. echo "Error: unknown type"
  543. log_event 'debug' "$E_INVALID $V_EVENT"
  544. exit $E_INVALID
  545. fi
  546. }
  547. decrease_user_value() {
  548. USER="$1"
  549. key="${2//$}"
  550. factor="${3-1}"
  551. # Parsing current value
  552. conf="$V_USERS/$USER/user.conf"
  553. old=$(grep "$key=" $conf | cut -f 2 -d \')
  554. if [ -z "$old" ]; then
  555. old=0
  556. fi
  557. # Decreasing
  558. if [ "$old" -le 1 ]; then
  559. new=0
  560. else
  561. new=$((old - factor))
  562. fi
  563. sed -i "s/$key='$old'/$key='$new'/g" $conf
  564. }
  565. # Json listing function
  566. json_list() {
  567. # Print top bracket
  568. echo '{'
  569. # Count fields
  570. fileds_count=$(echo $fields| wc -w )
  571. # Reading file line by line
  572. while read line; do
  573. # Assing key=value pair
  574. eval $line
  575. # Closing bracket if there already was output
  576. if [ -n "$data" ]; then
  577. echo -e ' },'
  578. fi
  579. i=1
  580. for field in $fields; do
  581. eval value=$field
  582. if [ $i -eq 1 ]; then
  583. # Printing parrent
  584. (( ++i))
  585. echo -e "\t\"$value\": {"
  586. else
  587. # Printing child
  588. if [ $i -lt $fileds_count ]; then
  589. (( ++i))
  590. echo -e "\t\t\"${field//$/}\": \"$value\","
  591. else
  592. echo -e "\t\t\"${field//$/}\": \"$value\""
  593. data=1
  594. fi
  595. fi
  596. done
  597. done < $conf
  598. # Closing bracket if there was output
  599. if [ -n "$data" ]; then
  600. echo -e ' }'
  601. fi
  602. # Printing bottom bracket
  603. echo -e '}'
  604. }
  605. # Shell listing function
  606. shell_list() {
  607. if [ -z "$nohead" ] ; then
  608. # Print brief info
  609. echo "${fields//$/}"
  610. for a in $fields; do
  611. echo -e "------ \c"
  612. done
  613. echo
  614. fi
  615. # Reading file line by line
  616. while read line ; do
  617. # Assing key=value pair
  618. eval $line
  619. # Print result
  620. eval echo "$fields"
  621. done < $conf
  622. }
  623. get_usr_disk() {
  624. size='0'
  625. # Using tricky way to parse configs
  626. dir_usage=$(grep 'U_DIR_DISK=' $V_USERS/$user/user.conf |\
  627. cut -f 2 -d "'")
  628. size=$((size + dir_usage))
  629. # Checking web
  630. if [ -f "$V_USERS/$user/web.conf" ]; then
  631. # Using tricky way to parse configs
  632. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/web.conf |\
  633. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  634. for disk in $disk_usage; do
  635. size=$((size + disk))
  636. done
  637. fi
  638. # Checking db
  639. if [ -f "$V_USERS/$user/db.conf" ]; then
  640. # Using tricky way to parse configs
  641. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/db.conf |\
  642. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  643. for disk in $disk_usage; do
  644. size=$((size + disk))
  645. done
  646. fi
  647. # Checking mail
  648. if [ -f "$V_USERS/$user/mail_domains.conf" ]; then
  649. # Using tricky way to parse configs
  650. disk_usage=$(grep 'U_DISK=' $V_USERS/$user/mail_domains.conf |\
  651. awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'")
  652. for disk in $disk_usage; do
  653. size=$((size + disk))
  654. done
  655. fi
  656. echo "$size"
  657. }
  658. get_usr_traff() {
  659. size='0'
  660. conf='web.conf'
  661. # Checking web
  662. if [ -f "$V_USERS/$user/$conf" ]; then
  663. # Using tricky way to parse configs
  664. bandwidth_usage=$(grep 'U_BANDWIDTH=' $V_USERS/$user/$conf|\
  665. awk -F "U_BANDWIDTH='" '{print $2}'|cut -f 1 -d "'")
  666. for bandwidth in $bandwidth_usage; do
  667. size=$((size + bandwidth))
  668. done
  669. fi
  670. echo "$size"
  671. }
  672. is_backup_enabled() {
  673. BACKUPS=$(grep "BACKUPS='" $V_USERS/$user/user.conf |cut -f 2 -d \')
  674. if [ -z "$BACKUPS" ] || [[ "$BACKUPS" -le '0' ]]; then
  675. echo "Error: User backups are disabled"
  676. log_event 'debug' "$E_DISABLED $V_EVENT"
  677. exit $E_DISABLED
  678. fi
  679. }
  680. gen_password() {
  681. MATRIX='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  682. LENGTH=10
  683. while [ ${n:=1} -le $LENGTH ]; do
  684. PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
  685. let n+=1
  686. done
  687. echo "$PASS"
  688. }