Front-end para administração do Samba

Publicado por José Lima 30/09/2005

[ Hits: 8.438 ]

Download admsamba.sh




Front-end utilizando o XDialog para administração do Samba: usuários, grupos, computadores, scripts de login, homes dos usuários... completo.

  



Esconder código-fonte

#!/bin/sh

# Interface grafica para administracao de grupos e
# usuarios do samba utilizando o XDialog como ferramenta
# de desenvolvimento

# Criado por Jose Alves de Lima - ilsinho@ig.com.br - em 18/07/2005



# Funcoes especificas

##################################
#           MENSAGENS            #
##################################

################# Mensagem inicial
Mensagem_Inicial() {
Xdialog --title "Administração de Usuários - SAMBA"\
        --ok-label "Continuar"\
        --msgbox "Você poderá utilizar esta ferramenta para \n administração de grupos e usuários \n do Samba. Bom proveito. \n\n José Alves \n ilsinho@ig.com.br" 15 45

case $? in
    0) Menu_Inicial;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem finalizar
Mensagem_Finalizar() {
Xdialog --title "Finalizar Programa"\
        --ok-label "Finalizar"\
        --cancel-label "Não finalizar"\
        --yesno "\nTem certeza que deseja finalizar o programa?\n" 0 0

case $? in
    0) exit 0;;
    1) Menu_Inicial;;
    255) exit 0;;
esac
}


################# Mensagem - Grupo adicionado
Grupo_Adicionado() {
Xdialog --title "Grupo criado"\
        --msgbox "O grupo foi criado com sucesso." 10 45

case $? in
    0) Grupo_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Grupo removido
Grupo_Removido() {
Xdialog --title "Grupo removido"\
        --msgbox "O grupo foi removido com sucesso." 10 45

case $? in
    0) Grupo_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Grupo existente
Grupo_Existente() {
Xdialog --title "Grupo existente"\
        --msgbox "O grupo que você informou já existe." 10 45

case $? in
    0) Grupo_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Grupo inexistente
Grupo_Inexistente() {
Xdialog --title "Grupo inexistente"\
        --msgbox "O grupo que você informou não existe." 10 45

case $? in
    0) Grupo_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario adicionado
Usuario_Adicionado() {
Xdialog --title "Usuário criado"\
        --msgbox "O usuário foi cadastrado com sucesso. \n Criado pasta do usuário em /HOME. \n Cadastre uma senha para o usuário." 10 45

case $? in
    0) Usuario_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario removido
Usuario_Removido() {
Xdialog --title "Usuario removido"\
        --msgbox "O usuario foi removido com sucesso. \n Pasta pessoal do usuário em /HOME removida" 10 45

case $? in
    0) Usuario_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario existente
Usuario_Existente() {
Xdialog --title "Usuário existente"\
        --msgbox "O usuário que você informou já existe." 10 45

case $? in
    0) Usuario_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario inexistente
Usuario_Inexistente() {
Xdialog --title "Usuário inexistente"\
        --msgbox "O usuário que você informou não existe." 10 45

case $? in
    0) Usuario_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario grupo inexistente
UsuarioGrupo_Inexistente() {
Xdialog --title "Grupo inexistente"\
        --msgbox "O grupo que você informou não existe." 10 45

case $? in
    0) Usuario_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario login inexistente
UsuarioLogin_Inexistente() {
Xdialog --title "Login inexistente"\
        --msgbox "O login que você informou não existe." 10 45

case $? in
    0) Usuario_Login;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario senha alterado
UsuarioLogin_Alterado() {
Xdialog --title "Senha cadastrada/alterada"\
        --msgbox "A senha foi cadastrada/alterada com sucesso." 10 45

case $? in
    0) Usuario_Login;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Usuario senha errada
UsuarioLogin_SenhaErrada() {
Xdialog --title "Senhas diferentes"\
        --msgbox "A senha e a repetição \n da senha não coincidem. \n Por favor digite novamente." 10 45

case $? in
    0) Usuario_Login;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script individual adicionado
ScriptIndividual_Adicionado() {
Xdialog --title "Script adicionado"\
        --msgbox "O script foi adicionado com sucesso." 10 45

case $? in
    0) Script_Individual;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script individual - caminho inexistente
ScriptIndividual_CaminhoInexistente() {
Xdialog --title "Caminho inexistente"\
        --msgbox "O arquivo informado \n não existe em /HOME/NETLOGON." 10 45

case $? in
    0) Script_Individual;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script individual - usuario inexistente
ScriptIndividual_UsuarioInexistente() {
Xdialog --title "Usuário inexistente"\
        --msgbox "O login informado não existe." 10 45

case $? in
    0) Script_Individual;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script grupo adicionado
ScriptGrupo_Adicionado() {
Xdialog --title "Script adicionado"\
        --msgbox "O script foi adicionado com sucesso." 10 45

case $? in
    0) Script_Grupo;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script grupo - login inexistente
ScriptGrupo_LoginInexistente() {
Xdialog --title "Arquivo com login inexistente"\
        --msgbox "O arquivo de login informado \n não existe em /TMP." 10 45

case $? in
    0) Script_Grupo;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Script grupo - script inexistente
ScriptGrupo_ScriptInexistente() {
Xdialog --title "Script inexistente"\
        --msgbox "O arquivo de script informado \n não existe em /HOME/NETLOGON." 10 45

case $? in
    0) Script_Grupo;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Computador adicionado
Computador_Adicionado() {
Xdialog --title "Computador criado"\
        --msgbox "O computador foi adicionado com sucesso." 10 45

case $? in
    0) Computador_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Computador removido
Computador_Removido() {
Xdialog --title "Computador removido"\
        --msgbox "O computador foi removido com sucesso." 10 45

case $? in
    0) Computador_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Computador inexistente
Computador_Inexistente() {
Xdialog --title "Computador inexistente"\
        --msgbox "O computador que você informou não existe." 10 45

case $? in
    0) Computador_Remover;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Computador existente
Computador_Existente() {
Xdialog --title "Computador existente"\
        --msgbox "O computador que você informou já existe." 10 45

case $? in
    0) Computador_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}


################# Mensagem - Computador inexistente
ComputadorGrupo_Inexistente() {
Xdialog --title "Grupo inexistente"\
        --msgbox "O grupo que você informou não existe." 10 45

case $? in
    0) Computador_Adicionar;;
    255) Mensagem_Finalizar;;
esac
}





##################################
#            TAREFAS             #
##################################

################# Opcoes de trabalho iniciais
Menu_Inicial() {
Xdialog --title "Opções de Trabalho"\
        --ok-label "Continuar"\
        --cancel-label "Finalizar"\
        --menubox "\nEscolha uma opção de trabalho \n para administração de grupos e usuários do Samba:\n\n" 15 56 6 \
        "Grupo" "Administração de grupos de usuários do Samba"\
        "Usuário" "Administração de usuários do Samba"\
        "Computador" "Administração de computadores do Samba" 2> /tmp/menu.tmp.$$

opcao=$?
escolha=`cat /tmp/menu.tmp.$$`
rm -f /tmp/menu.tmp.$$

case $opcao in
    0) case $escolha in
            Grupo) Menu_Grupo;;
       Usuário) Menu_Usuario;;
            Computador) Menu_Computador;;
       esac;;
    1) Mensagem_Finalizar;;
    255) Mensagem_Finalizar;;
esac
}


##################
#     grupos     #
##################

################# Opções de trabalho - administracao de grupos
Menu_Grupo() {
Xdialog --title "Administração de Grupos"\
        --ok-label "Continuar"\
        --cancel-label "Menu anterior"\
        --menubox "\nEscolha uma opção de trabalho \n para administração de grupos do Samba:\n\n" 15 56 6 \
        "Listar" "Lista grupos do Samba"\
        "Adicionar" "Adiciona grupo ao Samba"\
        "Remover" "Remove grupo do Samba" 2> /tmp/menu.tmp.$$

opcao=$?
escolha=`cat /tmp/menu.tmp.$$`
rm -f /tmp/menu.tmp.$$

case $opcao in
    0) case $escolha in
            Listar) Grupo_Listar;;
       Adicionar) Grupo_Adicionar;;
            Remover) Grupo_Remover;;
       esac;;
    1) Menu_Inicial;;
    255) Mensagem_Finalizar;;
esac
}


################# Grupo - Listar grupos
Grupo_Listar() {

rm -f /tmp/grupos

cat /etc/group | grep 5[0-100] | awk -F: {'print $1'} | sort >> /tmp/grupos

Xdialog --title "Lista de Grupos"\
        --no-cancel\
        --tailbox "/tmp/grupos" 40 30

case $? in
    0) Menu_Grupo;;
    255) Mensagem_Finalizar;;
esac

}


################# Grupo - Adicionar grupo
Grupo_Adicionar() {
Xdialog --title "Novo Grupo"\
        --cancel-label "Menu anterior"\
        --inputbox "\nDigite o nome para o novo grupo. \n O nome do grupo deve ser uma única palavra \n e em letras minúsculas.\n\n" 13 45 2> /tmp/input.tmp.$$

opcao=$?
input=`cat /tmp/input.tmp.$$`
input_search=""$input\$""

rm -f /tmp/input.tmp.$$

case $opcao in
    0) NomeGrupo=`cat /etc/group | awk -F: {'print $1'} | grep "$input_search"`
       if [ -z $NomeGrupo ]; then
        groupadd $input;
             Grupo_Adicionado;
       else
             Grupo_Existente;
       fi;;
    1) Menu_Grupo;;
    255) Mensagem_Finalizar;;
esac
}


################# Grupo - Remover grupo
Grupo_Remover() {
Xdialog --title "Remover Grupo"\
        --cancel-label "Menu anterior"\
        --inputbox "\nDigite o nome do grupo que deve ser removido. \n\n ESTA AÇÃO NÃO PODERÁ SER DESFEITA.\n\n" 13 45 2> /tmp/input.tmp.$$

opcao=$?
input=`cat /tmp/input.tmp.$$`
input_search=""$input\$""

rm -f /tmp/input.tmp.$$

case $opcao in
    0) NomeGrupo=`cat /etc/group | awk -F: {'print $1'} | grep "$input_search"`
       if [ ! -z $NomeGrupo ]; then
             groupdel $input;
             Grupo_Removido;
       else
             Grupo_Inexistente;
       fi;;
    1) Menu_Grupo;;
    255) Mensagem_Finalizar;;
esac
}


##################
#    usuarios    #
##################

################# Opções de trabalho - administracao de usuarios
Menu_Usuario() {
Xdialog --title "Administração de Usuários"\
        --ok-label "Continuar"\
        --cancel-label "Menu anterior"\
        --menubox "\nEscolha uma opção de trabalho \n para administração de usuários do Samba:\n\n" 17 56 6 \
        "Listar" "Lista usuários do Samba"\
        "Adicionar" "Adiciona usuário ao Samba"\
        "Remover" "Remove usuário do Samba"\
        "Logon" "Definir script de logon para usuário"\
        "Senha" "Cadastra ou altera a senha no Samba" 2> /tmp/menu.tmp.$$

opcao=$?
escolha=`cat /tmp/menu.tmp.$$`

rm -f /tmp/menu.tmp.$$

case $opcao in
    0) case $escolha in
            Listar) Usuario_Listar;;
       Adicionar) Usuario_Adicionar;;
            Remover) Usuario_Remover;;
            Logon) Menu_Script;;
       Senha) Usuario_Login;;
       esac;;
    1) Menu_Inicial;;
    255) Mensagem_Finalizar;;
esac
}


################# Usuario - Listar usuario
Usuario_Listar() {

rm -f /tmp/usuarios

sed -e '/^#/d' /etc/samba/smbpasswd | awk -F: {'print $1'} | sed -e '/[$]/d' | sort >> /tmp/usuarios

Xdialog --title "Lista de Usuários"\
        --fixed-font\
        --no-cancel\
        --tailbox "/tmp/usuarios" 40 40

case $? in
    0) Menu_Usuario;;
    255) Mensagem_Finalizar;;
esac

}


################# Usuario - Adicionar usuario
Usuario_Adicionar() {

Xdialog --title "Novo Usuário"\
        --cancel-label "Menu anterior"\
        --3inputsbox "\nPara cadastrar um novo usuário \n digite os dados abaixo." 20 48 "Nome completo:" "" "Login:" "" "Grupo:" "" 2> /tmp/novousuario

opcao=$?
name=`cat /tmp/novousuario | awk -F/ {'print $1'}`
login=`cat /tmp/novousuario | awk -F/ {'print $2'}`
login_search=""$login\$""
group=`cat /tmp/novousuario | awk -F/ {'print $3'}`
group_search=""$group\$""

rm -f /tmp/novousuario

case $opcao in
    0) Usuario=`cat /etc/passwd | awk -F: {'print $1'} | grep "$login_search"`
       Grupo=`cat /etc/group | awk -F: {'print $1'} | grep "$group_search"`
       if [ -z $Usuario ]; then
          if [ ! -z $Grupo ]; then
              useradd -c "$name" -g $group -d /dev/null -s /bin/false $login;
         smbpasswd -a -n $login;
         mkdir /home/$login;
              chmod -R 700 /home/$login;
              chown -R $login:$group /home/$login;
         Usuario_Adicionado;
         rm -f /tmp/novousuario;
          else
              UsuarioGrupo_Inexistente
          fi
       else
          Usuario_Existente;
          rm -f /tmp/novousuario;
       fi;;
    1) Menu_Usuario;;
    255) Mensagem_Finalizar;;
esac
}


################# Usuario - Remover usuario
Usuario_Remover() {
Xdialog --title "Remover Usuário"\
        --cancel-label "Menu anterior"\
        --inputbox "\nDigite o login do usuario que deve ser removido. \n\n ESTA AÇÃO NÃO PODERÁ SER DESFEITA.\n\n" 13 45 2> /tmp/input.tmp.$$

opcao=$?
input=`cat /tmp/input.tmp.$$`
input_search=""$input\$""

rm -f /tmp/input.tmp.$$

case $opcao in
    0) Usuario=`cat /etc/samba/smbpasswd | awk -F: {'print $1'} | grep "$input_search"`
       if [ ! -z $Usuario ]; then
             smbpasswd -x $input;
             rm -fR /home/$input;
             rm -f /home/netlogon/$input.bat;
        userdel $input;
             Usuario_Removido;
       else
             Usuario_Inexistente;
       fi;;
    1) Menu_Usuario;;
    255) Mensagem_Finalizar;;
esac
}


################# Usuario - Cadastrar/Alterar Senha - Login
Usuario_Login() {

Xdialog --title "Usuário - Senha"\
        --cancel-label "Menu anterior"\
        --password\
        --password\
        --3inputsbox "\nPara cadastrar/alterar a senha do usuário \n digite os dados abaixo." 20 48 "Login:" "" "Senha:" "" "Repetição da senha:" "" 2> /tmp/senha

opcao=$?
login=`cat /tmp/senha | awk -F/ {'print $1'}`
login_search=""$login\$""
password_one=`cat /tmp/senha | awk -F/ {'print $2'}`
password_two=`cat /tmp/senha | awk -F/ {'print $3'}`

rm -f /tmp/senha

case $opcao in
    0) Usuario=`cat /etc/samba/smbpasswd | awk -F: {'print $1'} | grep "$login_search"`
       if [ ! -z $Usuario ]; then
        if [ "$password_one" = "$password_two" ]; then
                   ( echo $password_one ; echo $password_two ) | smbpasswd -s $login;
                   UsuarioLogin_Alterado;
             else
                   UsuarioLogin_SenhaErrada;
             fi
       else
             UsuarioLogin_Inexistente;
       fi;;
    1) Menu_Usuario;;
    255) Mensagem_Finalizar;;
esac
}


##########################
#    usuarios - script   #
##########################

################# Opções de trabalho - usuarios
Menu_Script() {
Xdialog --title "Script de logon"\
        --ok-label "Continuar"\
        --cancel-label "Menu anterior"\
        --menubox "\nEscolha uma opção de trabalho \n para definir o script de logon para usuários do Samba:\n\n" 17 56 6 \
        "Individual" "Atribui script para um único usuário"\
        "Grupo" "Atribui script para grupos de usuários" 2> /tmp/menu.tmp.$$

opcao=$?
escolha=`cat /tmp/menu.tmp.$$`

rm -f /tmp/menu.tmp.$$

case $opcao in
    0) case $escolha in
            Individual) Script_Individual;;
       Grupo) Script_Grupo;;
       esac;;
    1) Menu_Usuario;;
    255) Mensagem_Finalizar;;
esac
}


################# Script - individual
Script_Individual() {

Xdialog --title "Script individual"\
        --cancel-label "Menu anterior"\
        --2inputsbox "\nPara designar um script de logon \n a um usuário digite abaixo." 18 48 "Login do usuário:" "" "Arquivo de script \n (deve estar em /home/netlogon):" "" 2> /tmp/script

opcao=$?
login=`cat /tmp/script | awk -F/ {'print $1'}`
login_search=""$login\$""
file=`cat /tmp/script | awk -F/ {'print $2'}`

rm -f /tmp/script

case $opcao in
    0) Usuario=`cat /etc/passwd | awk -F: {'print $1'} | grep -e "$login_search"`
       if [ ! -z $Usuario ]; then
          if [ -r /home/netlogon/$file ]; then
              cp -f /home/netlogon/$file /home/netlogon/$login.bat
         ScriptIndividual_Adicionado;
          else
              ScriptIndividual_CaminhoInexistente
          fi
       else
          ScriptIndividual_UsuarioInexistente;
       fi;;
    1) Menu_Script;;
    255) Mensagem_Finalizar;;
esac
}


################# Script - grupo
Script_Grupo() {

Xdialog --title "Script individual"\
        --cancel-label "Menu anterior"\
        --2inputsbox "\nPara designar um script de logon \n a um grupo de usuários digite abaixo." 18 48 "Arquivo com login \n (deve estar em /tmp):" "" "Arquivo de script \n (deve estar em /home/netlogon):" "" 2> /tmp/script

opcao=$?
fileLogin=`cat /tmp/script | awk -F/ {'print $1'}`
fileScript=`cat /tmp/script | awk -F/ {'print $2'}`

rm -f /tmp/script

case $opcao in
    0) if [ -r /home/netlogon/$fileScript ]; then
          if [ -r /tmp/$fileLogin ]; then
             for login in `cat /tmp/$fileLogin` ; do
                login_search=""$login\$""
                Usuario=`cat /etc/passwd | awk -F: {'print $1'} | grep -e "$login_search"`
                if [ ! -z $Usuario ]; then
                   cp -f /home/netlogon/$fileScript /home/netlogon/$login.bat
                fi
             done
             ScriptGrupo_Adicionado
          else
             ScriptGrupo_LoginInexistente
          fi
       else
          ScriptGrupo_ScriptInexistente
       fi;;
    1) Menu_Script;;
    255) Mensagem_Finalizar;;
esac
}



##################
#  computadores  #
##################

################# Opções de trabalho - administracao de computadores
Menu_Computador() {
Xdialog --title "Administração de Computadores"\
        --ok-label "Continuar"\
        --cancel-label "Menu anterior"\
        --menubox "\nEscolha uma opção de trabalho \n para administração de usuários do Samba:\n\n" 15 56 6 \
        "Listar" "Lista computadores do Samba"\
        "Adicionar" "Adiciona computador ao Samba"\
        "Remover" "Remove computador do Samba" 2> /tmp/menu.tmp.$$

opcao=$?
escolha=`cat /tmp/menu.tmp.$$`

rm -f /tmp/menu.tmp.$$

case $opcao in
    0) case $escolha in
            Listar) Computador_Listar;;
       Adicionar) Computador_Adicionar;;
            Remover) Computador_Remover;;
       esac;;
    1) Menu_Inicial;;
    255) Mensagem_Finalizar;;
esac
}


################# Computador - Listar computador
Computador_Listar() {

rm -f /tmp/computadores

sed -e '/^#/d' /etc/samba/smbpasswd | awk -F: {'print $1'} | sed -n '/\$/p' | sort >> /tmp/computadores

Xdialog --title "Lista de Computadores"\
        --fixed-font\
        --no-cancel\
        --tailbox "/tmp/computadores" 40 40

case $? in
    0) Menu_Computador;;
    255) Mensagem_Finalizar;;
esac

}


################# Computador - Adicionar computador
Computador_Adicionar() {

Xdialog --title "Novo Computador"\
        --cancel-label "Menu anterior"\
        --3inputsbox "\nPara cadastrar um novo computador \n digite os dados abaixo." 18 48 "Computador:" "" "Comentário:" "" "Grupo:" "" 2> /tmp/novocomputador

opcao=$?
computer=`cat /tmp/novocomputador | awk -F/ {'print $1'}`
computer_search=""$computer\$""
comment=`cat /tmp/novocomputador | awk -F/ {'print $2'}`
group=`cat /tmp/novocomputador | awk -F/ {'print $3'}`
group_search=""$group\$""

rm -f /tmp/novocomputador

case $opcao in
    0) Computador=`cat /etc/passwd | awk -F: {'print $1'} | grep -e "$computer_search"`
       Grupo=`cat /etc/group | awk -F: {'print $1'} | grep -e "$group_search"`
       if [ -z $Computador ]; then
          if [ ! -z $Grupo ]; then
              useradd -c "$comment" -g $group -d /dev/null -s /bin/false $computer$;
         smbpasswd -a -m $computer;
         Computador_Adicionado;
         rm -f /tmp/novocomputador;
          else
              ComputadorGrupo_Inexistente
          fi
       else
          Computador_Existente;
          rm -f /tmp/novocomputador;
       fi;;
    1) Menu_Computador;;
    255) Mensagem_Finalizar;;
esac
}


################# Computador - Remover computador
Computador_Remover() {
Xdialog --title "Remover Computador"\
        --cancel-label "Menu anterior"\
        --inputbox "\nDigite o nome do computador que deve ser removido. \n\n ESTA AÇÃO NÃO PODERÁ SER DESFEITA.\n\n" 13 45 2> /tmp/input.tmp.$$

opcao=$?
input=`cat /tmp/input.tmp.$$`
input_search=""$input\$""

rm -f /tmp/input.tmp.$$

case $opcao in
    0) Computador=`cat /etc/samba/smbpasswd | awk -F: {'print $1'} | grep -e "$input_search"`
       if [ ! -z $Computador ]; then
             smbpasswd -x $input;
        userdel $input;
             Computador_Removido;
       else
             Computador_Inexistente;
       fi;;
    1) Menu_Computador;;
    255) Mensagem_Finalizar;;
esac
}


Mensagem_Inicial;

Scripts recomendados

ORACLE 10.2g - Fazendo Restore

SwapFile - swap dinâmico

syncnow - sincronizar diretórios com servidor local

Reconexão automática para internet ADSL

Cluster beowulf


  

Comentários
[1] Comentário enviado por removido em 13/06/2007 - 10:08h

como usar?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts