2018-03-09 21:25:29 -05:00
#!/bin/sh
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# >>>>Title<<<<
2018-06-07 06:51:30 -04:00
## Universal Qubes Update Script (UQUS).
2018-07-02 00:53:06 -04:00
# >>>>Purpose<<<<
2018-06-07 06:51:30 -04:00
## This script performs auto-updates of dom0 and every default template, as well as any templates
## you may wish to add. The script is straight forward and highly customizeable.
# >>>>WARNING!<<<<
## Please read the script carefully, do not run if you do not know what it does.
## Be sure you edit it correctly to your own needs.
2018-07-02 00:53:06 -04:00
## Useage notes and to-do-notes can be found at the bottom of the script.
2018-06-07 06:51:30 -04:00
# >>>Disclaimer!<<<
## I take no responsibility for use of this script, please study it before you use this script at your own risk.
## However I gureantee and stand by the ideal and belief to improve the quality and reliability as far as possible
## within my capability and reach, and reasonable circumstances, such as being aware, and having the time to fix it.
2018-07-02 04:40:55 -04:00
# /// Special settings \\\
#toggle-shutdown-sys-whonix='qvm-shutdown sys-whonix --wait' # Enable/Disable this second-last command at bottom of script.
2018-06-07 06:51:30 -04:00
2018-07-02 06:14:25 -04:00
2018-07-02 00:53:06 -04:00
# /// Testing Updates \\\
## Removing or inserting the hash-# sign on below lines will disable/enable Qubes testing updates.
## If using testing repositories, make sure you keep all domains (Dom0 and DomUs') in sync.
#dom0_testing='--enablerepo=qubes-dom0-current-testing'
#fedora_testing='--enablerepo=qubes-vm-*-current-testing' # Includes all CentOS and Fedora-Minimal templates.
#debian_testing='-t *-testing' # Includes all Whonix templates.
# /// Dom0 updates \\\
xterm -e 'sudo qubes-dom0-update ' $dom0_testing ' --refresh'
wait
# /// Template Script slots \\\
## You can insert values in the slots below, and/or add more slots in the script.
## Be sure you match the slots with the commands and values further down the script.
## Disabling a slot with hash-#, will disable updates for specified VM.
# Fedora_based script slots include all Fedora, Fedora-minimal and CentOS templates.
fedora_based_template_1 = 'fedora-28'
#fedora_based_template_2=''
#fedora_based_template_3=''
#fedora_based_template_4=''
#fedora_based_template_5=''
2018-07-02 04:40:55 -04:00
#fedora_based_template_6=''
#fedora_based_template_7=''
#fedora_based_template_8=''
#fedora_based_template_9=''
#fedora_based_template_10=''
2018-06-07 06:51:30 -04:00
2018-07-02 00:53:06 -04:00
# Debian_based script slots include all Debian / Whonix templates.
debian_based_template_1 = 'debian-9'
2018-07-02 04:40:55 -04:00
debian_based_template_2 = 'whonix-ws'
debian_based_template_3 = 'whonix-gw'
#debian_based_template_4=''
#debian_based_template_5=''
#debian_based_template_6=''
#debian_based_template_7=''
#debian_based_template_8=''
#debian_based_template_9=''
#debian_based_template_10=''
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# /// Inner Script mechanics below \\\
# You only need to modify the below if you plan to go beyond the normal scope
# of the scripts purpose, and/or if you want to expand the number of included slots.
# All fedora-based, and all debian-based slots are identical, except for slot numbers.
# It is therefore very easy to copy/paste to create more slots, and modify extra numbers.
# Fedora/Fedora-minimal/CentOS-based update slot #1
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_1 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $fedora_based_template_1 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_1 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_1 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_1" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $fedora_based_template_1 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #2
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_2 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $fedora_based_template_2 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_2 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_2 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_2" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $fedora_based_template_2 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #3
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_3 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $fedora_based_template_3 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_3 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_3 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_3" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $fedora_based_template_3 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #4
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_4 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $fedora_based_template_4 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_4 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_4 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_4" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $fedora_based_template_4 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #5
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_5 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $fedora_based_template_5 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_5 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_5 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_5" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $fedora_based_template_5 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #6
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_6 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $fedora_based_template_6 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_6 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_6 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_6" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $fedora_based_template_6 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #7
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_7 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $fedora_based_template_7 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_7 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_7 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_7" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $fedora_based_template_7 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #8
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_8 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $fedora_based_template_8 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_8 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_8 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_8" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $fedora_based_template_8 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #9
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_9 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $fedora_based_template_9 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_9 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_9 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_9" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $fedora_based_template_9 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Fedora/Fedora-minimal/CentOS-based update slot #10
2018-07-02 06:14:25 -04:00
if [ " $fedora_based_template_10 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $fedora_based_template_10 " #Needed to avoid premature qvm-run shutdown.
qvm-run " $fedora_based_template_10 " 'xterm -e sudo dnf update ' $fedora_testing ' --refresh'
qvm-run " $fedora_based_template_10 " 'xterm -e sudo dnf upgrade ' $fedora_testing ''
#qvm-run "$fedora_based_template_10" 'xterm -e sudo dnf autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $fedora_based_template_10 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# <<< !!! Switching from Fedora-based to Debian-based updates !!! >>>
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# Debian/Whonix-based update slot #1
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_1 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $debian_based_template_1 " #Needed to avoid premature qvm-run shutdown, important here.
2018-07-02 04:40:55 -04:00
qvm-run " $debian_based_template_1 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_1 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
2018-07-02 00:53:06 -04:00
#qvm-run "$debian_based_template_1" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $debian_based_template_1 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# Debian/Whonix-based update slot #2
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_2 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $debian_based_template_2 " #Needed to avoid premature qvm-run shutdown, important here.
2018-07-02 04:40:55 -04:00
qvm-run " $debian_based_template_2 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_2 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
2018-07-02 00:53:06 -04:00
#qvm-run "$debian_based_template_2" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $debian_based_template_2 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-03-09 21:23:52 -05:00
2018-07-02 00:53:06 -04:00
# Debian/Whonix-based update slot #3
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_3 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $debian_based_template_3 " #Needed to avoid premature qvm-run shutdown, important here.
2018-07-02 04:40:55 -04:00
qvm-run " $debian_based_template_3 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_3 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
2018-07-02 00:53:06 -04:00
#qvm-run "$debian_based_template_3" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $debian_based_template_3 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
# Debian/Whonix-based update slot #4
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_4 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $debian_based_template_4 " #Needed to avoid premature qvm-run shutdown, important here.
2018-07-02 04:40:55 -04:00
qvm-run " $debian_based_template_4 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_4 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
2018-07-02 00:53:06 -04:00
#qvm-run "$debian_based_template_4" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $debian_based_template_4 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
# Debian/Whonix-based update slot #5
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_5 " ] ; then
2018-07-02 00:53:06 -04:00
qvm-start " $debian_based_template_5 " #Needed to avoid premature qvm-run shutdown, important here.
2018-07-02 04:40:55 -04:00
qvm-run " $debian_based_template_5 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_5 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
2018-07-02 00:53:06 -04:00
#qvm-run "$debian_based_template_5" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
2018-07-02 04:40:55 -04:00
qvm-shutdown " $debian_based_template_5 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Debian/Whonix-based update slot #6
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_6 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $debian_based_template_6 " #Needed to avoid premature qvm-run shutdown, important here.
qvm-run " $debian_based_template_6 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_6 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
#qvm-run "$debian_based_template_6" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $debian_based_template_6 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Debian/Whonix-based update slot #7
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_7 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $debian_based_template_7 " #Needed to avoid premature qvm-run shutdown, important here.
qvm-run " $debian_based_template_7 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_7 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
#qvm-run "$debian_based_template_7" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $debian_based_template_7 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Debian/Whonix-based update slot #8
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_8 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $debian_based_template_8 " #Needed to avoid premature qvm-run shutdown, important here.
qvm-run " $debian_based_template_8 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_8 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
#qvm-run "$debian_based_template_8" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $debian_based_template_8 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 04:40:55 -04:00
# Debian/Whonix-based update slot #9
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_9 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $debian_based_template_9 " #Needed to avoid premature qvm-run shutdown, important here.
qvm-run " $debian_based_template_9 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_9 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
#qvm-run "$debian_based_template_9" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $debian_based_template_9 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
2018-07-02 04:40:55 -04:00
# Debian/Whonix-based update slot #10
2018-07-02 06:14:25 -04:00
if [ " $debian_based_template_10 " ] ; then
2018-07-02 04:40:55 -04:00
qvm-start " $debian_based_template_10 " #Needed to avoid premature qvm-run shutdown, important here.
qvm-run " $debian_based_template_10 " " xterm -e sudo apt-get update ' $debian_testing ' "
qvm-run " $debian_based_template_10 " " xterm -e sudo apt-get dist-upgrade ' $debian_testing ' "
#qvm-run "$debian_based_template_10" 'xterm -e sudo apt autoremove' # Remember you are asked to confirm for a reason, it may not always be a good to autoremove.
qvm-shutdown " $debian_based_template_10 " --wait #Needed if qvm-start is used.
2018-07-02 06:14:25 -04:00
fi
2018-07-02 00:53:06 -04:00
2018-07-02 04:40:55 -04:00
$( toggle-shutdown-sys-whonix)
2018-07-02 00:53:06 -04:00
2018-03-09 21:23:52 -05:00
2018-06-07 06:51:30 -04:00
##Conclusion: Question message, whether to restart or not.
##For this part of the Script logic, credit goes to rhss6-2011 @ https://ubuntuforums.org/showthread.php?t=2239195
2018-07-02 04:40:55 -04:00
ans = $( zenity --width= "520" --height= "200" --title= "uQUS has reached its conclusion." --question --text= 'The update-script has successfully reached its conflusion.\n\n- Click "Yes" to perform a full system restart.\n\n- Click "No" if no restart is required or you wish to restart manually later.\n\n- Whenever in doubt, consider a full system reboot.' --ok-label= "Yes, shutdown Qubes." --cancel-label= "No, keep running." 2> /dev/null
2018-03-09 21:23:52 -05:00
if [ $? = 0 ] ; then
command = $( xterm -e shutdown -h now) #use 'reboot -h now' instead of shutdown if you want the 'Yes' button to perform a reboot.
else
command = $( )
fi
)
2018-07-02 00:53:06 -04:00
# >>>>usage-notes!<<<<
##1) Be sure you have enough free RAM to run every updated template, all are run one at a time.
##2) The script will halt if it is interupted, such as not enoguh RAM, errors/logs are currently not reported.
##3) VMs will proceed and shutdown automatically if no updates, or after succesfull update install.
##4) You may include the -y option to auto-accept updates in some VMs, be careful though.
##5) Add or remove # in front of the command instructions to disable/enable commands.
##6) Its essential to keep dom0/templates in sync between repositories, don't mix current and current-testing.
##7) Only use current-testing if you know what you are getting yourself into (untested updates).
##8) This script release version is only tested on Qubes 4.0, but presumably may work on Qubes 3.2.
# >>>>To-do-notes<<<<
##1) Further streamline script, making it easier to customize with symbolic links.
##2) Reducing the risk that users mistakenly run testing, or out-of-sync dom0/template updates.
##3) If feasible, presenting the logs for each update, saved in a dated folder for every time script is run.
## - If feasible, reporting errors and logs to the user during or after the update has finished.
## - If succesful, it removes one of the two major concerns of including the -y attribute, making it easier to use.
##4) - (Done) Investigate whether --clean can be removed or changed from the dom0 update command.
##5) Investigate the feasibility of a simple GUI interface to select or de-select script script-options (possibly long-term).
##6) Fixing the progress bar, and picking the best approach to inform the user.
##7) A better means to stop the script pre-maturely but safely, because it is a long chain of events to update all VM's.
# >>>>Author<<<<
## Aekez @ https://github.com/Qubes-Community
# >>>>Feedback & Contributions<<<<
## Feedback and/or new contributoers are welcome, please use QCC Pull Request, or feel free to contact me.