Browse Source

Merge pull request #540 from hestiacp/master

Push master to demo mode branch.
Raphael Schneeberger 6 years ago
parent
commit
d3c67ca0c6
100 changed files with 789 additions and 496 deletions
  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
 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
 Code Contributions & Pull Requests - Guidelines
 -----------------------
 -----------------------
 
 
 **All pull requests must include:**
 **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.
 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."
    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.
 3. Only commits which are related to the pull request or issue itself.
 
 
 ### Code formatting and comments:
 ### 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:
 ### 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:
 ### 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.
 * **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.
 * **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:
 ### 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.**
 **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:
 You can find this information in $HESTIA/conf/hestia.conf by running the following command:
 `grep VERSION $HESTIA/conf/hestia.conf`
 `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?
 ### 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?
 ### Which of the following web server configurations are you using?
 - Apache + Nginx (default)
 - Apache + Nginx (default)

+ 13 - 4
README.md

@@ -1,8 +1,17 @@
 [Hestia Control Panel](https://www.hestiacp.com/)
 [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?
 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.
 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.**
 **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'
     update_object_value 'mail' 'DOMAIN' "$root_domain" '$LETSENCRYPT' 'yes'
 fi
 fi
 
 
+# Remove challenge folder if exist
+if [ ! -z "$well_known" ]; then
+    rm -fr $well_known
+fi
+
 #----------------------------------------------------------#
 #----------------------------------------------------------#
 #                        Hestia                            #
 #                        Hestia                            #
 #----------------------------------------------------------#
 #----------------------------------------------------------#

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

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

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

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

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

@@ -14,9 +14,11 @@ user=$1
 domain=$2
 domain=$2
 domain_idn=$2
 domain_idn=$2
 id=$3
 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
 # Includes
 source $HESTIA/func/main.sh
 source $HESTIA/func/main.sh
@@ -33,8 +35,8 @@ format_domain_idn
 #                    Verifications                         #
 #                    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_system_enabled "$DNS_SYSTEM" 'DNS_SYSTEM'
 is_object_valid 'user' 'USER' "$user"
 is_object_valid 'user' 'USER' "$user"
 is_object_unsuspended '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 \ )
 date=$(echo "$time_n_date" |cut -f 2 -d \ )
 
 
 # Adding record
 # 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'"
 dns_rec="$dns_rec VALUE='$dvalue' SUSPENDED='no' TIME='$time' DATE='$date'"
 echo "$dns_rec" >> $USER_DATA/dns/$domain.conf
 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
 # Restarting mail server
 $BIN/v-restart-mail $restart
 $BIN/v-restart-mail $restart
-$BIN/v-restart-service $IMAP_SYSTEM $restart
 
 
 check_result $? "Mail restart failed" >/dev/null
 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
 # Restarting web server
 if [ "$restart" != 'no' ]; then
 if [ "$restart" != 'no' ]; then
     kill -HUP $(cat /var/run/hestia-nginx.pid)
     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
 fi
 
 
 # Logging
 # Logging

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

@@ -18,6 +18,11 @@ source $HESTIA/conf/hestia.conf
 #                       Action                             #
 #                       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
 # Theme argument and file detection
 if [ -z "$theme" ]; then
 if [ -z "$theme" ]; then
     echo "ERROR: No theme specified."
     echo "ERROR: No theme specified."

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

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

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

@@ -82,7 +82,7 @@ fi
 $BIN/v-restart-web $restart
 $BIN/v-restart-web $restart
 check_result $? "Web restart failed" >/dev/null
 check_result $? "Web restart failed" >/dev/null
 
 
-if [ -z "$mail"]; then
+if [ -z "$mail" ]; then
     # Restarting proxy
     # Restarting proxy
     if [ ! -z "$PROXY_SYSTEM" ]; then
     if [ ! -z "$PROXY_SYSTEM" ]; then
         $BIN/v-restart-web $restart >/dev/null
         $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_valid 'mail' 'DOMAIN' "$domain"
 is_object_unsuspended 'mail' 'DOMAIN' "$domain"
 is_object_unsuspended 'mail' 'DOMAIN' "$domain"
 is_object_value_exist 'mail' 'DOMAIN' "$domain" '$SSL'
 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
 # Updating config
 update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' 'no'
 update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' 'no'
+update_object_value 'mail' 'DOMAIN' "$domain" '$LETSENCRYPT' 'no'
 decrease_user_value "$user" '$U_MAIL_SSL'
 decrease_user_value "$user" '$U_MAIL_SSL'
 
 
 # Restarting mail server
 # Restarting mail server
 $BIN/v-restart-mail $restart
 $BIN/v-restart-mail $restart
-service dovecot restart
-service exim4 restart
 check_result $? "Mail restart failed" >/dev/null
 check_result $? "Mail restart failed" >/dev/null
 
 
 # Logging
 # Logging

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

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

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

@@ -15,6 +15,10 @@ format=${1-shell}
 # Includes
 # Includes
 source $HESTIA/func/main.sh
 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 function
 json_list() {
 json_list() {
     echo '{'
     echo '{'
@@ -23,6 +27,8 @@ json_list() {
         "OS": "'$OS'",
         "OS": "'$OS'",
         "VERSION": "'$VERSION'",
         "VERSION": "'$VERSION'",
         "ARCH": "'$ARCH'",
         "ARCH": "'$ARCH'",
+        "HESTIA": "'$HESTIA_VERSION'",
+        "RELEASE": "'$HESTIA_RELEASE'",
         "UPTIME": "'$UPTIME'",
         "UPTIME": "'$UPTIME'",
         "LOADAVERAGE": "'$LOADAVERAGE'"
         "LOADAVERAGE": "'$LOADAVERAGE'"
         }'
         }'
@@ -31,20 +37,20 @@ json_list() {
 
 
 # SHELL list function
 # SHELL list function
 shell_list() {
 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 function
 plain_list() {
 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 function
 csv_list() {
 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'"
     data="$data CPU='$cpu' MEM='$mem' RTIME='$rtime'"
 fi
 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
 # Checking FIREWALL system
 if [ ! -z "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
 if [ ! -z "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
     state="stopped"
     state="stopped"
@@ -274,6 +281,7 @@ if [ ! -z "$FIREWALL_SYSTEM" ] && [ "$FIREWALL_SYSTEM" != 'remote' ]; then
     data="$data STATE='$state' CPU='0' MEM='0' RTIME='$rtime'"
     data="$data STATE='$state' CPU='0' MEM='0' RTIME='$rtime'"
 fi
 fi
 
 
+
 # Checking FIREWALL Fail2ban extention
 # Checking FIREWALL Fail2ban extention
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
     get_srv_state $FIREWALL_EXTENSION fail2ban-server script
     get_srv_state $FIREWALL_EXTENSION fail2ban-server script

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

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

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

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

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

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

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

@@ -28,7 +28,7 @@ fi
 if [ ! -z "$src_file" ]; then
 if [ ! -z "$src_file" ]; then
     rpath=$(readlink -f "$src_file")
     rpath=$(readlink -f "$src_file")
     services="nginx|apache|httpd|php|ftp|bind|named|exim|dovecot|spamassassin"
     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"
     services="$services|my.cnf"
     spath=$(echo "$rpath" |egrep "$services")
     spath=$(echo "$rpath" |egrep "$services")
     if [ -z "$spath" ]; then
     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/func/rebuild.sh
 source $HESTIA/conf/hestia.conf
 source $HESTIA/conf/hestia.conf
 
 
+# Define mail user
+if [ "$MAIL_SYSTEM" = 'exim4' ]; then
+    MAIL_USER=Debian-exim
+else
+    MAIL_USER=exim
+fi
 
 
 #----------------------------------------------------------#
 #----------------------------------------------------------#
 #                    Verifications                         #
 #                    Verifications                         #

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

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

+ 3 - 6
bin/v-restart-cron

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -58,7 +55,7 @@ fi
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 
 

+ 3 - 6
bin/v-restart-dns

@@ -41,11 +41,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -63,7 +60,7 @@ fi
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 
 

+ 3 - 6
bin/v-restart-ftp

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -58,7 +55,7 @@ fi
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 
 

+ 3 - 6
bin/v-restart-mail

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -67,7 +64,7 @@ fi
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 
 

+ 3 - 6
bin/v-restart-proxy

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -73,7 +70,7 @@ if [ -f "$HESTIA/web/inc/nginx_proxy" ]; then
 
 
     # Update restart queue
     # Update restart queue
     if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
     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
 fi
 fi
 
 

+ 19 - 7
bin/v-restart-service

@@ -28,17 +28,29 @@ check_args '1' "$#" 'SERVICE'
 #                       Action                             #
 #                       Action                             #
 #----------------------------------------------------------#
 #----------------------------------------------------------#
 
 
-# Run the restart rules for iptables firewall
 if [ "$service" = "iptables" ]; then
 if [ "$service" = "iptables" ]; then
+    # Run the restart rules for iptables firewall
     $BIN/v-stop-firewall
     $BIN/v-stop-firewall
     $BIN/v-update-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
 else
+    systemctl reset-failed $service > /dev/null 2>&1
     systemctl restart $service > /dev/null 2>&1
     systemctl restart $service > /dev/null 2>&1
 fi
 fi
 
 

+ 0 - 1
bin/v-restart-system

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

+ 3 - 6
bin/v-restart-web

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -58,7 +55,7 @@ if [ $? -ne 0 ]; then
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 #----------------------------------------------------------#
 #----------------------------------------------------------#

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

@@ -36,11 +36,8 @@ if [ "$1" = "no" ]; then
 fi
 fi
 
 
 # Schedule restart
 # 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
     echo "$BIN/$SCRIPT now" >> $HESTIA/data/queue/restart.pipe
     exit
     exit
 fi
 fi
@@ -66,7 +63,7 @@ fi
 
 
 # Update restart queue
 # Update restart queue
 if [ -e "$HESTIA/data/queue/restart.pipe" ]; then
 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
 
 
 
 

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

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

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

@@ -90,6 +90,7 @@ if [ ! -z "$1" ]; then
         exit 1
         exit 1
     else
     else
         branch=$1
         branch=$1
+        /usr/local/hestia/bin/v-change-sys-config-value 'RELEASE_BRANCH' "$branch"
     fi
     fi
 else
 else
     source /usr/local/hestia/conf/hestia.conf
     source /usr/local/hestia/conf/hestia.conf
@@ -348,7 +349,7 @@ if [ "$HESTIA_B" = true ] ; then
 
 
     # Move needed directories
     # Move needed directories
     cd $BUILD_DIR/hestiacp-$branch
     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
     # Set permission
     cd ../hestia_$HESTIA_V/usr/local/hestia/bin
     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
     ln -s $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.key /usr/local/hestia/ssl/mail/mail.$domain.key
 
 
     # Set correct permissions on certificates
     # 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/*
     chmod 0644 $HOMEDIR/$user/conf/mail/$domain/ssl/*
     chown -h $user:mail $HOMEDIR/$user/conf/mail/$domain/ssl/*
     chown -h $user:mail $HOMEDIR/$user/conf/mail/$domain/ssl/*
     chmod -R 0644 /usr/local/hestia/ssl/mail/*
     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_pem="$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.pem"
     ssl_ca="$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.ca"
     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 | \
     cat $MAILTPL/$1/$2 | \
         sed -e "s|%ip%|$local_ip|g" \
         sed -e "s|%ip%|$local_ip|g" \
             -e "s|%domain%|$WEBMAIL_ALIAS.$domain|g" \
             -e "s|%domain%|$WEBMAIL_ALIAS.$domain|g" \
             -e "s|%domain_idn%|$domain_idn|g" \
             -e "s|%domain_idn%|$domain_idn|g" \
             -e "s|%root_domain%|$domain|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_idn%|${aliases_idn//,/ }|g" \
             -e "s|%alias_string%|$alias_string|g" \
             -e "s|%alias_string%|$alias_string|g" \
             -e "s|%email%|info@$domain|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
 RRD=$HESTIA/web/rrd
 SENDMAIL="$HESTIA/web/inc/mail-wrapper.php"
 SENDMAIL="$HESTIA/web/inc/mail-wrapper.php"
 HESTIA_GIT_REPO="https://raw.githubusercontent.com/hestiacp/hestiacp"
 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"
 HESTIA_THEMES_CUSTOM="$HESTIA/data/templates/themes"
+SCRIPT="$(basename $0)"
 
 
 # Return codes
 # Return codes
 OK=0
 OK=0

+ 15 - 11
func/upgrade.sh

@@ -33,7 +33,7 @@ upgrade_welcome_message() {
 
 
 upgrade_complete_message() {
 upgrade_complete_message() {
     # Add notification to panel
     # 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 message to console output
     echo
     echo
@@ -78,8 +78,7 @@ upgrade_start_routine() {
     release_branch_check=$(cat $HESTIA/conf/hestia.conf | grep RELEASE_BRANCH)
     release_branch_check=$(cat $HESTIA/conf/hestia.conf | grep RELEASE_BRANCH)
     if [ -z "$release_branch_check" ]; then
     if [ -z "$release_branch_check" ]; then
         echo "(*) Adding global release branch variable to system configuration..."
         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
     fi
 
 
     #####################################################################
     #####################################################################
@@ -121,12 +120,19 @@ upgrade_start_routine() {
     # Upgrade to Version 1.0.3
     # Upgrade to Version 1.0.3
     if [ $VERSION = "1.0.2" ]; then
     if [ $VERSION = "1.0.2" ]; then
         source $HESTIA/install/upgrade/versions/previous/1.0.3.sh
         source $HESTIA/install/upgrade/versions/previous/1.0.3.sh
-        VERSION="$new_version"
+        VERSION="1.0.3"
         upgrade_refresh_config
         upgrade_refresh_config
     fi
     fi
 
 
-    # Upgrade to Version 1.1.0
+    # Upgrade to Version 1.0.4
     if [ $VERSION = "1.0.3" ]; then
     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
         source $HESTIA/install/upgrade/versions/latest.sh
         VERSION="$new_version"
         VERSION="$new_version"
         upgrade_refresh_config
         upgrade_refresh_config
@@ -195,25 +201,23 @@ upgrade_rebuild_users() {
     for user in `ls /usr/local/hestia/data/users/`; do
     for user in `ls /usr/local/hestia/data/users/`; do
         echo "(*) Rebuilding domains and account for user: $user..."
         echo "(*) Rebuilding domains and account for user: $user..."
         if [ ! -z "$WEB_SYSTEM" ]; then
         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
         fi
         if [ ! -z "$DNS_SYSTEM" ]; then
         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
         fi
         if [ ! -z "$MAIL_SYSTEM" ]; then 
         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
         fi
     done
     done
 }
 }
 
 
 upgrade_restart_services() {
 upgrade_restart_services() {
     echo "(*) Restarting services..."
     echo "(*) Restarting services..."
+    sleep 5
     if [ ! -z "$MAIL_SYSTEM" ]; then
     if [ ! -z "$MAIL_SYSTEM" ]; then
         $BIN/v-restart-mail $restart
         $BIN/v-restart-mail $restart
     fi
     fi
-    if [ ! -z "$IMAP_SYSTEM" ]; then
-        $BIN/v-restart-service $IMAP_SYSTEM $restart
-    fi
     if [ ! -z "$WEB_SYSTEM" ]; then
     if [ ! -z "$WEB_SYSTEM" ]; then
         $BIN/v-restart-web $restart
         $BIN/v-restart-web $restart
         $BIN/v-restart-proxy $restart
         $BIN/v-restart-proxy $restart

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

@@ -30,7 +30,6 @@ Debug false
 ScanPE true
 ScanPE true
 ScanOLE2 true
 ScanOLE2 true
 ScanHTML true
 ScanHTML true
-DetectBrokenExecutables false
 ExitOnOOM false
 ExitOnOOM false
 LeaveTemporaryFiles false
 LeaveTemporaryFiles false
 AlgorithmicDetection true
 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)
 arch=$(uname -i)
 spinner="/-\|"
 spinner="/-\|"
 os='debian'
 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 \))"
 codename="$(cat /etc/os-release |grep VERSION= |cut -f 2 -d \(|cut -f 1 -d \))"
 HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 
 
@@ -39,7 +39,7 @@ if [ "$release" -eq 8 ]; then
         e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
         e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         unrar-free vim-common acl sysstat"
         unrar-free vim-common acl sysstat"
-else
+elif [ "$release" -eq 9 ]; then
     software="nginx apache2 apache2-utils apache2-suexec-custom
     software="nginx apache2 apache2-utils apache2-suexec-custom
         libapache2-mod-ruid2 libapache2-mod-fcgid libapache2-mod-php php
         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
         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
         e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban dnsutils
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         bsdmainutils cron hestia hestia-nginx hestia-php expect libmail-dkim-perl
         unrar-free vim-common acl sysstat rsyslog"
         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
 fi
 
 
 # Defining help function
 # 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
     echo "deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
 fi
 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
 # Installing hestia repo
 echo "(*) Hestia Control Panel"
 echo "(*) Hestia Control Panel"
 if [ -e $apt/hestia.list ]; then
 if [ -e $apt/hestia.list ]; then
@@ -622,6 +629,7 @@ echo
 
 
 # Updating system
 # Updating system
 echo -ne "Updating currently installed packages, please wait... "
 echo -ne "Updating currently installed packages, please wait... "
+apt-get -qq update
 apt-get -y upgrade >> $LOG &
 apt-get -y upgrade >> $LOG &
 BACK_PID=$!
 BACK_PID=$!
 
 
@@ -864,9 +872,6 @@ fi
 #                     Install packages                     #
 #                     Install packages                     #
 #----------------------------------------------------------#
 #----------------------------------------------------------#
 
 
-# Updating system
-apt-get -qq update
-
 # Disabling daemon autostart on apt-get install
 # Disabling daemon autostart on apt-get install
 echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 chmod a+x /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
 ntpdate -s pool.ntp.org
 
 
 # Setup rssh
 # 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
 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/html
 mkdir -p /var/www/document_errors
 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
 # Install default success page
 cp -rf $HESTIA_INSTALL_DIR/templates/web/unassigned/index.html /var/www/html/
 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/
 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/*
             rm -f /etc/php/$v/fpm/pool.d/*
             v_tpl=$(echo "$v" | sed -e 's/[.]//')
             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/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
         done
         chmod a+x $HESTIA/data/templates/web/apache2/*.sh
         chmod a+x $HESTIA/data/templates/web/apache2/*.sh
         if [ "$release" = '8' ]; then
         if [ "$release" = '8' ]; then
@@ -1416,7 +1421,7 @@ if [ "$postgresql" = 'yes' ]; then
     ppass=$(gen_pass)
     ppass=$(gen_pass)
     cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
     cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
     systemctl restart postgresql
     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
     # Configuring phpPgAdmin
     if [ "$apache" = 'yes' ]; then
     if [ "$apache" = 'yes' ]; then
@@ -1783,6 +1788,11 @@ $HESTIA/bin/v-add-web-domain admin $servername
 check_result $? "can't create $servername domain"
 check_result $? "can't create $servername domain"
 
 
 # Adding cron jobs
 # 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"
 command="sudo $HESTIA/bin/v-update-sys-queue disk"
 $HESTIA/bin/v-add-cron-job 'admin' '15' '02' '*' '*' '*' "$command"
 $HESTIA/bin/v-add-cron-job 'admin' '15' '02' '*' '*' '*' "$command"
 command="sudo $HESTIA/bin/v-update-sys-queue traffic"
 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
 # Enable automatic updates
 $HESTIA/bin/v-add-cron-hestia-autoupdate
 $HESTIA/bin/v-add-cron-hestia-autoupdate
-systemctl restart cron
 
 
 # Building initital rrd images
 # Building initital rrd images
 $HESTIA/bin/v-update-sys-rrd
 $HESTIA/bin/v-update-sys-rrd
@@ -1814,7 +1823,7 @@ fi
 $HESTIA/bin/v-change-sys-port $port
 $HESTIA/bin/v-change-sys-port $port
 
 
 # Set default theme
 # Set default theme
-$HESTIA/bin/v-change-sys-theme default
+$HESTIA/bin/v-change-sys-theme 'default'
 
 
 # Starting Hestia service
 # Starting Hestia service
 update-rc.d hestia defaults
 update-rc.d hestia defaults

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

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

+ 3 - 3
install/hst-install.sh

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

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

@@ -9,7 +9,7 @@
 # Set default theme
 # Set default theme
 if [ -z $THEME ]; then
 if [ -z $THEME ]; then
     echo "(*) Enabling support for themes..."
     echo "(*) Enabling support for themes..."
-    $BIN/v-change-sys-theme default
+    $BIN/v-change-sys-theme 'default'
 fi
 fi
 
 
 # Reduce SSH login grace time
 # Reduce SSH login grace time
@@ -21,7 +21,7 @@ fi
 
 
 # Implement recidive jail for fail2ban
 # Implement recidive jail for fail2ban
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
 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
         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
 fi
 fi
@@ -34,4 +34,24 @@ if [ ! -z "$IMAP_SYSTEM" ]; then
         cp -f /etc/nginx/conf.d/webmail.inc $HESTIA_BACKUP/conf/
         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
         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 
+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.                   #######
 #######                      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
 # Replace dhparam 1024 with dhparam 4096
 echo "(*) Increasing Diffie-Hellman Parameter strength to 4096-bit..."
 echo "(*) Increasing Diffie-Hellman Parameter strength to 4096-bit..."
 if [ -e /etc/ssl/dhparam.pem ]; then
 if [ -e /etc/ssl/dhparam.pem ]; then
@@ -59,7 +51,7 @@ if [ ! -z "$WEBALIZER_CHECK" ]; then
     if [ -d "/var/www/webalizer" ]; then
     if [ -d "/var/www/webalizer" ]; then
         rm -rf /var/www/webalizer
         rm -rf /var/www/webalizer
     fi
     fi
-    $HESTIA/bin/v-change-sys-config-value '$STATS_SYSTEM' 'awstats'
+    $HESTIA/bin/v-change-sys-config-value 'STATS_SYSTEM' 'awstats'
 fi
 fi
 
 
 # Remove old hestia.conf files from Apache & NGINX if they exist
 # 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
     # Move needed directories
     cd $BUILD_DIR/hestiacp-$branch
     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
     # Set permission
     cd ../hestia_$HESTIA_V/usr/local/hestia/bin
     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') {
 if ($_SESSION['user'] == 'admin') {
     exec (HESTIA_CMD."v-add-cron-hestia-autoupdate", $output, $return_var);
     exec (HESTIA_CMD."v-add-cron-hestia-autoupdate", $output, $return_var);
-    $_SESSION['error_msg'] = __('Autoupdate has been successfully enabled');
     unset($output);
     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);
 exec (HESTIA_CMD."v-add-cron-reports ".$user, $output, $return_var);
-$_SESSION['error_msg'] = __('Cronjob email reporting has been successfully enabled');
 unset($output);
 unset($output);
 
 
 header("Location: /list/cron/");
 header("Location: /list/cron/");

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

@@ -6,6 +6,11 @@ $TAB = 'DNS';
 // Main include
 // Main include
 include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
 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
 // Check POST request for dns domain
 if (!empty($_POST['ok'])) {
 if (!empty($_POST['ok'])) {
 
 
@@ -33,7 +38,7 @@ if (!empty($_POST['ok'])) {
     $v_domain = preg_replace("/^www./i", "", $_POST['v_domain']);
     $v_domain = preg_replace("/^www./i", "", $_POST['v_domain']);
     $v_domain = escapeshellarg($v_domain);
     $v_domain = escapeshellarg($v_domain);
     $v_domain = strtolower($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_ns1 = escapeshellarg($_POST['v_ns1']);
     $v_ns2 = escapeshellarg($_POST['v_ns2']);
     $v_ns2 = escapeshellarg($_POST['v_ns2']);
     $v_ns3 = escapeshellarg($_POST['v_ns3']);
     $v_ns3 = escapeshellarg($_POST['v_ns3']);
@@ -45,7 +50,7 @@ if (!empty($_POST['ok'])) {
 
 
     // Add dns domain
     // Add dns domain
     if (empty($_SESSION['error_msg'])) {
     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);
         check_return_code($return_var,$output);
         unset($output);
         unset($output);
     }
     }
@@ -146,6 +151,10 @@ $v_ns6 = str_replace("'", "", $v_ns6);
 $v_ns7 = str_replace("'", "", $v_ns7);
 $v_ns7 = str_replace("'", "", $v_ns7);
 $v_ns8 = str_replace("'", "", $v_ns8);
 $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'])) {
 if (empty($_GET['domain'])) {
     // Display body for dns domain
     // Display body for dns domain

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

@@ -53,9 +53,9 @@
 
 
 /* Component containers
 /* 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 .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 { border: 1px solid #aaaaaa; color: #ccc; }
 .ui-widget-content a { color: #222222; }
 .ui-widget-content a { color: #222222; }
 .ui-widget-header { color: #444; font-size: 10pt; font-weight: bold;}
 .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
  * 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-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 { 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 span { display: block; margin: 1px; }
 .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
 .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-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-style: normal;
   font-weight: 300;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-style: italic;
   font-weight: 300;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-style: normal;
   font-weight: 400;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-style: italic;
   font-weight: 400;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-style: normal;
   font-weight: 500;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-style: italic;
   font-weight: 500;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-style: normal;
   font-weight: 600;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-style: italic;
   font-weight: 600;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: normal;
   font-style: normal;
   font-weight: 700;
   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-face {
-  font-family: 'Exo 2';
+  font-family: 'Exo';
   font-style: italic;
   font-style: italic;
   font-weight: 700;
   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 */
 /* inconsolata-bold - latin */
 @font-face {
 @font-face {
   font-family: 'Inconsolata';
   font-family: 'Inconsolata';
   src: local('Inconsolata Bold'), local('Inconsolata-Bold'),
   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-weight: bold;
   font-style: normal;
   font-style: normal;
 }
 }
@@ -318,8 +246,8 @@
 @font-face {
 @font-face {
   font-family: 'Inconsolata';
   font-family: 'Inconsolata';
   src: local('Inconsolata Regular'), local('Inconsolata-Regular'),
   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-weight: normal;
   font-style: normal;
   font-style: normal;
 }
 }
@@ -758,7 +686,7 @@ html {
 }
 }
 
 
 body {
 body {
-  font-family: 'Exo 2', Arial;
+  font-family: 'Exo', Arial;
   overflow-x: hidden;
   overflow-x: hidden;
   font-size: 0.9rem;
   font-size: 0.9rem;
   height: 100%;
   height: 100%;
@@ -889,8 +817,8 @@ a {
 .l-menu__item a {
 .l-menu__item a {
   color: #f7f7f7;
   color: #f7f7f7;
   position: relative;
   position: relative;
-  line-height: 38px;
-  padding: 12px 18px;
+  line-height: 39px;
+  padding: 11px 14px;
   border-left: 1px solid transparent;
   border-left: 1px solid transparent;
   border-right: 1px solid transparent; 
   border-right: 1px solid transparent; 
 }
 }
@@ -1011,7 +939,7 @@ a {
   background-color: rgba(255,255,255,0.95);
   background-color: rgba(255,255,255,0.95);
   box-shadow: 0 3px 30px 0 rgba(0, 0, 0, 0.5);
   box-shadow: 0 3px 30px 0 rgba(0, 0, 0, 0.5);
   list-style-type: none;
   list-style-type: none;
-  margin: 0 27px;
+  margin: 0 18px;
   max-height: 90%;
   max-height: 90%;
   overflow-y: auto;
   overflow-y: auto;
   padding-left: 0;
   padding-left: 0;
@@ -1028,29 +956,44 @@ a {
   border-top: none;
   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 {
 .notification-container .unseen {
   color: #6f6f6f;
   color: #6f6f6f;
 }
 }
 
 
 .notification-container li {
 .notification-container li {
   border-bottom: 1px solid #e9e4e4;
   border-bottom: 1px solid #e9e4e4;
-  padding: 20px;
+  padding: 1rem;
+}
+
+.notification-container  li:last-child {
+  border-bottom: none;
 }
 }
 
 
 .notification-container .mark-seen {
 .notification-container .mark-seen {
   background-color: #cc3366;
   background-color: #cc3366;
-  border: 2px solid #454545;
+  border: 1px solid #c41650;
   border-radius: 10px;
   border-radius: 10px;
   cursor: pointer;
   cursor: pointer;
   display: none;
   display: none;
   float: right;
   float: right;
   height: 7px;
   height: 7px;
   margin-right: -5px;
   margin-right: -5px;
-  margin-top: 10px;
+  margin-top: 9px;
   width: 7px;
   width: 7px;
 }
 }
 .notification-container .mark-seen:hover {
 .notification-container .mark-seen:hover {
-  background-color: #333;
+  background-color: #fff;
   border-color: #e83b75;
   border-color: #e83b75;
 }
 }
 .notification-container .mark-seen:active {
 .notification-container .mark-seen:active {
@@ -1104,9 +1047,10 @@ a {
 }
 }
 
 
 .notification-container .time {
 .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 {
 .l-stat__col-title {
   text-transform: uppercase;
   text-transform: uppercase;
   font-weight: 600;
   font-weight: 600;
-  color: #474747;
+  color: #5b5b5b;
   min-height: 21px;
   min-height: 21px;
 }
 }
+
 .l-stat__col--active .l-stat__col-title {
 .l-stat__col--active .l-stat__col-title {
   color: #cc3366;
   color: #cc3366;
-  font-size: 24px;
+  font-size: 22px;
   margin-top: -7px;
   margin-top: -7px;
   letter-spacing: -1px;
   letter-spacing: -1px;
-  margin-right: -8px;
+  margin-right: -4px;
 }
 }
 
 
 .l-stat__col .fas {
 .l-stat__col .fas {
@@ -1205,7 +1150,7 @@ a {
 .l-separator.selected,
 .l-separator.selected,
 .l-separator {
 .l-separator {
   height: 1px;
   height: 1px;
-  background-color: #ddd;
+  border-top: 1px solid #ddd;
 }
 }
 
 
 div.l-content > div.l-separator:nth-of-type(2) {
 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%;
   width: 100%;
   position: fixed;
   position: fixed;
   z-index: 110;
   z-index: 110;
+  border-top: none;
+  border-bottom: 1px solid #ddd;
 }
 }
 
 
 .l-sort {
 .l-sort {
@@ -1368,10 +1315,10 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #4b4b4b;
   color: #4b4b4b;
 }
 }
 .l-sort-toolbar .sort-by:active {
 .l-sort-toolbar .sort-by:active {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 }
 .l-sort-toolbar .sort-by:active b {
 .l-sort-toolbar .sort-by:active b {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 }
 
 
 .l-sort-toolbar .sort-by b {
 .l-sort-toolbar .sort-by b {
@@ -1384,7 +1331,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #4b4b4b;
   color: #4b4b4b;
 }
 }
 .l-sort-toolbar .toggle-all:active {
 .l-sort-toolbar .toggle-all:active {
-  color: #55c9c0;
+  color: #3b9de8;
 }
 }
 
 
 .l-sort-toolbar .l-select {
 .l-sort-toolbar .l-select {
@@ -1412,7 +1359,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 .l-sort-toolbar__filter-apply {
 .l-sort-toolbar__filter-apply {
   float: left;
   float: left;
   width: 32px;
   width: 32px;
-  height: 28px;
+  height: 30px;
   border: 1px solid #ddd;
   border: 1px solid #ddd;
   background-color: rgba(255,255,255,0.90);
   background-color: rgba(255,255,255,0.90);
   text-shadow: 0px 1px rgba(255,255,255,0.95);
   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;
   color: #cc3366;
 }
 }
 .l-sort-toolbar .vst:active {
 .l-sort-toolbar .vst:active {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 }
 .l-sort-toolbar .vst.selected {
 .l-sort-toolbar .vst.selected {
   color: #cc3366;
   color: #cc3366;
@@ -1530,7 +1477,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 .l-select select {
 .l-select select {
   border: 0;
   border: 0;
   background-color: transparent;
   background-color: transparent;
-  height: 26px;
+  height: 28px;
   min-width: 175px;
   min-width: 175px;
   padding-left: 10px;
   padding-left: 10px;
   background-image: url("/images/arrow.png");
   background-image: url("/images/arrow.png");
@@ -1568,7 +1515,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   color: #707070;
   color: #707070;
   padding: 0 0 0 14px;
   padding: 0 0 0 14px;
   overflow: hidden;
   overflow: hidden;
-  font-size: 0.8rem;
+  font-size: 0.85rem;
   border-radius: 0;
   border-radius: 0;
   border-left: 1px solid transparent;
   border-left: 1px solid transparent;
   border-right: 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-left: 1px solid #ddd !important;
   border-right: 1px solid #ddd !important;
   border-right: 1px solid #ddd !important;
   border-bottom: 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);
   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;
   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-left-radius: 0px;
   border-top-right-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;
   min-height: 28px;
   color: #707070;
   color: #707070;
   padding: 0 0 0 14px;
   padding: 0 0 0 14px;
@@ -1645,7 +1593,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
   display: block;
   display: block;
 }
 }
 .l-unit--blue {
 .l-unit--blue {
-  border-left: 2px solid #55c9c0;
+  border-left: 2px solid #3b9de8;
 }
 }
 
 
 .l-unit--suspended {
 .l-unit--suspended {
@@ -2419,7 +2367,7 @@ label:hover {
   border: 1px solid #cfcfcf;
   border: 1px solid #cfcfcf;
   border-radius: 4px;
   border-radius: 4px;
   color: #4e4e4e;
   color: #4e4e4e;
-  font-family: 'Exo 2', Arial, Arial, Helvetica, sans-serif;
+  font-family: 'Exo', Arial, Arial, Helvetica, sans-serif;
   font-size: 0.8rem;
   font-size: 0.8rem;
   height: 20px;
   height: 20px;
   margin: 2px 6px 0 0;
   margin: 2px 6px 0 0;
@@ -2432,7 +2380,7 @@ label:hover {
   border: 1px solid #909090;
   border: 1px solid #909090;
 }
 }
 .vst-input:focus {
 .vst-input:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   background-color: #D7F9FF;
   background-color: #D7F9FF;
   color: #333;
   color: #333;
 }
 }
@@ -2453,13 +2401,26 @@ label:hover {
 .vst-input.short {
 .vst-input.short {
   width: 200px;
   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 {
 .vst-list {
   background-color: #fff;
   background-color: #fff;
   border: 1px solid #ccc;
   border: 1px solid #ccc;
   border-radius: 4px;
   border-radius: 4px;
   color: #4e4e4e;
   color: #4e4e4e;
-  font-family: 'Exo 2', Arial, Helvetica,sans-serif;
+  font-family: 'Exo', Arial, Helvetica,sans-serif;
   font-size: 0.8rem;
   font-size: 0.8rem;
   font-weight: normal;
   font-weight: normal;
   height: 36px;
   height: 36px;
@@ -2478,6 +2439,10 @@ label:hover {
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
 }
 }
 
 
+select.vst-list:-moz-focusring {
+  color:transparent;
+}
+
 .vst-list.long-2 {
 .vst-list.long-2 {
   width: 486px;
   width: 486px;
   background-position: 465px;
   background-position: 465px;
@@ -2489,7 +2454,7 @@ label:hover {
   border: 1px solid #909090;
   border: 1px solid #909090;
 }
 }
 .vst-list:focus {
 .vst-list:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   color: #333;
   color: #333;
 }
 }
 
 
@@ -2531,6 +2496,7 @@ a.vst-text:active b{
   color: #30659d !important;
   color: #30659d !important;
   padding: 4px 0px 0px 18px;
   padding: 4px 0px 0px 18px;
   overflow: hidden;
   overflow: hidden;
+  height: 28px;
 }
 }
 
 
 .advanced-options a {
 .advanced-options a {
@@ -2551,7 +2517,7 @@ a.vst-text:active b{
   padding: 5px;
   padding: 5px;
   width: 560px;
   width: 560px;
   height: 60px;
   height: 60px;
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif;
+  font-family: 'Exo', Arial, Helvetica, sans-serif;
   padding: 7px 1px 3px 14px;
   padding: 7px 1px 3px 14px;
   font-weight: normal;
   font-weight: normal;
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
@@ -2560,7 +2526,7 @@ a.vst-text:active b{
   border: 1px solid #909090;
   border: 1px solid #909090;
 }
 }
 .vst-textinput:focus {
 .vst-textinput:focus {
-  border: 1px solid #55C9C0;
+  border: 1px solid #3b9de8;
   background-color: #D7F9FF;
   background-color: #D7F9FF;
   color: #333;
   color: #333;
 }
 }
@@ -2729,10 +2695,10 @@ td.hint {
   filter:chroma(color=#000);
   filter:chroma(color=#000);
   cursor: pointer;
   cursor: pointer;
   border-radius: 3px 3px 3px 3px !important;
   border-radius: 3px 3px 3px 3px !important;
-  font-size: 1.0em !important;
+  font-size: 1.05em !important;
   font-weight: 500 !important;
   font-weight: 500 !important;
   padding: 2px 16px 3px 20px !important;
   padding: 2px 16px 3px 20px !important;
-  width: 100px !important;
+  min-width: 100px !important;
   height: 28px !important;
   height: 28px !important;
   color: #30659d !important;
   color: #30659d !important;
   border: 1px solid #3b9de8 !important;
   border: 1px solid #3b9de8 !important;
@@ -2741,7 +2707,7 @@ td.hint {
   box-shadow: 0px 1px 4px rgba(0,0,0,0.2),
   box-shadow: 0px 1px 4px rgba(0,0,0,0.2),
               inset 0px 0px 1px #fff,
               inset 0px 0px 1px #fff,
               inset 0px 0px 3px rgba(255,255,255,0.5) !important;
               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 {
 .ui-button:hover, .button:hover, .ui-button.cancel:hover, .button.cancel:hover {
   color: #3b9de8 !important;
   color: #3b9de8 !important;
@@ -2914,7 +2880,7 @@ a.button.cancel {
 
 
 .mail-infoblock td {
 .mail-infoblock td {
   color: #505050;
   color: #505050;
-  font-size: 11.5px;
+  font-size: 0.75rem;
   height: 20px;
   height: 20px;
   font-weight: normal;
   font-weight: normal;
 }
 }
@@ -2952,7 +2918,7 @@ a.button.cancel {
 .login {
 .login {
   background-color: #fff;
   background-color: #fff;
   box-shadow: 0px 8px 30px rgba(49,98,153, 0.75);
   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;
   margin: 0;
   padding: 0;
   padding: 0;
   text-align: left;
   text-align: left;
@@ -3060,7 +3026,7 @@ div.l-content.collapsed .l-sort {
 
 
 .console-output {
 .console-output {
   font-family: "Inconsolata", "Lucida Console", Monaco, monospace;
   font-family: "Inconsolata", "Lucida Console", Monaco, monospace;
-  font-size: 0.7rem;
+  font-size: 0.8rem;
   color: #202020;
   color: #202020;
   letter-spacing: -0.01em;
   letter-spacing: -0.01em;
 }
 }
@@ -3119,7 +3085,7 @@ form#vstobjects.suspended {
 }
 }
 
 
 .l-sort__create-btn.edit:hover #tooltip {
 .l-sort__create-btn.edit:hover #tooltip {
-  background-color: #55C9C0;
+  background-color: #3b9de8;
 }
 }
 .l-sort__create-btn.edit:active #tooltip {
 .l-sort__create-btn.edit:active #tooltip {
   background-color: #3BF0E6 !important;
   background-color: #3BF0E6 !important;
@@ -3138,13 +3104,12 @@ form#vstobjects.suspended {
 .pill.usage{
 .pill.usage{
   margin-top: 8px;
   margin-top: 8px;
   font-size: 0.75rem;
   font-size: 0.75rem;
-  padding: 3px;
+  padding: 4px;
   padding-left: 8px;
   padding-left: 8px;
   padding-right: 8px;
   padding-right: 8px;
   margin-right: 10px;
   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);
   background-color: rgba(255,255,255,0.75);
   font-weight: 500;
   font-weight: 500;
   border: 1px solid rgba(255,255,255,0.9);
   border: 1px solid rgba(255,255,255,0.9);
@@ -3241,41 +3206,51 @@ form#vstobjects.suspended {
   font-size: 1rem;
   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;
   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;
   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;
   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;
   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;
   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;
   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;
   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;
   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;
   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;
   color: #326b9b;
 }
 }
 
 
@@ -3306,7 +3281,7 @@ form#vstobjects.suspended {
 .search-input {
 .search-input {
   background-color: #fff;
   background-color: #fff;
   border: 1px solid #ddd;
   border: 1px solid #ddd;
-  height: 24px;
+  height: 26px;
   line-height: 28px;
   line-height: 28px;
   padding-left: 7px;
   padding-left: 7px;
   float: left;
   float: left;
@@ -3408,7 +3383,7 @@ form#vstobjects.suspended {
   background-color: #000;
   background-color: #000;
 }
 }
 .shortcuts .close:active {
 .shortcuts .close:active {
-  background-color: #55c9c0;
+  background-color: #3b9de8;
 }
 }
 .shortcuts .close .fas {
 .shortcuts .close .fas {
   font-size: 1.3rem;
   font-size: 1.3rem;
@@ -3525,7 +3500,7 @@ form#vstobjects.suspended {
 }
 }
 
 
 .ui-dialog {
 .ui-dialog {
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif !important;
+  font-family: 'Exo', Arial, Helvetica, sans-serif !important;
   font-weight: 500 !important;
   font-weight: 500 !important;
   background-color: rgba(245,245,245,0.87) !important;
   background-color: rgba(245,245,245,0.87) !important;
   box-shadow: 0 8px 50px 0 rgba(0, 0, 0, 0.55) !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 {
 .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 {
 .ui-dialog-buttonpane {
@@ -3556,11 +3535,13 @@ form#vstobjects.suspended {
 .helper-container {
 .helper-container {
   float: right;
   float: right;
   margin-bottom: -450px;
   margin-bottom: -450px;
-  margin-top: 359px;
-  margin-right: 80px;
+  margin-top: 410px;
+  margin-right: 22px;
   padding-top: 3px;
   padding-top: 3px;
   width: 563px;
   width: 563px;
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
   box-shadow: 0px 1px 4px rgba(0,0,0,0.15);
+  border: 1px solid #cfcfcf;
+  border-radius: 4px;
 }
 }
 
 
 .context-helper {
 .context-helper {
@@ -3573,7 +3554,7 @@ form#vstobjects.suspended {
   float: right;
   float: right;
 }
 }
 .context-helper:hover {
 .context-helper:hover {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 }
 .context-helper:active {
 .context-helper:active {
   color: #cc3366;
   color: #cc3366;
@@ -3583,7 +3564,7 @@ form#vstobjects.suspended {
 .cron-helper-tabs {
 .cron-helper-tabs {
 /*  margin-top: 30px;*/
 /*  margin-top: 30px;*/
   border: none !important;
   border: none !important;
-  font-family: 'Exo 2', Arial, Helvetica, sans-serif !important;
+  font-family: 'Exo', Arial, Helvetica, sans-serif !important;
 }
 }
 
 
 .cron-helper-tabs a {
 .cron-helper-tabs a {
@@ -3599,15 +3580,12 @@ form#vstobjects.suspended {
   color: #cc3366;
   color: #cc3366;
 }
 }
 .cron-helper-tabs a:active {
 .cron-helper-tabs a:active {
-  color: #55C9C0;
+  color: #3b9de8;
 }
 }
 .cron-helper-tabs .ui-tabs-selected a {
 .cron-helper-tabs .ui-tabs-selected a {
   color: #cc3366;
   color: #cc3366;
 }
 }
 
 
-.cron-helper-tabs select {
-  font-size: 15px !important;
-}
 .cron-helper-tabs select.short {
 .cron-helper-tabs select.short {
   background-position: -388px -604px;
   background-position: -388px -604px;
   min-width: 30px;
   min-width: 30px;
@@ -3631,8 +3609,8 @@ form#vstobjects.suspended {
 
 
 .cron-helper-tabs .button {
 .cron-helper-tabs .button {
   width: auto;
   width: auto;
-  background-color: #55C9C0;
-  border: 1px solid #55C9C0;
+  background-color: #3b9de8;
+  border: 1px solid #3b9de8;
   text-transform: capitalize;
   text-transform: capitalize;
 }
 }
 .cron-helper-tabs .button:hover {
 .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') {
 if ($_SESSION['user'] == 'admin') {
     exec (HESTIA_CMD."v-delete-cron-hestia-autoupdate", $output, $return_var);
     exec (HESTIA_CMD."v-delete-cron-hestia-autoupdate", $output, $return_var);
-    $_SESSION['error_msg'] = __('Autoupdate has been successfully disabled');
     unset($output);
     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);
 exec (HESTIA_CMD."v-delete-cron-reports ".$user, $output, $return_var);
-$_SESSION['error_msg'] = __('Cronjob email reporting has been successfully disabled');
 unset($output);
 unset($output);
 
 
 header("Location: /list/cron/");
 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']);
     $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
 // List dns domain
 if ((!empty($_GET['domain'])) && (empty($_GET['record_id'])))  {
 if ((!empty($_GET['domain'])) && (empty($_GET['record_id'])))  {
     $v_domain = escapeshellarg($_GET['domain']);
     $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']);
     $v_record_id = escapeshellarg($_POST['v_record_id']);
 
 
     // Change dns record
     // 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_val = escapeshellarg($_POST['v_val']);
         $v_priority = escapeshellarg($_POST['v_priority']);
         $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);
         check_return_code($return_var,$output);
+        $v_rec = $_POST['v_rec'];
+        $v_type = $_POST['v_type'];
         $v_val = $_POST['v_val'];
         $v_val = $_POST['v_val'];
         unset($output);
         unset($output);
         $restart_dns = 'yes';
         $restart_dns = 'yes';
     }
     }
 
 
+
     // Change dns record id
     // Change dns record id
     if (($_GET['record_id'] != $_POST['v_record_id']) && (empty($_SESSION['error_msg']))) {
     if (($_GET['record_id'] != $_POST['v_record_id']) && (empty($_SESSION['error_msg']))) {
         $v_old_record_id = escapeshellarg($_GET['record_id']);
         $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
     // 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);
         exec (HESTIA_CMD."v-delete-letsencrypt-domain ".$user." ".escapeshellarg($v_domain)." ' ' 'yes'", $output, $return_var);
         check_return_code($return_var,$output);
         check_return_code($return_var,$output);
         unset($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
     // 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);
         exec (HESTIA_CMD."v-delete-letsencrypt-domain ".$user." ".escapeshellarg($v_domain)." ''", $output, $return_var);
         check_return_code($return_var,$output);
         check_return_code($return_var,$output);
         unset($output);
         unset($output);

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

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

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

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

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

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

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

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

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

@@ -756,5 +756,5 @@ $LANG['cz'] = array(
     'Email Credentials' => 'Email Credentials',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Vzhled',
     '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',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Udseende',
     'Theme' => 'Udseende',
+    'Operating System' => 'Operativsystem',
 );
 );

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

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

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

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

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

@@ -764,4 +764,7 @@ $LANG['en'] = array(
     '2FA Reset Code:' => 'Account Recovery Code:',
     '2FA Reset Code:' => 'Account Recovery Code:',
 
 
     'Theme' => 'Appearance',
     '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',
     'Email Credentials' => 'Datos de acceso a la cuenta de correo',
 
 
     'Theme' => 'Aspecto',
     '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 کاراکتر طول, شامل پیشوند',
     'maximum characters length, including prefix' => 'بیشینه %s کاراکتر طول, شامل پیشوند',
     'Email Credentials' => 'اعتبار پست الکترونیکی',
     'Email Credentials' => 'اعتبار پست الکترونیکی',
     'Theme' => 'ظاهر',
     'Theme' => 'ظاهر',
+    'Operating System' => 'سیستم عامل',
 );
 );

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

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

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

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

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

@@ -759,4 +759,6 @@ $LANG['hu'] = array(
     'Email Credentials' => 'Email Credentials',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Megjelenése',
     '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',
     'Email Credentials' => 'Kredensial surel',
 
 
     'Theme' => 'Penampilan',
     'Theme' => 'Penampilan',
+    'Operating System' => 'Sistem operasi',
 );
 );

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

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

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

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

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

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

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

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

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

@@ -755,4 +755,5 @@ $LANG['pt'] = array(
     'Email Credentials' => 'Email Credentials',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Aparência',
     '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',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Aspectul',
     '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',
     'Force SSL/HTTPS' => 'Принудительный редирект HTTP-на-HTTPS',
     
     
     'Theme' => 'Внешний вид',
     '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',
     'maximum characters length, including prefix' => 'maximum %s characters length, including prefix',
 
 
     'Email Credentials' => 'Email Credentials',
     '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',
     'Email Credentials' => 'Email lozinka i podešavanja',
 
 
     'Theme' => 'Izgled',
     'Theme' => 'Izgled',
+    'Operating System' => 'Operacijskog sustava',
     
     
 );
 );

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

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

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

@@ -756,5 +756,5 @@ $LANG['tr'] = array(
     'Email Credentials' => 'Email Credentials',
     'Email Credentials' => 'Email Credentials',
 
 
     'Theme' => 'Görünüm',
     '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:' => 'Код відновлення доступу до акаунту:',
     '2FA Reset Code:' => 'Код відновлення доступу до акаунту:',
 	'Force SSL/HTTPS' => 'Примусовий редирект HTTP-на-HTTPS',
 	'Force SSL/HTTPS' => 'Примусовий редирект HTTP-на-HTTPS',
     'Theme' => 'Зовнішній вигляд',
     'Theme' => 'Зовнішній вигляд',
+    'Operating System' => 'Операційна система',
     
     
 );
 );

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

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

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

@@ -757,4 +757,5 @@ $LANG['vi'] = array(
     'Email Credentials' => 'Chứng nhận email',
     'Email Credentials' => 'Chứng nhận email',
     
     
     'Theme' => 'Xuất hiện',
     '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_a.css({'min-height': 111 - st + 'px'});
         nav_context.css({'margin-top': 181 - st + 'px'});
         nav_context.css({'margin-top': 181 - st + 'px'});
         sep_2.css({'box-shadow':'none'});
         sep_2.css({'box-shadow':'none'});
-        sep_2.css({'background-color': '#ddd'});
         sep_2.css({'height': '1px'});
         sep_2.css({'height': '1px'});
     }
     }
 
 
@@ -1017,7 +1016,6 @@ hover_menu = function() {
         sep_1.css({'margin-top': '100px'});
         sep_1.css({'margin-top': '100px'});
         sep_2.css({'margin-top': '130px'});
         sep_2.css({'margin-top': '130px'});
         sep_2.css({'height': '15px'});
         sep_2.css({'height': '15px'});
-        sep_2.css({'background-color': '#fff'});
         nav_a.css({'height': '0'});
         nav_a.css({'height': '0'});
         nav_a.css({'min-height': '0'});
         nav_a.css({'min-height': '0'});
         nav_context.css({'margin-top': '101px'});
         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>\
                     '<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>\
                         <span class="title"><span class="unselectable icon ~!:TYPE~!">&nbsp;</span>~!:TOPIC~!</span>\
                         ~!:NOTICE~!\
                         ~!:NOTICE~!\
-                        <span class="time">~!:TIME~! ~!:DATE~!</span>\
+                        <b><span class="time">~!:TIME~! ~!:DATE~!</span></b>\
                     </li>'
                     </li>'
         ],
         ],
         notification_empty: [
         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>
                             <tr>
                             <tr>
                                 <td>
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td class="vst-text input-label">
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>

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

@@ -94,7 +94,16 @@
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td>
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>

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

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

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

@@ -68,7 +68,17 @@
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td>
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>

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

@@ -68,7 +68,7 @@
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td>
                                 <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)?>">
                                   <input type="hidden" name="v_record_id" value="<?=htmlentities($v_record_id)?>">
                                 </td>
                                 </td>
                             </tr>
                             </tr>
@@ -79,7 +79,22 @@
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td>
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>
@@ -89,7 +104,16 @@
                             </tr>
                             </tr>
                             <tr>
                             <tr>
                                 <td>
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                             <tr>
                             <tr>

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

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

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

@@ -166,7 +166,7 @@
 
 
                             <tr>
                             <tr>
                                 <td class="vst-text input-label">
                                 <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>
                                 </td>
                             </tr>
                             </tr>
                         </table>
                         </table>

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

@@ -82,6 +82,26 @@
                                     <?php } ?>
                                     <?php } ?>
                                 </td>
                                 </td>
                             </tr>
                             </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>
                             <tr>
                                 <td class="vst-text input-label">
                                 <td class="vst-text input-label">
                                     <?php print __('Email');?>
                                     <?php print __('Email');?>
@@ -137,26 +157,6 @@
                                     </select>
                                     </select>
                                 </td>
                                 </td>
                             </tr>
                             </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>
                             <tr>
                                 <td class="vst-text input-label">
                                 <td class="vst-text input-label">
                                     <?php print __('SSH Access');?>
                                     <?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="l-center units animated fadeIn">
         <div class="header table-header">
         <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>
                   <div class="clearfix l-unit__stat-col--left super-compact">
                   <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');">
                       <input id="toggle-all" type="checkbox" name="toggle-all" value="toggle-all" onChange="checkedAll('objects');">

Some files were not shown because too many files changed in this diff