EPI ( EASY PACKAGE INSTALLER ) es un programa para empaquetar instalaciones mas complicadas que no se pueden realizar mediante debs o para aquellos casos en los cuales la instalacion de un paquete se quiere realizar de una forma sencilla ( mediante el zero-center ).
Un paquete epi puede consistir en dos ficheros: - fichero epi - script de instalacion. El fichero .epi si que es necesario, mientras que el script de instalacion solo es necesario en caso de que se quiera hacer algun proceso en alguna de las fases que ejecuta EPI. Por convención los ficheros se instalaran en la ruta /usr/share/NOMBREDELPAQUETE.
El fichero epi es el fichero que contiene toda la meta informacion sobre el proceso de instalacion, como puede ser la url desde donde se bajara los ficheros necesarios, si necesita de permisos de root. Es un fichero que tiene un mimetype asociado, por lo que al hacer doble click sobre el se lanzara la aplicacion epi-gtk y por lo que tiene una extension .epi .
{ ... type: "apt" ... }
{ ... "script" : { "name" : "/usr/share/foo/foo_script" , "remove" : true, "addRepoKeys":true } } ... }
{ ... "depends":"/usr/share/zero-google-earth/google-earth.epi" ... }
"eula":"https://www.google.com/chrome/privacy/eula_text.html"
{ ... "pkg_list" : [{"name":"androidstudio","custom_name":"Android Studio tools for building apps on every type of Android device.","custom_icon":"androidstudio.png","type":"file","eula":"https://developer.android.com/studio/terms"},...] ...}
..."pkg_list":[{"name":"pgadmin4",..."skip_flavours":["client","desktop"]}]}
{..."pkg_list":[{"name":"androidstrudio",..."skip_groups":[{"group":"teachers,"action":"remove"},{"group":"students","action":"all"}]}]}
"version":{"64b":"google-earth-stable_current_amd64.deb","32b":"google-earth-stable_current_i386.deb"}
{ ... "pkg_list" : [{"name":"google-earth-pro-stable","version":{"64b":"google-earth-stable_current_amd64.deb","32b":"google-earth-stable_current_i386.deb"},"key_store":"zero-lliurex-gearth","url_download":"http://dl.google.com/dl/earth/client/current/"}] ...}
{... "repository": [{"url":"deb http://repository.spotify.com stable non-free","key_cmd":"apt-key --keyring /tmp/epi_keyring adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886 0DF731E45CE24F27EEEB1450EFDC8610341D9410"}] ...}
{..."selection_enabled":{"active":True,"all_selected":False}}
{..."custom_icon_path":"/usr/share/zero-fp-informatica/"
{..."lock_remove_groups":["students"]}
Además de mediante la interfaz gráfica, es posible instalar ficheros epi mediante la terminal usando para ello la herramienta EPIC. Para ver las distintas opciones ejecutar en una terminal la instrucción.: epic -h(o --help)
Usage
epic [FLAGS...] ACTION
Actions
showlist : Shows alls epi files avaliables to be installed with EPIC
showinfo PATH or NAME APP_EPI_FILE : Shows information about APP_EPI_FILE
install PATH or NAME APP_EPI_FILE "optional" all" or "optional" pkg1" "optional pkg2"...
uninstall PATH or NAME APP_EPÌ_FILE "optional all" or "optional pkg1" "optional pkg2"...
Flags
-h --help : Show help
-u --unattended: Run the install/uninstall without prompting for user confirmation
-d --debug: Run the install/uninstall in debug mode
-n --no-check: Run the install/uninstall without check internet connection and apt,dpkg or lliurex-up locks
Es posible obtener la relación de todos los ficheros epi instalables mediante EPIC disponibles en el equipo donde se realiza la consulta. Para ello se ejecutará la instrucción: epic showlist
[EPIC]: List of all epi files that can be installed with EPIC: acroread.epi, anydesk.epi, autofirma.epi, bell-scheduler.epi, blockly-arduino.epi, chromecast.epi, docker.epi...
Para obtener información sobre el contenido de un fichero EPI mediante EPIC se ejecutará la siguiente instrucción:epic showinfo "RUTA_FICHERO_EPI/FICERO_EPI". Indicar que sólo se mostrará la información de aquellos ficheros epi que pueden instalados mediante EPIC, en caso contrario se mostraŕa un aviso. Así mismo indicar que "Packages availables" sólo se listan aquellos paquetes de la lista que pueden ser instalados mediante EPIC de forma que se excluyen los paquetes que necesitan una interfaz gráfica para su instalación. En "Packages already installed" se muestran los paquetes de la lista que ya estan instalados.Usando epic showinfo y tabulando se muestra la relación de los ficheros epi disponibles. También mediante el tabulador es posible completar el nombre del fichero epi
[EPIC]: Searching information...
[EPIC]: Information availabled:
- Application: palemoon lliurex-adobe-settings
- Status: availabled
- Uninstall process availabled: No
[EPIC]: Searching information...
[EPIC]: Information availabled:
- Packages availables: androidstudio atom bluegriffon dia eclipse git git-buildpackage gitkraken intellij kazam minicom packettracer pgadmin4 pdfmod qtmips remmina virtualbox xmlcopyeditor
- Packages selected by defafult: None
- If you want to install all, indicate 'all'. If you want to install only some packages indicate their names separated by space
- Packages already installed: git git-buildpackage
- Uninstall process availabled: Yes
[EPIC]: Searching information...
[EPIC]: Information availabled:
- Packages availables: wine-stable winetricks q4wine
- Packages selected by defafult: wine-stable winetricks
- If you want to install all, indicate 'all'. If you want to install only some packages indicate their names separated by space
- Packages already installed: None
- Uninstall process availabled: Yes
[EPIC]: Searching information...
[EPIC]: Information availabled:
- Application not availabled to install/uninstall via terminal. Use epi-gtk for this
Para instalar/desinstalar un fichero EPI con lista de paquetes mediante EPIC se podrá utilizar las siguientes instrucciones. En ambos casos EPIC comprobará la validez de los parámetros indicados y en caso necesario mostrará un mensaje informativo. Por último indicar que se podrá utilizar el modo desantendido añadiendo el parámetro -u (--unattended):
Dado que mediante un fichero EPI tipo "mix" pueden combinarse paquetes de diversos tipos de paquetes con requerimientos distintos a la hora de descagar o consultar su estado es necesario establecer una serie de criterios para su utilización:
getStatus)
#START Android Studio Script, INTELLIJ
if [[ " ${PACKAGE_LIST[*]} " == *" androidstudio "* ]]; then
if [ -d $ANDROID_DEST"/android-studio" ];then
echo 0
else
echo 1
fi
else
echo "Not found"
;;
Ejemplo de getStatus incorrecto: getStatus)
if [[ " ${PACKAGE_LIST[*]} " == *" musescoref "* ]]; then
if flatpak list --app | grep org.musescore.MuseScore;then
echo 0
else
echo 1
fi
else
echo "Not found"
fi
;;
...
esac
echo "End script"
exit 0
En el ejemplo anterior si el paquete está instalado el echo que devuelve getStatus es la suma del echo de la instrucción flatpack list + 0 + "End script". Como consequencia EPI indicará que el paquete no esta instalado o que la instalación ha fallado.
Ejemplo getStatus corregido: getStatus)
if [[ " ${PACKAGE_LIST[*]} " == *" musescoref "* ]]; then
TEST=$(flatpak list --app | grep org.musescore.MuseScore)
if [[ $TEST ]]; then
echo 0
else
echo 1
fi
else
echo "Not found"
fi
;;
...
esac
exit 0
Para activar el modo debug cuando se ejecuta se utilizará el parámetro -d o --debug:
El parámetro no-check permite ejecutar EPI sin comprobar la conexión a internet o posibles bloqueos debidos a Apt,Dpkg o Lliurex-Up:
Se muestra a continuación unos ejemplos completos de ficheros EPI
{
"type":"file",
"pkg_list": [{"name":"telegram","key_store":"zero-lliurex-telegram"}],
"script": {"name":"/usr/share/zero-lliurex-telegram/telegram_script","remove":true,"getStatus":true,"download":true},
"required_x":true,
"required_root":true,
"zomado":"zero-lliurex-telegram"
}
{
"type":"apt",
"pkg_list": [{"name":"google-chrome-stable","key_store":"zero-lliurex-chrome","eula":"https://www.google.com/chrome/privacy/eula_text.html"}],
"repository": [{"url":"deb http://dl.google.com/linux/chrome/deb/ stable main","key_cmd":"wget -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key --keyring /tmp/epi_keyring add -"}],
"script": {"name":"/usr/share/zero-lliurex-chrome/chrome_script", "remove":true},
"zomando":"zero-lliurex-chrome",
"required_x":true
}
{
"type":"apt",
"pkg_list": [{"name":"rsc-alquimia"},{"name":"rsc-animals-vertebrats"},{"name":"rsc-caixademusica"},{"name":"rsc-cifras"},{"name":"rsc-ingles"},{"name":"rsc-jclics"},{"name":"rsc-matematicas3"},{"name":"rsc-primartis"},{"name":"rsc-ser-pensar-conviure-fer"},{"name":"rsc-simon"}],
"repository": [{"url":"deb http://ppa.launchpad.net/llxdev/recursos/ubuntu xenial main"}],
"script": {"name":"/usr/share/zero-lliurex-recursos/primary_script", "remove":true},
"selection_enabled":{"active":true,"all_selected":true},
"zomando":"zero-lliurex-recursos-pri"
}
{
"type":"mix",
"pkg_list": [{"name":"androidstudio","custom_name":"Android Studio tools for building apps on every type of Android device.","custom_icon":"androidstudio.png","type":"file","eula":"https://developer.android.com/studio/terms"},{"name":"atom","custom_name":"Atom Text Editor","custom_icon":"atom.png","type":"file"},{"name":"bluegriffon","custom_name":"Bluegriffon Web Editor","custom_icon":"bluegriffon.png","type":"apt"},{"name":"dia","custom_name":"Dia diagram creation program","custom_icon":"dia.png","type":"apt"},{"name":"eclipse","custom_name":"Eclipse integrated development environment","custom_icon":"eclipse.png","type":"file"},{"name":"git","type":"apt","custom_name":"Git Version Control System","custom_icon":"git.png"},{"name":"git-buildpackage","type":"apt","custom_name":"Git Build Package to generate Debian packages","custom_icon":"gitbpg.png"},{"name":"gitkraken","custom_name":"GitKraken Git client for linux","custom_icon":"gitkraken.png","version":{"all":"gitkraken-amd64.deb"},"url_download":"https://release.gitkraken.com/linux/","type":"deb"},{"name":"intellij","custom_name":"Intellij Commnity Edition is a integrated Development Environment","custom_icon":"intellij.png","type":"file"},{"name":"kazam","custom_name":"Kazam screencasting program","custom_icon":"kazam.png","type":"apt"},{"name":"minicom","custom_name":"Minicom serial communication program","custom_icon":"minicom.png","type":"apt"},{"name":"packet-tracer","custom_name":"Packet Tracer 7 software for simulating Cisco networking devices","custom_icon":"packettracer.png","version":{"all":"PacketTracer_730_amd64.deb"},"url_download":"https://archive.org/download/packettracer730mac_202002/","type":"deb"},{"name":"pgadmin4","custom_name":"pgAdmin 4 platform for administration and development PostgreSQL","custom_icon":"pgadmin4.png"},{"name":"pdfmod","custom_name":"Pdfmod application for modifying PDF documents","custom_icon":"pdfmod.png","type":"apt"},{"name":"remmina","custom_name":"Remmina remote desktop client","custom_icon":"remmina.png","type":"apt"},{"name":"virtualbox","type":"apt","custom_name":"VirtualBox virtualization program","custom_icon":"virtualbox.png"},{"name":"xmlcopyeditor","custom_name":"XML Copy Editor for validating XML","custom_icon":"xmlcopyeditor.png","type":"apt"}],
"repository": [{"url":"deb http://ppa.launchpad.net/remmina-ppa-team/remmina-next/ubuntu bionic main"},{"url":"deb https://packagecloud.io/AtomEditor/atom/any/ any main"}],
"script": {"name":"/usr/share/zero-fp-informatica/zero-fp-informatica_script", "remove":true,"download":true,"getStatus":true},
"zomando":"zero-fp-informatica",
"custom_icon_path":"/usr/share/zero-fp-informatica/",
"selection_enabled":{"active":true,"all_selected":false}
}
El script de instalacion es el encargado de indicar todas las acciones que se ejecutaran en las distintas fases que ejecuta EPI. Estas fases son las siguientes:
En cada una de las fases se llama el script entero pasandole como argumento la fase en la que se encuentra. Por esta razon se ha de hacer una comparacion del argumento que estamos recibiendo para ejecutar los pasos de instalacion o para realizar el paso de desinstalacion. Es importante que el script termine con exit 0 y en caso de que exista un error se salga del scritp con exit 1
#!/bin/bash
ACTION="$1"
PKG="$2"
USERHOME=$(getent passwd $USER | cut -f6 -d ':')
BINDIR=$USERHOME"/.local/bin"
DESTDIR=$BINDIR"/telegram"
DESTDOWNLOAD="/var/cache/epi-downloads"
DESTDESKTOP=$USERHOME"/.local/share/applications/zero-lliurex-telegram.desktop"
TCH_URL="https://desktop.telegram.org/changelog"
TVERSION=$(wget -qO- $TCH_URL | sed -e 's/<[^>]*>//g;/^\s*$/d' | grep -o 'v [0-9.]*' -m1 | cut -d ' ' -f2)
if [[ $(arch) == "x86_64" ]]
then
TSETUP="tsetup.${TVERSION}.tar.xz"
TURL="https://updates.tdesktop.com/tlinux/"
else
TSETUP="tsetup32.${TVERSION}.tar.xz"
TURL="https://updates.tdesktop.com/tlinux32/"
fi
case $ACTION in
getStatus)
case $PKG in
telegram)
if [ -d ${DESTDIR} ]; then
echo 0
else
echo 1
fi
;;
esac
;;
download)
cd ${DESTDOWNLOAD}
if [ -s ${DESTDOWNLOAD}"/"${TSETUP} ]
then
rm -f ${DESTDOWNLOAD}"/"${TSETUP}
fi
wget ${TURL}${TSETUP}
if ! [ -s ${DESTDOWNLOAD}"/"${TSETUP} ]
then
exit 1
fi
;;
installPackage)
if ! [ -d $DESTDIR ]
then
echo $DESTDIR
mkdir $DESTDIR
fi
echo "Unzipping file..."
FIRSTPWD=$PWD
cd $DESTDOWNLOAD
tar -Jxf $TSETUP -C $DESTDIR
USER_GR=$(id -g -n ${USER})
chown -R ${USER}:${USER_GR} $BINDIR
if [ $? -eq 0 ]
then
cd $FIRSTPWD
echo "Launching telegram..."
su $USER -c /usr/bin/telegram &
else
rm -r $DESTDIR
exit 1
fi
;;
remove)
echo "Removing files..."
if [ -d $DESTDIR ]
then
rm -rf $DESTDIR
fi
if [ -f $DESTDESKTOP ]
then
rm -f $DESTDESKTOP
fi
;;
esac
exit 0
Se muestra un ejemplo de script que permite desinstalar los paquetes que haya seleccionado el usuario. Las lista de paquetes seleccionados se recibe como un parámetro
#!/bin/bash
ACTION="$1"
shift
PACKAGE_LIST=$@
case $ACTION in
remove)
for ix in $PACKAGE_LIST
do
apt-get remove -y $ix
TEST=$( dpkg-query -s $ix 2> /dev/null| grep Status | cut -d " " -f 4 )
if [ "$TEST" == 'installed' ];then
exit 1
fi
done
;;
esac
exit 0
Se muestra un ejemplo de script que permite asociado a un epi tipo "mix"
#!/bin/bash
ACTION="$1"
shift
PACKAGE_LIST=$@
# START Define variables
DESTDOWNLOAD="/var/cache/epi-downloads"
ANDROID_STUDIO_URL="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.6.3.0/"
ANDROID_FILE="android-studio-ide-192.6392135-linux.tar.gz"
ANDROID_DEST="/opt"
ATOM_DEB="atom-amd64.deb"
ATOM_URL="https://atom.io/download/deb"
export PATH=$PATH:/snap/bin
# END Define Variables
case $ACTION in
getStatus)
#START Android Studio Script, INTELLIJ
if [[ " ${PACKAGE_LIST[*]} " == *" androidstudio "* ]]; then
if [ -d $ANDROID_DEST"/android-studio" ];then
echo 0
else
echo 1
fi
elif [[ " ${PACKAGE_LIST[*]} " == *" intellij "* ]]; then
if [[ $(snap list | grep "intellij") == *"intellij"* ]];then
echo 0
else
echo 1
fi
elif [[ " ${PACKAGE_LIST[*]} " == *" eclipse "* ]]; then
if [[ $(snap list | grep "eclipse") == *"eclipse"* ]];then
echo 0
else
echo 1
fi
#statements
else
echo "Not found"
fi
#END Android Studio Script, INTELLIJ
;;
download)
#START Android Studio Script
if [[ " ${PACKAGE_LIST[*]} " == *" androidstudio "* ]]; then
echo "Downloading......"
cd ${DESTDOWNLOAD}
if [ -s ${DESTDOWNLOAD}"/"${ANDROID_FILE} ]
then
rm -f ${DESTDOWNLOAD}"/"${ANDROID_FILE}
fi
wget ${ANDROID_STUDIO_URL}${ANDROID_FILE}
if ! [ -s ${DESTDOWNLOAD}"/"${ANDROID_FILE} ]
then
exit 1
fi
fi
#END Android Studio Script
#START Atom Script
if [[ " ${PACKAGE_LIST[*]} " == *" atom "* ]]; then
echo "Downloading ATOM ... please wait"
cd ${DESTDOWNLOAD}
if [ -s ${DESTDOWNLOAD}"/"${ATOM_DEB} ]
then
rm -f ${DESTDOWNLOAD}"/"${ATOM_DEB}
fi
wget -O ${ATOM_DEB} ${ATOM_URL}
if ! [ -s ${DESTDOWNLOAD}"/"${ATOM_DEB} ]
then
exit 1
fi
fi
#END Atom Script
;;
preInstall)
#START Android Studio Script
if [[ " ${PACKAGE_LIST[*]} " == *" androidstudio "* ]]; then
apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386 -y
fi
#END Android Studio Script
#START Intellij IDEA
if [[ " ${PACKAGE_LIST[*]} " == *" intellij "* ]]; then
apt-get install snapd snapd-xdg-open -y
fi
#END Intellij IDEA
#START Eclipse
if [[ " ${PACKAGE_LIST[*]} " == *" eclipse "* ]]; then
apt-get install default-jre -y
fi
#END Eclipse
#START Atom
if [[ " ${PACKAGE_LIST[*]} " == *" atom "* ]]; then
echo "****Installing atom plugins... please wait****"
apt install gdebi-core -y
echo " * * Finished * * "
fi
#END Atom
;;
installPackage)
#START Android Studio Script
if [[ " ${PACKAGE_LIST[*]} " == *" androidstudio "* ]]; then
cd $DESTDOWNLOAD
echo "Installing androidstudio... please wait"
tar -xvf $ANDROID_FILE -C $ANDROID_DEST
if [ $? -eq 0 ]
then
cd $ANDROID_DEST"/android-studio/bin"
echo "Launching androidstudio"
./studio.sh &
else
rm -f $ANDROID_DEST"/android-studio/bin"
exit 1
fi
echo " * * Finished * * "
fi
#END Android Studio Script
#START Intellij IDEA
if [[ " ${PACKAGE_LIST[*]} " == *" intellij "* ]]; then
echo "Installing intellij-idea-community... please wait"
snap install intellij-idea-community --classic --edge
echo " * * Finished * * "
fi
#END Intellij IDEA
#START Eclipse
if [[ " ${PACKAGE_LIST[*]} " == *" eclipse "* ]]; then
echo "Installing Eclipse... please wait"
snap install --classic eclipse
echo " * * Finished * * "
fi
#END Eclipse
#START Atom
if [[ " ${PACKAGE_LIST[*]} " == *" atom "* ]]; then
echo "****Installing atom plugins... please wait****"
gdebi ${DESTDOWNLOAD}"/"${ATOM_DEB} -n
echo " * * Finished * * "
fi
#END Atom
;;
postInstall)
#START Remmina
if [[ " ${PACKAGE_LIST[*]} " == *" remmina "* ]]; then
echo "Installing remmina plugins... please wait"
apt install remmina-plugin-rdp remmina-plugin-secret -y
echo " * * Finished * * "
fi
#END Remmina
;;
remove)
for ix in $PACKAGE_LIST
do
#START Android Studio Script
if [[ " $ix " == *" androidstudio "* ]]; then
echo "Removing files from Android Studio..."
if [ -d $ANDROID_DEST"/android-studio/" ]
then
rm -rf $ANDROID_DEST"/android-studio/"
fi
echo " * * Finished * * "
#END Android Studio Script
#START Intellij IDEA
elif [[ " $ix " == *" intellij "* ]]; then
echo "Uninstalling intellij-idea-community... please wait"
snap remove intellij-idea-community
echo " * * Finished * * "
#END Intellij IDEA
#START Eclipse
elif [[ " $ix " == *" eclipse "* ]]; then
echo "Uninstalling Eclipse... please wait"
snap remove eclipse
echo " * * Finished * * "
#END Eclipse
else
apt-get remove -y $ix
TEST=$( dpkg-query -s $ix 2> /dev/null| grep Status | cut -d " " -f 4 )
if [ "$TEST" == 'installed' ];then
exit 1
fi
echo " * * Finished * * "
fi
done
;;
esac
exit 0