Boa tarde,
Estou a mais de três semanas tentando resolver dois problemas no qual não acho a solução, gostaria da ajuda de todos se possível.
PRIMEIRO PROBLEMA
Existe uma forma de adaptar este script para ele não perder os agendamentos anteriores?
if [ "`crontab -l | grep 'change_wallpapers.sh'`" ]; then
echo "Agendamento ja foi criado..."
else
CHECKLIST=$(ls /home|cut -d: -f2);
LISTUSER=/tmp/list_users.txt
echo $CHECKLIST|sed 's/ /\n/g' > $LISTUSER
while read USER
do
cat <<- EOF > cron.jobs
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
DISPLAY=:0
HOME=/home/${USER}
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# Agendamento para troca de papel de parade.
*/15 * * * * /home/${USER}/.scripts/bin/change_wallpapers.sh
EOF
cat cron.jobs|crontab -u $USER -
echo -e "Agendamento do usuario \033[1;33m${USER}\033[0m criado com sucesso..............................(\033[0;32m OK \033[0m)"
echo -e ""
done < $LISTUSER
fi
SEGUNDO PROBLEMA
O script não quer funcionar no agendamentos de todos usuários comum, mais ele funciona caso seja executando via terminal logado na sua área de trabalho. já com super usuário o agendamento funciona, andei pesquisando no google sobre o problema, achei varias dicas como export DISPLAY=:0 e muitos outro, mais nao obtive sucesso, li que tinha haver com DBUS, mais tb não consegui nada, por favor alguém pode ajudar?, preciso implementar esta solução em um parque de 750 maquina com Linux Mint Cinnamon 18.2.
#!/bin/bash
# Obitendo o usuario real
RUID=$(who | awk 'FNR == 1 {print $1}')
# Traduzir o nome de usuário real para o ID do usuário real
RUSER_UID=$(id -u ${RUID})
# Definir o papel de parede de uma lista
LIST="001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg 009.jpg 010.jpg 011.jpg 012.jpg 013.jpg 014.jpg"
# Local de armazenamento dos papeis de parede
BASE="file:///home/${USER}/.wallpapers/"
# O papel de parede atual
current=`gsettings get org.cinnamon.desktop.background picture-uri`
opacity=`gsettings get org.cinnamon.desktop.background picture-opacity`
options=`gsettings get org.cinnamon.desktop.background picture-options`
# Percorrer a lista até encontrarmos o fim
matched=0
new=""
for wp in $LIST
do
if [ $matched -eq 1 ]
then
new="${BASE}${wp}"
break
elif [ "'${BASE}${wp}'" = "${current}" ]
then
matched=1
fi
done
# if "$new" is blank, then we show the first shot
if [ "$new" = "" ]
then
new=${BASE}${LIST%% *}
fi
# Definir o papel de parede
gsettings set org.cinnamon.desktop.background picture-uri \'${new}\'
gsettings set org.cinnamon.desktop.background picture-opacity ${opacity}
gsettings set org.cinnamon.desktop.background picture-options ${options}
SCRIPT COMPLETO
#####################################################################
#!/bin/bash
# Autor: Erik P. Ghijs <[email protected]>
# Script simples que criar agendamento para todos usuários no sistema.
# PATH local
PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin
export PATH
#
if [ "`crontab -l | grep 'change_wallpapers.sh'`" ]; then
echo "Agendamento ja foi criado..."
else
CHECKLIST=$(ls /home|cut -d: -f2);
LISTUSER=/tmp/list_users.txt
echo $CHECKLIST|sed 's/ /\n/g' > $LISTUSER
while read USER
do
cat <<- EOF > cron.jobs
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
DISPLAY=:0
HOME=/home/${USER}
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# Agendamento para troca de papel de parade.
*/15 * * * * /home/${USER}/.scripts/bin/change_wallpapers.sh
EOF
cat cron.jobs|crontab -u $USER -
echo -e "Agendamento do usuario \033[1;33m${USER}\033[0m criado com sucesso..............................(\033[0;32m OK \033[0m)"
echo -e ""
done < $LISTUSER
fi
########################################################################
#### Criando infraestrutura para script ./change_wallpapers.sh ####
########################################################################
while read USER
do
if [ -e /home/$USER/.scripts/bin/change_wallpapers.sh ]
then {
echo -e "O script change_wallpapers.sh já existe...........................................................(\033[0;32m OK \033[0m)"
echo -e ""
}
else {
echo -e "Criando a estrutura do script \033[1;37mchange_wallpapers.sh\033[0m ...............................................(\033[0;32m STATUS \033[0m)"
echo -e ""
mkdir -p /home/$USER/.scripts/bin
echo -e 'Diretorio \033[1;37m".scripts/bin"\033[0m criado com sucesso.......................................................(\033[0;32m OK \033[0m)'
echo -e ""
chmod -R 775 /home/$USER/.scripts
echo -e 'Permissao 755 no diretorio \033[1;37m".scripts"\033[0m trocad com sucesso..........................................(\033[0;32m OK \033[0m)'
echo -e ""
chmod -R 755 /home/$USER/.scripts/bin
echo -e 'Permissao 755 no diretorio \033[1;37m".scripts/bin"\033[0m trocad com sucesso......................................(\033[0;32m OK \033[0m)'
echo -e ""
chown -c -R $USER:$USER /home/$USER/.scripts > /dev/null 2>&1
echo -e 'Certado usuario e grupo da pasta \033[1;37m".scripts"\033[0m.......................................................(\033[0;32m OK \033[0m)'
echo -e ""
cd /home/$USER/.scripts/bin
echo -e 'Dentro da pasta \033[1;37m".scripts/bin"\033[0m....................................................................(\033[0;32m OK \033[0m)'
echo -e ""
touch change_wallpapers.sh
echo -e 'Arquivo \033[1;37m"change_wallpapers.sh"\033[0m criado com sucesso.................................................(\033[0;32m OK \033[0m)'
echo -e ""
chmod +x change_wallpapers.sh
echo -e 'Permissao de execucao do arquivo \033[1;37m"change_wallpapers.sh"\033[0m trocada com sucesso.......................(\033[0;32m OK \033[0m)'
echo -e ""
chown $USER:$USER change_wallpapers.sh > /dev/null 2>&1
echo -e 'Certado usuario e grupo do arquivo \033[1;37m"change_wallpapers.sh"\033[0m trocada com sucesso.....................(\033[0;32m OK \033[0m)'
echo -e ""
cat <<"EOF" > change_wallpapers.sh
#!/bin/bash
# Obitendo o usuario real
RUID=$(who | awk 'FNR == 1 {print $1}')
# Traduzir o nome de usuário real para o ID do usuário real
RUSER_UID=$(id -u ${RUID})
# Definir o papel de parede de uma lista
LIST="001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg 009.jpg 010.jpg 011.jpg 012.jpg 013.jpg 014.jpg"
# Local de armazenamento dos papeis de parede
BASE="file:///home/${USER}/.wallpapers/"
# O papel de parede atual
current=`gsettings get org.cinnamon.desktop.background picture-uri`
opacity=`gsettings get org.cinnamon.desktop.background picture-opacity`
options=`gsettings get org.cinnamon.desktop.background picture-options`
# Percorrer a lista até encontrarmos o fim
matched=0
new=""
for wp in $LIST
do
if [ $matched -eq 1 ]
then
new="${BASE}${wp}"
break
elif [ "'${BASE}${wp}'" = "${current}" ]
then
matched=1
fi
done
# if "$new" is blank, then we show the first shot
if [ "$new" = "" ]
then
new=${BASE}${LIST%% *}
fi
# Definir o papel de parede
gsettings set org.cinnamon.desktop.background picture-uri \'${new}\'
gsettings set org.cinnamon.desktop.background picture-opacity ${opacity}
gsettings set org.cinnamon.desktop.background picture-options ${options}
############################## Fim Script ##############################
EOF
#sed -i '12i\BASE="file:///home/${USER}/.wallpapers/"' change_wallpapers.sh
}
fi
echo -e 'Codigo trasnferido para o script \033[1;37m"change_wallpapers.sh"\033[0m...........................................(\033[0;32m OK \033[0m)'
echo -e ""
done < $LISTUSER
########################################################################
#### Criando mapeamento da pasta wallpapers para usuario local. ####
########################################################################
touch /root/.smbcredentials
chmod 600 /root/.smbcredentials
cat <<"EOF" > /root/.smbcredentials
username=wallpaper
password=R@py#!1234
EOF
echo -e 'Arquivo \033[1;37m".smbcredentials"\033[0m criado com sucesso......................................................(\033[0;32m OK \033[0m)'
echo -e ""
# Backup do fstab
cp /etc/fstab /etc/fstab.original
echo -e "Copia de segurança realizada com sucesso, do arquivo fstab........................................(\033[0;32m OK \033[0m)"
echo -e ""
# Onde:
# //192.168.0.10/myfolder - /fileserver/pastacompartilhada;
# /mnt/minhapasta/ - ponto de montagem;
# cifs - tipo de sistema de arquivos;
# credentials - apontamento para arquivo com credenciais;
# iocharset - converte nomes de caminho locais para formato específico;
# sec - é o modo de segurança e determina como as senhas são criptografadas entre servidor e cliente.
# dir_mode - Se o servidor não suporta extensões CIFS Unix, sobrepõe o modo padrão para esse diretório. No caso 777, que dá permissão de leitura, escrita e gravação para todos;
# file_mode - Se o servidor não suporta a extensão CIFS, irá sobrescrever o arquivo para esse modo, no caso 777.
#
# Ex1.:
# //192.168.0.10/myfolder /mnt/minhapasta/ cifs credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm 0 0
#
# Ex2.:
# //192.168.0.250/backup /mnt/backup cifs credentials=/root/pwd.txt,user,dir_mode=0777,file_mode=0777 0 0
# Consultando /etc/fstab para criar o mapeamento via rede.
if [ "`grep -n cifs /etc/fstab`" ]; then
echo -e 'Já exister a linha no arquivo "fstab".'
else
cat << "EOF" >> /etc/fstab
#
# SMB protocol version. Allowed values are:
# 1.0 - The classic CIFS/SMBv1 protocol. This is the default.
# 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008.
# 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2.
# 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012.
#
# Mapeamento local via CIFS
//10.1.8.200/wallpapers /mnt/cifs_wallpapers/ cifs credentials=/root/.smbcredentials,iocharset=utf8,vers=2.0 0 0
EOF
echo -e "Linha de mapeamento criada com sucesso............................................................(\033[0;32m OK \033[0m)"
echo -e ""
fi
# Mapeamento local para compartilhamento dos arquivos wallpapers.
mkdir /mnt/cifs_wallpapers
echo -e 'Diretorio \033[1;37m"cifs_wallpapers"\033[0m criado com sucesso....................................................(\033[0;32m OK \033[0m)'
echo -e ""
# Criando link sinbolico nos perfis local
while read USER
do
if [ -h /home/$USER/.wallpapers ];
then
echo -e "Link sinbolico já exister.........................................................................(\033[0;32m OK \033[0m)"
echo -e ""
else
ln -s /mnt/cifs_wallpapers /home/$USER/.wallpapers
echo -e "Link sinbolico criado com sucesso.................................................................(\033[0;32m OK \033[0m)"
echo -e ""
fi
done < $LISTUSER
echo -e "Link criado com sucesso...........................................................................(\033[0;32m OK \033[0m)"
echo -e ""
# Removendo lista de usuarios
rm $LISTUSER
echo -e "Lista de usuario removido com sucesso.............................................................(\033[0;32m OK \033[0m)"
echo -e ""