diff --git a/README.md b/README.md
index d2229ad..53341c8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-## WebVirtCloud
+# WebVirtCloud
###### Python3 & Django 2.2
## Features
@@ -25,10 +25,21 @@ wget -O - https://clck.ru/9VMRH | sudo tee -a /usr/local/bin/gstfsd
sudo service supervisor restart
```
-### Description
+## Description
WebVirtCloud is a virtualization web interface for admins and users. It can delegate Virtual Machine's to users. A noVNC viewer presents a full graphical console to the guest domain. KVM is currently the only hypervisor supported.
+## Quick Install with Installer (Beta)
+Install an OS and run specified commands. Installer supported OSes: Ubuntu 18.04, Debian 10, Centos/OEL/RHEL 8.
+It can be installed on a virtual machine, physical host or on a KVM host.
+```bash
+wget https://raw.githubusercontent.com/retspen/webvirtcloud/master/install.sh
+chmod 744 install.sh
+# run with sudo or root user
+./install.sh
+```
+
+## Manual Installation
### Generate secret key
You should generate SECRET_KEY after cloning repo. Then put it into webvirtcloud/settings.py.
@@ -95,7 +106,7 @@ sudo sed -r "s/SECRET_KEY = ''/SECRET_KEY = '"`python3 /srv/webvirtcloud/conf/ru
```
#### Start installation webvirtcloud
-```
+```bash
virtualenv-3 venv
source venv/bin/activate
pip3 install -r conf/requirements.txt
@@ -306,7 +317,7 @@ Edit WS_PUBLIC_PORT at settings.py file to expose redirect to 80 or 443. Default
WS_PUBLIC_PORT = 80
```
-### How To Update
+## How To Update
```bash
# Go to Installation Directory
cd /srv/webvirtcloud
@@ -333,7 +344,7 @@ Run tests
python manage.py test
```
-### Screenshots
+## Screenshots
Instance Detail:
Instance List:
@@ -343,6 +354,6 @@ Other:
-### License
+## License
WebVirtCloud is licensed under the [Apache Licence, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..3a59b62
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,13 @@
+# ensure running as root
+if [ "$(id -u)" != "0" ]; then
+ #Debian doesnt have sudo if root has a password.
+ if ! hash sudo 2>/dev/null; then
+ exec su -c "$0" "$@"
+ else
+ exec sudo "$0" "$@"
+ fi
+fi
+
+wget https://raw.githubusercontent.com/retspen/webvirtcloud/master/webvirtcloud.sh
+chmod 744 webvirtcloud.sh
+./webvirtcloud.sh 2>&1 | tee -a /var/log/webvirtcloud-install.log
\ No newline at end of file
diff --git a/webvirtcloud.sh b/webvirtcloud.sh
new file mode 100644
index 0000000..4a1b79b
--- /dev/null
+++ b/webvirtcloud.sh
@@ -0,0 +1,494 @@
+#!/bin/bash
+#/ Usage: webvirtcloud.sh [-vh]
+#/
+#/ Install Webvirtcloud virtualization web interface.
+#/
+#/ OPTIONS:
+#/ -v | --verbose Enable verbose output.
+#/ -h | --help Show this message.
+
+########################################################
+# Webvirtcloud Install Script #
+# Script created by Mike Tucker(mtucker6784@gmail.com) #
+# adapted by catborise #
+# catborise@gmail.com #
+# #
+# Feel free to modify, but please give #
+# credit where it's due. Thanks! #
+########################################################
+
+# Parse arguments
+while true; do
+ case "$1" in
+ -h|--help)
+ show_help=true
+ shift
+ ;;
+ -v|--verbose)
+ set -x
+ verbose=true
+ shift
+ ;;
+ -*)
+ echo "Error: invalid argument: '$1'" 1>&2
+ exit 1
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+print_usage () {
+ grep '^#/' <"$0" | cut -c 4-
+ exit 1
+}
+
+if [ -n "$show_help" ]; then
+ print_usage
+else
+ for x in "$@"; do
+ if [ "$x" = "--help" ] || [ "$x" = "-h" ]; then
+ print_usage
+ fi
+ done
+fi
+
+# ensure running as root
+if [ "$(id -u)" != "0" ]; then
+ #Debian doesnt have sudo if root has a password.
+ if ! hash sudo 2>/dev/null; then
+ exec su -c "$0" "$@"
+ else
+ exec sudo "$0" "$@"
+ fi
+fi
+
+clear
+
+readonly APP_USER="wvcuser"
+readonly APP_REPO_URL="https://github.com/retspen/webvirtcloud.git"
+readonly APP_NAME="webvirtcloud"
+readonly APP_PATH="/srv/$APP_NAME"
+
+readonly PYTHON="python3"
+
+progress () {
+ spin[0]="-"
+ spin[1]="\\"
+ spin[2]="|"
+ spin[3]="/"
+
+ echo -n " "
+ while kill -0 "$pid" > /dev/null 2>&1; do
+ for i in "${spin[@]}"; do
+ echo -ne "\\b$i"
+ sleep .3
+ done
+ done
+ echo ""
+}
+
+log () {
+ if [ -n "$verbose" ]; then
+ eval "$@" |& tee -a /var/log/webvirtcloud-install.log
+ else
+ eval "$@" |& tee -a /var/log/webvirtcloud-install.log >/dev/null 2>&1
+ fi
+}
+
+install_packages () {
+ case $distro in
+ ubuntu|debian)
+ for p in $PACKAGES; do
+ if dpkg -s "$p" >/dev/null 2>&1; then
+ echo " * $p already installed"
+ else
+ echo " * Installing $p"
+ log "DEBIAN_FRONTEND=noninteractive apt-get install -y $p"
+ fi
+ done;
+ ;;
+ centos)
+ for p in $PACKAGES; do
+ if yum list installed "$p" >/dev/null 2>&1; then
+ echo " * $p already installed"
+ else
+ echo " * Installing $p"
+ log "yum -y install $p"
+ fi
+ done;
+ ;;
+ fedora)
+ for p in $PACKAGES; do
+ if dnf list installed "$p" >/dev/null 2>&1; then
+ echo " * $p already installed"
+ else
+ echo " * Installing $p"
+ log "dnf -y install $p"
+ fi
+ done;
+ ;;
+ esac
+}
+
+configure_nginx () {
+ # Remove default configuration
+ rm /etc/nginx/nginx.conf
+ if [ -f /etc/nginx/sites-enabled/default ]; then
+ rm /etc/nginx/sites-enabled/default
+ fi
+
+ chown -R $nginx_group:$nginx_group /var/lib/nginx
+ # Copy new configuration and webvirtcloud.conf
+ echo " * Copying Nginx configuration"
+ cp $APP_PATH/conf/nginx/"$distro"_nginx.conf /etc/nginx/nginx.conf
+ cp $APP_PATH/conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/
+
+ if ! [ -z "$fqdn" ]; then
+ sed -i "s|\\(#server_name\\).*|server_name = $fqdn|" "$nginxfile"
+ fi
+
+ sed -i "s|\\(server 127.0.0.1:\\).*|\\1$novncd_port;|" "$nginxfile"
+
+}
+
+configure_supervisor () {
+ # Copy template supervisor service for gunicorn and novnc
+ echo " * Copying supervisor configuration"
+ cp $APP_PATH/conf/supervisor/webvirtcloud.conf $supervisor_conf_path/$supervisor_file_name
+ sed -i "s|^\\(user=\\).*|\\1$nginx_group|" "$supervisor_conf_path/$supervisor_file_name"
+}
+
+create_user () {
+ echo "* Creating webvirtcloud user."
+
+ if [ "$distro" == "ubuntu" ] || [ "$distro" == "debian" ] ; then
+ adduser --quiet --disabled-password --gecos '""' "$APP_USER"
+ else
+ adduser "$APP_USER"
+ fi
+
+ usermod -a -G "$nginx_group" "$APP_USER"
+}
+
+run_as_app_user () {
+ if ! hash sudo 2>/dev/null; then
+ su -c "$@" $APP_USER
+ else
+ sudo -i -u $APP_USER "$@"
+ fi
+}
+
+activate_python_environment () {
+ cd $APP_PATH
+ virtualenv -p $PYTHON venv
+ source venv/bin/activate
+}
+
+generate_secret_key() {
+ $PYTHON - <> /etc/hosts "127.0.0.1 $(hostname) $fqdn"
+}
+
+restart_supervisor () {
+ echo "* Setting Supervisor to start on boot and restart."
+ log "systemctl enable $supervisor_service"
+ #systemctl enable $supervisor_service
+ log "systemctl restart $supervisor_service"
+ #systemctl restart $supervisor_service
+}
+
+restart_nginx () {
+ echo "* Setting Nginx to start on boot and starting Nginx."
+ log "systemctl enable nginx.service"
+ #systemctl enable nginx.service
+ log "systemctl restart nginx.service"
+ #systemctl restart nginx.service
+}
+
+
+if [[ -f /etc/lsb-release || -f /etc/debian_version ]]; then
+ distro="$(lsb_release -is)"
+ version="$(lsb_release -rs)"
+ codename="$(lsb_release -cs)"
+elif [ -f /etc/os-release ]; then
+ # shellcheck disable=SC1091
+ distro="$(source /etc/os-release && echo "$ID")"
+ # shellcheck disable=SC1091
+ version="$(source /etc/os-release && echo "$VERSION_ID")"
+ #Order is important here. If /etc/os-release and /etc/centos-release exist, we're on centos 7.
+ #If only /etc/centos-release exist, we're on centos6(or earlier). Centos-release is less parsable,
+ #so lets assume that it's version 6 (Plus, who would be doing a new install of anything on centos5 at this point..)
+ #/etc/os-release properly detects fedora
+elif [ -f /etc/centos-release ]; then
+ distro="centos"
+ version="8"
+else
+ distro="unsupported"
+fi
+
+
+echo '
+ WEBVIRTCLOUD
+'
+
+echo ""
+echo " Welcome to Webvirtcloud Installer for CentOS, Fedora, Debian and Ubuntu!"
+echo ""
+shopt -s nocasematch
+case $distro in
+ *ubuntu*)
+ echo " The installer has detected $distro version $version codename $codename."
+ distro=ubuntu
+ nginx_group=www-data
+ nginxfile=/etc/nginx/conf.d/$APP_NAME.conf
+ supervisor_service=supervisord
+ supervisor_conf_path=/etc/supervisor/conf.d
+ supervisor_file_name=webvirtcloud.conf
+ ;;
+ *debian*)
+ echo " The installer has detected $distro version $version codename $codename."
+ distro=debian
+ nginx_group=www-data
+ nginxfile=/etc/nginx/conf.d/$APP_NAME.conf
+ supervisor_service=supervisor
+ supervisor_conf_path=/etc/supervisor/conf.d
+ supervisor_file_name=webvirtcloud.conf
+ ;;
+ *centos*|*redhat*|*ol*|*rhel*)
+ echo " The installer has detected $distro version $version."
+ distro=centos
+ nginx_group=nginx
+ nginxfile=/etc/nginx/conf.d/$APP_NAME.conf
+ supervisor_service=supervisord
+ supervisor_conf_path=/etc/supervisord.d
+ supervisor_file_name=webvirtcloud.ini
+ ;;
+ *)
+ echo " The installer was unable to determine your OS. Exiting for safety."
+ exit 1
+ ;;
+esac
+
+setupfqdn=default
+until [[ $setupfqdn == "yes" ]] || [[ $setupfqdn == "no" ]]; do
+ echo -n " Q. Do you want to configure fqdn for Nginx? (y/n) "
+ read -r setupfqdn
+
+ case $setupfqdn in
+ [yY] | [yY][Ee][Ss] )
+ echo -n " Q. What is the FQDN of your server? ($(hostname --fqdn)): "
+ read -r fqdn
+ if [ -z "$fqdn" ]; then
+ readonly fqdn="$(hostname --fqdn)"
+ fi
+ setupfqdn="yes"
+ echo " Setting to $fqdn"
+ echo ""
+ ;;
+ [nN] | [n|N][O|o] )
+ setupfqdn="no"
+ ;;
+ *) echo " Invalid answer. Please type y or n"
+ ;;
+ esac
+done
+
+echo -n " Q. Do you want to change NOVNC service port number?(Default: 6080) "
+read -r novncd_port
+if [ -z "$novncd_port" ]; then
+ readonly novncd_port=6080
+fi
+echo " Setting novnc service port $novncd_port"
+echo ""
+
+echo -n " Q. Do you want to change NOVNC public port number for reverse proxy(e.g: 80 or 443)?(Default: 6080) "
+read -r novncd_public_port
+if [ -z "$novncd_public_port" ]; then
+ readonly novncd_public_port=6080
+fi
+echo " Setting novnc public port $novncd_public_port"
+echo ""
+
+echo -n " Q. Do you want to change NOVNC host listen ip?(Default: 0.0.0.0) "
+read -r novncd_host
+if [ -z "$novncd_host" ]; then
+ readonly novncd_host="0.0.0.0"
+fi
+echo " Setting novnc host ip $novncd_host"
+echo ""
+
+
+case $distro in
+ debian)
+ if [[ "$version" -ge 9 ]]; then
+ # Install for Debian 9.x / 10.x
+ tzone=\'$(cat /etc/timezone)\'
+
+ echo -n "* Updating installed packages."
+ log "apt-get update && apt-get -y upgrade" & pid=$!
+ progress
+
+ echo "* Installing OS requirements."
+ PACKAGES="git virtualenv python3-virtualenv python3-dev python3-lxml libvirt-dev zlib1g-dev libxslt1-dev nginx supervisor libsasl2-modules gcc pkg-config python3-guestfs uuid"
+ install_packages
+
+ set_hosts
+
+ install_webvirtcloud
+
+ echo "* Configuring Nginx."
+ configure_nginx
+
+ echo "* Configuring Supervisor."
+ configure_supervisor
+
+ restart_supervisor
+ restart_nginx
+ fi
+ ;;
+ ubuntu)
+ if [ "$version" -ge "18.04" ]; then
+ # Install for Ubuntu 18 / 20
+ tzone=\'$(cat /etc/timezone)\'
+
+ echo -n "* Updating installed packages."
+ log "apt-get update && apt-get -y upgrade" & pid=$!
+ progress
+
+ echo "* Installing OS requirements."
+ PACKAGES="git virtualenv python3-virtualenv python3-pip python3-dev python3-lxml libvirt-dev zlib1g-dev libxslt1-dev nginx supervisor libsasl2-modules gcc pkg-config python3-guestfs"
+ install_packages
+
+ set_hosts
+
+ install_webvirtcloud
+
+ echo "* Configuring Nginx."
+ configure_nginx
+
+ echo "* Configuring Supervisor."
+ configure_supervisor
+
+ restart_supervisor
+ restart_nginx
+
+ fi
+ ;;
+ centos)
+ if [[ "$version" =~ ^8 ]]; then
+ # Install for CentOS/Redhat 8
+ tzone=\'$(timedatectl|grep "Time zone"| awk '{print $3}')\'
+
+ echo "* Adding wget & epel-release repository."
+ log "yum -y install wget epel-release"
+
+ echo "* Installing OS requirements."
+ PACKAGES="git python3-virtualenv python3-devel libvirt-devel glibc gcc nginx supervisor python3-lxml python3-libguestfs iproute-tc cyrus-sasl-md5 python3-libguestfs"
+ install_packages
+
+ set_hosts
+
+ install_webvirtcloud
+
+ echo "* Configuring Nginx."
+ configure_nginx
+
+ echo "* Configuring Supervisor."
+ configure_supervisor
+
+ set_firewall
+
+ set_selinux
+
+ restart_supervisor
+ restart_nginx
+
+
+ else
+ echo "Unsupported CentOS version. Version found: $version"
+ exit 1
+ fi
+ ;;
+esac
+
+
+echo ""
+echo " ***Open http://$fqdn to login to webvirtcloud.***"
+echo ""
+echo ""
+echo "* Cleaning up..."
+rm -f webvirtcloud.sh
+rm -f install.sh
+echo "* Finished!"
+sleep 1