AvoConnect poggia le sue basi su un file di funzioni che serve a fare funzionare le sue app e manipolare i file di sistema.
isroot () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: isroot
#Descrizione: Verifica se sei root oppure no
#Parametri:
#Richiede:
#Restituisce: Esce se non sei root
#fine_info_per_la_documentazione
if [ "$EUID" -ne 0 ]
then
echo "Questo script va eseguito come root "
exit 1
else
echo "Bene , sei root"
ISROOT="YES"
fi
}
isuser () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: isuser
#Descrizione: Verifica se sei non sei root
#Parametri:
#Richiede:
#Restituisce: Esce se sei root
#fine_info_per_la_documentazione
if (whoami != root)
then
echo "Non sei utente root"
ISUSER="YES"
else
echo "Non puoi eseguire questo script da root"
exit 1
fi
}
issudo () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: issudo
#Descrizione: verifica se sei nei sudoers
#Parametri:
#Richiede:
#Restituisce: Esce se non sei un sudoers
#fine_info_per_la_documentazione
if sudo -vn 2> /dev/null; then
echo "Bene, sei nei sudoers"
ISSUDO="YES"
else
echo "Non hai i permessi necessari per eseguire questo script"
exit 1
fi
}
isconnected () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: isconnected
#Descrizione: Verifica se sei collegato a internet
#Parametri:
#Richiede:
#Restituisce: Esce se non sei collegato a internet
#fine_info_per_la_documentazione
wget -q --spider https://www.avoconnect.itisavogadro.org/
if [ $? -eq 0 ]; then
echo "Bene, siamo online"
ISCONNECTED="YES"
else
echo "Sembra che non sei collegato a internet, correggi e riprova"
exit 1
fi
}
logga () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: logga
#Descrizione: Scrive nei log qualcosa, se sono root lo fa su $WORKINGFOLDER/log/install.log, altrimenti su /home/$utente/.log/install.log.
manda anche il messaggio a schermo tramite zenity.
#Parametri: messaggio
#Richiede: un messaggio da loggare
#Restituisce: scrittura e output zenity
#fine_info_per_la_documentazione
DATAEVENTO=`date +"%Y-%m-%d %H:%M:%S"`
if (( $EUID == 0 )); then
utente="root"
echo -e "$DATAEVENTO -- $1" >> $WORKINGFOLDER/log/install.log
# notify-send -i "/usr/AvoScript/img/avologo.png" -t 1300 "$1"
else
utente=$(whoami)
mkdir -p /home/$utente/.log/
touch /home/$utente/.log/install.log
echo -e "$DATAEVENTO -- $1" >> /home/$utente/.log/install.log
fi
zenity --info --text="$1" --timeout 2 --title="AvoScript $utente" --width="300"
}
dimmi () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: dimmi
#Descrizione: manda un messaggio a schermo tramite zenity.
#Parametri: messaggio
#Richiede: un messaggio da inviare
#Restituisce: output zenity
#fine_info_per_la_documentazione
DATAEVENTO=`date +"%Y-%m-%d %H:%M:%S"`
# notify-send -i "/usr/AvoScript/img/avologo.png" -t 1300 "$1"
zenity --info --text="*** $1 ***" --timeout 2 --title="AvoScript" --width="400"
}
loggauser () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: DEPRECATO
#Nome: loggauser
#Descrizione: integrato in logga
#Parametri: messaggio
#Richiede: un messaggio da loggare
#Restituisce: output su file
#fine_info_per_la_documentazione
DATAEVENTO=`date +"%Y-%m-%d %H:%M:%S"`
echo -e "$DATAEVENTO -- $1" >> $LOGUSERFILE
echo -e "$DATAEVENT -- $1"
notify-send -i "/usr/AvoScript/img/avologo.png" -t 1300 "$1"
}
escape_su_sed() {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: escape_su_sed
#Descrizione: Funzione di appoggio richiamata da scrivi_cfg leggi_cfg cancella_cfg esiste_cfg
#Parametri:
#Richiede: il testo da manipolare
#Restituisce: il testo pronto per essere usato nella scittura
#fine_info_per_la_documentazione
sed -e 's/[]\/$*.^[]/\\&/g'
}
scrivi_cfg() { # path, key, value
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: scrivi_cfg
#Descrizione: Scrive su $1 sulla chiave $2 il valore $3
#Parametri: File Chiave Valore
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
cancella_cfg "$1" "$2"
echo "$2=$3" >> "$1"
}
leggi_cfg() { # path, key -> value
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: leggi_cfg
#Descrizione: Legge su $1 sulla chiave $2
#Parametri: File Chiave Valore
#Richiede:
#Restituisce: Valore chiave
#fine_info_per_la_documentazione
test -f "$1" && grep "^$(echo "$2" | escape_su_sed)=" "$1" | sed "s/^$(echo "$2" | escape_su_sed)=//" | tail -1
}
cancella_cfg() { # path, key
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: cancella_cfg
#Descrizione: cancella su $1 la chiave $2
#Parametri: File Chiave Valore
#Richiede:
#Restituisce: cancella la voce
#fine_info_per_la_documentazione
test -f "$1" && sed -i "/^$(echo $2 | escape_su_sed).*$/d" "$1"
}
esiste_cfg() { # path, key
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Stabile
#Nome: esiste_cfg
#Descrizione: cancella su $1 la chiave $2
#Parametri: File Chiave
#Richiede:
#Restituisce: verifica l'esistenza di una voce
#fine_info_per_la_documentazione
test -f "$1" && grep "^$(echo "$2" | escape_su_sed)=" "$1" > /dev/null
}
installa () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Beta
#Nome: installa
#Descrizione: la funzione verifica guarda se una cosa è già stata fatta $1 è il comando e se $2 è "F" forzo l'esecuzione anche se gia fatto, se N è normale
#Parametri: pacchetto.deb
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
PACCHETTO=$1
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $PACCHETTO|grep "install ok installed")
echo Checking for $PACCHETTO: $PKG_OK
if [ "" = "$PKG_OK" ]; then
sudo apt-get --yes install $PACCHETTO
DATAEVENTO=`date +"%Y-%m-%d %H:%M:%S"`
logga "**** $1 installato"
else
logga "$1 già installato"
fi
}
verifica () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Beta da finire
#Nome: verifica
#Descrizione: verifica se un comando è gia stato eseguito, per ora controlla solo le operazioni di root utile ad esempio per non mettere repo piu volte
#Parametri: comando
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
LOGFILE="$WORKINGFOLDER/log/install.log"
DATAEVENTO=`date +"%Y-%m-%d %H:%M:%S"`
touch $LOGFILE
count=$(grep -o "$1" $LOGFILE | wc -l)
if [ $count != 0 ];then
if [ $2 = "F" ]; then
echo $DATAEVENTO -- ***$2*** $1 >> $LOGFILE
$1
fi
if [ $2 = "N" ]; then
echo "Comando gia eseguito ($count volte)"
fi
else
echo $DATAEVENTO -- $1 >> $LOGFILE
$1
fi
}
trovatesto () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: stabile
#Nome: installa
#Descrizione: cerca una occorrenza nei file di log
#Parametri: testo da cercare
#Richiede: voce da cercare
#Restituisce:vai posto a S o N
#fine_info_per_la_documentazione
# verifica se nel file di log c'è una occorrenza , se si pone la variabile "vai" a "S" , "N"
LOGFILE="$WORKINGFOLDER/log/install.log"
count=$(grep -o "$1" $LOGFILE | wc -l)
if [ $count != 0 ];then
export vai="N"
else
export vai="S"
fi
}
cancella () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Beta
#Nome: cancella
#Descrizione: Cancella un file o una cartella, se esiste e se può farlo.
#Parametri: file o cartella da cancellare
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
if [ -f "$1" ]; then
if [ -w "$1" ]
then
rm $1
logga "Rimosso $1"
else
logga "Non posso rimuovere $1"
fi
fi
if [ -d "$1" ]; then
if [ -w "$1" ]
then
rm -rf $1
logga "Rimosso $1 (cartella)"
else
logga "Non posso rimuovere $1 (cartella)"
fi
fi
}
autostart () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: Beta
#Nome: autostart
#Descrizione: Mette in autostart qualcosa a livello user
#Parametri: utente nome_app path_binario
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
notify-send -i "/usr/AvoScript/img/avologo.png" -t 700 "$1"
if [ -n "$3" ]; then
DIRH="/home/$1/"
if [ -d "$DIRH" ]; then
logga " creazione autostart per utente $1 e app $3 : utente esistente"
DIRA="$DIRH.config/autostart/"
if [ -d "$DIRA" ]; then
logga " creazione autostart per utente $1 e app $3 : abbiamo autostart in $1"
else mkdir $DIRA
chown $1 $DIRA
chgrp $1 $DIRA
fi
echo -e "[Desktop Entry]\nName=$2\nComment=$2\nExec=$3\nType=Application\nTerminal=false\nHidden=false"> $DIRA$2.desktop
chmod +x $DIRA$2.desktop
chmod 744 $DIRA$2.desktop
chown $1 $DIRA$2.desktop
chgrp $1 $DIRA$2.desktop
logga " creazione autostart per utente $1 e app $3 : creato $DIRA$2.desktop"
else
logga " creazione autostart per utente $1 e app $3 : NON Creato $DIRA$2.desktop "
fi
else
logga " Devi lanciare la funzione per creare autostart con tre parametri : utente nome e percorso_applicazione "
fi
}
linkmenu () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: No
#Stato: da finire
#Nome: linkmenu
#Descrizione: crea i link nella gui
#Parametri:
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
if [ -z "$1" ]
then
echo "uso : linkmenu Name Exec (Icon) (Isolate (S-N)) (autostart (S-N))"
exit 0
fi
name=$1
if [ -z "$2" ]
then
echo "uso : linkmenu Name Exec (Icon) (Isolate (S-N)) (autostart (S-N))"
exit 0
fi
exec=$2
if [ -z "$3" ]
then
icon="/usr/AvoScript/img/avologo.png"
else
icon=$4
fi
if [ -z "$4" ]
then
isolate="N"
else
isolate=$4
fi
if [ -z "$5" ]
then
autostart="N"
else
autostart=$5
fi
# settato tutto
# creo il file
FILE="$name.desktop"
if test -f "$FILE"; then
rm $FILE
fi
echo $FILE
logga "$FILE"
echo "[Desktop Entry]">$FILE
scrivi_cfg "$FILE" "Version" "`date +"%Y-%m-%d %H:%M:%S"`"
scrivi_cfg "$FILE" "Name" "$name"
scrivi_cfg "$FILE" "Comment" "$name by Avoscript"
scrivi_cfg "$FILE" "Exec" "$exec"
scrivi_cfg "$FILE" "Terminal" "False"
scrivi_cfg "$FILE" "Type" "Application"
scrivi_cfg "$FILE" "Icon" "$icon"
scrivi_cfg "$FILE" "Categories" "Avogadro"
scrivi_cfg "$FILE" "StartupNotify" "True"
chmod +x $FILE
}
scarica () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: da finire
#Nome: scarica
#Descrizione: Scarica una app dal repo Avoconnect
#Parametri:
#Richiede: nome app da scaricare (la cartella)
#Restituisce:
#fine_info_per_la_documentazione
isconnected
isroot
if [ -d "$WORKINGFOLDER/bin/scripts" ]; then
echo "OK"
else
mkdir $WORKINGFOLDER/bin/scripts
fi
rm -rf $WORKINGFOLDER/bin/scripts/$1
mkdir $WORKINGFOLDER/bin/scripts/$1
mkdir $WORKINGFOLDER/bin/scripts/$1/files
for robe in label.txt man.sh post.sh pre.sh remove.sh run.sh version
do
wget -q -O $WORKINGFOLDER/bin/scripts/$1/$robe $SERVERPATH/apps/items/$1/$robe
chmod +x $WORKINGFOLDER/bin/scripts/$1/$robe
done
logga "Scaricato $1"
unset $1
}
createrminal() {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: finito
#Nome: createrminal
#Descrizione: Configura le connessioni rdp della rete amministrativa
#Parametri:
#Richiede: se passo l'username lo fa per quello, altrimenti chiede
#Restituisce:
#fine_info_per_la_documentazione
if [ -n "$1" ]; then
userterminal=$1
else
userterminal=$(zenity --entry --title="Creo Terminal" --text="quale utente deve avere il terminal ?")
fi
if id -u "$userterminal" >/dev/null 2>&1; then
echo 'utente esiste'
else
echo 'utente non esiste , esco'
exit 1
fi
Posizione=$(pwd)
Cartella=`date +"%s"`
mkdir $Posizione/$Cartella
cd $Posizione/$Cartella
if [ $? -eq 0 ]; then
SERVERPATH=$(leggi_cfg "$WORKINGFOLDER/etc/AvoScript.conf" "SERVERPATH")
wget -O listats.txt $SERVERPATH/apps/items/Amministrativa/files/listaterminal.txt
wget -O default.remmina $SERVERPATH/apps/items/Amministrativa/files/ts.remmina
cat listats.txt | while read terminalutente
do
logga "$terminalutente per $userterminal"
PATHCONFREMMINA="/home/$userterminal/.local/share/remmina"
if [ -d "$PATHCONFREMMINA" ]; then
### Take action if $DIR exists ###
echo "Trovata la cartella di configurazione remmina per $userterminal"
else
logga "La cartella di configurazione remmina per $userterminal non esiste, la creo"
mkdir -p $PATHCONFREMMINA
chown $userterminal $PATHCONFREMMINA
chgrp $userterminal $PATHCONFREMMINA
fi
nomets=$(echo $terminalutente |sed s/[.]/-/g)
nomets="Terminal_$nomets"
nomets="$nomets.remmina"
cp default.remmina $nomets
ipsource=$(hostname -I)
scrivi_cfg $nomets server $terminalutente
scrivi_cfg $nomets username $userterminal
scrivi_cfg $nomets group Amministrativa
scrivi_cfg $nomets clientname $ipsource
scrivi_cfg $nomets name RDP_$terminalutente
chown $userterminal $nomets
chgrp $userterminal $nomets
chmod +x $nomets
if [[ -f "$PATHCONFREMMINA/$nomets" ]]; then
rm $PATHCONFREMMINA/$nomets
fi
cp $nomets $PATHCONFREMMINA/.
done
fi
cd $Posizione
rm -rf $Posizione/$Cartella
}
sistemalauncher() {
#sistemo plank che è in /home/$utente/.config/plank/dock1
if [ "$*" == "" ]; then
echo "uso: sistemalauncher [nomeapp]"
exit 1
fi
Posizione=$(pwd)
Cartella=`date +"%s"`
mkdir $Posizione/$Cartella
cd $Posizione/$Cartella
if [[ $EUID -ne 0 ]]
then
echo "Non sono root"
whoami > utenti.txt
else
echo "Sono root"
getent passwd {1000..6000} | awk -F: '{ print $1}' > utenti.txt
fi
FILEL=/usr/share/applications/$1.desktop
if [ -f "$FILEL" ]; then
echo "$FILEL esiste."
else
echo "$FILEL does non esiste, esco."
cd $Posizione
rm -rf $Posizione/$Cartella
exit 1
fi
TIPOINSTALLAZIONE=$(leggi_cfg "$WORKINGFOLDER/etc/AvoScript.conf" "TIPOINSTALLAZIONE")
echo "[PlankDockItemPreferences]" > $1.dockitem
scrivi_cfg $1.dockitem Launcher file:///usr/share/applications/$1.desktop
cat utenti.txt | while read line
do
destpath=/home/$line/.config/plank/dock1/launchers
dest=/home/$line/.config/plank/dock1/launchers/$1.dockitem
if [ -f "$dest" ]; then
rm $dest
fi
echo "cp $1.dockitem $destpath/."
cp $1.dockitem $destpath/.
chown $line $dest
echo "chown $line $dest"
logga "Creato $1 sul launcher per $line"
done
cd $Posizione
rm -rf $Posizione/$Cartella
}
settatipo () {
#info_per_la_documentazione Non rimuovere le linee di commento sottostanti
#Pubblicato: Si
#Stato: finito
#Nome: settatipo
#Descrizione: Imposta il tipo di installazione (amministrativa ... laboratorio informatica ...)
#Parametri:
#Richiede:
#Restituisce:
#fine_info_per_la_documentazione
if [ -z "$1" ]
then
TIPOINSTALLAZIONE=$(leggi_cfg "$WORKINGFOLDER/etc/AvoScript.conf" "TIPOINSTALLAZIONE")
if [ -z "$TIPOINSTALLAZIONE" ]
then
STICA=$(zenity --list \
--title="Scegli il tipo di installazione (una sola)" \
--column="Valore" --column="Descrizione" \
AMMINISTRATIVA "Per i pc della rete amministrativa" \
LABORATORIO "Uso nei laboratori didattici" \
PERSONALE "Come personal computer" \
GENERIC "Impostazione di default" \
DEVELOPER "Per fare esperimenti e sviluppare nuove funzioni" \
CHIOSCO "Postazione pubblica" )
dimmi "Hai scelto $STICA"
scrivi_cfg $WORKINGFOLDER/etc/AvoScript.conf TIPOINSTALLAZIONE $STICA
else
if zenity --question --text="Tipo installazione $TIPOINSTALLAZIONE : Vuoi cambiare?"
then
STICA=$(zenity --list \
--title="Scegli il tipo di installazione (una sola)" \
--column="Valore" --column="Descrizione" \
AMMINISTRATIVA "Per i pc della rete amministrativa" \
LABORATORIO "Uso nei laboratori didattici" \
PERSONALE "Come personal computer" \
GENERIC "Impostazione di default" \
DEVELOPER "Per fare esperimenti e sviluppare nuove funzioni" \
CHIOSCO "Postazione pubblica" )
dimmi "Hai scelto $STICA"
scrivi_cfg $WORKINGFOLDER/etc/AvoScript.conf TIPOINSTALLAZIONE $STICA
fi
TIPOINSTALLAZIONE=$(leggi_cfg "$WORKINGFOLDER/etc/AvoScript.conf" "TIPOINSTALLAZIONE")
logga "Abbiamo impostato il tipo di installazione a $TIPOINSTALLAZIONE"
fi
else
scrivi_cfg $WORKINGFOLDER/etc/AvoScript.conf TIPOINSTALLAZIONE $1
TIPOINSTALLAZIONE=$(leggi_cfg "$WORKINGFOLDER/etc/AvoScript.conf" "TIPOINSTALLAZIONE")
logga "Abbiamo impostato il tipo di installazione a $TIPOINSTALLAZIONE"
fi
}