Uso das funções plot() e plot3d() do Scilab a partir de terminal LTSP

scilab-plot-ltsp

 

Trata-se do mal funcionamento das funções plot() e plot3d() do Scilab, quando utilizadas a partir de terminal thinclient LTSP executando imagem do S.O. Ubuntu 14.04 para se conectar em servidor LTSP executando S.O. Ubuntu 14.04 com ambiente gráfico Gnome ou Xfce.

As funções plot() e plot3d() do Scilab funcionam se a opção LDM_DIRECTX for definida para “False” no arquivo /var/lib/tftpboot/ltsp/i386/lts.conf (este arquivo reside no servidor LTSP ou no servidor de boot, no caso do projeto LTSP-Cluster). Entretanto, esta alteração habilita a encriptação na comunicação do terminal com o servidor LTSP, comprometendo o desempenho da sessão de área de trabalho remota como um todo e exigindo maior poder de processamento do terminal leve, que é bastante limitado.

O fato é que, independente do valor, se a variável de ambiente LIBGL_ALWAYS_INDIRECT for definida durante o início da sessão do usuário, as funções plot() e plot3d() do Scilab não funcionam. Além disso, essa variável de ambiente é definida somente se a opção LDM_DIRECTX estiver definida como “True” no arquivo /var/lib/tftpboot/ltsp/i386/lts.conf.

Para manter a opção LDM_DIRECTX habilitada, garantindo a performance da sessão de área de trabalho remota, e não definir a variável de ambiente LIBGL_ALWAYS_INDIRECT, se faz necessário alterar um dos scripts de início de sessão do LTSP, garantindo que a variável de ambiente LIBGL_ALWAYS_INDIRECT não seja definida e a função plot() do Scilab funcione.

  • Versão original do script /usr/share/ldm/rc.d/X51-opengl presente na imagem entregue aos terminais leves:
# Force indirect rendering when using LDM_DIRECTX so we have some working GL by default
if boolean_is_true "$LDM_DIRECTX" && ! boolean_is_true "$LTSP_FATCLIENT"; then
   CLIENT_ENV="$CLIENT_ENV LIBGL_ALWAYS_INDIRECT=true"
fi
  • Alteração proposta no script /usr/share/ldm/rc.d/X51-opengl:
# Force indirect rendering when using LDM_DIRECTX so we have some working GL by default
if boolean_is_true "$LDM_DIRECTX" && ! boolean_is_true "$LTSP_FATCLIENT"; then
   CLIENT_ENV="$CLIENT_ENV"
fi

Configurando container no OpenVZ 7 como Servidor de Aplicação do LTSP-Cluster

# Configurando container no OpenVZ 7 como
# Servidor de Aplicação do LTSP-Cluster

# Listando Templates OS EZ para Containers
vzpkg list -O

# Criando Container:
prlctl create CT2 --vmtype ct --ostemplate ubuntu-14.04-x86_64

# Listing Virtual Machines and Containers 
prlctl list -a

# Configuring Main VSwap Parameters
prlctl set CT2 --memsize 12G --swappages 6G

# Increasing Disk Capacity
prl_disk_tool resize --hdd \
/vz/private/d9068bc5-085f-47b0-87d3-f82574575eaa/root.hdd --size 30G

# Listing Virtual Networks
prlsrvctl net list

# Creating Virtual Networks
prlsrvctl net add Bridged

# Configuring Virtual Network Parameters
prlsrvctl net set Bridged -t bridged --ifname eno1 \
-d "This is now a bridged virtual network"

# Connecting Virtual Networks to Adapters
prlsrvctl net set Bridged -i eno1

# Creating and Deleting veth Network Adapters
prlctl set CT2 --netif_add netif2

# Configuring veth Adapter Parameters
prlctl set CT2 --ifname netif2 --ipadd 10.6.0.219/22
prlctl set CT2 --ifname netif2 --dhcp no
prlctl set CT2 --ifname netif2 --nameserver 10.6.0.98,192.168.1.4
prlctl set CT2 --ifname netif2 --gw 10.6.0.1

# Connecting Containers to Virtual Networks
prlctl set CT2 --ifname netif2 --network Bridged

# Container tunig
# You need to make a character device named /dev/fuse 
# and grant your container permissions to it 
vzctl set CT2 --devnodes fuse:rw --save

# Configurando servidor de aplicação do LTSP-Cluster no
# container CT2 previamente criado
prlctl enter CT2
apt-get update
apt-get upgrade
apt-get install ubuntu-gnome-desktop ltsp-server \
ltsp-cluster-lbagent ltsp-cluster-accountmanager
apt-get install gnome-session-flashback ltspfs
apt-get remove --purge gnome-screensaver compiz
apt-get autoremove && apt-get autoclean
update-rc.d -f nbd-server remove
update-rc.d -f gdm remove
update-rc.d -f bluetooth remove
update-rc.d -f pulseaudio remove
chown root.fuse /dev/fuse
chmod 660 /dev/fuse
mkdir -p /home/ltsp-cluster-accountmanager

vim /etc/ltsp/accountmanager.conf
# Início d conteúdo do arquivo
# /etc/ltsp/accountmanager.conf
port=8001
autologin_root=/home/ltsp-cluster-accountmanager/
autologin_uidmin=1003000
autologin_uidmax=1003100
autologin_groups=autologin,fuse,audio,video
key=PUT-A-KEY-HERE
# Final do conteúdo do arquivo
# /etc/xdg/autostart/pulseaudio-module-suspend-on-idle.desktop

service ltsp-cluster-accountmanager restart

vim /etc/xdg/autostart/pulseaudio-module-suspend-on-idle.desktop
# Início do conteúdo do arquivo
# /etc/xdg/autostart/pulseaudio-module-suspend-on-idle.desktop
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=PulseAudio Session Management
Comment=Load module-suspend-on-idle into PulseAudio
Exec=pactl load-module module-suspend-on-idle
Terminal=false
Type=Application
Categories=
GenericName=
# Final do conteúdo do arquivo
# /etc/xdg/autostart/pulseaudio-module-suspend-on-idle.desktop

Deploy de aplicação Django em ambiente de produção baseado no Debian 8

Passo 1: Instalar o servidor HTTP Apache, o módulo adaptador WSGI Python para Apache e a interface Python para MySQL.

# apt-get install apache2 libapache2-mod-wsgi python-mysqldb

Passo 2: Instalar o pip (sistema de gerenciamento de pacotes escritos em Python).

~# wget https://bootstrap.pypa.io/get-pip.py
~# python get-pip.py

Passo 3: Instalar o Django e verificar versão.

# pip install django
# python -m django --version
1.10.4

Passo 4: Criar um projeto.

/home# django-admin startproject projeto

Passo 5: Editar /home/projeto/projeto/settings.py.

#Autorizar servidor a utilizar a aplicação Django
ALLOWED_HOSTS = ['ip_do_servidor_web']
...
...
#Configurar a funcionalidade de banco de dados da API do Django (utilizado SGBD MySQL neste exemplo)
DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'banco',
                'USER': 'usuario',
                'PASSWORD': 'senha',
                'HOST': 'ip_do_servidor_mysql',
                'PORT': '3306',
                'OPTIONS': {
                        'init_command': 'SET default_storage_engine=INNODB',
                        'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
                }
        }
}

Passo 6: Sincronizar modelo e banco de dados.

/home/projeto# python manage.py migrate

Passo 7: Criar /etc/apache2/conf-available/projeto.conf com o conteúdo abaixo.

WSGIScriptAlias / /home/projeto/projeto/wsgi.py
WSGIPythonPath /home/projeto

<Directory /home/projeto/projeto>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Passo 8: Editar /etc/apache2/conf-available/projeto.conf e incluir configuração para servir conteúdo estático utilizado pela aplicação de administração do Django.

Alias /static/ /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/

<Directory /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static>
Require all granted
</Directory>

WSGIScriptAlias / /home/projeto/projeto/wsgi.py
WSGIPythonPath /home/projeto

<Directory /home/projeto/projeto>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Passo 9: Criar link simbólico, dentro do diretório definido como document root do VirtualHost (/var/www/html), para os arquivos estáticos da interface de administração do Django que residem no diretório (django/contrib/admin/static/admin) da distribuição Django.

/var/www/html# ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/ admin

Passo 10: Habilitar configuração do projeto e reiniciar Apache.

/etc/apache2/conf-available# a2enconf projeto
# /etc/init.d/apache2 restart

Modificando arquivo de imagem customizada do Windows com o DISM

Montando e checando integridade:
C:\Windows\system32\Dism.exe /Mount-Image /ImageFile:{caminho do arquivo de imagem .wim} /index:{índice da imagem a ser modificada} /CheckIntegrity /MountDir:{caminho do diretório para montagem da imagem}

Definindo identificação de edição e chave do produto:
C:\Windows\system32\Dism.exe /Image:{caminho do diretório de montagem da imagem} /Set-Edition:ServerStandardEval /Set-ProductKey:XC9B7-NBPP2-83J2H-RHMBY-92BT4

Desmontando e salvando alterações:
C:\Windows\system32\Dism.exe /Unmount-Image /MountDir:{caminho do diretório de montagem da imagem} /commit

Autologin em Host de Sessão de Área de Trabalho Remota Microsoft a partir de terminal LTSP

No LTSP (Linux Terminal Server Project), uma das formas de configurar o início automático de sessão no serviço de terminal da Microsoft a partir dos terminais leves usando o cliente xfreerdp v1.0.2 é associar o endereço MAC dos terminais LTSP a contas de usuário existentes na base de dados de autenticação utilizada pelo serviço de terminal alvo do acesso remoto. Esta associação deve ser declarada no arquivo de configuração /var/lib/tftpboot/ltsp/i386/lts.conf, conforme exemplo a seguir.

[rdp]
#End IP do servidor de área de trabalho remota da Microsoft
RDP_SERVER="x.y.z.w"

#MAC XX:XX:XX:XX:XX:XX associado à conta user1
[XX:XX:XX:XX:XX:XX]
LIKE=rdp
RDP_OPTIONS="-f --disable-full-window-drag --disable-theming --disable-wallpaper --disable-menu-animations --no-auth --no-nla --ignore-certificate -u 'domain\user1' -p 'asdf' --plugin rdpsnd --data alsa -- --plugin drdynvc --data tsmf audin -- --plugin rdpdr --data disk:usbdisk:/media/usb -- "

O script shell a seguir realiza a associação de uma lista de endereços MAC (arquivo contendo um MAC por linha recebido como argumento no terminal) a contas de usuário existentes na base de dados de autenticação utilizada pelo serviço de terminal alvo do acesso remoto.

#!/bin/bash
USERSEQ=0
PREFIXO="lab2"
while IFS='' read -r line || [[ -n "$line" ]]; do
    USERSEQ=$(expr $USERSEQ + 1)
    echo "[$line]"
    echo "LIKE=rdp"
    if [ "$USERSEQ" -lt 10 ]
    then
        echo "RDP_OPTIONS=\"-f --disable-full-window-drag --disable-theming --disable-wallpaper --disable-menu-animations --no-auth --no-nla --ignore-certificate -u 'dominio\\$PREFIXO"0"$USERSEQ' -p 'asdfg' --plugin rdpsnd --data alsa -- --plugin drdynvc --data tsmf audin -- --plugin rdpdr --data disk:usbdisk:/media/usb -- \""
    else
        echo "RDP_OPTIONS=\"-f --disable-full-window-drag --disable-theming --disable-wallpaper --disable-menu-animations --no-auth --no-nla --ignore-certificate -u 'dominio\\$PREFIXO$USERSEQ' -p 'asdfg' --plugin rdpsnd --data alsa -- --plugin drdynvc --data tsmf audin -- --plugin rdpdr --data disk:usbdisk:/media/usb -- \""
    fi
    echo " "
done < "$1"

A saída do script acima deve ser inserida no arquivo de configuração /var/lib/tftpboot/ltsp/i386/lts.conf para autorizar o início automático de sessão.

#Saída do script para arquivo de entrada contendo 44 endereços MAC:
[18:A9:05:34:75:F9]
LIKE=rdp
RDP_OPTIONS="-f --disable-full-window-drag --disable-theming --disable-wallpaper --disable-menu-animations --no-auth --no-nla --ignore-certificate -u 'dominio\lab201' -p 'asdfg' --plugin rdpsnd --data alsa -- --plugin drdynvc --data tsmf audin -- --plugin rdpdr --data disk:usbdisk:/media/usb -- "
...
..
.
[D8:D3:85:6D:C5:FA]
LIKE=rdp
RDP_OPTIONS="-f --disable-full-window-drag --disable-theming --disable-wallpaper --disable-menu-animations --no-auth --no-nla --ignore-certificate -u 'dominio\lab244' -p 'asdfg' --plugin rdpsnd --data alsa -- --plugin drdynvc --data tsmf audin -- --plugin rdpdr --data disk:usbdisk:/media/usb -- "


Criando contas de usuário em massa no samba 4

Recentemente precisei criar 185 contas de usuário no Samba 4 (com o papel de Active Directory Domain Controller) e percebi que não seria muito prático realizar esta tarefa utilizando o RSAT (Remote Server Administration Tools) a partir da minha estação de trabalho Windows, pois teria que repetir o procedimento de criação de usuário diversas vezes a partir do ambiente gráfico utilizando o snap-in Usuários e Computadores do Active Directory.

O script shell a seguir acelerou o processo de criação das contas de usuário.

#!/bin/bash

#Sequencial utilizado na designação de cada conta
USERSEQ=0

#Identificação da sala/laboratório
PREFIXO=lab2

#Quantidade de contas a serem criadas
NUMTERMINAIS=46
while [ $USERSEQ -lt $NUMTERMINAIS ]
do
    USERSEQ=$(expr $USERSEQ + 1)
    if [ "$USERSEQ" -lt 10 ]
    then
        USER=$PREFIXO"0"$USERSEQ
        samba-tool user add $USER asdfg
    else
        USER=$PREFIXO"$USERSEQ"
        samba-tool user add $USER asdfg
    fi
    echo " "
done

Como resultado da execução do script, serão criadas 46 contas de usuário, todas com a senha asdfg, sendo a primeira lab201 e a última lab246.

Criando snapshotting de container OpenVZ

Fontes:

Segue abaixo trecho retirado do manual do OpenVZ relacionado ao assunto.

Snapshotting

Snapshotting is a feature based on checkpointing and ploop shapshots. It allows to save a complete state of container file system. Plus, if the container is running, it’s in-memory state (as in checkpointing). Note that snapshot functionality is only working for containers on ploop device.

snapshot CTID [--id uuid] [--name name] [--description desc]
[--skip-suspend] [--skip-config]

Creates a container snapshot, i.e. saves the current container state, including its file system state, running processes state, and configuration file.

If a container is running, and --skip-suspend option is not specified, a container is checkpointed and then restored, and CT memory dump becomes the part of snapshot.

Unless --skip-config option is given, container configuration file is saved to the snapshot.

If uuid is not specified, it is auto-generated. Options --name and --description can be used to specify the snapshot name and description, respectively. Name is displayed by snapshot-list.

snapshot-switch CTID [--skip-resume | --must-resume] [--skip-config] --id uuid

Switches the container to a snapshot identified by uuid, restoring its file system state, configuration (if available) and its running state (if available).

Note that the current state of a container (including its file system state and its configuration file) is lost!

Option --skip-resume is used to ignore a CT memory dump file in a snapshot, as a result the container will end up being in a stopped state (same as if a snapshot has been taken with --skip-suspend).

If option --must-resume is set, absense of a memory dump is treated as an error, and the inability to restore from the memory dump is treated as an error rather than warning.

Option option --skip-config is used to ignore the CT configuration file in a snapshot, i.e. the current configuration file will be left as is.

snapshot-delete CTID --id uuid

Removes a specified snapshot.

snapshot-mount CTID --id uuid --target directory

Mounts a snapshot specified by uuid to a directory. Note this mount is read-only.

snapshot-umount CTID --id uuid

Unmounts a specified snapshot.
snapshot-list CTID [-H] [-o field[,field...] [--id uuid]

List container’s snapshots.

You can suppress displaying header using -H option.

You can use the -o option to display only the specified field(s). List of available fields can be obtained using -L option.