ncantu 46bf9676a0 Install and enable all missing systemd services
**Motivations:**
- Ensure all application directories have systemd services enabled at boot
- Complete service installation for api-relay, filigrane-api, and clamav-api
- Fix dependencies and import issues preventing clamav-api from starting

**Root causes:**
- Three services (api-relay, filigrane-api, clamav-api) had service files but were not installed in systemd
- api-clamav had incorrect node-clamav version (0.12.1) that doesn't exist
- api-clamav dependencies were not installed (node_modules missing)
- ES module import syntax incompatible with CommonJS node-clamav package

**Correctifs:**
- Installed api-relay.service, filigrane-api.service, and clamav-api.service in /etc/systemd/system/
- Enabled all three services for automatic startup at boot
- Updated api-clamav/package.json: changed node-clamav version from ^0.12.1 to ^1.0.11
- Installed npm dependencies for api-clamav
- Fixed ES module import in api-clamav/src/routes/scan.js to use CommonJS-compatible syntax

**Evolutions:**
- All 7 application services now have systemd services enabled at boot
- Complete service coverage: anchorage-api, faucet-api, signet-dashboard, userwallet, api-relay, filigrane-api, clamav-api
- All services verified active and listening on their respective ports

**Pages affectées:**
- api-clamav/package.json
- api-clamav/src/routes/scan.js
- api-clamav/node_modules/ (new)
- api-clamav/package-lock.json (new)
- /etc/systemd/system/api-relay.service (new)
- /etc/systemd/system/filigrane-api.service (new)
- /etc/systemd/system/clamav-api.service (new)
2026-01-26 12:56:11 +01:00
..

Clamdjs

A ClamAV client on node.js

The library will uses TCP socket communicate with clamd (ClamAV daemon) through some commands

Clamd protocol is explained here: http://linux.die.net/man/8/clamd


Provide

  • Scan Stream and Buffer
  • Scan local File and local Directory
  • Check the daemons state
  • Get the version detail of the running ClamAV program

Installation

$ npm install clamdjs

API

const clamd = require('clamdjs')
const scanner = clamd.createScanner(host, port)

scanner.scanStream(stream, [timeout])

scanner.scanStream(stream, 3000)
       .then(function (reply) {
           console.log(reply) 
           // print some thing like
           // 'stream: OK', if not infected
           // `stream: ${virus} FOUND`, if infected
       })
       .catch(handler)

Returns a promise, which will resovle with the reply from the ClamAV server

  • stream (Object) - read stream object
  • timeout (Number) - use to set the socket's timeout option, default 5000

scanner.scanBuffer(buffer, [timeout], [chunkSize])

scanner.scanBuffer(buffer, 3000, 1024 * 1024)
       .then(function (reply) {
           console.log(reply) 
           // print some thing like
           // 'stream: OK', if not infected
           // `stream: ${virus} FOUND`, if infected
       })
       .catch(handler)

Returns a promise, which will resovle with the reply from the ClamAV server

  • buffer (Object)
  • timeout (Number) - use to set the socket's timeout option, default 5000
  • chunkSize (Number) - size of the chunk, which will send to ClamAV server, default 64 * 1024

scanner.scanFile(path, [timeout], [chunkSize])

scanner.scanFile(path, 3000, 1024 * 1024)
       .then(function (reply) {
           console.log(reply) 
           // print some thing like
           // 'stream: OK', if not infected
           // `stream: ${virus} FOUND`, if infected
       })
       .catch(handler)

Returns a promise, which will resovle with the reply from the ClamAV server

  • path (String) - file path, will be pass to path.normalize() first
  • timeout (Number) - use to set the socket's timeout option, default 5000
  • chunkSize (Number) - size of the chunk, which will send to ClamAV server, default 64 * 1024

scanner.scanDirectory(rootPath, [options])

let optins = {
    timeout: 5000,
    chunkSize: 64 * 1024,
    scanningFile: 10,
    detail: true,
    cont: true
}
scanner.scanDirectory(rootPath, options)
       .then(function (reply) {
           console.log(reply) 
           /* print some thing like
           {
                ScannedFiles: 11,
                Infected: 3,
                EncounterError: 1,
                Result:[...]
           }
           */
       })
       .catch(handler)

Returns a promise, which will resovle with a object which contained the scan summary

  • rootPath (String) - directory path, will be pass to path.normalize() first
  • optinns (Object)
    • timeout (Number) - use to set the socket's timeout option, default 5000
    • chunkSize (Number) - size of the chunk, which will send to ClamAV server, default 64 * 1024
    • scanningFile (Number) - the number of file will scan concurrently, should not be greater than the file table limit in node.js, default 10
    • detail (Boolean) - if true the output object will contain the scan summary and all scaned files's scan result no matter infected or not, if false the output object will contain the scan summary and scan result of infected files and file that encountered error when scanning, default true
    • cont (Boolean) - when scanning a path and an Error throw, if true, will move on to scan next path, if false, will stop scanning and return a rejected promise, default true

clamd.ping()

Returns true if clamd daemon alive

clamd.version()

Returns clamav version information

clamd.isCleanReply(reply)

Retuens true if the reply of a scan means OK, false if means infected