Auteur/autrice : bastien

Radioamateur & sportif.

Recherche de vulnérabilités sous DEBIAN.

Si vous utilisez l’OS DEBIAN, il existe un outil très pratique pour cela, il s’agit de Debsecan.

Voyons voir comment l’utiliser, on commence par installer l’outil :

root@crx-sec01 / # apt-get install debsecan
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  debsecan
0 upgraded, 1 newly installed, 0 to remove and 25 not upgraded.
Need to get 33.2 kB of archives.
After this operation, 112 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main amd64 debsecan all 0.4.20.1 [33.2 kB]
Fetched 33.2 kB in 0s (688 kB/s)
Preconfiguring packages ...
Selecting previously unselected package debsecan.
(Reading database ... 63992 files and directories currently installed.)
Preparing to unpack .../debsecan_0.4.20.1_all.deb ...
Unpacking debsecan (0.4.20.1) ...
Setting up debsecan (0.4.20.1) ...
setup debsecan

Suivant la distribution on va adapter le nom de la suite :

Debian 11 (Bullseye)
Debian 10 (buster)
Debian 9 (stretch)
Debian 8 (jessie)
Debian 7 (wheezy)
Debian 6.0 (squeeze)

Ensuite on lance un scan :

root@crx-sec01 / # debsecan --suite bullseye
CVE-2021-3447 ansible
CVE-2022-2795 bind9
CVE-2022-2881 bind9
CVE-2022-3080 bind9
CVE-2022-38177 bind9
CVE-2022-38178 bind9
CVE-2022-2795 bind9-dnsutils
CVE-2022-2881 bind9-dnsutils
CVE-2022-3080 bind9-dnsutils
CVE-2022-38177 bind9-dnsutils
CVE-2022-38178 bind9-dnsutils
CVE-2022-2795 bind9-host
CVE-2022-2881 bind9-host
CVE-2022-3080 bind9-host
CVE-2022-38177 bind9-host
CVE-2022-38178 bind9-host
CVE-2022-2795 bind9-libs
CVE-2022-2881 bind9-libs
CVE-2022-3080 bind9-libs
CVE-2022-38177 bind9-libs
CVE-2022-38178 bind9-libs
CVE-2022-2795 bind9-utils
CVE-2022-2881 bind9-utils
CVE-2022-3080 bind9-utils
CVE-2022-38177 bind9-utils
CVE-2022-38178 bind9-utils
CVE-2016-2781 coreutils (low urgency)
CVE-2021-38185 cpio
CVE-2022-35252 curl (fixed)
CVE-2022-2795 dnsutils
CVE-2022-2881 dnsutils
CVE-2022-3080 dnsutils
CVE-2022-38177 dnsutils
CVE-2022-38178 dnsutils
CVE-2022-1664 dpkg (fixed)
CVE-2022-1304 e2fsprogs
CVE-2018-12886 gcc-8-base
CVE-2019-15847 gcc-8-base
CVE-2016-1585 libapparmor1 (low urgency)
..... 

Et voilà !   on obtient la liste des vulnérabilités du système, truc pratique on peut obtenir un affichage détaillé :

root@crx-sec01 / # debsecan --suite bullseye --format detail
...
CVE-2022-24919
  An authenticated user can create a link with reflected Javascript code ...
  installed: zabbix-agent 1:5.0.8+dfsg-1
             (built from zabbix 1:5.0.8+dfsg-1)
  fixed in unstable: zabbix 1:6.0.7+dfsg-2 (source package)
  fixed on branch:   zabbix 1:3.0.32+dfsg-0+deb9u3 (source package)
...

Ensuite on peut récupérer une liste des paquets disponibles pour corriger toutes ces failles :

root@crx-sec01 / # debsecan --suite buster --only-fixed --format packages
dpkg
libdns-export1104
libdpkg-perl
libisc-export1100
python3-paramiko
zlib1g

Enfin pour mettre à jour le tout avec cette liste :

root@crx-sec01 / # apt-get install $(debsecan --suite buster --only-fixed --format packages)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
python3-paramiko is already the newest version (2.7.2-1).
python3-paramiko set to manually installed.
libdns-export1104 is already the newest version (1:9.11.5.P4+dfsg-5.1+deb10u5).
libisc-export1100 is already the newest version (1:9.11.5.P4+dfsg-5.1+deb10u5).
Suggested packages:
  debsig-verify debian-keyring gcc | c-compiler binutils patch git bzr
The following packages will be upgraded:
  dpkg libdpkg-perl zlib1g
3 upgraded, 0 newly installed, 0 to remove and 22 not upgraded.
Need to get 0 B/4178 kB of archives.
After this operation, 11.3 kB of additional disk space will be used.
Do you want to continue? [Y/n]

 

Debscan marche aussi sur Ubuntu, pour cela suivez ce guide : https://korben.info/debsecan-cve.html

 

Configuration WSL/VISUALSTUDIO CODE.

Bonjour à tous,

Si votre éditeur vous renvoi un message indiquant que votre instance WSL n’est pas en V2, CTRL+MAJ+u  puis :
wsl_term

Lancez un powershell en tant qu’administrateur puis :

PS C:\Users\tux> wsl --list --verbose
NAME STATE VERSION
* Debian Stopped 1
PS C:\Users\bba>

Lancez ensuite cette commande pour convertir l’image WSL ici « Debian » :

PS C:\Users\tux> wsl --set-version Debian 2

Enfin vous pouvez décider que toutes vos images soient en V2 via cette commande :

PS C:\WINDOWS\system32> wsl --set-default-version 2
Pour plus d’informations sur les différences de clés avec WSL 2, visitez https://aka.ms/wsl2
L’opération a réussi.

Et voilà !

wsl --list --verbose
  NAME      STATE           VERSION
* Debian    Running         2

Sources :
https://docs.microsoft.com/fr-fr/windows/wsl/troubleshooting
https://aka.ms/wsl2

ANSIBET project is launch !

Hello everybody,

I developed a new concept to control the Ansible layer, my project is called « ANSIBET », phylosophy is make my ansible system experience better

The objective of this one is to bring a fast piloting of Ansible by freeing itself from the modification of files and by making more « user friendly » the interface of Ansible.

For the moment it is a « beta » version, the idea being progressively to build an advanced Ansible management system.

https://bastien.barbe.pw/ansibet/

 

Goodbye !

Configuration du NAT pour une machine hyper-v avec Windows 10/11.

Bonjour à tous,

Dans cet article je vais vous parler de configuration NAT pour une VM sous HYPERV avec Windows 10.
L’idée de cette configuration est de permettre le surf Internet d’une machine virtuelle ici DEBIAN LINUX.

hyper_vm_nat_net

1 Contrôle de la navigation Internet de la couche « virtualisation » :

Cette étape bien que facultative vous permet de vous s’assurez que votre machine WSL sort sur Internet,
Notez que ici ma machine WSL est de type « 1 ».

PS C:\Windows\System32\WindowsPowerShell\v1.0> wsl --list --running -v
NAME STATE VERSION
* Debian Running 1

N’utilisant que peu WSL, je commence par changer le mot de passe ROOT :

#Reset root pasword 
#run WINOWS cli 
wsl -u root 
passwd

Un simple ping en root fait l’affaire ensuite :

bba@CT-6SYSFC2:~$ su -
Password:
root@CT-6SYSFC2:~# ping www.google.fr
PING www.google.fr(par21s20-in-x03.1e100.net (2a00:1450:4007:818::2003)) 56 data bytes
64 bytes from par21s20-in-x03.1e100.net (2a00:1450:4007:818::2003): icmp_seq=1 ttl=114 time=16.2 ms
64 bytes from par21s20-in-x03.1e100.net (2a00:1450:4007:818::2003): icmp_seq=2 ttl=114 time=17.8 ms
..

2. Création d’un « v-switch » : 

Je créé ici un switch virtuel que j’appel « NATLINUX » :

New-VMSwitch –SwitchName "NATLINUX" –SwitchType Internal –Verbose

#pour enlever celui ci 
#Remove-VMSwitch -Name "NATLINUX"

Je récupère ensuite l’ID de l’interface de ce SW ici « 14 » :

PS C:\WINDOWS\system32> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
vEthernet (NATLINUX)      Hyper-V Virtual Ethernet Adapter #3          14 Up           00-15-5D-B0-01-08        10 Gbps

PS C:\WINDOWS\system32>

3. Création de la passerelle NAT et rattachement à la machine virtuelle : 

Je peux ensuite créer la passerelle de NAT via cette commande POWERSHELL :

New-NetIPAddress -IPAddress 172.16.229.10 -PrefixLength 24 -InterfaceIndex 14 -Verbose

Maintenant je « map » ma machine virtuelle LINUX pour utiliser cette passerelle :

Get-VM | Get-VMNetworkAdapter | Connect-VMNetworkAdapter –SwitchName "NATLINUX"

Je précise alors que ma machine virtuelle va sortir par l’adresse IP de cette passerelle NAT pour ceci je créé une règle de NAT :

New-NetNat -Name NATOutsideDebian -InternalIPInterfaceAddressPrefix 172.16.229.0/24

#Pour effacer cette règle : Remove-NetNat

Ensuite je peux lister la règle via cette commande :

PS C:\WINDOWS\system32> Get-NetNat


Name                             : NATNetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.1.33/32
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True

Et voilà  :

bba@debian:~$ ping www.google.fr
PING www.google.fr (216.58.214.67) 56(84) bytes of data.
64 bytes from fra15s10-in-f3.1e100.net (216.58.214.67): icmp_seq=1 ttl=119 time=16.5 ms
64 bytes from fra15s10-in-f67.1e100.net (216.58.214.67): icmp_seq=2 ttl=119 time=17.0 ms
64 bytes from fra15s10-in-f67.1e100.net (216.58.214.67): icmp_seq=3 ttl=119 time=16.0 ms
^C
--- www.google.fr ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 16.034/16.493/16.964/0.379 ms
bba@debian:~$

Il est possible maintenant d’utiliser différents outils comme un serveur X windows pour pouvoir utiliser la GUI de ma machine virtuelle depuis WINDOWS,
Ou encore y accéder et disposer d’une multitude d’outils.

A très bientôt !

 

 

 

Gestion des mises à jour LINUX suite, cibler les mises à jour de sécurité

Bonjour à tous,

Suite à mon petit article d’introduction à ANSIBLE et les mises à jour LINUX ici : automatisation-de-la-gestion-des-utilisateurs-et-des-mises-a-jour
Je vous propose ici de gérer une ou plusieurs mises à jour de sécurité en mode « automatique » toujours avec ANSIBLE.

Dans mon exemple ici je pars du principe que j’ai un ensemble de serveurs à mettre à jour ( en cas de mise à jour urgente à faire ),
Que j’ai un accès SSH sur ceux-ci et que je dispose de la couche ANSIBLE opérationnelle :

Je commence par identifier la mise à jour à faire via cette commande :

# apt-cache policy php8.0-memcache
php8.0-memcache:
  Installed: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-1+0~20210302.23+debian10~1.gbpff8707
  Candidate: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
  Version table:
     8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4 500
        500 https://packages.sury.org/php buster/main amd64 Packages
 *** 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-1+0~20210302.23+debian10~1.gbpff8707 100
        100 /var/lib/dpkg/status

Je déduis donc que le paquet cible à déployer est :

php8.0-memcache:8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4

Dans cet exemple, il s’agit d’une simple mise à jour, bien sur cela peut être une mise à jour de sécurité ou encore un paquet à installer
comme nous l’avons vu précédemment.

Maintenant, je peux donc utiliser ce playbook, notez ici l’utilisation du signe  » =  » comme mentionné dans la documentation ANSIBLE,
Voici mon code YAML :    crx-awx/upgrade_package.yml

---

- hosts: all
  become: yes
  tasks:
    - name: Install the package
      apt:
        name: php8.0-memcache=8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
        update_cache: yes

Je peux donc le lancer via cette commande :

bba@crx-ans01 ~ $ ansible-playbook crx-awx/upgrade_package.yml --limit crx-webng04.crxcluster.lan

PLAY [all] **********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [crx-webng04.crxcluster.lan]

TASK [Install the package] ******************************************************************************************************************************************************************************************************************
[WARNING]: Updating cache and auto-installing missing dependency: python3-apt
changed: [crx-webng04.crxcluster.lan]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
crx-webng04.crxcluster.lan : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

bba@crx-ans01 ~ $

Ensuite je contrôle que tout est bon :

# apt-cache policy php8.0-memcache
php8.0-memcache:
  Installed: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
  Candidate: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
  Version table:
 *** 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4 500
        500 https://packages.sury.org/php buster/main amd64 Packages
        100 /var/lib/dpkg/status

Ou je peux aussi le contrôler via cette commande ANSIBLE :

$ ansible crx-webng04.crxcluster.lan -a "apt-cache policy php8.0-memcache" | grep -- 'Installed\|Candidate'
  Installed: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
  Candidate: 8.0+4.0.5.2+3.0.9~20170802.e702b5f9+-7+0~20220117.28+debian10~1.gbp8ceec4
b

Et voilà j’ai pu mettre à jour simplement un paquet via un processus ANSIBLE.

 

A bientôt,

 

The PHP framework interoperability, why is important in 2022 ?

Hello everybody !

Let me show you how we can build a game with PHP here a small train game ( user interopt via web interface, system can be control via human small interface ), with 2 sytstem’s : php-symfony and php-crx-framework.

When you write a lib, you can use it in different way, like direct call, virtualisation call what ever the sense,
interoperability is the most important for a framework.

Few years, i’ve started my own framework and i discover the important
of that. Here is a short code for interoperability with a framework.

I start by install PHP composer packages manager on my LINUX by :

$> php -r « copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’); »
$> php composer-setup.php –install-dir=/usr/local/bin –filename=composer
$> chmod +x /usr/local/bin/composer
$> composer -v
$> composer self-upgrade

In this case, composer is install globally on the system LINUX.
For DEBIAN OS, i simply do that :

$> aptitude search composer
$> composer -v

Witch install :

composer jsonlint{a} php-composer-ca-bundle{a} php-composer-semver{a} php-composer-spdx-licenses{a} php-composer-xdebug-handler{a} php-json-schema{a}
php-psr-container{a} php-psr-log{a} php-react-promise{a} php-symfony-console{a} php-symfony-filesystem{a} php-symfony-finder{a} php-symfony-polyfill-php80{a}
php-symfony-process{a} php-symfony-service-contracts{a}

Get: 1 http:////deb.debian.org/debian bullseye/main amd64 php-composer-ca-bundle all 1.2.9-1 [11.0 kB]
Get: 2 http://deb.debian.org/debian bullseye/main amd64 php-composer-semver all 3.2.4-2 [20.4 kB]
Get: 3 http://deb.debian.org/debian bullseye/main amd64 php-composer-spdx-licenses all 1.5.5-2 [13.3 kB]
Get: 4 http://deb.debian.org/debian bullseye/main amd64 php-psr-log all 1.1.3-2 [9232 B]
Get: 5 http://deb.debian.org/debian bullseye/main amd64 php-composer-xdebug-handler all 1.4.5-1 [16.9 kB]
Get: 6 http://deb.debian.org/debian bullseye/main amd64 php-json-schema all 5.2.10-2 [37.8 kB]
Get: 7 http://deb.debian.org/debian bullseye/main amd64 jsonlint all 1.8.3-2 [13.5 kB]
Get: 8 http://deb.debian.org/debian bullseye/main amd64 php-symfony-polyfill-php80 all 1.22.1-1 [9976 B]
Get: 9 http://deb.debian.org/debian bullseye/main amd64 php-psr-container all 1.0.0-2 [3436 B]
Get: 10 http://deb.debian.org/debian bullseye/main amd64 php-symfony-service-contracts all 1.1.10-2 [8052 B]
Get: 11 http://deb.debian.org/debian bullseye/main amd64 php-symfony-console all 4.4.19+dfsg-2 [82.7 kB]
Get: 12 http://deb.debian.org/debian bullseye/main amd64 php-symfony-filesystem all 4.4.19+dfsg-2 [26.1 kB]
Get: 13 http://deb.debian.org/debian bullseye/main amd64 php-symfony-finder all 4.4.19+dfsg-2 [31.4 kB]
Get: 14 http://deb.debian.org/debian bullseye/main amd64 php-symfony-process all 4.4.19+dfsg-2 [36.3 kB]
Get: 15 http://deb.debian.org/debian bullseye/main amd64 php-react-promise all 2.7.0-2 [18.6 kB]
Get: 16 http://deb.debian.org/debian bullseye/main amd64 composer all 2.0.9-2 [407 kB]

Now here i install composer is specific way for my train « game » call for example « smalltraingame »,
witch can be stored on COMPOSER app store or on another part of the Internet network :

$> php -r « copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’); »
$> cd /home/hosting/www_root/traingame.cloud && mkdir -p bin
$> php composer-setup.php –install-dir=bin –filename=composer
$> chmod +x bin/composer
$> composer self-upgrade
$> cd /home/hosting/www_root/traingame.cloud/html/app-php
$> mkdir /home/hosting/www_root/traingame.cloud/html/app-php/smalltraingameengine
$> composer require frvmcontrolapp/Box2Interuptors
$> composer require frvmcontrolapp/GameSystemControlFr

$> composer require frvmcontrolapp/VRControlerFr
$> composer require frvmcontrolapp/RandomSystem

Of course, composer is in my PATH, here this few command update my : composer.json
Here is my gaming engine example of my header  :

namespace crxcms;
use \crx\crxOrchestratorV0;
use \crx\crxDataSource;
use \crx\TrainGame;
use \crx\TrainController;
use \crx\VRControl;
$p = _APPLI_MAIN_MODULES_PATH_.’myModule/php-ml-master/src’;
$ia = new crxLoaderForLib($p,’frvmcontrolapp’);
use frvmcontrolapp/GameSystemControlFr;
use frvmcontrolapp/VRControlerFr;
use frvmcontrolapp/RandomSystem;
use frvmcontrolapp/BoxWith3Interrupteurs
;

Now like in CPP, i can declare my engine :

And now in my code i can do :
class VRControler{
function __construct(){
$controlTrain=\crx\crxTrainController;
$orchestrator=\crx\crxOrchestrator;
}
function run(){
$orchestrator = new \crx\crxOrchestratorV0();
while($controlTrain->readSystem()){
if($orchestrator->status()==5){ return array(‘ag1′,’step1’);}
if($orchestrator->status()){ return array(‘ag2′,’step2’);}
if($orchestrator->status()){ return array(‘ag3′,’step1’);}
}
}
}

class TrainGame{
function __construct(){}
function __runInstance(){

$dbi = \crx\crxDataSource::getDs(‘mysql2’);
$user1 = new \crx\crxUser(‘A’,’20’);
$user2 = new \crx\crxUser(‘B’,’20’);
$randomSystem = new RandomSystem();
$my_object = new Train(‘red’,’8′,’tgv’);
$control = new BoxWith3Interrupteurs();
$vr_system = new \crx\VRControl($user1,$user2,$randomSystem,$control);
$crxGame = new \crx\GameStd($my_object,$vr_system,$users);
$crxGame->run();

}

}

 

Here :
=> TrainGame is one of my PHP class.
=> TrainController is a simple SERIAL PORT reader for example ( with custom protocol based on 2 interuptors button system ).
=> crxOrchestrator system engine use : TCP-IP/SEMAPHORES control system loop.

So finnaly we got this gaming system :

DEBIAN-LINUX-Bullseye-OS
{
PHP framework A => Call composer librairies (framework B) => Call Python ( machine learning system )
}

A bientôt !

Sources :
https://tecadmin.net/how-to-install-and-use-php-composer-on-debian-11/
https://stackoverflow.com/questions/3902754/mit-vs-gpl-license
https://fr.wikipedia.org/wiki/Composer_(logiciel)
https://getcomposer.org/
https://fr.wikipedia.org/wiki/C%2B%2B

Nouvelle interface WEB CRX CLOUD

Bonjour à tous,

Après un peu plus de 4 mois de boulot, la nouvelle interface WEB de CRX est en ligne,
pour le 7ème anniversaire de la version HAM ( et les 16 de la version 11M )  :



Un grand merci aux personnes qui ont participées à cette nouvelle version.
73 à tous et bon dimanche,

https://dxham.crx.cloud/

HAM remote station on mobile phone.

Hello everyone,

Today I implemented the remote station on the CRX phone application (https://m.crx.cloud).

It works well i made few QSO’s in UHF with the remote station, with control in a browser and sound via MUMBLE.

73 to all,

PS: I am using a CHROME WEB browser, and a RASPBERRY PI.
For people who want to test, you have to configure first your remote station on PC website (https://ham.crx.cloud). 

 

 

Take notes in the cloud !

Hello to all,

« My notes » app is a new feature available into CRX-LOGBOOK :

-> For the moment, a note is limited to ~ 6000 caracters (limitation is only the WEB call here).
-> All the notes are protected by encryption (with your PIN code from 4 to 127 caracters).
-> Remember to write down this code or memorize it, because it is not possible to recover it and therefore to read your notes without this code !
-> Pin code is store into your webrowser via a COOKIE (encrypted by security) and for 1 year.
-> So if you change your browser, you will have to re-enter your pin code.
-> When you clic on « Exit » link, COOKIE will be erased.
-> If you enter the wrong code, the notes are visible but simply empty.

From a technical point of view :

-> Encryption is done on server side, not client side.

-> The cookie containing the pin code and the note are encrypted via AEAD (authenticated encryption with additional data),
with the PHP « SODIUM » library : crypto_aead_xchacha20poly1305_ietf  ( https://datatracker.ietf.org/doc/html/rfc8103 )

as input :
-> the message encrypted here the content of your note (in plain text).
-> the pin code (number or letter of 4 minimum, you can put a lot more).
-> the nounce (Number used only once) generated via: random_bytes SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES
-> a unique encryption key linked to the CRX site, here generated via: random_bytes : SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES

Of course I use a base 64 envelope via php base64_encode to store the global key in configuration.

Good weekend, 73!



 

Connect CQRLOG logbook to CRX-LOGBOOK.

Hello everyone,

The LINUX CQRLOG Logbook is now compatible with the « CRXLOGBOOK » (online Logbook cloud instance).

=> It allows new QSOs from CQRLOG to be forwarded in the online log, the system operates in « offline » mode (portable/dx operation)
and can be launched manually or automatically via a LINUX CRON.

=> It works with all versions of CQRLOG and is independent.

=> It’s available here :

https://project.crx.cloud/cqrlog_online_crxlogbook

73