segunda-feira, 14 de outubro de 2024

Webex com LXC

O Webex parou de funcionar no Ubuntu 22.04 quando eu atualizei o kernel e continuou dando problema quando fiz o upgrade para 24.04.

Ele inicia e até chega a rodar por uns minutos, mas acaba por encerrar sem dar nenhuma explicação. A comunicação não é mesmo o forte dele, porque ele não funciona no root, mas não indica nenhum motivo.

Sem muita esperança, resolvi experimentar rodar dentro de um contêiner LXC.

Vamos ao básico: instalar o LXD.


sudo snap install lxd
sudp lxd init

O init vai fazer um monte de perguntas. As respostas default servem.

Como vai ser preciso usar o X11 do hospedeiro, é preciso criar um profile. Primeiro, cria-se um arquivo gui.txt com essas configurações:


config:
  environment.DISPLAY: :0
  environment.PULSE_SERVER: unix:/home/ubuntu/pulse-native
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
  user.user-data: |
    #cloud-config
    runcmd: 
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
    write_files:
      - owner: root:root
        permissions: '0644'
        append: true
        content: |
          PULSE_SERVER=unix:/home/ubuntu/pulse-native
        path: /etc/environment
description: GUI LXD profile
devices:
  PASocket1:
    bind: container
    connect: unix:/run/user/1000/pulse/native
    listen: unix:/home/ubuntu/pulse-native
    security.gid: "1000"
    security.uid: "1000"
    uid: "1000"
    gid: "1000"
    mode: "0777"
    type: proxy
  X0:
    bind: container
    connect: unix:@/tmp/.X11-unix/X1
    listen: unix:@/tmp/.X11-unix/X0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
  mygpu:
    type: gpu
name: x11
used_by: []

Com isso, podemos criar um profile e, finalmente, um contêiner (como root):


lxc profile create gui
cat gui.txt | lxc profile edit gui
lxc launch --profile default --profile gui ubuntu:22.04 jammy

Jammy vai ser o nome do nosso contêiner. Pode ser que o launch falhe inicialmente, mas o start o coloca de pé novamente:


lxc start jammy

Agora temos que criar um user, copiar o Webex.deb para dentro do contêiner, instalar e, finalmente, rodar:


xhost +
sudo lxc file push Webex.deb jammy/
sudo lxc exec jammy bash
# dentro do contêiner
cd /
apt install /Webex.deb
adduser armando
su armando
# como armando
/opt/Webex/bin/CiscoCollabHost %U

Como o usuário armando foi criado depois, precisamos pegar o seu id e editar algumas linhas no profile para que o áudio funcione. Como é o primeiro usuário criado, ele ficou com o id 1001.


name: gui
description: GUI LXD profile
config:
  environment.DISPLAY: :0
  environment.PULSE_SERVER: unix:/home/armando/pulse-native
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
  user.user-data: |
    #cloud-config
    runcmd:
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
    write_files:
      - owner: root:root
        permissions: '0644'
        append: true
        content: |
          PULSE_SERVER=unix:/home/armando/pulse-native
        path: /etc/environment
devices:
  PASocket1:
    bind: container
    connect: unix:/run/user/1000/pulse/native
    gid: "1001"
    listen: unix:/home/armando/pulse-native
    mode: "0777"
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
    uid: "1001"
  X0:
    bind: container
    connect: unix:@/tmp/.X11-unix/X1
    listen: unix:@/tmp/.X11-unix/X0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
  mygpu:
    type: gpu
used_by:
- /1.0/instances/jammy


Após editar o profile, é preciso parar e iniciar novamente o contêiner.


sudo lxc profile edit gui
sudo lxc stop jammy
sudo lxc start jammy

E com isso pode-se quebrar um galho enquanto a Cisco não atualiza o software.

segunda-feira, 7 de outubro de 2024

Migração de uma Instância de Oracle Apex

O Apex é uma ferramenta low-code muito interessante e conveniente. Infelizmente, é oferecida pela Oracle.

Como tudo é que é produzido pela empresa, ela oferece muitas facilidades para os programadores, mas é deficiente na administração.

Por algum motivo misterioso, ou talvez simplesmente fruto da complexidade desnecessária que a Oracle julga interessante aplicar a tudo, não é possível usar o Data Pump para exportar e importar os schemas do Apex.

O zip de instalação oferece um par de classes para exportar partes do Apex: oracle.apex.APEXExport.class e oracle.apex.APEXExportSplitter.class

Ele oferece várias opções, mas não uma maneira de exportar tudo de uma vez e, o mais curioso, não oferece uma maneira de exportar as configurações da instância. É preciso exportar primeiro os workspaces e então as aplicações:


java -cp .:ojdbc8.jar oracle.apex.APEXExport  \
  -db mydb.mycompany.com:1521/apex.mydb.mycompany.com \
  -user system \
  -password hard2crack \
  -expWorkspace

java -cp .:ojdbc8.jar oracle.apex.APEXExport  \
  -db mydb.mycompany.com:1521/apex.mydb.mycompany.com \
  -user system \
  -password hard2crack \
  -instance
  

Isso vai gerar um arquivo w123.sql para cada workspace e um arquivo f123.sql para cada aplicação.

Enquanto isso, recomendo guardar cópias das páginas de configuração da instância.

Então, no servidor destino, é preciso rodar uns comandos.

Em primeiro lugar, se já existe uma instância do Apex, é preciso remover todos os workspaces antes de carregar os novos:


begin
  -- Verifique os ids das aplicações a serem exportadas
  for w in (select * from  apex_workspaces where workspace_id>1000) loop
    APEX_INSTANCE_ADMIN.REMOVE_WORKSPACE(p_workspace=>w.workspace);  
  end loop;
end;

Depois, pode-se carregar os workspaces e as aplicações:


. ./mynewdb.env

ls -1a  w*sql | xargs -I{} sqlplus / as sysdba @{}
ls -1a  f*sql | xargs -I{} sqlplus / as sysdba @{}

Conforme o tamanho de sua instância, isso pode demorar.

Como nem as menores coisas da Oracle estão livre de bugs, problemas, e poréns, a configuração de autenticações com Web Credentials, não funciona e o campo client-id não foi copiado.


update wwv_credentials
set client_id='my-id'
where client_id is null

Como prêmio final, os nomes das aplicações saíram com erro de codificação e precisaram ser corrigidos manualmente.