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