EPI

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.

Formato de fichero epi

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 .

Claves del fichero

Instalación de ficheros epi mediante terminal

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
		

Consultar la lista de ficheros epi instalables mediante EPIC

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

Consulta de la información sobre un fichero EPI mediante EPIC

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

Instalación/Desinstalación de fichero EPI con lista de paquetes mediante EPIC

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):

Consideraciones para utilizar un fichero EPI tipo "mix"

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:

Utilización del modo debug en EPI

Para activar el modo debug cuando se ejecuta se utilizará el parámetro -d o --debug:

Utilización del parámetro no-check en EPI

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:

Formato del fichero EPI

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}
	}

Example

Formato del script de instalacion

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

Example

#!/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

Example

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

Example

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