mirror of
https://github.com/Jarli01/xenorchestra_installer
synced 2026-07-28 17:31:21 +00:00
Compare commits
2 Commits
OS-Spec-De
...
f896d80241
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f896d80241 | ||
|
|
53a0132680 |
@@ -83,11 +83,4 @@ While the goal initially was to have a solution as close to XOA as possible, wit
|
||||
|
||||
To keep XOCE up to date I recommend that anyone who's used this installation script or the sources installation to use this: https://github.com/Jarli01/xenorchestra_updater
|
||||
|
||||
## Adding XOCE v6 to your installation (this is a Work In Progress by Vates)
|
||||
|
||||
cd /opt/xen-orchestra
|
||||
yarn run turbo run build --filter @xen-orchestra/web
|
||||
|
||||
Once the installation is completed, you can then go to [https://your-host-ip/v6](https://your-host-ip/v6)
|
||||
|
||||
|
||||
|
||||
15
ansible/xoa-role/defaults/main.yml
Normal file
15
ansible/xoa-role/defaults/main.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
# defaults file
|
||||
# The default username and password are applied, and admin for the password
|
||||
xoa_install_url: https://raw.githubusercontent.com/Jarli01/xenorchestra_installer/master/xo_install.sh
|
||||
xoa_install_script: xo_install.sh
|
||||
xoa_update_url: https://raw.githubusercontent.com/Jarli01/xenorchestra_updater/master/xo-update.sh
|
||||
xoa_update_script: xo_update.sh
|
||||
git_email: ""
|
||||
git_user: ""
|
||||
xoa_default_user: "admin@admin.net"
|
||||
xoa_default_password: "admin"
|
||||
xoa_user: xoa
|
||||
xoa_password: xoa
|
||||
xcpng_servers: [{"label": "localhost", "ip": "127.0.1"}]
|
||||
xcpng_user: root
|
||||
xcpng_password: xcpng
|
||||
22
ansible/xoa-role/handlers/main.yml
Normal file
22
ansible/xoa-role/handlers/main.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
- name: reload_systemd
|
||||
shell: systemctl daemon-reload
|
||||
args:
|
||||
warn: no
|
||||
|
||||
- name: cleaning_packages_metadata
|
||||
shell: yum clean all && rm -rf /var/cache/yum
|
||||
when: ansible_distribution == 'Red Hat Enterprise Linux' or ansible_distribution == 'XCP-ng'
|
||||
args:
|
||||
warn: no
|
||||
|
||||
- name: cleaning_packages_metadata
|
||||
shell: zypper clean && rm -rf /var/cache/zypp
|
||||
when: ansible_distribution == 'openSUSE Leap'
|
||||
args:
|
||||
warn: no
|
||||
|
||||
- name: cleaning_packages_metadata
|
||||
shell: apt clean
|
||||
when: ansible_distribution == 'Debian'
|
||||
args:
|
||||
warn: no
|
||||
57
ansible/xoa-role/meta/main.yml
Normal file
57
ansible/xoa-role/meta/main.yml
Normal file
@@ -0,0 +1,57 @@
|
||||
galaxy_info:
|
||||
author: your name
|
||||
description: your description
|
||||
company: your company (optional)
|
||||
|
||||
# If the issue tracker for your role is not on github, uncomment the
|
||||
# next line and provide a value
|
||||
# issue_tracker_url: http://example.com/issue/tracker
|
||||
|
||||
# Some suggested licenses:
|
||||
# - BSD (default)
|
||||
# - MIT
|
||||
# - GPLv2
|
||||
# - GPLv3
|
||||
# - Apache
|
||||
# - CC-BY
|
||||
license: license (GPLv2, CC-BY, etc)
|
||||
|
||||
min_ansible_version: 1.2
|
||||
|
||||
# If this a Container Enabled role, provide the minimum Ansible Container version.
|
||||
# min_ansible_container_version:
|
||||
|
||||
# Optionally specify the branch Galaxy will use when accessing the GitHub
|
||||
# repo for this role. During role install, if no tags are available,
|
||||
# Galaxy will use this branch. During import Galaxy will access files on
|
||||
# this branch. If Travis integration is configured, only notifications for this
|
||||
# branch will be accepted. Otherwise, in all cases, the repo's default branch
|
||||
# (usually master) will be used.
|
||||
#github_branch:
|
||||
|
||||
#
|
||||
# platforms is a list of platforms, and each platform has a name and a list of versions.
|
||||
#
|
||||
# platforms:
|
||||
# - name: Fedora
|
||||
# versions:
|
||||
# - all
|
||||
# - 25
|
||||
# - name: SomePlatform
|
||||
# versions:
|
||||
# - all
|
||||
# - 1.0
|
||||
# - 7
|
||||
# - 99.99
|
||||
|
||||
galaxy_tags: []
|
||||
# List tags for your role here, one per line. A tag is a keyword that describes
|
||||
# and categorizes the role. Users find roles by searching for tags. Be sure to
|
||||
# remove the '[]' above, if you add tags to this list.
|
||||
#
|
||||
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
|
||||
# Maximum 20 tags per role.
|
||||
|
||||
dependencies: []
|
||||
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
|
||||
# if you add dependencies to this list.
|
||||
250
ansible/xoa-role/tasks/main.yml
Normal file
250
ansible/xoa-role/tasks/main.yml
Normal file
@@ -0,0 +1,250 @@
|
||||
- name: Updating packages
|
||||
shell: apt-get update -y && apt-get upgrade -y
|
||||
when: ansible_distribution == 'Debian'
|
||||
ignore_errors: True
|
||||
args:
|
||||
warn: no
|
||||
notify: cleaning_packages_metadata
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Installing packages
|
||||
package: name={{item}} state=present
|
||||
when: ansible_distribution == 'Debian'
|
||||
with_items:
|
||||
- curl
|
||||
- git
|
||||
notify: cleaning_packages_metadata
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Check if xoa is already installed
|
||||
stat:
|
||||
path: /opt/xen-orchestra
|
||||
register: xen_orchestra_directory
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Ensure group xoa exists
|
||||
ansible.builtin.group:
|
||||
name: xoa
|
||||
state: present
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Check if xoa is already registered in sudoers.d
|
||||
stat:
|
||||
path: /etc/sudoers.d/xoa
|
||||
register: xoa_sudoers_file
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Add the xoa user
|
||||
ansible.builtin.user:
|
||||
name: xoa
|
||||
shell: /bin/bash
|
||||
home: /home/xoa
|
||||
comment: xen-orchestra user
|
||||
uid: 1040
|
||||
groups: xoa,users
|
||||
append: yes
|
||||
when: not xoa_sudoers_file.stat.exists
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Register xoa in sudoers.d
|
||||
ansible.builtin.file:
|
||||
path: /etc/sudoers.d/xoa
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0640'
|
||||
when: not xoa_sudoers_file.stat.exists
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Allow xoa to have passwordless sudo
|
||||
lineinfile:
|
||||
dest: /etc/sudoers.d/xoa
|
||||
state: present
|
||||
regexp: '^%xoa'
|
||||
line: '%xoa ALL=(ALL) NOPASSWD: ALL'
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Setting git user email
|
||||
git_config:
|
||||
name: user.email
|
||||
scope: global
|
||||
value: "{{git_email}}"
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Setting git user
|
||||
git_config:
|
||||
name: user.name
|
||||
scope: global
|
||||
value: "{{git_user}}"
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Download installation script
|
||||
ansible.builtin.get_url:
|
||||
url: "{{xoa_install_url}}"
|
||||
dest: "/tmp/{{xoa_install_script}}"
|
||||
mode: '0770'
|
||||
when: not xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Download update script
|
||||
ansible.builtin.get_url:
|
||||
url: "{{xoa_update_url}}"
|
||||
dest: "/home/xoa/{{xoa_update_script}}"
|
||||
mode: '0770'
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Create symbolic link to
|
||||
file:
|
||||
src: "/home/xoa/{{xoa_update_script}}"
|
||||
dest: "/etc/cron.weekly/{{xoa_update_script}}"
|
||||
state: link
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Removing existing data structures
|
||||
shell: "rm -R /var/lib/xo-server"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
when: not xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
|
||||
- name: Removing existing data structures
|
||||
shell: "rm -R /var/lib/xo-updater"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
when: not xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
|
||||
- name: Removing existing redis data
|
||||
shell: "redis-cli -n 0 FLUSHALL"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
when: not xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
|
||||
- name: Installing
|
||||
shell: "/tmp/{{xoa_install_script}}"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
when: not xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Updating
|
||||
shell: "/home/xoa/{{xoa_update_script}} -n stable"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
when: xen_orchestra_directory.stat.exists
|
||||
tags:
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Installing xo-cli
|
||||
shell: "npm install -g xo-cli"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Closing existing session using xo-cli
|
||||
shell: "xo-cli --unregister"
|
||||
ignore_errors: True
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Opening session using xo-cli
|
||||
shell: "xo-cli --register --au http://127.0.0.1 {{xoa_default_user}} {{xoa_default_password}}"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- install
|
||||
|
||||
- name: Adding user session using xo-cli
|
||||
shell: "xo-cli user.create email='{{xoa_user}}' password='{{xoa_password}}' permission='admin'"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- install
|
||||
|
||||
- name: Closing existing session using xo-cli
|
||||
shell: "xo-cli --unregister"
|
||||
ignore_errors: True
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Opening session using xo-cli
|
||||
shell: "xo-cli --register --au http://127.0.0.1 {{xoa_user}} {{xoa_password}}"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Adding xcp-ng servers using xo-cli
|
||||
shell: "xo-cli server.add label='{{item.label}}' host='{{item.ip}}' username={{xcpng_user}} password='{{xcpng_password}}' autoConnect=true allowUnauthorized=true"
|
||||
ignore_errors: False
|
||||
with_items: "{{xcpng_servers}}"
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
|
||||
- name: Closing session using xo-cli
|
||||
shell: "xo-cli --unregister"
|
||||
ignore_errors: False
|
||||
args:
|
||||
warn: no
|
||||
tags:
|
||||
- add-servers
|
||||
- install
|
||||
- update
|
||||
2
ansible/xoa-role/tests/inventory
Normal file
2
ansible/xoa-role/tests/inventory
Normal file
@@ -0,0 +1,2 @@
|
||||
localhost
|
||||
|
||||
4
ansible/xoa-role/tests/test.yml
Normal file
4
ansible/xoa-role/tests/test.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
- hosts: localhost
|
||||
remote_user: root
|
||||
roles:
|
||||
- xoa
|
||||
2
ansible/xoa-role/vars/main.yml
Normal file
2
ansible/xoa-role/vars/main.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
---
|
||||
# vars file
|
||||
186
xo_install.sh
186
xo_install.sh
@@ -1,106 +1,15 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# --- Check if we were effectively run as root ---
|
||||
[ "${EUID:-$(id -u)}" = 0 ] || { echo "This script needs to be run as root!"; exit 1; }
|
||||
# Check if we were effectively run as root
|
||||
[ $EUID = 0 ] || { echo "This script needs to be run as root!"; exit 1; }
|
||||
|
||||
# --- Check for required memory ---
|
||||
# Check for required memory
|
||||
totalk=$(awk '/^MemTotal:/{print $2}' /proc/meminfo)
|
||||
if [ "$totalk" -lt "2000000" ]; then echo "XOCE Requires at least 2GB Memory!"; exit 1; fi
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
if [ "$totalk" -lt "2000000" ]; then echo "XOCE Requires at least 2GB Memory!"; exit 1; fi
|
||||
|
||||
# --- OS detection ---
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
distro="$ID"
|
||||
version="$VERSION_ID"
|
||||
else
|
||||
echo "Unable to detect OS via /etc/os-release"; exit 1
|
||||
fi
|
||||
distro=$(/usr/bin/lsb_release -is)
|
||||
if [ "$distro" = "Ubuntu" ]; then /usr/bin/add-apt-repository multiverse; fi
|
||||
|
||||
# --- Deb Point Release Check ---
|
||||
if [ "$distro" = "debian" ] && [ -r /etc/debian_version ]; then
|
||||
deb_point=$(sed -E 's/^([0-9]+(\.[0-9]+)?).*/\1/' /etc/debian_version)
|
||||
version="${deb_point:-$version}"
|
||||
fi
|
||||
|
||||
echo "Detected: $distro $version"
|
||||
|
||||
# --- Version compare helper ---
|
||||
version_ge() { dpkg --compare-versions "$1" ge "$2"; }
|
||||
|
||||
# --- Minimum supported versions ---
|
||||
case "$distro" in
|
||||
debian)
|
||||
version_ge "$version" "12.5" || { echo "Debian $version too old (min 12.5)"; exit 1; }
|
||||
;;
|
||||
ubuntu)
|
||||
version_ge "$version" "24.04" || { echo "Ubuntu $version too old (min 24.04)"; exit 1; }
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported distribution: $distro"; exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# --- Helper: apt install if available ---
|
||||
apt_install_if_available() {
|
||||
local pkg="$1"
|
||||
/usr/bin/apt-get update -qq
|
||||
if /usr/bin/apt-cache policy "$pkg" 2>/dev/null | grep -q 'Candidate:'; then
|
||||
echo "Installing $pkg"
|
||||
/usr/bin/apt-get --yes install "$pkg"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# --- FUSE runtime install ---
|
||||
install_fuse_runtime() {
|
||||
echo "Ensuring FUSE runtime (libfuse.so.2)..."
|
||||
for p in libfuse2 libfuse2t64; do
|
||||
apt_install_if_available "$p" && break
|
||||
done
|
||||
/sbin/ldconfig -v 2>/dev/null || true
|
||||
if ! /sbin/ldconfig -p | grep -Fq 'libfuse.so.2'; then
|
||||
echo "ERROR: libfuse.so.2 not found. XO requires FUSE2 runtime."
|
||||
exit 1
|
||||
fi
|
||||
echo "libfuse.so.2 verified."
|
||||
}
|
||||
|
||||
# --- Install dependencies ---
|
||||
install_deps() {
|
||||
echo "Installing general dependencies..."
|
||||
/usr/bin/apt-get update
|
||||
/usr/bin/apt-get --yes install git curl apt-transport-https gnupg ca-certificates
|
||||
|
||||
case "$distro" in
|
||||
debian)
|
||||
echo "Installing Debian-specific dependencies..."
|
||||
install_fuse_runtime
|
||||
/usr/bin/apt-get --yes install libnbd-bin nbdkit nbdkit-plugin-vddk || true
|
||||
;;
|
||||
ubuntu)
|
||||
echo "Installing Ubuntu-specific dependencies..."
|
||||
/usr/bin/apt-get --yes install software-properties-common
|
||||
/usr/bin/add-apt-repository -y multiverse || true
|
||||
/usr/bin/apt-get update
|
||||
install_fuse_runtime
|
||||
/usr/bin/apt-get --yes install libnbd-bin nbdkit || true
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Installing XOCE common dependencies..."
|
||||
/usr/bin/apt-get --yes install \
|
||||
build-essential redis-server libpng-dev python3-minimal \
|
||||
libvhdi-utils nfs-common lvm2 cifs-utils openssl || true
|
||||
}
|
||||
|
||||
install_deps
|
||||
|
||||
# --- Script variables ---
|
||||
xo_branch="master"
|
||||
xo_server="https://github.com/vatesfr/xen-orchestra"
|
||||
n_repo="https://raw.githubusercontent.com/tj/n/master/bin/n"
|
||||
@@ -111,53 +20,64 @@ xo_server_dir="/opt/xen-orchestra"
|
||||
systemd_service_dir="/lib/systemd/system"
|
||||
xo_service="xo-server.service"
|
||||
|
||||
# --- Install Yarn ---
|
||||
# Ensures that Yarn dependencies are installed
|
||||
/usr/bin/apt-get update
|
||||
/usr/bin/apt-get --yes install git curl apt-transport-https gnupg
|
||||
|
||||
#Install yarn
|
||||
cd /opt
|
||||
/usr/bin/curl -sSL "$yarn_gpg" | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null
|
||||
|
||||
/usr/bin/curl -sSL $yarn_gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null
|
||||
echo "$yarn_repo" | tee /etc/apt/sources.list.d/yarn.list
|
||||
/usr/bin/apt-get update
|
||||
/usr/bin/apt-get install --yes yarn
|
||||
|
||||
# --- Install Node via n ---
|
||||
/usr/bin/curl -o "$n_location" "$n_repo"
|
||||
/bin/chmod +x "$n_location"
|
||||
/usr/local/bin/n lts
|
||||
# Install n
|
||||
/usr/bin/curl -o $n_location $n_repo
|
||||
/bin/chmod +x $n_location
|
||||
|
||||
# Ensure new Node is used
|
||||
export PATH="/usr/local/bin:$PATH"
|
||||
hash -r
|
||||
# Install node via n
|
||||
n lts
|
||||
|
||||
node_version=$(node -v | sed 's/v//')
|
||||
dpkg --compare-versions "$node_version" lt "20.18" && {
|
||||
echo "ERROR: Node version $node_version too old. XO requires >=20.18"
|
||||
exit 1
|
||||
}
|
||||
# Symlink node directories
|
||||
ln -s /usr/bin/node /usr/local/bin/node
|
||||
|
||||
# --- Clone & build XO ---
|
||||
/usr/bin/git clone -b "$xo_branch" "$xo_server" "$xo_server_dir" 2>/dev/null || true
|
||||
cd "$xo_server_dir"
|
||||
# Install XO dependencies
|
||||
/usr/bin/apt-get install --yes build-essential redis-server libpng-dev git python3-minimal libvhdi-utils nfs-common lvm2 cifs-utils
|
||||
|
||||
/usr/bin/git clone -b $xo_branch $xo_server
|
||||
|
||||
cd $xo_server_dir
|
||||
/usr/bin/yarn
|
||||
/usr/bin/yarn build
|
||||
|
||||
cd packages/xo-server
|
||||
cp -f sample.config.toml .xo-server.toml
|
||||
cp sample.config.toml .xo-server.toml
|
||||
|
||||
dest=/usr/local/lib/node_modules/
|
||||
mkdir -p "$dest"
|
||||
#Create node_modules directory if doesn't exist
|
||||
mkdir -p $dest
|
||||
|
||||
# Plugins to ignore
|
||||
ignoreplugins=("xo-server-test")
|
||||
for source in $(ls -d /opt/xen-orchestra/packages/xo-server-* 2>/dev/null || true); do
|
||||
plugin=$(basename "$source")
|
||||
[[ " ${ignoreplugins[*]} " == *" $plugin "* ]] && continue
|
||||
ln -sfn "$source" "$dest"
|
||||
|
||||
# Symlink all plugins
|
||||
for source in $(ls -d /opt/xen-orchestra/packages/xo-server-*); do
|
||||
plugin=$(basename $source)
|
||||
if [[ "${ignoreplugins[@]}" =~ $plugin ]]; then
|
||||
echo "Ignoring $plugin plugin"
|
||||
else
|
||||
ln -s "$source" "$dest"
|
||||
fi
|
||||
done
|
||||
|
||||
# --- systemd service ---
|
||||
if [[ -e "$systemd_service_dir/$xo_service" ]]; then
|
||||
rm -f "$systemd_service_dir/$xo_service"
|
||||
if [[ -e $systemd_service_dir/$xo_service ]] ; then
|
||||
rm $systemd_service_dir/$xo_service
|
||||
fi
|
||||
|
||||
/bin/cat << 'EOF' > "$systemd_service_dir/$xo_service"
|
||||
/bin/cat << EOF >> $systemd_service_dir/$xo_service
|
||||
# Systemd service for XO-Server.
|
||||
|
||||
[Unit]
|
||||
Description= XO Server
|
||||
After=network-online.target
|
||||
@@ -165,6 +85,7 @@ After=network-online.target
|
||||
[Service]
|
||||
WorkingDirectory=/opt/xen-orchestra/packages/xo-server/
|
||||
ExecStart=/usr/local/bin/node ./dist/cli.mjs
|
||||
|
||||
Restart=always
|
||||
SyslogIdentifier=xo-server
|
||||
|
||||
@@ -172,13 +93,12 @@ SyslogIdentifier=xo-server
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
/bin/systemctl daemon-reload
|
||||
/bin/systemctl enable "$xo_service"
|
||||
/bin/systemctl start "$xo_service" || (sleep 2 && /bin/systemctl start "$xo_service")
|
||||
|
||||
echo
|
||||
echo "Installation complete, open a browser to:" && hostname -I
|
||||
echo
|
||||
echo 'Default Login: "admin@admin.net" Password: "admin"'
|
||||
echo
|
||||
echo "Don't forget to change your password!"
|
||||
/bin/systemctl daemon-reload
|
||||
/bin/systemctl enable $xo_service
|
||||
/bin/systemctl start $xo_service
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
echo "Installation complete, open a browser to:" && hostname -I && echo "" && echo "Default Login:"admin@admin.net" Password:"admin"" && echo "" && echo "Don't forget to change your password!"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user