forked from kwindrem/SetupHelper
-
Notifications
You must be signed in to change notification settings - Fork 0
davemuench/SetupHelper
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
The SetupHelper package provides a set of utilities to simplfy
installing modifications to Victron Venus Os
and includes a mechanism to automatically reinstall them following a Venus OS update
Setup:
The easiest way to install this code IF the Venus device has internet access is to run the following command:
wget -qO - https://github.com/kwindrem/SetupHelper/archive/current.tar.gz | tar -xzf - -C /data
mv /data/SetupHelper-current /data/SetupHelper
or
wget https://github.com/kwindrem/TankRepeater/archive/current.tar.gz
mv current.tar.gz SetupHelper.tar.gz
Then move rcS.local to /data, or edit that file if it already exists and add:
/data/SetupHelper/reinstallMods
You can alternatively use rc.local as explained below
The following lines should be inclueded in the setup script to use the functions and variables provided here
#### following lines incorporate SetupHelper utilities into this script
# Refer to the SetupHelper ReadMe file for details.
source "/data/SetupHelper/CommonResources"
if [ $scriptAction == 'EXIT' ] ; then
exit
fi
checkFileSets
#### end of lines to include SetupHelper
A Venus software update overwrites any modifications to the root partition.
It is therefore necessary to reinstall the modifications following the Venus update.
For automatic reinstallation of any modificaitons using SetupHelper following a Venus update,
add the following line in /data/rcS.local or /data/rc.local to call the reinstaller:
/data/SetupHelper/reinstallMods
Typically, rcS.local is used because it runs prior to starting services
so conflicts with running services can be avoided
(services don't need to be restarted after they've been modified)
and if a reboot is required, it happens faster
If your setup script needs resources launched later in boot, use /data/rc.local
reinstallScriptsList is a list of setup scripts, one per line that will be called from reinstallMods.
Scripts in this list are called EVERY time the system boots.
The script must avoid repeating work if it can be avoided.
reinstallScriptsList is hard-coded to reside in the /data directory.
The location must match in CommonResources, and in reinstallMods
The file is created by the first setup script to add to it.
reinstallScriptsList should use full path names to avoid problems finding the script
Lines beginning with # or completely blank lines are ignored as is white space at begin and end
When the setup script adds itself to the script list, it includes "reinstall" as the first parameter.
When reinstallMods calls the script, it passes "reinstall" to the setup script so it knows not to prompt the user
When called from reinstallMods:
1) The setup script must not require user input since there will be no user interface
2) The setup script should not reboot the system directly
3) The setup script should avoid reapplying the modifications.
4) The setup script should avoid making calls to the internet as these could hang the system.
reinstallMods tests the exit code of each setup script.
An exit code of 123 signals that reinstallMods should reboot the system after all scripts have been run.
A "installed flag file" is used to make sure the automatic reinstallation occurs only once after a Venus OS update.
The presence of the installed flag file signals no further work needs to be done to reinstall the package
Running the script manually should typically ignore the installed flag,
but MUST create or remove it as appropriate to control future boot-time execution.
The installed flag file needs to be removed by a Venus OS update so that the script can do it's work again.
Therefore, installed flag files are stored in /etc/venus since a Venus OS update overwrites the entire dirctory.
The installed flag file should be tested early in the script to save time.
A setup script needs to run manually to perform the initial installation or removal of the package.
In this case, user interaction is necessary at least to choose to install or uninstall.
The setup script also needs to run unattended when called from reinstallMods during system boot.
When run by a user, the scrit should prompt the user for neede information.
However, the call from reinstallMods also needs this information and the user won't be available.
Therefore the paremeters taken from user interaction need to be stored in persistent storage,
then recovered from that storage during the reinstall.
The script's directory is a convenient location for persistent storage since /data survives a Venus OS update.
The $scriptDir variable is set up in CommonResources (see discussion below).
$scriptDir may be prepended to any persistent storage files.
CommonResources contains common functions and variables that can be used by all scripts,
saving the setup script writer from lots of tedious work and also hooks scripts into
the reinstall mechanism.
The tools CommonResorces provides are described now.
The following functions manage execution of the script and interfaces to reinstallMods which is run
at boot from one of the /data/rc scripts:
Sourcing CommonResources checks the setup script command line and the installed flag
and sets $scriptAction based on what is found.
If this is a boot-time reinstall, AND the installed flag is set,
scriptAction is set to EXIT.
The setup script should test scripAction immmediately afger sourcing CommonResources
and skip furter processing if it is 'EXIT'
If this a boot-time reinstall but the installed flag is NOT set,
scriptAction is set to INSTALL.
checkFileSets
Attempts to create a file set for the current Venus OS version if it does not exist yet.
If the original files match another version, the file set is created
so the setup script may continue normally
However, if the original files for this new version differ from all existing versions
the new partial file set must not be used
Flag files ares placed in the file set:
basename.NO_REPLACEMENT indicates a new replaement verion must be created manually
INCOMPLETE indiates the file set can not be used until issue are corrected
scriptAction is also set to EXIT
It is necessary for the user to create new replacement files manually
then rerun the setup script to install the package.
You can also revert to a previous Venus OS version until the package
is updated for the new version.
Symbolic links are used in the file set to indicate redundancy between versions.
This provides a visual indication of which versions have changes from a previous one.
checkFileSets should be called before any attempt is made to modify Venus files
endScript
Function to finish up, prompt the user (if not reinstalling) and exit the script
It updates the installed flag based on the $runAgain variable
This script is added/removed from the reinstallScriptsList if installing/uninstalling, respectively
If $runningAtBoot is true (false when CommonResources is sourced)
the script will exit with $exitReboot if $rebootNeeded is true
otherwise, the script will exit with $exitSuccess
endScript NEVER RETURNS to the caller
If $runningAtBoot is false (script was run manually), user interaction controls further action
If $rebootNeeded is true, the function asks if the user wishes to reboot now
If they respond yes, the system will be rebooted
The user may choose to not reboot now if additional installations need to be done first
If $rebootNeeded is false, the function notifies the user of any needed actions
If $restartGui is true (false when CommonResources is sourced)
the gui service will be restarted
The following variables are available to control behavior:
$scriptAction provides direction for the setup script and has the following values:
NONE - setup script should prompt the user for the desired action
and set scriptAction accordingly
EXIT - the setup script should exit immediately
INSTALL - the setup script should execute code to install the package
UNINSTALL - the setup script should execute the code to restore the Venus files to stock
If installaiton errors occur within functions in CommonResources, scriptAction will be changed to UNINSTALL.
The setup script MUST retest scriptAction after all installation code has been executed
so the package can be removed, rather than leaving the system with a partially installed package.
$rebootNeeded - true signifies a reboot is required after the script is run
if $runningAtBoot is also true, the reboot is actually performed in reinstallMods
$runAgain - true signifies startup script needs to be run again
The following useful variables become available as well:
$scriptDir - the full path name to the startup script
the script's code can use this to identify the location of files that need to
persist between reboots and through Venus OS updates
It must be set in the setup script beause it is needed before sourcing CommonResources
$scriptName - the basename of the setup script
$reinstallScriptsList - the file containing a list of scripts to be run at boot to reinstall packages
after a Venus software update
$installedFlag - the name of the install flag files including it's full path
User code may use these variables but should not change their value!
It must be set in the setup script beause it is needed before sourcing CommonResources
$venusVersion - the version of VenusOS derived from /opt/victronenergy/version
$fileSets - the standard location for the replacement files
equivalent to #scriptDir/FileSets
Version-dependent replacements are stored in version subdirectories
Version-INDEPENDENT replacements are stored in FileSets
$runningAtBoot - true if the script was called from reinstallMods (at boot time)
signifying this is to be an unattended (automatic) installation
CommonResoures sets this variable based on command line options
The following functions update or restore Venus files to activate a package
they are intended to simplify common tasks, generally reducing many lines
to a single line that is easier to read/understand
The "active" file is the one used by Venus applications
It is backed up to [activeFile].orig in the same directory
Then a "replacement" file is copied into place and becomes the active file
Backups allow the stock functionality to be restored when the package is uninstalled
Replacement files are expected in the FileSets directory within the script's directory
If the replacement file content differs with VenusOS version,
subdirectories for each version hold the replacement files
If the replacment is independent of version, it can be placed in FileSets
The version subdirectories are checked first.
The version sub-directories also contain the stock files with their name ending in .orig.
These are used to look for a match within previous versions when a new Venus version is detected.
A new Venus version with matching files to a previous version updates the file sets automatically.
If the new version has different file content, replacement file(s) will need to be created MANUALLY.
This is typically easy by inspecting previous active and .orig files and the new .orig file.
The file set for the new version is flagged as INCOMPLETE and
will preven installation until the file set is complete and the INCOMPLETE flag is removed manually.
fileList contains a list of Venus files to be managed by this package.
Packages may also contain files that do not exist in the stock Venus image.
These are NOT included in fileList!
Use full paths/name for all files to avoid problems when running the script from other locations
such as the boot code, and quote them in case the names contain spaces.
Two flags are set by these routines in order for the setup script to detect changes
$thisFileUpdated is true of the venus file was modified by the operation
It can be tested following each update, copy or restore operation
to determine the success/failure of that one operation
$filesUpdates is true if ANY file is modified by any of these functions
It can be tested at the end of the setup script to know if ANY file
was modified to trigger restarting service or rebooting
Use updateActiveFile to replace the active file with a replacement from the package
updateActiveFile replacementFile activeFile
or
updateActiveFile activeFile
First backs up the active file
then copies the replacement version into the active location
If called with two parameters
the first is replacement the file (source)
the second is the active file (destination)
If called with only one parameter, it specifies the active file
the replacement file is selected from FileSets
restoreActiveFile activeFile
Moves the backup copy to the active location
The first parameter is the name of the active file (the one to be restored to stock)
The file with the same name with .orig at the end is moved
to the active file
If the backup copy doesn't exist BUT the noOrig flag is set
the active copy is deleted to restore the system to stock
A failure in updateActiveFile and copyToActiveFile set scriptAction to UNINSTALL.
The setup script MUST then remove the package
to prevent system instability from a partially installed package
The following functions simplify the task of getting user input
standardActionPrompt displays a menu of actions and asks the user to choose
It sets scriptAction accordingly and returns
It also handles displaying setup and package logs then asks for an action again
It also handles quitting with no action - the fuction EXITS without returning in this case
The basic action prompt includes install, reinstall, quit, display logs (2 choices)
A reinstall option is enabled by including 'enableReinstall' as the first parameter
When reinstall is enabled, selecting install, returns a scriptAction of PROMPT
indicating additional prompting may be needed to complete the install
At the end of these prompts, the main script should set scriptAction to INSTALL
If reinstall is selected, the script action is set to INSTALL and the main script
can then skip additional prompts and allow options set previously to control the install
yesNoPrompt "question"
Asks the user to answer yes or no to the question
Any details regarding the question should be output before calling yesNoPrompt
yesNoPrompt sets $yesResponse to true if the answer was yes and false if the answer was no
LogHandler is a logging and log display mechanism. It is sourced by CommonResources and also by reinstallMods
Some executions of the setup scripts are during system boot
where console messages are likely to go unnoticed (if they are visible at all).
Boot-time scripts that output to the console are diverted to /var/log/boot,var/log/messages or dmesg,
but these logs retain messages only from the last boot.
A Setup Helper log is used to make messages from these setup acivities that are more persistent and easier to find.
The setup helper log file is /var/log/SetupHelper (or $setupLogFile)
In addition, some packages have their own log file and logging utilities here write to these logs as well
Finally, when run from the command line, the console (stdout) is also available and provides the most immediate
interface to the user.
A tai64n timestamp is added to messages written to both log files.
This timestamp can be converted to human readable form for display tai64nlocal
The script name is also written to logs
logMessage "message"
writes "message" the above places
displayLog logfile
displays the last 100 lines of the log file
$1 is the log file to be displayed. Either:
$setupLogFile or
$packageLogFile
The latter must be initialized in setup script code
If no package log file exists, $packageLogFile shoudl remain null ""
About
Helper functions to simplify writing setup scripts that modify VenusOs functionality. The package includes automatic reinstallation of the package after a VenusOs update.
Resources
Stars
Watchers
Forks
Packages 0
No packages published
Languages
- Shell 100.0%