Просмотр исходного кода

Merge pull request #540 from hestiacp/master

Push master to demo mode branch.
Raphael Schneeberger 6 лет назад
Родитель
Сommit
d3c67ca0c6
100 измененных файлов с 789 добавлено и 496 удалено
  1. 63 0
      CHANGELOG.md
  2. 11 16
      CONTRIBUTING.md
  3. 7 2
      ISSUE_TEMPLATE.md
  4. 13 4
      README.md
  5. 5 0
      bin/v-add-letsencrypt-domain
  6. 0 1
      bin/v-add-mail-domain-ssl
  7. 1 2
      bin/v-add-sys-theme
  8. 8 6
      bin/v-change-dns-record
  9. 0 1
      bin/v-change-mail-domain-sslcert
  10. 1 4
      bin/v-change-sys-hestia-ssl
  11. 5 0
      bin/v-change-sys-theme
  12. 1 0
      bin/v-change-sys-webmail
  13. 1 1
      bin/v-delete-letsencrypt-domain
  14. 2 2
      bin/v-delete-mail-domain-ssl
  15. 1 1
      bin/v-delete-user-log
  16. 12 6
      bin/v-list-sys-info
  17. 8 0
      bin/v-list-sys-services
  18. 7 2
      bin/v-list-sys-themes
  19. 4 0
      bin/v-list-user-stats
  20. 5 0
      bin/v-list-users-stats
  21. 1 1
      bin/v-open-fs-config
  22. 6 0
      bin/v-rebuild-mail-domain
  23. 6 0
      bin/v-rebuild-mail-domains
  24. 3 6
      bin/v-restart-cron
  25. 3 6
      bin/v-restart-dns
  26. 3 6
      bin/v-restart-ftp
  27. 3 6
      bin/v-restart-mail
  28. 3 6
      bin/v-restart-proxy
  29. 19 7
      bin/v-restart-service
  30. 0 1
      bin/v-restart-system
  31. 3 6
      bin/v-restart-web
  32. 3 6
      bin/v-restart-web-backend
  33. 1 4
      bin/v-update-host-certificate
  34. 2 1
      bin/v-update-sys-hestia-git
  35. 0 43
      bin/v-update-sys-themes
  36. 8 1
      func/domain.sh
  37. 2 1
      func/main.sh
  38. 15 11
      func/upgrade.sh
  39. 0 1
      install/deb/clamav/clamd.conf
  40. 0 0
      install/deb/themes/default.css
  41. 56 0
      install/deb/themes/flat.css
  42. 32 23
      install/hst-install-debian.sh
  43. 10 10
      install/hst-install-ubuntu.sh
  44. 3 3
      install/hst-install.sh
  45. 23 3
      install/upgrade/versions/latest.sh
  46. 1 9
      install/upgrade/versions/previous/1.0.2.sh
  47. 8 0
      install/upgrade/versions/previous/1.0.4.sh
  48. 1 1
      src/hst_autocompile.sh
  49. 0 1
      web/add/cron/autoupdate/index.php
  50. 0 1
      web/add/cron/reports/index.php
  51. 11 2
      web/add/dns/index.php
  52. 4 4
      web/css/jquery-custom-dialogs.css
  53. 172 194
      web/css/styles.min.css
  54. 0 1
      web/delete/cron/autoupdate/index.php
  55. 0 1
      web/delete/cron/reports/index.php
  56. 12 2
      web/edit/dns/index.php
  57. 1 1
      web/edit/mail/index.php
  58. 58 0
      web/edit/server/ssh/index.php
  59. 1 1
      web/edit/web/index.php
  60. 1 0
      web/inc/i18n/ar.php
  61. 1 0
      web/inc/i18n/bg.php
  62. 1 0
      web/inc/i18n/bs.php
  63. 1 0
      web/inc/i18n/cn.php
  64. 1 1
      web/inc/i18n/cz.php
  65. 1 0
      web/inc/i18n/da.php
  66. 1 0
      web/inc/i18n/de.php
  67. 1 0
      web/inc/i18n/el.php
  68. 3 0
      web/inc/i18n/en.php
  69. 1 0
      web/inc/i18n/es.php
  70. 1 0
      web/inc/i18n/fa.php
  71. 2 0
      web/inc/i18n/fi.php
  72. 2 0
      web/inc/i18n/fr.php
  73. 2 0
      web/inc/i18n/hu.php
  74. 1 0
      web/inc/i18n/id.php
  75. 1 0
      web/inc/i18n/it.php
  76. 2 0
      web/inc/i18n/ja.php
  77. 1 0
      web/inc/i18n/ko.php
  78. 1 0
      web/inc/i18n/no.php
  79. 1 0
      web/inc/i18n/pt.php
  80. 2 0
      web/inc/i18n/ro.php
  81. 1 0
      web/inc/i18n/ru.php
  82. 2 0
      web/inc/i18n/se.php
  83. 1 0
      web/inc/i18n/sr.php
  84. 1 0
      web/inc/i18n/th.php
  85. 1 1
      web/inc/i18n/tr.php
  86. 1 0
      web/inc/i18n/ua.php
  87. 1 0
      web/inc/i18n/ur.php
  88. 1 0
      web/inc/i18n/vi.php
  89. 0 2
      web/js/app.js
  90. 3 4
      web/js/templates.js
  91. 11 2
      web/templates/admin/add_dns.html
  92. 10 1
      web/templates/admin/add_dns_rec.html
  93. 1 1
      web/templates/admin/add_mail_acc.html
  94. 23 23
      web/templates/admin/add_user.html
  95. 11 1
      web/templates/admin/edit_dns.html
  96. 27 3
      web/templates/admin/edit_dns_rec.html
  97. 15 17
      web/templates/admin/edit_server.html
  98. 1 1
      web/templates/admin/edit_server_nginx.html
  99. 20 20
      web/templates/admin/edit_user.html
  100. 1 1
      web/templates/admin/list_backup.html

+ 63 - 0
CHANGELOG.md

@@ -0,0 +1,63 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+## [CURRENT] - Development
+### Features
+- 
+
+### Bugfixes
+- 
+
+## [1.0.4] - 2019-07-09 - Hotfix
+### Bugfixes
+- Delay start of services to prevent restart liimit
+
+## [1.0.3] - 2019-07-09 - Hotfix
+### Bugfixes
+- Fix Let's Encrypt Mail SSL permission issue
+
+## [1.0.1] - 2019-06-25
+### Features
+- Improved support for Let's Encrypt certificate generation
+- Addition of Let's Encrypt support for Control Panel – see v-add-letsencrypt-host
+- Enabled use of per-domain SSL certificates for inbound and outbound mail services
+- Consolidated template structure, removing over 50% duplicate code
+- Re-organized file system structure for domain configuration files
+- Added the ability to change release branches through the user interface and command line
+- Added the ability to update using Git from the command line - see v-sys-update-hestia-git
+- Implemented support for SFTP chroot jails
+- A newly redesigned user interface which features:
+    - A softer color palette which better matches the Hestia Control Panel logo colors.
+    - A consolidated overview of domains and other information
+    - Improved navigation paths to make things easier to find
+    - Improved compatibility when viewing the Control Panel interface from a mobile device
+- Improved handling of mail domain DNS zone values
+- Enabled OCSP stapling on SSL-enabled web domains
+- Enabled support for HTTP Strict Transport Security on SSL-enabled web domains in the system backend– see v-change-web-domain-hsts
+- Improved logging and console output during new installations and upgrades
+
+### Bugfixes
+- Fixed issues with HTTP-to-HTTPS redirecton
+- Fixed an issue where another website would load if browsing to a non-SSL enabled domaing using HTTPS.
+
+## [1.0.0-190618] - 2019-06-25
+### Features
+- 
+
+### Bugfixes
+- 
+
+## [0.9.8-28] - 2019-05-16
+### Features
+- Implement force ssl function for web domains
+
+### Bugfixes
+- 
+
+
+[CURRENT]: https://github.com/hestiacp/hestiacp
+[1.0.4]: https://github.com/hestiacp/hestiacp/releases/tag/1.0.4
+[1.0.3]: https://github.com/hestiacp/hestiacp/releases/tag/1.0.3
+[1.0.1]: https://github.com/hestiacp/hestiacp/releases/tag/1.0.1
+[1.0.0-190618]: https://github.com/hestiacp/hestiacp/releases/tag/1.0.0-190618
+[0.9.8-28]: https://github.com/hestiacp/hestiacp/releases/tag/0.9.8-28

+ 11 - 16
CONTRIBUTING.md

@@ -1,45 +1,40 @@
 How to Contribute
 ==================================================
 
-Do you want to contribute to the Hestia Control Panel project? The easiest way to get started is to [submit an issue report](https://github.com/hestiacp/hestia/issues) if you come across a bug or issue. If you're a developer, please feel free to submit a patch/pull request with a fix. 
+Do you want to contribute to the Hestia Control Panel project? The easiest way to get started is to [submit an issue report](https://github.com/hestiacp/hestia/issues) if you come across a bug or issue. If you are a developer, please feel free to submit your code via pull request for review.
 
-**We appreciate all contributions to our project; it is with the help of the open-source community that we are able to build a product that meets users needs.**
+**We appreciate and welcome all contributions to our project; it is with the help of the open-source community that we are able to build a product that meets our users needs.**
 
 Code Contributions & Pull Requests - Guidelines
 -----------------------
 
 **All pull requests must include:**
-1. A brief but descriptive title, such as **Fixed typo in php.ini** or **Updated rebuild_mail_conf function in rebuild.sh**.
+1. A brief but descriptive title, such as **Fixed syntax error in php.ini** or **Updated rebuild_mail_conf function in rebuild.sh**.
 2. A detailed description of the changes that you've made.
    1. Example: "Apache subdomain configuration was incorrect, modified variables in templates to point to the correct files."
 3. Only commits which are related to the pull request or issue itself.
 
 ### Code formatting and comments:
-We ask that you try to follow existing naming schemes and coding conventions as much as possible, and that you please add brief but descriptive comments in your source code to aid other developers in debugging and understanding your code in the future.
+We ask that you please try to follow existing naming schemes and coding conventions as much as possible, and that you add brief but descriptive comments in your source code to aid other developers in debugging and understanding your code in the future.
 
 ### Squashing commits for smaller changes:
-When submitting a pull request with multiple smaller commits which are related to the same issue (or file), we ask that you please **squash your commits** in order to keep the project's commit history clean and easy to follow for other developers.
-
+When submitting a pull request with multiple smaller commits which are related to the same issue (or file), we ask that you please **squash your commits** in order to keep the project's commit history clean and easy to follow for other developers. For example, if you are submitting a fix for two files which contain the same code change, merge those changes into one commit before submitting your request.
 
 ### Working with branches:
-Development for this project takes place in branches to effectively develop, manage, and test manage new features and code changes, ensuring that that each release meets high quality standards. Our primary branches are as follows:
+Development for this project takes place in branches to effectively develop, manage, and test new features and code changes, helping to ensure that each release meets high quality standards. Our primary branches are as follows:
 
 * **master**: Active development code for the the next version of Hestia Control Panel.
-* **prerelease**: The next release of Hestia Control Panel which is undergoing testing and quality refinement.
 * **release**: The latest stable release code - installation packages generally align with this branch.
 
-We ask that you create a new branch for your work based on **master** or **prerelease**, depending on the code you are contributing. By doing this, you can submit a pull request with only the necessary commits. Please follow the below naming conventions for your work and submit a pull request when it has been completed. Once reviewed and approved, our development team will merge your code into the primary development branch.
+We ask that you create a new branch for your work based on **master**, this will allow you to submit only the necessary commits/changes that you've made. We generally adhere to the below naming convention for internal branches; you're welcome to use your own naming conventions so long as your commits follow the guidelines mentioned above.
 
-* **feature/area/name-of-feature**: New features
-* **hotfix/000**: Critical security or bug fixes
-* **bugfix/000**: Non-critical bug fixes
+* **feature-name**: New features
+* **bugfix-000**: Bug fixes
 
-**Note**: Replace **area** with Web, DNS, Mail, etc. Replace **000** with the GitHub Issue ID if available, or use a short but descriptive name.
+**Note**: Replace **000** with the GitHub Issue ID if available, or use a short but descriptive name.
 
 ### Feature freeze:
-The general flow of our development process is that new features or work begin in a new branch derived from **master**. Once the work has been completed and reviewed, it is then submitted via Pull Request for further review and inclusion into the main code base. Once a release has reached a point where slated new features have been incorporated and the build has gone through testing and validation, it will then enter a "feature freeze" state where only fixes to the existing functionality will be merged for inclusion and be pushed to the **prerelease** branch. Once any remaining known issues have been resolved and the build is considered stable, the code is then pushed to **release** and the cycle starts all over again.
-
-**master** -> **prerelease** -> **release**
+Once development has reached a point where all planned new features have been incorporated, the **master** branch will then enter a "feature freeze" period where only fixes to the existing functionality will be added or merged for inclusion. Once any known issues have been resolved and the build has passed internal validation and testing procedures, it will then be pushed to **release** and tagged with it's respective version number and made available through our APT repositories.
 
 **Please ensure that all pull requests meet the guidelines listed above; those that do not will be rejected and sent back for review.**
 

+ 7 - 2
ISSUE_TEMPLATE.md

@@ -16,10 +16,15 @@ Please enter your response here (e.g. Ubuntu 18.04.2 LTS)
 You can find this information in $HESTIA/conf/hestia.conf by running the following command:
 `grep VERSION $HESTIA/conf/hestia.conf`
 
-Please enter your response here (e.g. 1.00.0-190618)
+Please enter your response here (e.g. 1.0.1)
 
 ### Which branch are you using?
-Please enter your response here (e.g master, develop, etc.)
+Please enter your response here (e.g release, master, etc.)
+
+### When did this issue occur? After a clean installation, or after an upgrade?
+Please enter your response here (e.g the feature stopped working after upgrading to the latest release)
+
+**Note:** If you have upgraded from an older release on an existing server, please let us know which version was previously installed if at all possible.
 
 ### Which of the following web server configurations are you using?
 - Apache + Nginx (default)

+ 13 - 4
README.md

@@ -1,8 +1,17 @@
 [Hestia Control Panel](https://www.hestiacp.com/)
 ==================================================
-**Current stable release:** Version 1.0.1, released on June 25th, 2019.
+**Current stable release:** Version 1.0.4, released on July 9th, 2019.
 
-**Next planned release:** Version 1.0.2 - minor bug fixes & improvements, currently available for testing in the **prerelease** branch. Please see "Installing development builds" for more information.
+**Wanted:** Beta testers! 
+---------------------------- 
+We're currently looking for people who would be willing to help us test development builds as we continue work on the project. If you have previous experience in software testing or development, awesome! If not, now is a great chance to get started.
+
+If you're interested, please send us an e-mail at info@hestiacp.com, or get started today by installing a development build (see the instructions below) on a test server and send us your feedback through GitHub Issues. 
+
+We look forward to your feedback, and as always we welcome all feedback and contributions!
+
+Sincerely,<br>
+The Hestia Control Panel development team
 
 What is Hestia Control Panel?
 ----------------------------
@@ -56,9 +65,9 @@ bash hst-install.sh -h
 ```
 Alternatively, @gabizz has made available a command-line script generator at https://gabizz.github.io/hestiacp-scriptline-generator/ which allows you to easily generate the installation command via GUI.
 
-Installing development builds
+Installing & testing development builds
 =============================
-In order to install a development build based on the latest published code, you must first have an existing installation of Hestia Control Panel available. If you do not have a server configured, please install the latest stable build using the instructions above before continuing.
+In order to install a development build based on the latest published code, you should first have an instance of Hestia Control Panel set up. If you do not have a server configured, please install the latest stable build using the instructions above before continuing.
 
 **PLEASE NOTE: Development builds should not be installed on systems with live production data without understanding the potential risks involved.**
 

+ 5 - 0
bin/v-add-letsencrypt-domain

@@ -411,6 +411,11 @@ else
     update_object_value 'mail' 'DOMAIN' "$root_domain" '$LETSENCRYPT' 'yes'
 fi
 
+# Remove challenge folder if exist
+if [ ! -z "$well_known" ]; then
+    rm -fr $well_known
+fi
+
 #----------------------------------------------------------#
 #                        Hestia                            #
 #----------------------------------------------------------#

+ 0 - 1
bin/v-add-mail-domain-ssl

@@ -86,7 +86,6 @@ update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' "yes"
 
 # Restarting mail server
 $BIN/v-restart-mail $restart
-$BIN/v-restart-service $IMAP_SYSTEM $restart
 check_result $? "Mail restart failed" >/dev/null
 
 # Restarting web server

+ 1 - 2
bin/v-add-sys-theme

@@ -19,7 +19,7 @@ source $HESTIA/func/main.sh
 source $HESTIA/conf/hestia.conf
 
 # Define themes repository URL format
-HESTIA_THEMES_REPO="$HESTIA_GIT_REPO/$RELEASE_BRANCH/themes"
+HESTIA_THEMES_REPO="$HESTIA_GIT_REPO/$RELEASE_BRANCH/install/deb/themes"
 
 #----------------------------------------------------------#
 #                       Action                             #
@@ -48,7 +48,6 @@ fi
 # Check if theme name already exists as system theme
 if [ -e $HESTIA_THEMES/$theme.css ]; then
     echo "ERROR: System theme with the same name already exists: $theme."
-    echo "       To update system themes, run v-update-sys-themes."
     exit 1
 fi
 

+ 8 - 6
bin/v-change-dns-record

@@ -14,9 +14,11 @@ user=$1
 domain=$2
 domain_idn=$2
 id=$3
-dvalue=$(idn -t --quiet -u "$4" )
-priority=$5
-restart=$6
+record=$4
+type=$5
+dvalue=$(idn -t --quiet -u "$6" )
+priority=$7
+restart=$8
 
 # Includes
 source $HESTIA/func/main.sh
@@ -33,8 +35,8 @@ format_domain_idn
 #                    Verifications                         #
 #----------------------------------------------------------#
 
-check_args '4' "$#" 'USER DOMAIN ID VALUE [PRIORITY] [RESTART]'
-is_format_valid 'user' 'domain' 'id' 'dvalue'
+check_args '6' "$#" 'USER DOMAIN ID RECORD TYPE VALUE [PRIORITY] [RESTART]'
+is_format_valid 'user' 'domain' 'id' 'record' 'type' 'dvalue'
 is_system_enabled "$DNS_SYSTEM" 'DNS_SYSTEM'
 is_object_valid 'user' 'USER' "$user"
 is_object_unsuspended 'user' 'USER' "$user"
@@ -77,7 +79,7 @@ time=$(echo "$time_n_date" |cut -f 1 -d \ )
 date=$(echo "$time_n_date" |cut -f 2 -d \ )
 
 # Adding record
-dns_rec="ID='$id' RECORD='$RECORD' TYPE='$TYPE' PRIORITY='$priority'"
+dns_rec="ID='$id' RECORD='$record' TYPE='$type' PRIORITY='$priority'"
 dns_rec="$dns_rec VALUE='$dvalue' SUSPENDED='no' TIME='$time' DATE='$date'"
 echo "$dns_rec" >> $USER_DATA/dns/$domain.conf
 

+ 0 - 1
bin/v-change-mail-domain-sslcert

@@ -57,7 +57,6 @@ add_mail_ssl_config
 
 # Restarting mail server
 $BIN/v-restart-mail $restart
-$BIN/v-restart-service $IMAP_SYSTEM $restart
 
 check_result $? "Mail restart failed" >/dev/null
 

+ 1 - 4
bin/v-change-sys-hestia-ssl

@@ -61,10 +61,7 @@ cp -f $ssl_dir/certificate.key $HESTIA/ssl/certificate.key
 # Restarting web server
 if [ "$restart" != 'no' ]; then
     kill -HUP $(cat /var/run/hestia-nginx.pid)
-    $BIN/v-restart-mail
-    if [ ! -z "$IMAP_SYSTEM" ]; then
-        v-restart-service "$IMAP_SYSTEM"
-    fi
+    $BIN/v-restart-mail $restart
 fi
 
 # Logging

+ 5 - 0
bin/v-change-sys-theme

@@ -18,6 +18,11 @@ source $HESTIA/conf/hestia.conf
 #                       Action                             #
 #----------------------------------------------------------#
 
+# Initialize local directory if it does not exist
+if [ ! -d "$HESTIA_THEMES_CUSTOM" ]; then
+    mkdir -p $HESTIA_THEMES_CUSTOM
+fi
+
 # Theme argument and file detection
 if [ -z "$theme" ]; then
     echo "ERROR: No theme specified."

+ 1 - 0
bin/v-change-sys-webmail

@@ -47,6 +47,7 @@ if [ "$WEB_SYSTEM" = "apache2" ]; then
 fi
 if [ -e "/etc/nginx/conf.d/webmail.inc" ]; then
     sed -i "s|location \/$OLD_ALIAS|location \/$NEW_ALIAS|gI" /etc/nginx/conf.d/webmail.inc
+    sed -i "s|location ~ ^\/$OLD_ALIAS|location ~ ^\/$NEW_ALIAS|gI" /etc/nginx/conf.d/webmail.inc
 fi
 
 #----------------------------------------------------------#

+ 1 - 1
bin/v-delete-letsencrypt-domain

@@ -82,7 +82,7 @@ fi
 $BIN/v-restart-web $restart
 check_result $? "Web restart failed" >/dev/null
 
-if [ -z "$mail"]; then
+if [ -z "$mail" ]; then
     # Restarting proxy
     if [ ! -z "$PROXY_SYSTEM" ]; then
         $BIN/v-restart-web $restart >/dev/null

+ 2 - 2
bin/v-delete-mail-domain-ssl

@@ -33,6 +33,7 @@ is_object_unsuspended 'user' 'USER' "$user"
 is_object_valid 'mail' 'DOMAIN' "$domain"
 is_object_unsuspended 'mail' 'DOMAIN' "$domain"
 is_object_value_exist 'mail' 'DOMAIN' "$domain" '$SSL'
+is_object_value_exist 'mail' 'DOMAIN' "$domain" '$LETSENCRYPT'
 
 
 #----------------------------------------------------------#
@@ -50,12 +51,11 @@ del_webmail_ssl_config
 
 # Updating config
 update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' 'no'
+update_object_value 'mail' 'DOMAIN' "$domain" '$LETSENCRYPT' 'no'
 decrease_user_value "$user" '$U_MAIL_SSL'
 
 # Restarting mail server
 $BIN/v-restart-mail $restart
-service dovecot restart
-service exim4 restart
 check_result $? "Mail restart failed" >/dev/null
 
 # Logging

+ 1 - 1
bin/v-delete-user-log

@@ -31,7 +31,7 @@ else
     rm -f $HESTIA/data/users/$user/history.log
 fi
 
-log_history "======== Log for $user cleared on $date ========"
+log_history "Log for $user was cleared on $date."
 log_event "$OK" "$ARGUMENTS"
 
 exit

+ 12 - 6
bin/v-list-sys-info

@@ -15,6 +15,10 @@ format=${1-shell}
 # Includes
 source $HESTIA/func/main.sh
 
+# Retrieve Hestia Control Panel version number
+HESTIA_VERSION=$(grep VERSION $HESTIA/conf/hestia.conf | cut -d '=' -f2 | sed "s|'||g")
+HESTIA_RELEASE=$(grep RELEASE_BRANCH $HESTIA/conf/hestia.conf | cut -d '=' -f2 | sed "s|'||g")
+
 # JSON list function
 json_list() {
     echo '{'
@@ -23,6 +27,8 @@ json_list() {
         "OS": "'$OS'",
         "VERSION": "'$VERSION'",
         "ARCH": "'$ARCH'",
+        "HESTIA": "'$HESTIA_VERSION'",
+        "RELEASE": "'$HESTIA_RELEASE'",
         "UPTIME": "'$UPTIME'",
         "LOADAVERAGE": "'$LOADAVERAGE'"
         }'
@@ -31,20 +37,20 @@ json_list() {
 
 # SHELL list function
 shell_list() {
-    echo "HOSTNAME   OS   VER   ARCH  UPTIME   LA"
-    echo "--------   --   ---   ----  ------   --"
-    echo "$HOSTNAME $OS $VERSION $ARCH $UPTIME $LOADAVERAGE"
+    echo "HOSTNAME   OS   VER   ARCH  HESTIA  RELEASE  UPTIME   LA"
+    echo "--------   --   ---   ----  ------  -------  ------   --"
+    echo "$HOSTNAME $OS $VERSION $ARCH $HESTIA_VERSION $HESTIA_RELEASE $UPTIME $LOADAVERAGE"
 }
 
 # PLAIN list function
 plain_list() {
-    echo -e "$HOSTNAME\t$OS\t$VERSION\t$ARCH\t$UPTIME\t$LOADAVERAGE"
+    echo -e "$HOSTNAME\t$OS\t$VERSION\t$ARCH\t$HESTIA_VERSION\t$HESTIA_RELEASE\t$UPTIME\t$LOADAVERAGE"
 }
 
 # CSV list function
 csv_list() {
-    echo "HOSTNAME,OS,VERSION,ARCH,UPTIME,LOADAVERAGE"
-    echo "$HOSTNAME,$OS,$VERSION,$ARCH,$UPTIME,$LOADAVERAGE"
+    echo "HOSTNAME,OS,VERSION,ARCH,HESTIA,RELEASE,UPTIME,LOADAVERAGE"
+    echo "$HOSTNAME,$OS,$VERSION,$ARCH,$HESTIA_VERSION,$HESTIA_RELEASE,$UPTIME,$LOADAVERAGE"
 }
 
 

+ 8 - 0
bin/v-list-sys-services

@@ -263,6 +263,13 @@ if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'remote' ]; then
     data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 fi
 
+# Checking SSH daemon
+if [ -e "/etc/ssh/sshd_config" ]; then
+    get_srv_state ssh
+    data="$data\nNAME='ssh' SYSTEM='SSH Access' STATE='$state'"
+    data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
+fi
+
 # Checking FIREWALL system
 if [ ! -z "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
     state="stopped"
@@ -274,6 +281,7 @@ if [ ! -z "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
     data="$data STATE='$state' CPU='0' MEM='0' RTIME='$rtime'"
 fi
 
+
 # Checking FIREWALL Fail2ban extention
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
     get_srv_state $FIREWALL_EXTENSION fail2ban-server script

+ 7 - 2
bin/v-list-sys-themes

@@ -81,10 +81,15 @@ csv_list() {
 #----------------------------------------------------------#
 
 # Parsing templates
+
+# System provided themes
 themes=$(ls -v $HESTIA_THEMES/)
+themes=$(echo "$themes" | grep '\.css' | sed 's/\.css$//')
+
+# Custom themes
 themes_custom=$(ls -v $HESTIA_THEMES_CUSTOM/)
-themes=$(echo "$themes" |grep '\.css' |sed 's/\.css$//')
-themes_custom=$(echo "$themes_custom" |grep '\.css' |sed 's/\.css$//')
+themes_custom=$(echo "$themes_custom" | grep '\.css' | sed 's/\.css$//')
+
 
 # Listing data
 case $format in

+ 4 - 0
bin/v-list-user-stats

@@ -122,6 +122,10 @@ is_object_valid 'user' 'USER' "$user"
 #                       Action                             #
 #----------------------------------------------------------#
 
+# Ensure statistics are up to date
+$BIN/v-update-user-stats $user
+
+
 # Defining config
 conf=$USER_DATA/stats.log
 if [ ! -e "$conf" ]; then

+ 5 - 0
bin/v-list-users-stats

@@ -121,6 +121,11 @@ check_args '0' "$#" '[FORMAT]'
 #                       Action                             #
 #----------------------------------------------------------#
 
+# Ensure statistics are up to date
+for user in $(ls $HESTIA/data/users); do
+    $BIN/v-update-user-stats $user
+done
+
 # Defining config
 conf=$HESTIA/data/users/admin/overall_stats.log
 if [ ! -e "$conf" ]; then

+ 1 - 1
bin/v-open-fs-config

@@ -28,7 +28,7 @@ fi
 if [ ! -z "$src_file" ]; then
     rpath=$(readlink -f "$src_file")
     services="nginx|apache|httpd|php|ftp|bind|named|exim|dovecot|spamassassin"
-    services="$services|clam|mysql|postgresql|pgsql|cron|fail2ban|iptables"
+    services="$services|clam|mysql|postgresql|pgsql|cron|ssh|fail2ban|iptables"
     services="$services|my.cnf"
     spath=$(echo "$rpath" |egrep "$services")
     if [ -z "$spath" ]; then

+ 6 - 0
bin/v-rebuild-mail-domain

@@ -19,6 +19,12 @@ source $HESTIA/func/domain.sh
 source $HESTIA/func/rebuild.sh
 source $HESTIA/conf/hestia.conf
 
+# Define mail user
+if [ "$MAIL_SYSTEM" = 'exim4' ]; then
+    MAIL_USER=Debian-exim
+else
+    MAIL_USER=exim
+fi
 
 #----------------------------------------------------------#
 #                    Verifications                         #

+ 6 - 0
bin/v-rebuild-mail-domains

@@ -18,6 +18,12 @@ source $HESTIA/func/domain.sh
 source $HESTIA/func/rebuild.sh
 source $HESTIA/conf/hestia.conf
 
+# Define mail user
+if [ "$MAIL_SYSTEM" = 'exim4' ]; then
+    MAIL_USER=Debian-exim
+else
+    MAIL_USER=exim
+fi
 
 #----------------------------------------------------------#
 #                    Verifications                         #

+ 3 - 6
bin/v-restart-cron

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -58,7 +55,7 @@ fi
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 

+ 3 - 6
bin/v-restart-dns

@@ -41,11 +41,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -63,7 +60,7 @@ fi
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 

+ 3 - 6
bin/v-restart-ftp

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -58,7 +55,7 @@ fi
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 

+ 3 - 6
bin/v-restart-mail

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -67,7 +64,7 @@ fi
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 

+ 3 - 6
bin/v-restart-proxy

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -73,7 +70,7 @@ if [ -f "$HESTIA/web/inc/nginx_proxy" ]; then
 
     # Update restart queue
     if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-        sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+        sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     fi
 fi
 

+ 19 - 7
bin/v-restart-service

@@ -28,17 +28,29 @@ check_args '1' "$#" 'SERVICE'
 #                       Action                             #
 #----------------------------------------------------------#
 
-# Run the restart rules for iptables firewall
 if [ "$service" = "iptables" ]; then
+    # Run the restart rules for iptables firewall
     $BIN/v-stop-firewall
     $BIN/v-update-firewall
-fi
-
-if [ "$service" = "hestia" ] || [ "$service" = "iptables" ] || [ "$service" = "mariadb" ] || [ "$service" = "mysql" ] || [ "$service" = "postgresql" ] || [ "$service" = "cron" ]; then
-    systemctl restart $service > /dev/null 2>&1
-elif [ -z "$force" ] || [ "$force" = "no" ]; then
-    systemctl reload $service > /dev/null 2>&1
+elif [ -z "$force" -o "$force" = "no" ] && [ \
+        "$service" = "nginx" -o     \
+        "$service" = "apache2" -o   \
+        "$service" = "exim4" -o     \
+        "$service" = "dovecot" -o   \
+        "$service" = "bind9" -o     \
+        "$service" = "named" -o     \
+        "$service" = "vsftpd" -o    \
+        "$service" = "php5.6-fpm" -o \
+        "$service" = "php7.0-fpm" -o \
+        "$service" = "php7.1-fpm" -o \
+        "$service" = "php7.2-fpm" -o \
+        "$service" = "php7.3-fpm" -o \
+        "$service" = "proftpd" -o    \
+        "$service" = "ssh" -o       \
+        "$service" = "fail2ban" ]; then
+    systemctl reload-or-restart $service > /dev/null 2>&1
 else
+    systemctl reset-failed $service > /dev/null 2>&1
     systemctl restart $service > /dev/null 2>&1
 fi
 

+ 0 - 1
bin/v-restart-system

@@ -31,7 +31,6 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 if [  "$restart" = 'yes' ]; then
-    log_history "A restart of the server was initiated."
     /sbin/reboot
 fi
 

+ 3 - 6
bin/v-restart-web

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -58,7 +55,7 @@ if [ $? -ne 0 ]; then
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 #----------------------------------------------------------#

+ 3 - 6
bin/v-restart-web-backend

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 
 # Schedule restart
-if [ "$1" = 'scheduled' ]; then
-    echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
-    exit
-fi
-if [ -z "$1" ] && [ "$SCHEDULED_RESTART" = 'yes' ]; then
+if [ "$1" = 'scheduled' ] || [ -z "$1" -a "$SCHEDULED_RESTART" = 'yes' ]; then
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
 fi
@@ -66,7 +63,7 @@ fi
 
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
-    sed -i "/$SCRIPT/d" $HESTIA/data/queue/restart.pipe
+    sed -i "/\/$SCRIPT now/d" $HESTIA/data/queue/restart.pipe
 fi
 
 

+ 1 - 4
bin/v-update-host-certificate

@@ -80,11 +80,8 @@ $BIN/v-restart-proxy
 if [ ! -z "$MAIL_SYSTEM" ]; then
     # Restart exim (and dovecot if applicable)
     $BIN/v-restart-mail
-    if [ ! -z "$IMAP_SYSTEM" ]; then
-        $BIN/v-restart-service "$IMAP_SYSTEM"
-    fi
 fi
-$BIN/v-restart-service "hestia"
+$BIN/v-restart-service hestia
 
 #----------------------------------------------------------#
 #                       Hestia                             #

+ 2 - 1
bin/v-update-sys-hestia-git

@@ -90,6 +90,7 @@ if [ ! -z "$1" ]; then
         exit 1
     else
         branch=$1
+        /usr/local/hestia/bin/v-change-sys-config-value 'RELEASE_BRANCH' "$branch"
     fi
 else
     source /usr/local/hestia/conf/hestia.conf
@@ -348,7 +349,7 @@ if [ "$HESTIA_B" = true ] ; then
 
     # Move needed directories
     cd $BUILD_DIR/hestiacp-$branch
-    mv bin func install themes web ../hestia_$HESTIA_V/usr/local/hestia/
+    mv bin func install web ../hestia_$HESTIA_V/usr/local/hestia/
 
     # Set permission
     cd ../hestia_$HESTIA_V/usr/local/hestia/bin

+ 0 - 43
bin/v-update-sys-themes

@@ -1,43 +0,0 @@
-#!/bin/bash
-# info: Updates system theme CSS files from Hestia Control 
-#       Panel GitHub repository using the $HESTIA_GIT_REPO
-#       varible set in $HESTIA/func/main.sh.
-#
-# Usage: v-update-sys-themes
-#
-
-#----------------------------------------------------------#
-#                    Variable&Function                     #
-#----------------------------------------------------------#
-
-# Includes
-source $HESTIA/func/main.sh
-source $HESTIA/conf/hestia.conf
-
-# Set temporary directory
-HESTIA_THEMES_TEMP="/tmp/hestia-themes"
-
-#----------------------------------------------------------#
-#                       Action                             #
-#----------------------------------------------------------#
-
-# Initialize download directory
-mkdir $HESTIA_THEMES_TEMP
-
-# Update system themes
-for theme in `ls $HESTIA_THEMES/`; do
-    echo "Downloading theme: $theme"
-    wget $HESTIA_GIT_REPO/$RELEASE_BRANCH/themes/$theme -O \ 
-        $HESTIA_THEMES_TEMP/$theme > /dev/null 2>&1
-    rm -f $HESTIA_THEMES/$theme
-    mv $HESTIA_THEMES_TEMP/$theme $HESTIA_THEMES/$theme
-done
-
-# Remove any temporary files and directories
-rm -rf $HESTIA_THEMES_TEMP
-
-#----------------------------------------------------------#
-#                       Hestia                             #
-#----------------------------------------------------------#
-
-exit

+ 8 - 1
func/domain.sh

@@ -647,6 +647,8 @@ add_mail_ssl_config() {
     ln -s $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.key /usr/local/hestia/ssl/mail/mail.$domain.key
 
     # Set correct permissions on certificates
+    chmod 750 $HOMEDIR/$user/conf/mail/$domain/ssl
+    chown -R $MAIL_USER:mail $HOMEDIR/$user/conf/mail/$domain/ssl
     chmod 0644 $HOMEDIR/$user/conf/mail/$domain/ssl/*
     chown -h $user:mail $HOMEDIR/$user/conf/mail/$domain/ssl/*
     chmod -R 0644 /usr/local/hestia/ssl/mail/*
@@ -694,12 +696,17 @@ add_webmail_config() {
     ssl_pem="$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.pem"
     ssl_ca="$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.ca"
 
+    override_alias="";
+    if [ "$WEBMAIL_ALIAS" != "mail" ]; then
+        override_alias="mail.$domain"
+    fi
+    
     cat $MAILTPL/$1/$2 | \
         sed -e "s|%ip%|$local_ip|g" \
             -e "s|%domain%|$WEBMAIL_ALIAS.$domain|g" \
             -e "s|%domain_idn%|$domain_idn|g" \
             -e "s|%root_domain%|$domain|g" \
-            -e "s|%alias%|mail.$domain|g" \
+            -e "s|%alias%|$override_alias|g" \
             -e "s|%alias_idn%|${aliases_idn//,/ }|g" \
             -e "s|%alias_string%|$alias_string|g" \
             -e "s|%email%|info@$domain|g" \

+ 2 - 1
func/main.sh

@@ -16,8 +16,9 @@ DNSTPL=$HESTIA/data/templates/dns
 RRD=$HESTIA/web/rrd
 SENDMAIL="$HESTIA/web/inc/mail-wrapper.php"
 HESTIA_GIT_REPO="https://raw.githubusercontent.com/hestiacp/hestiacp"
-HESTIA_THEMES="$HESTIA/themes"
+HESTIA_THEMES="$HESTIA_INSTALL_DIR/themes"
 HESTIA_THEMES_CUSTOM="$HESTIA/data/templates/themes"
+SCRIPT="$(basename $0)"
 
 # Return codes
 OK=0

+ 15 - 11
func/upgrade.sh

@@ -33,7 +33,7 @@ upgrade_welcome_message() {
 
 upgrade_complete_message() {
     # Add notification to panel
-    $HESTIA/bin/v-add-user-notification admin 'Upgrade complete' 'Your server has been updated to Hestia Control Panel version '$new_version'.<br>Please report any bugs on GitHub at<br><a href="https://github.com/hestiacp/hestiacp/Issues" target="_new">https://github.com/hestiacp/hestiacp/Issues</a><br><br>Have a great day!'
+    $HESTIA/bin/v-add-user-notification admin 'Upgrade complete' 'Your server has been updated to Hestia Control Panel <b>v'$new_version'</b>.<br><br>Please tell us about any bugs or issues by opening an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
 
     # Echo message to console output
     echo
@@ -78,8 +78,7 @@ upgrade_start_routine() {
     release_branch_check=$(cat $HESTIA/conf/hestia.conf | grep RELEASE_BRANCH)
     if [ -z "$release_branch_check" ]; then
         echo "(*) Adding global release branch variable to system configuration..."
-        sed -i "/RELEASE_BRANCH/d" $HESTIA/conf/hestia.conf
-        echo "RELEASE_BRANCH='release'" >> $HESTIA/conf/hestia.conf
+        $BIN/v-change-sys-config-value 'RELEASE_BRANCH' 'release'
     fi
 
     #####################################################################
@@ -121,12 +120,19 @@ upgrade_start_routine() {
     # Upgrade to Version 1.0.3
     if [ $VERSION = "1.0.2" ]; then
         source $HESTIA/install/upgrade/versions/previous/1.0.3.sh
-        VERSION="$new_version"
+        VERSION="1.0.3"
         upgrade_refresh_config
     fi
 
-    # Upgrade to Version 1.1.0
+    # Upgrade to Version 1.0.4
     if [ $VERSION = "1.0.3" ]; then
+        source $HESTIA/install/upgrade/versions/previous/1.0.4.sh
+        VERSION="1.0.4"
+        upgrade_refresh_config
+    fi
+
+    # Upgrade to Version 1.1.0
+    if [ $VERSION = "1.0.4" ]; then
         source $HESTIA/install/upgrade/versions/latest.sh
         VERSION="$new_version"
         upgrade_refresh_config
@@ -195,25 +201,23 @@ upgrade_rebuild_users() {
     for user in `ls /usr/local/hestia/data/users/`; do
         echo "(*) Rebuilding domains and account for user: $user..."
         if [ ! -z "$WEB_SYSTEM" ]; then
-            $BIN/v-rebuild-web-domains $user >/dev/null 2>&1
+            $BIN/v-rebuild-web-domains $user 'no' >/dev/null 2>&1
         fi
         if [ ! -z "$DNS_SYSTEM" ]; then
-            $BIN/v-rebuild-dns-domains $user >/dev/null 2>&1
+            $BIN/v-rebuild-dns-domains $user 'no' >/dev/null 2>&1
         fi
         if [ ! -z "$MAIL_SYSTEM" ]; then 
-            $BIN/v-rebuild-mail-domains $user >/dev/null 2>&1
+            $BIN/v-rebuild-mail-domains $user 'no' >/dev/null 2>&1
         fi
     done
 }
 
 upgrade_restart_services() {
     echo "(*) Restarting services..."
+    sleep 5
     if [ ! -z "$MAIL_SYSTEM" ]; then
         $BIN/v-restart-mail $restart
     fi
-    if [ ! -z "$IMAP_SYSTEM" ]; then
-        $BIN/v-restart-service $IMAP_SYSTEM $restart
-    fi
     if [ ! -z "$WEB_SYSTEM" ]; then
         $BIN/v-restart-web $restart
         $BIN/v-restart-proxy $restart

+ 0 - 1
install/deb/clamav/clamd.conf

@@ -30,7 +30,6 @@ Debug false
 ScanPE true
 ScanOLE2 true
 ScanHTML true
-DetectBrokenExecutables false
 ExitOnOOM false
 LeaveTemporaryFiles false
 AlgorithmicDetection true

+ 0 - 0
themes/default.css → install/deb/themes/default.css


+ 56 - 0
install/deb/themes/flat.css

@@ -0,0 +1,56 @@
+/* Flat theme */
+
+body {
+    letter-spacing: 0;
+}
+
+b, strong {
+    font-weight: 600;
+}
+
+.table-header {
+    box-shadow: none !important;
+}
+
+.l-header {
+    box-shadow: none;
+    background: #5070a6;
+}
+
+.l-menu__item--active {
+    background-color: #fff;
+}
+
+.l-menu__item.l-menu__item--active a {
+    background: none;
+}
+
+.l-menu__item a:hover {
+    background: #FFFFFF !important;
+    box-shadow: none;
+}
+
+.l-menu__item a:active {
+    background: none;
+    box-shadow: none;
+}
+
+.l-profile__notifications:hover,
+.l-profile__notifications.updates:hover,
+.l-profile__notifications.active.l-profile__notifications.updates:active {
+    background: white !important;
+    border: 1px solid transparent !important;
+    box-shadow: none !important;
+}
+
+.l-unit:hover {
+    box-shadow: none;
+}
+
+.l-unit__stat-col--left a, .l-unit__stat-col--left a:visited {
+    color: #5f7eb3;
+}
+
+.l-unit__stat-col--left a:hover {
+    color: #474747;
+}

+ 32 - 23
install/hst-install-debian.sh

@@ -17,7 +17,7 @@ hst_backups="/root/hst_install_backups/$(date +%d%m%Y%H%M)"
 arch=$(uname -i)
 spinner="/-\|"
 os='debian'
-release=$(cat /etc/debian_version|grep -o [0-9]|head -n1)
+release=$(cat /etc/debian_version | tr "." "\n" | head -n1)
 codename="$(cat /etc/os-release |grep VERSION= |cut -f 2 -d \(|cut -f 1 -d \))"
 HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 
@@ -39,7 +39,7 @@ if [ "$release" -eq 8 ]; then
         e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         unrar-free vim-common acl sysstat"
-else
+elif [ "$release" -eq 9 ]; then
     software="nginx apache2 apache2-utils apache2-suexec-custom
         libapache2-mod-ruid2 libapache2-mod-fcgid libapache2-mod-php php
         php-common php-cgi php-mysql php-curl php-pgsql php-imap php-ldap php-apcu
@@ -51,6 +51,18 @@ else
         e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         unrar-free vim-common acl sysstat rsyslog"
+else
+    software="nginx apache2 apache2-utils apache2-suexec-custom
+        apache2-suexec-pristine libapache2-mod-fcgid libapache2-mod-php php
+        php-common php-cgi php-mysql php-curl php-pgsql php-imap php-ldap php-apcu
+        awstats vsftpd proftpd-basic bind9 exim4 exim4-daemon-heavy 
+        clamav-daemon spamassassin dovecot-imapd dovecot-pop3d roundcube-core net-tools
+        roundcube-mysql roundcube-plugins mariadb-client mariadb-common
+        mariadb-server postgresql postgresql-contrib phpmyadmin phppgadmin mc
+        flex whois git idn zip sudo bc ftp lsof ntpdate rrdtool quota
+        e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
+        bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
+        unrar-free vim-common acl sysstat rsyslog"
 fi
 
 # Defining help function
@@ -605,11 +617,6 @@ if [ "$release" -eq 8 ]; then
     echo "deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
 fi
 
-# Installing Backport repo for debian 10
-if [ "$release" -eq 10 ]; then
-    echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
-fi
-
 # Installing hestia repo
 echo "(*) Hestia Control Panel"
 if [ -e $apt/hestia.list ]; then
@@ -622,6 +629,7 @@ echo
 
 # Updating system
 echo -ne "Updating currently installed packages, please wait... "
+apt-get -qq update
 apt-get -y upgrade >> $LOG &
 BACK_PID=$!
 
@@ -864,9 +872,6 @@ fi
 #                     Install packages                     #
 #----------------------------------------------------------#
 
-# Updating system
-apt-get -qq update
-
 # Disabling daemon autostart on apt-get install
 echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 chmod a+x /usr/sbin/policy-rc.d
@@ -963,13 +968,15 @@ chmod 755 /etc/cron.daily/ntpdate
 ntpdate -s pool.ntp.org
 
 # Setup rssh
-if [ -z "$(grep /usr/bin/rssh /etc/shells)" ]; then
-    echo /usr/bin/rssh >> /etc/shells
+if [ ! "$release" -eq 10 ]; then
+    if [ -z "$(grep /usr/bin/rssh /etc/shells)" ]; then
+        echo /usr/bin/rssh >> /etc/shells
+    fi
+    sed -i 's/#allowscp/allowscp/' /etc/rssh.conf
+    sed -i 's/#allowsftp/allowsftp/' /etc/rssh.conf
+    sed -i 's/#allowrsync/allowrsync/' /etc/rssh.conf
+    chmod 755 /usr/bin/rssh
 fi
-sed -i 's/#allowscp/allowscp/' /etc/rssh.conf
-sed -i 's/#allowsftp/allowsftp/' /etc/rssh.conf
-sed -i 's/#allowrsync/allowrsync/' /etc/rssh.conf
-chmod 755 /usr/bin/rssh
 
 
 #----------------------------------------------------------#
@@ -1118,10 +1125,6 @@ cp -rf $HESTIA_INSTALL_DIR/templates $HESTIA/data/
 mkdir -p /var/www/html
 mkdir -p /var/www/document_errors
 
-# Installing default themes
-mkdir -p $HESTIA/themes
-cp -rf $HESTIA_INSTALL_DIR/themes $HESTIA/themes/
-
 # Install default success page
 cp -rf $HESTIA_INSTALL_DIR/templates/web/unassigned/index.html /var/www/html/
 cp -rf $HESTIA_INSTALL_DIR/templates/web/skel/document_errors/* /var/www/document_errors/
@@ -1243,6 +1246,8 @@ if [ "$apache" = 'yes' ]; then
             rm -f /etc/php/$v/fpm/pool.d/*
             v_tpl=$(echo "$v" | sed -e 's/[.]//')
             cp -f $HESTIA_INSTALL_DIR/multiphp/apache2/PHP-$v_tpl.* $HESTIA/data/templates/web/apache2/
+            cp -f $HESTIA_INSTALL_DIR/php-fpm/dummy.conf /etc/php/$v/fpm/pool.d/
+            sed -i "s/9999/99$v_tpl/g" /etc/php/$v/fpm/pool.d/dummy.conf
         done
         chmod a+x $HESTIA/data/templates/web/apache2/*.sh
         if [ "$release" = '8' ]; then
@@ -1416,7 +1421,7 @@ if [ "$postgresql" = 'yes' ]; then
     ppass=$(gen_pass)
     cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
     systemctl restart postgresql
-    sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'"
+    sudo -iu postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'"
 
     # Configuring phpPgAdmin
     if [ "$apache" = 'yes' ]; then
@@ -1783,6 +1788,11 @@ $HESTIA/bin/v-add-web-domain admin $servername
 check_result $? "can't create $servername domain"
 
 # Adding cron jobs
+export SCHEDULED_RESTART="yes"
+command="sudo $HESTIA/bin/v-update-sys-queue restart"
+$HESTIA/bin/v-add-cron-job 'admin' '*/2' '*' '*' '*' '*' "$command"
+systemctl restart cron
+
 command="sudo $HESTIA/bin/v-update-sys-queue disk"
 $HESTIA/bin/v-add-cron-job 'admin' '15' '02' '*' '*' '*' "$command"
 command="sudo $HESTIA/bin/v-update-sys-queue traffic"
@@ -1800,7 +1810,6 @@ $HESTIA/bin/v-add-cron-job 'admin' '*/5' '*' '*' '*' '*' "$command"
 
 # Enable automatic updates
 $HESTIA/bin/v-add-cron-hestia-autoupdate
-systemctl restart cron
 
 # Building initital rrd images
 $HESTIA/bin/v-update-sys-rrd
@@ -1814,7 +1823,7 @@ fi
 $HESTIA/bin/v-change-sys-port $port
 
 # Set default theme
-$HESTIA/bin/v-change-sys-theme default
+$HESTIA/bin/v-change-sys-theme 'default'
 
 # Starting Hestia service
 update-rc.d hestia defaults

+ 10 - 10
install/hst-install-ubuntu.sh

@@ -582,6 +582,7 @@ echo
 
 # Updating system
 echo -ne "Updating currently installed packages, please wait... "
+apt-get -qq update
 apt-get -y upgrade >> $LOG &
 BACK_PID=$!
 
@@ -836,9 +837,6 @@ fi
 #                     Install packages                     #
 #----------------------------------------------------------#
 
-# Updating system
-apt-get -qq update
-
 # Disabling daemon autostart on apt-get install
 echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 chmod a+x /usr/sbin/policy-rc.d
@@ -1080,10 +1078,6 @@ cp -rf $HESTIA_INSTALL_DIR/templates $HESTIA/data/
 mkdir -p /var/www/html
 mkdir -p /var/www/document_errors
 
-# Installing default themes
-mkdir -p $HESTIA/themes
-cp -rf $HESTIA_INSTALL_DIR/themes $HESTIA/themes/
-
 # Install default success page
 cp -rf $HESTIA_INSTALL_DIR/templates/web/unassigned/index.html /var/www/html/
 cp -rf $HESTIA_INSTALL_DIR/templates/web/skel/document_errors/* /var/www/document_errors/
@@ -1210,6 +1204,8 @@ if [ "$apache" = 'yes' ]; then
             rm -f /etc/php/$v/fpm/pool.d/*
             v_tpl=$(echo "$v" | sed -e 's/[.]//')
             cp -f $HESTIA_INSTALL_DIR/multiphp/apache2/PHP-$v_tpl.* $HESTIA/data/templates/web/apache2/
+            cp -f $HESTIA_INSTALL_DIR/php-fpm/dummy.conf /etc/php/$v/fpm/pool.d/
+            sed -i "s/9999/99$v_tpl/g" /etc/php/$v/fpm/pool.d/dummy.conf
         done
         chmod a+x $HESTIA/data/templates/web/apache2/*.sh
     fi
@@ -1379,7 +1375,7 @@ if [ "$postgresql" = 'yes' ]; then
     ppass=$(gen_pass)
     cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
     systemctl restart postgresql
-    sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'"
+    sudo -iu postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'"
 
     # Configuring phpPgAdmin
     if [ "$apache" = 'yes' ]; then
@@ -1679,6 +1675,11 @@ $HESTIA/bin/v-add-web-domain admin $servername
 check_result $? "can't create $servername domain"
 
 # Adding cron jobs
+export SCHEDULED_RESTART="yes"
+command="sudo $HESTIA/bin/v-update-sys-queue restart"
+$HESTIA/bin/v-add-cron-job 'admin' '*/2' '*' '*' '*' '*' "$command"
+systemctl restart cron
+
 command="sudo $HESTIA/bin/v-update-sys-queue disk"
 $HESTIA/bin/v-add-cron-job 'admin' '15' '02' '*' '*' '*' "$command"
 command="sudo $HESTIA/bin/v-update-sys-queue traffic"
@@ -1696,7 +1697,6 @@ $HESTIA/bin/v-add-cron-job 'admin' '*/5' '*' '*' '*' '*' "$command"
 
 # Enable automatic updates
 $HESTIA/bin/v-add-cron-hestia-autoupdate
-systemctl restart cron
 
 # Building initital rrd images
 $HESTIA/bin/v-update-sys-rrd
@@ -1710,7 +1710,7 @@ fi
 $HESTIA/bin/v-change-sys-port $port
 
 # Set default theme
-$HESTIA/bin/v-change-sys-theme default
+$HESTIA/bin/v-change-sys-theme 'default'
 
 # Starting Hestia service
 update-rc.d hestia defaults

+ 3 - 3
install/hst-install.sh

@@ -5,7 +5,7 @@
 #
 # Currently Supported Operating Systems:
 #
-#   Debian 8, 9
+#   Debian 8, 9, 10
 #   Ubuntu 16.04, 18.04
 #
 
@@ -54,7 +54,7 @@ no_support_message(){
     echo "Your operating system (OS) is not supported by"
     echo "Hestia Control Panel. Officially supported releases:"
     echo "****************************************************"
-    echo "  Debian 8, 9"
+    echo "  Debian 8, 9, 10"
     echo "  Ubuntu 16.04 LTS, 18.04 LTS"
     echo ""
     exit 1;
@@ -92,7 +92,7 @@ check_wget_curl(){
 
 # Check for supported operating system before proceeding with download
 # of OS-specific installer, and throw error message if unsupported OS detected.
-if [[ "$release" =~ ^(8|9|16.04|18.04)$ ]]; then
+if [[ "$release" =~ ^(8|9|10|16.04|18.04)$ ]]; then
     check_wget_curl $*
 else
     no_support_message

+ 23 - 3
install/upgrade/versions/latest.sh

@@ -9,7 +9,7 @@
 # Set default theme
 if [ -z $THEME ]; then
     echo "(*) Enabling support for themes..."
-    $BIN/v-change-sys-theme default
+    $BIN/v-change-sys-theme 'default'
 fi
 
 # Reduce SSH login grace time
@@ -21,7 +21,7 @@ fi
 
 # Implement recidive jail for fail2ban
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
-    if ! cat /etc/fail2ban/jail.local | grep -q "recidive"; then
+    if ! cat /etc/fail2ban/jail.local | grep -q "\[recidive\]"; then
         echo -e "\n\n[recidive]\nenabled  = true\nfilter   = recidive\naction   = hestia[name=HESTIA]\nlogpath  = /var/log/fail2ban.log\nmaxretry = 3\nfindtime = 86400\nbantime  = 864000" >> /etc/fail2ban/jail.local
     fi
 fi
@@ -34,4 +34,24 @@ if [ ! -z "$IMAP_SYSTEM" ]; then
         cp -f /etc/nginx/conf.d/webmail.inc $HESTIA_BACKUP/conf/
         sed -i "s/config|temp|logs/README.md|config|temp|logs|bin|SQL|INSTALL|LICENSE|CHANGELOG|UPGRADING/g" /etc/nginx/conf.d/webmail.inc
     fi
-fi 
+fi
+
+# Fix restart queue
+if [ -z "$($BIN/v-list-cron-jobs admin | grep 'v-update-sys-queue restart')" ]; then
+    command="sudo $BIN/v-update-sys-queue restart"
+    $BIN/v-add-cron-job 'admin' '*/2' '*' '*' '*' '*' "$command"
+fi
+
+# Remove deprecated line from ClamAV configuration file
+if [ -e "/etc/clamav/clamd.conf" ]; then
+    clamd_conf_update_check=$(grep DetectBrokenExecutables /etc/clamav/clamd.conf)
+    if [ ! -z "$clamd_conf_update_check" ]; then
+        echo "(*) Updating ClamAV configuration..."
+        sed -i '/DetectBrokenExecutables/d' /etc/clamav/clamd.conf
+    fi
+fi
+
+# Remove errornous history.log file created by certain builds due to bug in v-restart-system
+if [ -e $HESTIA/data/users/history.log ]; then
+    rm -f $HESTIA/data/users/history.log
+fi

+ 1 - 9
install/upgrade/versions/previous/1.0.2.sh

@@ -6,14 +6,6 @@
 #######                      Place additional commands below.                   #######
 #######################################################################################
 
-#!/bin/sh
-
-# Hestia Control Panel upgrade script for target version 1.0.2
-
-#######################################################################################
-#######                      Place additional commands below.                   #######
-#######################################################################################
-
 # Replace dhparam 1024 with dhparam 4096
 echo "(*) Increasing Diffie-Hellman Parameter strength to 4096-bit..."
 if [ -e /etc/ssl/dhparam.pem ]; then
@@ -59,7 +51,7 @@ if [ ! -z "$WEBALIZER_CHECK" ]; then
     if [ -d "/var/www/webalizer" ]; then
         rm -rf /var/www/webalizer
     fi
-    $HESTIA/bin/v-change-sys-config-value '$STATS_SYSTEM' 'awstats'
+    $HESTIA/bin/v-change-sys-config-value 'STATS_SYSTEM' 'awstats'
 fi
 
 # Remove old hestia.conf files from Apache & NGINX if they exist

+ 8 - 0
install/upgrade/versions/previous/1.0.4.sh

@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Hestia Control Panel upgrade script for target version 1.0.4
+
+#######################################################################################
+#######                      Place additional commands below.                   #######
+#######################################################################################
+

+ 1 - 1
src/hst_autocompile.sh

@@ -452,7 +452,7 @@ if [ "$HESTIA_B" = true ] ; then
 
     # Move needed directories
     cd $BUILD_DIR/hestiacp-$branch
-    mv bin func install themes web ../hestia_$HESTIA_V/usr/local/hestia/
+    mv bin func install web ../hestia_$HESTIA_V/usr/local/hestia/
 
     # Set permission
     cd ../hestia_$HESTIA_V/usr/local/hestia/bin

+ 0 - 1
web/add/cron/autoupdate/index.php

@@ -13,7 +13,6 @@ if ((!isset($_GET['token'])) || ($_SESSION['token'] != $_GET['token'])) {
 
 if ($_SESSION['user'] == 'admin') {
     exec (HESTIA_CMD."v-add-cron-hestia-autoupdate", $output, $return_var);
-    $_SESSION['error_msg'] = __('Autoupdate has been successfully enabled');
     unset($output);
 }
 

+ 0 - 1
web/add/cron/reports/index.php

@@ -12,7 +12,6 @@ if ((!isset($_GET['token'])) || ($_SESSION['token'] != $_GET['token'])) {
 }
 
 exec (HESTIA_CMD."v-add-cron-reports ".$user, $output, $return_var);
-$_SESSION['error_msg'] = __('Cronjob email reporting has been successfully enabled');
 unset($output);
 
 header("Location: /list/cron/");

+ 11 - 2
web/add/dns/index.php

@@ -6,6 +6,11 @@ $TAB = 'DNS';
 // Main include
 include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
 
+// List ip addresses
+exec (HESTIA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
+$v_ips = json_decode(implode('', $output), true);
+unset($output);
+
 // Check POST request for dns domain
 if (!empty($_POST['ok'])) {
 
@@ -33,7 +38,7 @@ if (!empty($_POST['ok'])) {
     $v_domain = preg_replace("/^www./i", "", $_POST['v_domain']);
     $v_domain = escapeshellarg($v_domain);
     $v_domain = strtolower($v_domain);
-    $v_ip = escapeshellarg($_POST['v_ip']);
+    $v_ip = $_POST['v_ip'];
     $v_ns1 = escapeshellarg($_POST['v_ns1']);
     $v_ns2 = escapeshellarg($_POST['v_ns2']);
     $v_ns3 = escapeshellarg($_POST['v_ns3']);
@@ -45,7 +50,7 @@ if (!empty($_POST['ok'])) {
 
     // Add dns domain
     if (empty($_SESSION['error_msg'])) {
-        exec (HESTIA_CMD."v-add-dns-domain ".$user." ".$v_domain." ".$v_ip." ".$v_ns1." ".$v_ns2." ".$v_ns3." ".$v_ns4." ".$v_ns5."  ".$v_ns6."  ".$v_ns7." ".$v_ns8." no", $output, $return_var);
+        exec (HESTIA_CMD."v-add-dns-domain ".$user." ".$v_domain." ".escapeshellarg($v_ip)." ".$v_ns1." ".$v_ns2." ".$v_ns3." ".$v_ns4." ".$v_ns5."  ".$v_ns6."  ".$v_ns7." ".$v_ns8." no", $output, $return_var);
         check_return_code($return_var,$output);
         unset($output);
     }
@@ -146,6 +151,10 @@ $v_ns6 = str_replace("'", "", $v_ns6);
 $v_ns7 = str_replace("'", "", $v_ns7);
 $v_ns8 = str_replace("'", "", $v_ns8);
 
+if(empty($v_ip) && count($v_ips) > 0) {
+    $ip = array_key_first($v_ips);
+    $v_ip = (empty($v_ips[$ip]['NAT'])?$ip:$v_ips[$ip]['NAT']);
+}
 
 if (empty($_GET['domain'])) {
     // Display body for dns domain

+ 4 - 4
web/css/jquery-custom-dialogs.css

@@ -53,9 +53,9 @@
 
 /* Component containers
 ----------------------------------*/
-.ui-widget { font-family: Arial, Helvetica, sans-serif; font-size: 12pt; }
+.ui-widget { font-family: 'Exo'; font-size: 0.9rem; }
 .ui-widget .ui-widget { font-size: 10pt; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial, Helvetica, sans-serif; font-size: 10pt; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: 'Exo'; }
 .ui-widget-content { border: 1px solid #aaaaaa; color: #ccc; }
 .ui-widget-content a { color: #222222; }
 .ui-widget-header { color: #444; font-size: 10pt; font-weight: bold;}
@@ -417,9 +417,9 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
  *
  * http://docs.jquery.com/UI/Dialog#theming
  */
-.ui-dialog { background: none repeat scroll 0 0 #333; border: 1px solid #333; border-radius: 3px; box-shadow: 0 2px 11px 0 rgba(0, 0, 0, 0.5); font-family: arial; overflow: hidden; padding: 27px 0 5px; position: absolute; width: 480px; }
+.ui-dialog { background: none repeat scroll 0 0 #333; border: 1px solid #333; border-radius: 3px; box-shadow: 0 2px 11px 0 rgba(0, 0, 0, 0.5); font-family: 'Exo', sans-serif; overflow: hidden; padding: 27px 0 5px; position: absolute; width: 480px; }
 .ui-dialog .ui-dialog-titlebar { padding: 2px 26px 0; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .10pt 16px .10pt 0;  font-family: Arial; color: #ebe697; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; }
+.ui-dialog .ui-dialog-title { float: left; margin: .10pt 16px .10pt 0;  font-family: 'Exo', sans-serif; color: #ebe697; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; }
 .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
 .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
 .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }

+ 172 - 194
web/css/styles.min.css

@@ -141,176 +141,104 @@
  */
 
 /* ==========================================================================
-   Define Exo 2 font family
+   Define Exo font family
    ========================================================================== */
-/* exo-2-100 - latin */
+/* exo-300 - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
-  font-style: normal;
-  font-weight: 100;
-  src: local('Exo 2 Thin'), local('Exo2-Thin'),
-       url('../webfonts/exo-2-v5-latin-100.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-100.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-100italic - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: italic;
-  font-weight: 100;
-  src: local('Exo 2 Thin Italic'), local('Exo2-ThinItalic'),
-       url('../webfonts/exo-2-v5-latin-100italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-100italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-200 - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: normal;
-  font-weight: 200;
-  src: local('Exo 2 Extra Light'), local('Exo2-ExtraLight'),
-       url('../webfonts/exo-2-v5-latin-200.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-200.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-200italic - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: italic;
-  font-weight: 200;
-  src: local('Exo 2 Extra Light Italic'), local('Exo2-ExtraLightItalic'),
-       url('../webfonts/exo-2-v5-latin-200italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-200italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-300 - latin */
-@font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-weight: 300;
-  src: local('Exo 2 Light'), local('Exo2-Light'),
-       url('../webfonts/exo-2-v5-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Light'), local('Exo-Light'),
+       url('../webfonts/exo-v8-latin-ext_latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-300italic - latin */
+/* exo-300italic - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-weight: 300;
-  src: local('Exo 2 Light Italic'), local('Exo2-LightItalic'),
-       url('../webfonts/exo-2-v5-latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Light Italic'), local('Exo-LightItalic'),
+       url('../webfonts/exo-v8-latin-ext_latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-regular - latin */
+/* exo-regular - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-weight: 400;
-  src: local('Exo 2'), local('Exo2-Regular'),
-       url('../webfonts/exo-2-v5-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Regular'), local('Exo-Regular'),
+       url('../webfonts/exo-v8-latin-ext_latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-italic - latin */
+/* exo-italic - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-weight: 400;
-  src: local('Exo 2 Italic'), local('Exo2-Italic'),
-       url('../webfonts/exo-2-v5-latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Italic'), local('Exo-Italic'),
+       url('../webfonts/exo-v8-latin-ext_latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-500 - latin */
+/* exo-500 - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-weight: 500;
-  src: local('Exo 2 Medium'), local('Exo2-Medium'),
-       url('../webfonts/exo-2-v5-latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Medium'), local('Exo-Medium'),
+       url('../webfonts/exo-v8-latin-ext_latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-500italic - latin */
+/* exo-500italic - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-weight: 500;
-  src: local('Exo 2 Medium Italic'), local('Exo2-MediumItalic'),
-       url('../webfonts/exo-2-v5-latin-500italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-500italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Medium Italic'), local('Exo-MediumItalic'),
+       url('../webfonts/exo-v8-latin-ext_latin-500italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-500italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-600 - latin */
+/* exo-600 - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-weight: 600;
-  src: local('Exo 2 Semi Bold'), local('Exo2-SemiBold'),
-       url('../webfonts/exo-2-v5-latin-600.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo SemiBold'), local('Exo-SemiBold'),
+       url('../webfonts/exo-v8-latin-ext_latin-600.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-600italic - latin */
+/* exo-600italic - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-weight: 600;
-  src: local('Exo 2 Semi Bold Italic'), local('Exo2-SemiBoldItalic'),
-       url('../webfonts/exo-2-v5-latin-600italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-600italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo SemiBold Italic'), local('Exo-SemiBoldItalic'),
+       url('../webfonts/exo-v8-latin-ext_latin-600italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-600italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-700 - latin */
+/* exo-700 - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-weight: 700;
-  src: local('Exo 2 Bold'), local('Exo2-Bold'),
-       url('../webfonts/exo-2-v5-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Bold'), local('Exo-Bold'),
+       url('../webfonts/exo-v8-latin-ext_latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
-/* exo-2-700italic - latin */
+/* exo-700italic - latin-ext_latin */
 @font-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-weight: 700;
-  src: local('Exo 2 Bold Italic'), local('Exo2-BoldItalic'),
-       url('../webfonts/exo-2-v5-latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-800 - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: normal;
-  font-weight: 800;
-  src: local('Exo 2 Extra Bold'), local('Exo2-ExtraBold'),
-       url('../webfonts/exo-2-v5-latin-800.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-800.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-800italic - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: italic;
-  font-weight: 800;
-  src: local('Exo 2 Extra Bold Italic'), local('Exo2-ExtraBoldItalic'),
-       url('../webfonts/exo-2-v5-latin-800italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-800italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-900 - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: normal;
-  font-weight: 900;
-  src: local('Exo 2 Black'), local('Exo2-Black'),
-       url('../webfonts/exo-2-v5-latin-900.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-900.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-/* exo-2-900italic - latin */
-@font-face {
-  font-family: 'Exo 2';
-  font-style: italic;
-  font-weight: 900;
-  src: local('Exo 2 Black Italic'), local('Exo2-BlackItalic'),
-       url('../webfonts/exo-2-v5-latin-900italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
-       url('../webfonts/exo-2-v5-latin-900italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  src: local('Exo Bold Italic'), local('Exo-BoldItalic'),
+       url('../webfonts/exo-v8-latin-ext_latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+       url('../webfonts/exo-v8-latin-ext_latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
 }
 /* inconsolata-bold - latin */
 @font-face {
   font-family: 'Inconsolata';
   src: local('Inconsolata Bold'), local('Inconsolata-Bold'),
-      url('hinted-Inconsolata-Bold.woff2') format('woff2'),
-      url('hinted-Inconsolata-Bold.woff') format('woff');
+      url('../webfonts/hinted-Inconsolata-Bold.woff2') format('woff2'),
+      url('../webfonts/hinted-Inconsolata-Bold.woff') format('woff');
   font-weight: bold;
   font-style: normal;
 }
@@ -318,8 +246,8 @@
 @font-face {
   font-family: 'Inconsolata';
   src: local('Inconsolata Regular'), local('Inconsolata-Regular'),
-      url('hinted-Inconsolata-Regular.woff2') format('woff2'),
-      url('hinted-Inconsolata-Regular.woff') format('woff');
+      url('../webfonts/hinted-Inconsolata-Regular.woff2') format('woff2'),
+      url('../webfonts/hinted-Inconsolata-Regular.woff') format('woff');
   font-weight: normal;
   font-style: normal;
 }
@@ -758,7 +686,7 @@ html {
 }
 
 body {
-  font-family: 'Exo 2', Arial;
+  font-family: 'Exo', Arial;
   overflow-x: hidden;
   font-size: 0.9rem;
   height: 100%;
@@ -889,8 +817,8 @@ a {
 .l-menu__item a {
   color: #f7f7f7;
   position: relative;
-  line-height: 38px;
-  padding: 12px 18px;
+  line-height: 39px;
+  padding: 11px 14px;
   border-left: 1px solid transparent;
   border-right: 1px solid transparent; 
 }
@@ -1011,7 +939,7 @@ a {
   background-color: rgba(255,255,255,0.95);
   box-shadow: 0 3px 30px 0 rgba(0, 0, 0, 0.5);
   list-style-type: none;
-  margin: 0 27px;
+  margin: 0 18px;
   max-height: 90%;
   overflow-y: auto;
   padding-left: 0;
@@ -1028,29 +956,44 @@ a {
   border-top: none;
 }
 
+.notification-container .empty {
+  text-align: center;
+  font-size: 1.2rem;
+  font-weight: normal;
+  padding: 4rem;
+}
+
+.notification-container .empty .status-icon {
+  color: #54a6e5;
+}
+
 .notification-container .unseen {
   color: #6f6f6f;
 }
 
 .notification-container li {
   border-bottom: 1px solid #e9e4e4;
-  padding: 20px;
+  padding: 1rem;
+}
+
+.notification-container  li:last-child {
+  border-bottom: none;
 }
 
 .notification-container .mark-seen {
   background-color: #cc3366;
-  border: 2px solid #454545;
+  border: 1px solid #c41650;
   border-radius: 10px;
   cursor: pointer;
   display: none;
   float: right;
   height: 7px;
   margin-right: -5px;
-  margin-top: 10px;
+  margin-top: 9px;
   width: 7px;
 }
 .notification-container .mark-seen:hover {
-  background-color: #333;
+  background-color: #fff;
   border-color: #e83b75;
 }
 .notification-container .mark-seen:active {
@@ -1104,9 +1047,10 @@ a {
 }
 
 .notification-container .time {
-  float: right;
-  margin-top: 1rem;
-  font-size: 0.7rem;
+  font-size: 0.9em;
+  display: block;
+  text-align: right;
+  padding-top: 0.6rem;
 }
 
 
@@ -1186,15 +1130,16 @@ a {
 .l-stat__col-title {
   text-transform: uppercase;
   font-weight: 600;
-  color: #474747;
+  color: #5b5b5b;
   min-height: 21px;
 }
+
 .l-stat__col--active .l-stat__col-title {
   color: #cc3366;
-  font-size: 24px;
+  font-size: 22px;
   margin-top: -7px;
   letter-spacing: -1px;
-  margin-right: -8px;
+  margin-right: -4px;
 }
 
 .l-stat__col .fas {
@@ -1205,7 +1150,7 @@ a {
 .l-separator.selected,
 .l-separator {
   height: 1px;
-  background-color: #ddd;
+  border-top: 1px solid #ddd;
 }
 
 div.l-content > div.l-separator:nth-of-type(2) {
@@ -1220,6 +1165,8 @@ div.l-content > div.l-separator:nth-of-type(4) {
   width: 100%;
   position: fixed;
   z-index: 110;
+  border-top: none;
+  border-bottom: 1px solid #ddd;
 }
 
 .l-sort {
@@ -1368,10 +1315,10 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #4b4b4b;
 }
 .l-sort-toolbar .sort-by:active {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 .l-sort-toolbar .sort-by:active b {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 
 .l-sort-toolbar .sort-by b {
@@ -1384,7 +1331,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #4b4b4b;
 }
 .l-sort-toolbar .toggle-all:active {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 
 .l-sort-toolbar .l-select {
@@ -1412,7 +1359,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 .l-sort-toolbar__filter-apply {
   float: left;
   width: 32px;
-  height: 28px;
+  height: 30px;
   border: 1px solid #ddd;
   background-color: rgba(255,255,255,0.90);
   text-shadow: 0px 1px rgba(255,255,255,0.95);
@@ -1468,7 +1415,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #cc3366;
 }
 .l-sort-toolbar .vst:active {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 .l-sort-toolbar .vst.selected {
   color: #cc3366;
@@ -1530,7 +1477,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 .l-select select {
   border: 0;
   background-color: transparent;
-  height: 26px;
+  height: 28px;
   min-width: 175px;
   padding-left: 10px;
   background-image: url("/images/arrow.png");
@@ -1568,7 +1515,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #707070;
   padding: 0 0 0 14px;
   overflow: hidden;
-  font-size: 0.8rem;
+  font-size: 0.85rem;
   border-radius: 0;
   border-left: 1px solid transparent;
   border-right: 1px solid transparent;
@@ -1580,12 +1527,13 @@ div.l-content > div.l-separator:nth-of-type(4) {
   border-left: 1px solid #ddd !important;
   border-right: 1px solid #ddd !important;
   border-bottom: 1px solid #ddd !important;
+  border-top: 1px solid #ddd !important;
   text-shadow: 0px 1px rgba(255,255,255,0.95);
   box-shadow: inset 0px 0px 1px rgba(255,255,255,1), inset 0px 0px 4px rgba(255,255,255,0.8), 0px 4px 6px rgba(190,190,190,0.3) !important;
   border-top-left-radius: 0px;
   border-top-right-radius: 0px;
-  border-bottom-left-radius: 5px;
-  border-bottom-right-radius: 5px;
+  border-bottom-left-radius: 6px;
+  border-bottom-right-radius: 6px;
   min-height: 28px;
   color: #707070;
   padding: 0 0 0 14px;
@@ -1645,7 +1593,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   display: block;
 }
 .l-unit--blue {
-  border-left: 2px solid #55c9c0;
+  border-left: 2px solid #3b9de8;
 }
 
 .l-unit--suspended {
@@ -2419,7 +2367,7 @@ label:hover {
   border: 1px solid #cfcfcf;
   border-radius: 4px;
   color: #4e4e4e;
-  font-family: 'Exo 2', Arial, Arial, Helvetica, sans-serif;
+  font-family: 'Exo', Arial, Arial, Helvetica, sans-serif;
   font-size: 0.8rem;
   height: 20px;
   margin: 2px 6px 0 0;
@@ -2432,7 +2380,7 @@ label:hover {
   border: 1px solid #909090;
 }
 .vst-input:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   background-color: #D7F9FF;
   color: #333;
 }
@@ -2453,13 +2401,26 @@ label:hover {
 .vst-input.short {
   width: 200px;
 }
+.vst-input.vst-list-editor {
+  border: none;
+  box-shadow: none;
+  position: absolute;
+  margin-top:-34px;
+  margin-left: 1px;
+  display: block;
+  width: 340px;
+  height: 1rem;
+}
+.vst-input.vst-list-editor:focus {
+  background-color: white;
+}
 
 .vst-list {
   background-color: #fff;
   border: 1px solid #ccc;
   border-radius: 4px;
   color: #4e4e4e;
-  font-family: 'Exo 2', Arial, Helvetica,sans-serif;
+  font-family: 'Exo', Arial, Helvetica,sans-serif;
   font-size: 0.8rem;
   font-weight: normal;
   height: 36px;
@@ -2478,6 +2439,10 @@ label:hover {
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
 }
 
+select.vst-list:-moz-focusring {
+  color:transparent;
+}
+
 .vst-list.long-2 {
   width: 486px;
   background-position: 465px;
@@ -2489,7 +2454,7 @@ label:hover {
   border: 1px solid #909090;
 }
 .vst-list:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   color: #333;
 }
 
@@ -2531,6 +2496,7 @@ a.vst-text:active b{
   color: #30659d !important;
   padding: 4px 0px 0px 18px;
   overflow: hidden;
+  height: 28px;
 }
 
 .advanced-options a {
@@ -2551,7 +2517,7 @@ a.vst-text:active b{
   padding: 5px;
   width: 560px;
   height: 60px;
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif;
+  font-family: 'Exo', Arial, Helvetica, sans-serif;
   padding: 7px 1px 3px 14px;
   font-weight: normal;
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
@@ -2560,7 +2526,7 @@ a.vst-text:active b{
   border: 1px solid #909090;
 }
 .vst-textinput:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   background-color: #D7F9FF;
   color: #333;
 }
@@ -2729,10 +2695,10 @@ td.hint {
   filter:chroma(color=#000);
   cursor: pointer;
   border-radius: 3px 3px 3px 3px !important;
-  font-size: 1.0em !important;
+  font-size: 1.05em !important;
   font-weight: 500 !important;
   padding: 2px 16px 3px 20px !important;
-  width: 100px !important;
+  min-width: 100px !important;
   height: 28px !important;
   color: #30659d !important;
   border: 1px solid #3b9de8 !important;
@@ -2741,7 +2707,7 @@ td.hint {
   box-shadow: 0px 1px 4px rgba(0,0,0,0.2),
               inset 0px 0px 1px #fff,
               inset 0px 0px 3px rgba(255,255,255,0.5) !important;
-  text-shadow: 0px 1px 1px rgba(255,255,255,0.5) !important;
+  text-shadow: 0px 1px 1px rgba(255,255,255,0.6) !important;
 }
 .ui-button:hover, .button:hover, .ui-button.cancel:hover, .button.cancel:hover {
   color: #3b9de8 !important;
@@ -2914,7 +2880,7 @@ a.button.cancel {
 
 .mail-infoblock td {
   color: #505050;
-  font-size: 11.5px;
+  font-size: 0.75rem;
   height: 20px;
   font-weight: normal;
 }
@@ -2952,7 +2918,7 @@ a.button.cancel {
 .login {
   background-color: #fff;
   box-shadow: 0px 8px 30px rgba(49,98,153, 0.75);
-  font-family: 'Exo 2', Tahoma, Arial, Helvetica, sans-serif;
+  font-family: 'Exo', Tahoma, Arial, Helvetica, sans-serif;
   margin: 0;
   padding: 0;
   text-align: left;
@@ -3060,7 +3026,7 @@ div.l-content.collapsed .l-sort {
 
 .console-output {
   font-family: "Inconsolata", "Lucida Console", Monaco, monospace;
-  font-size: 0.7rem;
+  font-size: 0.8rem;
   color: #202020;
   letter-spacing: -0.01em;
 }
@@ -3119,7 +3085,7 @@ form#vstobjects.suspended {
 }
 
 .l-sort__create-btn.edit:hover #tooltip {
-  background-color: #55C9C0;
+  background-color: #3b9de8;
 }
 .l-sort__create-btn.edit:active #tooltip {
   background-color: #3BF0E6 !important;
@@ -3138,13 +3104,12 @@ form#vstobjects.suspended {
 .pill.usage{
   margin-top: 8px;
   font-size: 0.75rem;
-  padding: 3px;
+  padding: 4px;
   padding-left: 8px;
   padding-right: 8px;
   margin-right: 10px;
-  line-height: 0.85rem;
-  box-shadow: 0px 1px 1px rgba(0,0,0,0.25),
-              inset 0px 0px 1px rgba(0,0,0,0.15);
+  line-height: 0.75rem;
+  box-shadow: 0px 1px 1px rgba(0,0,0,0.25), inset 0px 0px 1px rgba(0,0,0,0.15);
   background-color: rgba(255,255,255,0.75);
   font-weight: 500;
   border: 1px solid rgba(255,255,255,0.9);
@@ -3241,41 +3206,51 @@ form#vstobjects.suspended {
   font-size: 1rem;
 }
 
-.status-icon.yellow, .status-icon.yellow:hover {
+.status-icon.yellow, .status-icon.yellow:hover,
+.updates .status-icon.yellow, .updates .status-icon.yellow:hover {
   color: #f3e72c;
 }
-.status-icon.teal, .status-icon.teal:hover {
+.status-icon.teal, .status-icon.teal:hover,
+.updates .status-icon.teal, .updates .status-icon.teal:hover  {
   color: #33cccc;
 }
-.status-icon.purple, .status-icon.purple:hover {
+.status-icon.purple, .status-icon.purple:hover
+.updates .status-icon.purple, .updates .status-icon.purple:hover {
   color: #8e2fca;
 }
 
-.status-icon.maroon, .status-icon.maroon:hover {
+.status-icon.maroon, .status-icon.maroon:hover,
+.updates .status-icon.purple, .updates .status-icon.purple:hover {
   color: #cc3366;
 }
 
-.status-icon.red, .status-icon.red:hover {
+.status-icon.red, .status-icon.red:hover,
+.updates .status-icon.red, .updates .status-icon.red:hover {
   color: #ff3333;
 }
 
-.status-icon.green, .status-icon.green:hover {
+.status-icon.green, .status-icon.green:hover,
+.updates .status-icon.green, .updates .status-icon.green:hover {
   color: #53ba55;
 }
 
-.status-icon.orange, .status-icon.orange:hover {
+.status-icon.orange, .status-icon.orange:hover,
+.updates .status-icon.orange, .updates .status-icon.orange:hover {
   color: #ffc043;
 }
 
-.status-icon.lightblue, .status-icon.lightblue:hover {
+.status-icon.lightblue, .status-icon.lightblue:hover,
+.updates .status-icon.lightblue, .updates .status-icon.lightblue:hover {
   color: #6eb6f0;
 }
 
-.status-icon.highlight, .status-icon.highlight:hover {
+.status-icon.highlight, .status-icon.highlight:hover,
+.updates .status-icon.highlight, .updates .status-icon.highlight:hover {
   color: #323232;
 }
 
-.status-icon.blue, .status-icon.blue:hover {
+.status-icon.blue, .status-icon.blue:hover,
+.updates .status-icon.blue, .updates .status-icon.blue:hover {
   color: #326b9b;
 }
 
@@ -3306,7 +3281,7 @@ form#vstobjects.suspended {
 .search-input {
   background-color: #fff;
   border: 1px solid #ddd;
-  height: 24px;
+  height: 26px;
   line-height: 28px;
   padding-left: 7px;
   float: left;
@@ -3408,7 +3383,7 @@ form#vstobjects.suspended {
   background-color: #000;
 }
 .shortcuts .close:active {
-  background-color: #55c9c0;
+  background-color: #3b9de8;
 }
 .shortcuts .close .fas {
   font-size: 1.3rem;
@@ -3525,7 +3500,7 @@ form#vstobjects.suspended {
 }
 
 .ui-dialog {
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif !important;
+  font-family: 'Exo', Arial, Helvetica, sans-serif !important;
   font-weight: 500 !important;
   background-color: rgba(245,245,245,0.87) !important;
   box-shadow: 0 8px 50px 0 rgba(0, 0, 0, 0.55) !important;
@@ -3540,8 +3515,12 @@ form#vstobjects.suspended {
 }
 
 .ui-dialog .ui-dialog-title {
-  color: #121212 !important;
-  font-size: 1.2em !important;
+  color: #046c98 !important;
+  font-size: 1.1em !important;
+  text-transform: none !important;
+  letter-spacing: -0.01em !important;
+  text-align: center !important;
+  float: none !important;
 }
 
 .ui-dialog-buttonpane {
@@ -3556,11 +3535,13 @@ form#vstobjects.suspended {
 .helper-container {
   float: right;
   margin-bottom: -450px;
-  margin-top: 359px;
-  margin-right: 80px;
+  margin-top: 410px;
+  margin-right: 22px;
   padding-top: 3px;
   width: 563px;
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
+  border: 1px solid #cfcfcf;
+  border-radius: 4px;
 }
 
 .context-helper {
@@ -3573,7 +3554,7 @@ form#vstobjects.suspended {
   float: right;
 }
 .context-helper:hover {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 .context-helper:active {
   color: #cc3366;
@@ -3583,7 +3564,7 @@ form#vstobjects.suspended {
 .cron-helper-tabs {
 /*  margin-top: 30px;*/
   border: none !important;
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif !important;
+  font-family: 'Exo', Arial, Helvetica, sans-serif !important;
 }
 
 .cron-helper-tabs a {
@@ -3599,15 +3580,12 @@ form#vstobjects.suspended {
   color: #cc3366;
 }
 .cron-helper-tabs a:active {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 .cron-helper-tabs .ui-tabs-selected a {
   color: #cc3366;
 }
 
-.cron-helper-tabs select {
-  font-size: 15px !important;
-}
 .cron-helper-tabs select.short {
   background-position: -388px -604px;
   min-width: 30px;
@@ -3631,8 +3609,8 @@ form#vstobjects.suspended {
 
 .cron-helper-tabs .button {
   width: auto;
-  background-color: #55C9C0;
-  border: 1px solid #55C9C0;
+  background-color: #3b9de8;
+  border: 1px solid #3b9de8;
   text-transform: capitalize;
 }
 .cron-helper-tabs .button:hover {

+ 0 - 1
web/delete/cron/autoupdate/index.php

@@ -13,7 +13,6 @@ if ((!isset($_GET['token'])) || ($_SESSION['token'] != $_GET['token'])) {
 
 if ($_SESSION['user'] == 'admin') {
     exec (HESTIA_CMD."v-delete-cron-hestia-autoupdate", $output, $return_var);
-    $_SESSION['error_msg'] = __('Autoupdate has been successfully disabled');
     unset($output);
 }
 

+ 0 - 1
web/delete/cron/reports/index.php

@@ -12,7 +12,6 @@ if ((!isset($_GET['token'])) || ($_SESSION['token'] != $_GET['token'])) {
 }
 
 exec (HESTIA_CMD."v-delete-cron-reports ".$user, $output, $return_var);
-$_SESSION['error_msg'] = __('Cronjob email reporting has been successfully disabled');
 unset($output);
 
 header("Location: /list/cron/");

+ 12 - 2
web/edit/dns/index.php

@@ -17,6 +17,11 @@ if (($_SESSION['user'] == 'admin') && (!empty($_GET['user']))) {
     $user=escapeshellarg($_GET['user']);
 }
 
+// List ip addresses
+exec (HESTIA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
+$v_ips = json_decode(implode('', $output), true);
+unset($output);
+
 // List dns domain
 if ((!empty($_GET['domain'])) && (empty($_GET['record_id'])))  {
     $v_domain = escapeshellarg($_GET['domain']);
@@ -156,16 +161,21 @@ if ((!empty($_POST['save'])) && (!empty($_GET['domain'])) && (!empty($_GET['reco
     $v_record_id = escapeshellarg($_POST['v_record_id']);
 
     // Change dns record
-    if (($v_val != $_POST['v_val']) || ($v_priority != $_POST['v_priority']) && (empty($_SESSION['error_msg']))) {
+    if (($v_rec != $_POST['v_rec']) || ($v_type != $_POST['v_type']) || ($v_val != $_POST['v_val']) || ($v_priority != $_POST['v_priority']) && (empty($_SESSION['error_msg']))) {
+        $v_rec = escapeshellarg($_POST['v_rec']);
+        $v_type = escapeshellarg($_POST['v_type']);
         $v_val = escapeshellarg($_POST['v_val']);
         $v_priority = escapeshellarg($_POST['v_priority']);
-        exec (HESTIA_CMD."v-change-dns-record ".$v_username." ".$v_domain." ".$v_record_id." ".$v_val." ".$v_priority, $output, $return_var);
+        exec (HESTIA_CMD."v-change-dns-record ".$v_username." ".$v_domain." ".$v_record_id." ".$v_rec." ".$v_type." ".$v_val." ".$v_priority, $output, $return_var);
         check_return_code($return_var,$output);
+        $v_rec = $_POST['v_rec'];
+        $v_type = $_POST['v_type'];
         $v_val = $_POST['v_val'];
         unset($output);
         $restart_dns = 'yes';
     }
 
+
     // Change dns record id
     if (($_GET['record_id'] != $_POST['v_record_id']) && (empty($_SESSION['error_msg']))) {
         $v_old_record_id = escapeshellarg($_GET['record_id']);

+ 1 - 1
web/edit/mail/index.php

@@ -264,7 +264,7 @@ if ((!empty($_POST['save'])) && (!empty($_GET['domain'])) && (empty($_GET['accou
     }
 
     // Delete Lets Encrypt support
-    if (( $v_letsencrypt == 'yes' ) && (empty($_POST['v_letsencrypt'])) && (empty($_SESSION['error_msg']))) {
+    if (( $v_letsencrypt == 'yes' ) && (empty($_POST['v_letsencrypt']) || empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
         exec (HESTIA_CMD."v-delete-letsencrypt-domain ".$user." ".escapeshellarg($v_domain)." ' ' 'yes'", $output, $return_var);
         check_return_code($return_var,$output);
         unset($output);

+ 58 - 0
web/edit/server/ssh/index.php

@@ -0,0 +1,58 @@
+<?php
+error_reporting(NULL);
+$TAB = 'SERVER';
+
+// Main include
+include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
+
+// Check user
+if ($_SESSION['user'] != 'admin') {
+    header("Location: /list/user");
+    exit;
+}
+
+// Check POST request
+if (!empty($_POST['save'])) {
+
+    // Check token
+    if ((!isset($_POST['token'])) || ($_SESSION['token'] != $_POST['token'])) {
+        header('location: /login/');
+        exit();
+    }
+
+    // Set restart flag
+    $v_restart = 'yes';
+    if (empty($_POST['v_restart'])) $v_restart = 'no';
+
+    // Update config
+    if (!empty($_POST['v_config'])) {
+        exec ('mktemp', $mktemp_output, $return_var);
+        $new_conf = $mktemp_output[0];
+        $fp = fopen($new_conf, 'w');
+        fwrite($fp, str_replace("\r\n", "\n",  $_POST['v_config']));
+        fclose($fp);
+        exec (HESTIA_CMD."v-change-sys-service-config ".$new_conf." ssh ".$v_restart, $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+        unlink($new_conf);
+    }
+
+    // Set success message
+    if (empty($_SESSION['error_msg'])) {
+        $_SESSION['ok_msg'] = __('Changes has been saved.');
+    }
+
+}
+
+$v_config_path = '/etc/ssh/sshd_config';
+$v_service_name = strtoupper('ssh');
+
+// Read config
+$v_config = shell_exec(HESTIA_CMD."v-open-fs-config ".$v_config_path);
+
+// Render page
+render_page($user, $TAB, 'edit_server_service');
+
+// Flush session messages
+unset($_SESSION['error_msg']);
+unset($_SESSION['ok_msg']);

+ 1 - 1
web/edit/web/index.php

@@ -349,7 +349,7 @@ if (!empty($_POST['save'])) {
     }
 
     // Delete Lets Encrypt support
-    if (( $v_letsencrypt == 'yes' ) && (empty($_POST['v_letsencrypt'])) && (empty($_SESSION['error_msg']))) {
+    if (( $v_letsencrypt == 'yes' ) && (empty($_POST['v_letsencrypt']) || empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
         exec (HESTIA_CMD."v-delete-letsencrypt-domain ".$user." ".escapeshellarg($v_domain)." ''", $output, $return_var);
         check_return_code($return_var,$output);
         unset($output);

+ 1 - 0
web/inc/i18n/ar.php

@@ -756,6 +756,7 @@ $LANG['ar'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'مظهر',
+    'Operating System' => 'نظام التشغيل',
     
 // Texts below doesn't exist in en.php
     '%s rule' => 'قواعد %s',

+ 1 - 0
web/inc/i18n/bg.php

@@ -750,5 +750,6 @@ $LANG['bg'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Външния вид',
+    'Operating System' => 'Операционна система',
 );
 

+ 1 - 0
web/inc/i18n/bs.php

@@ -755,4 +755,5 @@ $LANG['bs'] = array(
     'Email Credentials' => 'Email lozinka i podešavanja',
 
     'Theme' => 'Izgled',
+    'Operating System' => 'Operativni sistem',
 );

+ 1 - 0
web/inc/i18n/cn.php

@@ -764,4 +764,5 @@ $LANG['cn'] = array(
     'Email Credentials' => '电子邮件证书',
 
     'Theme' => '外觀',
+    'Operating System' => '作業系統',
 );

+ 1 - 1
web/inc/i18n/cz.php

@@ -756,5 +756,5 @@ $LANG['cz'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Vzhled',
-    
+    'Operating System' => 'Operační systém',
 );

+ 1 - 0
web/inc/i18n/da.php

@@ -757,4 +757,5 @@ $LANG['da'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Udseende',
+    'Operating System' => 'Operativsystem',
 );

+ 1 - 0
web/inc/i18n/de.php

@@ -755,4 +755,5 @@ $LANG['de'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'aussehen',
+    'Operating System' => 'Betriebssystem',
 );

+ 1 - 0
web/inc/i18n/el.php

@@ -757,4 +757,5 @@ $LANG['el'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Εμφάνιση',
+    'Operating System' => 'Λειτουργικό σύστημα',
 );

+ 3 - 0
web/inc/i18n/en.php

@@ -764,4 +764,7 @@ $LANG['en'] = array(
     '2FA Reset Code:' => 'Account Recovery Code:',
 
     'Theme' => 'Appearance',
+
+    'Operating System' => 'Operating System',
+    
 );

+ 1 - 0
web/inc/i18n/es.php

@@ -763,4 +763,5 @@ $LANG['es'] = array(
     'Email Credentials' => 'Datos de acceso a la cuenta de correo',
 
     'Theme' => 'Aspecto',
+    'Operating System' => 'Operatsioonisüsteemi',
 );

+ 1 - 0
web/inc/i18n/fa.php

@@ -726,4 +726,5 @@ $LANG['fa'] = array(
     'maximum characters length, including prefix' => 'بیشینه %s کاراکتر طول, شامل پیشوند',
     'Email Credentials' => 'اعتبار پست الکترونیکی',
     'Theme' => 'ظاهر',
+    'Operating System' => 'سیستم عامل',
 );

+ 2 - 0
web/inc/i18n/fi.php

@@ -757,6 +757,8 @@ $LANG['fi'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Ulkonäkö',
+
+    'Operating System' => 'Käyttöjärjestelmä',
     
 // Texts below doesn't exist in en.php
     'traffic' => 'tiedonsiirto',

+ 2 - 0
web/inc/i18n/fr.php

@@ -756,6 +756,8 @@ $LANG['fr'] = array(
 
     'Theme' => 'Apparence',
 
+    'Operating System' => 'Système d\'exploitation',
+
 // Texts below doesn't exist in en.php
     'disk' => 'disque',
     'traffic' => 'traffic',

+ 2 - 0
web/inc/i18n/hu.php

@@ -759,4 +759,6 @@ $LANG['hu'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Megjelenése',
+    'Operating System' => 'Operációs rendszer',
+    
 );

+ 1 - 0
web/inc/i18n/id.php

@@ -756,4 +756,5 @@ $LANG['id'] = array(
     'Email Credentials' => 'Kredensial surel',
 
     'Theme' => 'Penampilan',
+    'Operating System' => 'Sistem operasi',
 );

+ 1 - 0
web/inc/i18n/it.php

@@ -756,4 +756,5 @@ $LANG['it'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Apparenza',
+    'Operating System' => 'Sistema operativo',
 );

+ 2 - 0
web/inc/i18n/ja.php

@@ -755,4 +755,6 @@ $LANG['ja'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => '外観',
+    'Operating System' => 'オペレーティング システム',
+    
 );

+ 1 - 0
web/inc/i18n/ko.php

@@ -755,4 +755,5 @@ $LANG['ko'] = array(
     'Email Credentials' => '이메일 자격증명',
 
     'Theme' => '모양을',
+    'Operating System' => '운영 체제',
 );

+ 1 - 0
web/inc/i18n/no.php

@@ -756,5 +756,6 @@ $LANG['no'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Utseende',
+    'Operating System' => 'Operativsystemet',
     
 );

+ 1 - 0
web/inc/i18n/pt.php

@@ -755,4 +755,5 @@ $LANG['pt'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Aparência',
+    'Operating System' => 'Sistema Operacional',
 );

+ 2 - 0
web/inc/i18n/ro.php

@@ -757,4 +757,6 @@ $LANG['ro'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Aspectul',
+    'Operating System' => 'Sistem de operare',
+    
 );

+ 1 - 0
web/inc/i18n/ru.php

@@ -763,4 +763,5 @@ $LANG['ru'] = array(
     'Force SSL/HTTPS' => 'Принудительный редирект HTTP-на-HTTPS',
     
     'Theme' => 'Внешний вид',
+    'Operating System' => 'Операционная система',
 );

+ 2 - 0
web/inc/i18n/se.php

@@ -753,4 +753,6 @@ $LANG['se'] = array(
     'maximum characters length, including prefix' => 'maximum %s characters length, including prefix',
 
     'Email Credentials' => 'Email Credentials',
+
+    'Operating System' => 'Operativsystem',
 );

+ 1 - 0
web/inc/i18n/sr.php

@@ -755,5 +755,6 @@ $LANG['sr'] = array(
     'Email Credentials' => 'Email lozinka i podešavanja',
 
     'Theme' => 'Izgled',
+    'Operating System' => 'Operacijskog sustava',
     
 );

+ 1 - 0
web/inc/i18n/th.php

@@ -758,4 +758,5 @@ $LANG['th'] = array(
     'Email Credentials' => 'ข้อมูลการใช้อีเมล',
 
     'Theme' => 'ลักษณะ',
+    'Operating System' => 'ระบบปฏิบัติการ',
 );

+ 1 - 1
web/inc/i18n/tr.php

@@ -756,5 +756,5 @@ $LANG['tr'] = array(
     'Email Credentials' => 'Email Credentials',
 
     'Theme' => 'Görünüm',
-    
+    'Operating System' => 'İşletim Sistemi',
 );

+ 1 - 0
web/inc/i18n/ua.php

@@ -728,5 +728,6 @@ $LANG['ua'] = array(
     '2FA Reset Code:' => 'Код відновлення доступу до акаунту:',
 	'Force SSL/HTTPS' => 'Примусовий редирект HTTP-на-HTTPS',
     'Theme' => 'Зовнішній вигляд',
+    'Operating System' => 'Операційна система',
     
 );

+ 1 - 0
web/inc/i18n/ur.php

@@ -735,4 +735,5 @@ $LANG['ur'] = array(
     'SubDomain' => 'ذیلی ڈومین',
     'Add Sub Domain' => 'ذیلی ڈومین کا اضافہ کریں',	
     'Theme' => 'ظہور',
+    'Operating System' => 'اشتغالی نظام',
 );

+ 1 - 0
web/inc/i18n/vi.php

@@ -757,4 +757,5 @@ $LANG['vi'] = array(
     'Email Credentials' => 'Chứng nhận email',
     
     'Theme' => 'Xuất hiện',
+    'Operating System' => 'Hệ điều hành',
 );

+ 0 - 2
web/js/app.js

@@ -1009,7 +1009,6 @@ hover_menu = function() {
         nav_a.css({'min-height': 111 - st + 'px'});
         nav_context.css({'margin-top': 181 - st + 'px'});
         sep_2.css({'box-shadow':'none'});
-        sep_2.css({'background-color': '#ddd'});
         sep_2.css({'height': '1px'});
     }
 
@@ -1017,7 +1016,6 @@ hover_menu = function() {
         sep_1.css({'margin-top': '100px'});
         sep_2.css({'margin-top': '130px'});
         sep_2.css({'height': '15px'});
-        sep_2.css({'background-color': '#fff'});
         nav_a.css({'height': '0'});
         nav_a.css({'min-height': '0'});
         nav_context.css({'margin-top': '101px'});

+ 3 - 4
web/js/templates.js

@@ -9,13 +9,12 @@ App.Templates.html = {
                     '<li class="~!:UNSEEN~!"><span class="unselectable mark-seen" id="notification-~!:ID~!">&nbsp;</span>\
                         <span class="title"><span class="unselectable icon ~!:TYPE~!">&nbsp;</span>~!:TOPIC~!</span>\
                         ~!:NOTICE~!\
-                        <span class="time">~!:TIME~! ~!:DATE~!</span>\
+                        <b><span class="time">~!:TIME~! ~!:DATE~!</span></b>\
                     </li>'
         ],
         notification_empty: [
-                    '<li class="empty">\
-                        '+App.Constants.NOTIFICATIONS_EMPTY+'\
-                    </li>'
+                    '<li class="empty"><span><i class="fas fa-bell-slash status-icon" style="font-size: 4rem;"></i><br><br>\
+                    '+App.Constants.NOTIFICATIONS_EMPTY+'\</span></li>'
         ]
     },
 

+ 11 - 2
web/templates/admin/add_dns.html

@@ -65,12 +65,21 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_ip" value="<?=htmlentities(trim($v_ip, "'"))?>">
+                                    <select class="vst-list" onchange="this.nextElementSibling.value=this.value">
+                                        <option value="">clear</option>
+                                        <?php
+                                            foreach ($v_ips as $ip => $value) {
+                                                $display_ip = empty($value['NAT']) ? $ip : "{$value['NAT']}";
+                                                echo "<option value='{$display_ip}'>" . htmlentities($display_ip) . "</option>\n";
+                                            }
+                                        ?>
+                                    </select>
+                                    <input type="text" size="20" class="vst-input vst-list-editor" name="v_ip" value="<?=htmlentities(trim($v_ip, "'"))?>">
                                 </td>
                             </tr>
                             <tr>
                                 <td class="vst-text input-label">
-                                    <a href="javascript:elementHideShow('advtable');" class="vst-advanced"><?php print __('Advanced options');?></a>
+                                    <a href="javascript:elementHideShow('advtable');" class="vst-advanced"><?php print __('Advanced options');?>&nbsp;<i class="fas fa-arrow-circle-right"></i></a>
                                 </td>
                             </tr>
                             <tr>

+ 10 - 1
web/templates/admin/add_dns_rec.html

@@ -94,7 +94,16 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_val" value="<?=htmlentities(trim($v_val, "'"))?>">
+                                    <select class="vst-list" onchange="this.nextElementSibling.value=this.value">
+                                        <option value="">clear</option>
+                                        <?php
+                                            foreach ($v_ips as $ip => $value) {
+                                                $display_ip = empty($value['NAT']) ? $ip : "{$value['NAT']}";
+                                                echo "<option value='{$display_ip}'>" . htmlentities($display_ip) . "</option>\n";
+                                            }
+                                        ?>
+                                    </select>
+                                    <input type="text" size="20" class="vst-input vst-list-editor" name="v_val" value="<?=htmlentities(trim($v_val, "'"))?>">
                                 </td>
                             </tr>
                             <tr>

+ 1 - 1
web/templates/admin/add_mail_acc.html

@@ -74,7 +74,7 @@
                         </tr>
                         <tr>
                             <td class="vst-text input-label">
-                                <a href="javascript:elementHideShow('advtable');" class="vst-advanced"> <?php print __('Advanced options');?></a>
+                                <a href="javascript:elementHideShow('advtable');" class="vst-advanced"> <?php print __('Advanced options');?>&nbsp;<i class="fas fa-arrow-circle-right"></i></a>
                             </td>
                         </tr>
                         <tr>

+ 23 - 23
web/templates/admin/add_user.html

@@ -68,6 +68,26 @@
                                     <input type="text" size="20" class="vst-input password" name="v_password" value="<?=htmlentities(trim($v_password, "'"))?>" tabindex="2" >
                                 </td>
                             </tr>
+                            <tr>
+                                <td class="vst-text input-label">
+                                    <?php print __('First Name');?>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>
+                                    <input type="text" size="20" class="vst-input" name="v_fname" value="<?=htmlentities(trim($v_fname, "'"))?>" tabindex="3" >
+                                </td>
+                            </tr>
+                            <tr>
+                                <td class="vst-text input-label">
+                                    <?php print __('Last Name');?>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>
+                                    <input type="text" size="20" class="vst-input" name="v_lname" value="<?=htmlentities(trim($v_lname, "'"))?>" tabindex="4" >
+                                </td>
+                            </tr>
                             <tr>
                                 <td class="vst-text input-label">
                                     <?php print __('Email');?>
@@ -75,7 +95,7 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_email" id='v_email' value="<?=htmlentities(trim($v_email, "'"))?>" tabindex="3" >
+                                    <input type="text" size="20" class="vst-input" name="v_email" id='v_email' value="<?=htmlentities(trim($v_email, "'"))?>" tabindex="5" >
                                 </td>
                             </tr>
                             <tr>
@@ -85,7 +105,7 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <select class="vst-list" name="v_package" tabindex="4" >
+                                    <select class="vst-list" name="v_package" tabindex="6" >
                                         <?php
                                             foreach ($data as $key => $value) {
                                                 echo "\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"".htmlentities($key)."\"";
@@ -109,7 +129,7 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <select class="vst-list" name="v_language" tabindex="5" >
+                                    <select class="vst-list" name="v_language" tabindex="7" >
                                         <?php
                                             foreach ($languages as $key => $value) {
                                                 echo "\n\t\t\t\t\t\t\t\t\t<option value=\"".htmlentities($value)."\"";
@@ -128,26 +148,6 @@
                                     </select>
                                 </td>
                             </tr>
-                            <tr>
-                                <td class="vst-text input-label">
-                                    <?php print __('First Name');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" size="20" class="vst-input" name="v_fname" value="<?=htmlentities(trim($v_fname, "'"))?>" tabindex="6" >
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class="vst-text input-label">
-                                    <?php print __('Last Name');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" size="20" class="vst-input" name="v_lname" value="<?=htmlentities(trim($v_lname, "'"))?>" tabindex="7" >
-                                </td>
-                            </tr>
                             <tr>
                                 <td class="vst-text input-label">
                                     <?php print __('Send login credentials to email address');?>

+ 11 - 1
web/templates/admin/edit_dns.html

@@ -68,7 +68,17 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_ip" value="<?=htmlentities(trim($v_ip, "'"))?>">
+                                    <select class="vst-list" onchange="this.nextElementSibling.value=this.value">
+                                        <option value="">clear</option>
+                                        <?php
+                                            foreach ($v_ips as $ip => $value) {
+                                                $display_ip = empty($value['NAT']) ? $ip : "{$value['NAT']}";
+                                                $ip_selected = ((!empty($v_ip) && ($v_ip==$ip||$v_ip==$display_ip) ))? 'selected' : '';
+                                                echo "<option value='{$display_ip}' {$ip_selected}>" . htmlentities($display_ip) . "</option>\n";
+                                            }
+                                        ?>
+                                    </select>
+                                    <input type="text" size="20" class="vst-input vst-list-editor" name="v_ip" value="<?=htmlentities(trim($v_ip, "'"))?>">
                                 </td>
                             </tr>
                             <tr>

+ 27 - 3
web/templates/admin/edit_dns_rec.html

@@ -68,7 +68,7 @@
                             </tr>
                             <tr>
                                 <td>
-                                  <input type="text" size="20" class="vst-input" name="v_rec" value="<?=htmlentities(trim($v_rec, "'"))?>" disabled>
+                                  <input type="text" size="20" class="vst-input" name="v_rec" value="<?=htmlentities(trim($v_rec, "'"))?>">
                                   <input type="hidden" name="v_record_id" value="<?=htmlentities($v_record_id)?>">
                                 </td>
                             </tr>
@@ -79,7 +79,22 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_type" value="<?=htmlentities(trim($v_type, "'"))?>" disabled>
+                                    <select class="vst-list" name="v_type">
+                                        <option value="A" <?php if ($v_type == 'A') echo selected; ?>>A</option>
+                                        <option value="AAAA" <?php if ($v_type == 'AAAA') echo selected; ?>>AAAA</option>
+                                        <option value="NS" <?php if ($v_type == 'NS') echo selected; ?>>NS</option>
+                                        <option value="CNAME" <?php if ($v_type == 'CNAME') echo selected; ?>>CNAME</option>
+                                        <option value="MX" <?php if ($v_type == 'MX') echo selected; ?>>MX</option>
+                                        <option value="TXT" <?php if ($v_type == 'TXT') echo selected; ?>>TXT</option>
+                                        <option value="SRV" <?php if ($v_type == 'SRV') echo selected; ?>>SRV</option>
+                                        <option value="DNSKEY" <?php if ($v_type == 'DNSKEY') echo selected; ?>>DNSKEY</option>
+                                        <option value="KEY" <?php if ($v_type == 'KEY') echo selected; ?>>KEY</option>
+                                        <option value="IPSECKEY" <?php if ($v_type == 'IPSECKEY') echo selected; ?>>IPSECKEY</option>
+                                        <option value="PTR" <?php if ($v_type == 'PTR') echo selected; ?>>PTR</option>
+                                        <option value="SPF" <?php if ($v_type == 'SPF') echo selected; ?>>SPF</option>
+                                        <option value="TLSA" <?php if ($v_type == 'TLSA') echo selected; ?>>TLSA</option>
+                                        <option value="CAA" <?php if ($v_type == 'CAA') echo selected; ?>>CAA</option>
+                                    </select>
                                 </td>
                             </tr>
                             <tr>
@@ -89,7 +104,16 @@
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="text" size="20" class="vst-input" name="v_val" value="<?=htmlentities(trim($v_val, "'"))?>">
+                                    <select class="vst-list" onchange="this.nextElementSibling.value=this.value">
+                                        <option value="">clear</option>
+                                        <?php
+                                            foreach ($v_ips as $ip => $value) {
+                                                $display_ip = empty($value['NAT']) ? $ip : "{$value['NAT']}";
+                                                echo "<option value='{$display_ip}'>" . htmlentities($display_ip) . "</option>\n";
+                                            }
+                                        ?>
+                                    </select>
+                                    <input type="text" size="20" class="vst-input vst-list-editor" name="v_val" value="<?=htmlentities(trim($v_val, "'"))?>">
                                 </td>
                             </tr>
                             <tr>

+ 15 - 17
web/templates/admin/edit_server.html

@@ -96,54 +96,54 @@
                                         </tr>
                                         <tr>
                                             <td class="vst-text input-label">
-                                                <?php print __('Default Language');?>
+                                                <?php print __('Theme') ?>
                                             </td>
                                         </tr>
                                         <tr>
                                             <td>
-                                                <select class="vst-list" name="v_language">
+                                                <select class="vst-list" name="v_theme">
                                                     <?php
-                                                        foreach ($languages as $key => $value) {
+                                                        foreach ($theme as $key => $value) {
                                                             echo "\t\t\t\t<option value=\"".$value."\"";
-                                                            if ((!empty($_SESSION['LANGUAGE'])) && ( $value == $_SESSION['LANGUAGE'])){
+                                                            if ((!empty($_SESSION['THEME'])) && ( $value == $_SESSION['THEME'])){
                                                                 echo ' selected' ;
                                                             }
-                                                            if ((!empty($_SESSION['LANGUAGE'])) && ( $value == $_POST['v_language'])){
+                                                            if ((!empty($_SESSION['THEME'])) && ( $value == $_POST['v_theme'])){
                                                                 echo ' selected' ;
                                                             }
                                                             echo ">".$value."</option>\n";
                                                         }
                                                     ?>
                                                 </select>
-                                            </td>
-                                        </tr>
-                                        <tr>
-                                        <td class="vst-text input-label">
-                                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_language_update"><?php print __('update');?> <?php print __('Users');?> <?php print __('Default Language');?></label>
                                                 <br><br>
                                             </td>
                                         </tr>
                                         <tr>
                                             <td class="vst-text input-label">
-                                                <?php print __('Theme') ?>
+                                                <?php print __('Default Language');?>
                                             </td>
                                         </tr>
                                         <tr>
                                             <td>
-                                                <select class="vst-list" name="v_theme">
+                                                <select class="vst-list" name="v_language">
                                                     <?php
-                                                        foreach ($theme as $key => $value) {
+                                                        foreach ($languages as $key => $value) {
                                                             echo "\t\t\t\t<option value=\"".$value."\"";
-                                                            if ((!empty($_SESSION['THEME'])) && ( $value == $_SESSION['THEME'])){
+                                                            if ((!empty($_SESSION['LANGUAGE'])) && ( $value == $_SESSION['LANGUAGE'])){
                                                                 echo ' selected' ;
                                                             }
-                                                            if ((!empty($_SESSION['THEME'])) && ( $value == $_POST['v_theme'])){
+                                                            if ((!empty($_SESSION['LANGUAGE'])) && ( $value == $_POST['v_language'])){
                                                                 echo ' selected' ;
                                                             }
                                                             echo ">".$value."</option>\n";
                                                         }
                                                     ?>
                                                 </select>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                        <td class="vst-text input-label">
+                                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_language_update"><?php print __('update');?> <?php print __('Users');?> <?php print __('Default Language');?></label>
                                                 <br><br>
                                             </td>
                                         </tr>
@@ -246,8 +246,6 @@
                                     </table>
                                 </td>
                             </tr>
-
-
                             <tr>
                                 <td class="vst-text input-label step-top advanced-options">
                                     <a href="javascript:elementHideShow('dns');" class="vst-text">

+ 1 - 1
web/templates/admin/edit_server_nginx.html

@@ -166,7 +166,7 @@
 
                             <tr>
                                 <td class="vst-text input-label">
-                                    <a href="javascript:toggleOptions();" class="vst-advanced"><?php print __('Advanced options');?></a>
+                                    <a href="javascript:toggleOptions();" class="vst-advanced"><?php print __('Advanced options');?>&nbsp;<i class="fas fa-arrow-circle-right"></i></a>
                                 </td>
                             </tr>
                         </table>

+ 20 - 20
web/templates/admin/edit_user.html

@@ -82,6 +82,26 @@
                                     <?php } ?>
                                 </td>
                             </tr>
+                            <tr>
+                                <td class="vst-text input-label">
+                                    <?php print __('First Name');?>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>
+                                    <input type="text" size="20" class="vst-input" name="v_fname" value="<?=htmlentities(trim($v_fname, "'"))?>">
+                                </td>
+                            </tr>
+                            <tr>
+                                <td class="vst-text input-label">
+                                    <?php print __('Last Name');?>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td>
+                                    <input type="text" size="20" class="vst-input" name="v_lname" value="<?=htmlentities(trim($v_lname, "'"))?>">
+                                </td>
+                            </tr>
                             <tr>
                                 <td class="vst-text input-label">
                                     <?php print __('Email');?>
@@ -137,26 +157,6 @@
                                     </select>
                                 </td>
                             </tr>
-                            <tr>
-                                <td class="vst-text input-label">
-                                    <?php print __('First Name');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" size="20" class="vst-input" name="v_fname" value="<?=htmlentities(trim($v_fname, "'"))?>">
-                                </td>
-                            </tr>
-                            <tr>
-                                <td class="vst-text input-label">
-                                    <?php print __('Last Name');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" size="20" class="vst-input" name="v_lname" value="<?=htmlentities(trim($v_lname, "'"))?>">
-                                </td>
-                            </tr>
                             <tr>
                                 <td class="vst-text input-label">
                                     <?php print __('SSH Access');?>

+ 1 - 1
web/templates/admin/list_backup.html

@@ -35,7 +35,7 @@
 
     <div class="l-center units animated fadeIn">
         <div class="header table-header">
-            <div class="l-unit__col l-unit__col--right step-top">
+            <div class="l-unit__col l-unit__col--right">
               <div>
                   <div class="clearfix l-unit__stat-col--left super-compact">
                       <input id="toggle-all" type="checkbox" name="toggle-all" value="toggle-all" onChange="checkedAll('objects');">

Некоторые файлы не были показаны из-за большого количества измененных файлов