Skip to content
CAI
Software that uses CAICheck a score

backup/backup

54.2

Adequate · 26 September 2026

8.4k

lines of production code

Ruby

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This release delivers a comprehensive architectural overhaul, introducing a modular, component-based design for backup, storage, and syncer operations. It significantly expands support for databases, cloud storage backends, and notification channels, while introducing new CLI templates to streamline configuration. The update also modernizes the codebase with RuboCop enforcement, Vagrant-based testing infrastructure, and extensive RSpec coverage across all new and refactored components.

Features

Add Zabbix notifier template

A new Zabbix notifier template has been added to the CLI, enabling users to configure notifications for Zabbix monitoring systems. The template includes default configuration for host, port, and service details, allowing integration with Zabbix for backup status alerts.

templates/cli/notifier · high confidence

Add storage templates for Cloud Files, Dropbox, FTP, Local, Qiniu, RSync, SCP, SFTP, and S3

New storage backend templates have been added to the CLI, enabling users to configure backups to Rackspace Cloud Files, Dropbox, FTP, local filesystem, Qiniu, RSync, SCP, SFTP, and Amazon S3. Each template provides a ready-to-use configuration block with placeholder credentials and paths, allowing users to quickly set up their preferred storage destination for backups.

templates/cli/storages · high confidence

Add templates for new notification and syncer integrations

Added configuration templates for new notification channels including Campfire, Command, DataDog, Flowdock, Hipchat, HTTP Post, Nagios, PagerDuty, Prowl, Pushover, SES, Slack, and Twitter, as well as syncer templates for Cloud Files, RSync (Local, Pull, Push), and Amazon S3, enabling users to configure these services directly from the CLI.

templates/cli/notifiers · high confidence

Added database backup templates for MongoDB, MySQL, OpenLDAP, PostgreSQL, Redis, Riak, and SQLite

New CLI templates have been introduced to configure backup operations for a range of database engines. Users can now generate backup configurations for MongoDB (defaulting to port 27017), MySQL, OpenLDAP (utilizing slapcat), PostgreSQL, Redis (supporting both copy and sync modes), Riak, and SQLite. Each template provides default connection parameters and options specific to the respective database system.

templates/cli/databases · high confidence

Added database test setup tasks for MongoDB, MySQL, PostgreSQL, Redis, and Riak

New Rake tasks have been added to the Vagrant utility suite to automate the preparation of test environments for various backends. The \db:mongodb\, \db:mysql\, \db:postgresql\, \db:redis\, and \db:riak\ tasks each provide a \drop\_all\ and \create\_all\ workflow to reset and populate test databases with sample data. Additionally, an \archives\ task was added to generate test file structures for archive testing.

vagrant/utils/tasks · high confidence

Added initial Vagrant utility scripts and Rakefile for test VM setup

The Vagrant utility directory now includes a Rakefile and a setup.sh script to automate the configuration of the test VM environment. The setup script checks and installs Ruby gems for multiple Ruby versions (2.1.0, 2.0.0, and 1.9.3), synchronizing cached gems between them to ensure consistent testing conditions across different Ruby environments.

vagrant/utils · high confidence

Initial Vagrant environment setup

Added a new Vagrant configuration for a 'backup-testbox' virtual machine, including a .gitignore file to exclude .vagrant and Gemfile.lock, an .rspec configuration for test output formatting, and a Vagrantfile that sets up the VM with a synced folder mapping the project root to /backup.git.

vagrant · high confidence

Introduce CloudIO abstraction for S3 and CloudFiles storage

Added new \lib/backup/cloud\_io\ module providing a unified interface for cloud storage backends. This introduces \CloudIO::S3\ and \CloudIO::CloudFiles\ classes that handle upload, listing, and deletion of objects. The S3 implementation supports IAM profile authentication, configurable chunk sizes, and multipart uploads. The CloudFiles implementation supports segmenting large files and custom Fog options. Both implementations include retry logic and error handling.

_lib/backup/cloud\io · high confidence

Introduce new modular components for backup processing

The lib/backup directory now includes several new classes that restructure how backups are packaged, cleaned, and managed. The new Backup::Archive class allows users to define file archives with support for root paths, exclusions, and tar options. The Backup::Cleaner module handles the removal of temporary packaging and package files, logging warnings if unexpected files remain. The Backup::Packager orchestrates the final packaging pipeline, integrating encryption and splitting. Additionally, the Backup::Splitter handles chunking large backups, and the Backup::Package class tracks metadata about the final output. These changes refactor the backup process into distinct, reusable components.

lib/backup · high confidence

Introduces RuboCop configuration and Docker testing infrastructure

The project adds a \.rubocop.yml\ file to enforce code style guidelines and a \.rubocop\_todo.yml\ file to suppress existing style violations, alongside a \Rakefile\ update to integrate RuboCop tasks. Additionally, the repository introduces a \Dockerfile\ and \docker-compose.yml\ to support running tests in a Dockerized environment, and updates \.gitignore\ and \.rspec\ to support these new workflows.

(repo-wide) · high confidence

Major internal reorganization and expanded library support

The Backup gem has been restructured to improve modularity and extensibility. The library now supports a wider range of databases (MySQL, PostgreSQL, MongoDB, Redis, Riak, OpenLDAP, SQLite), storage backends (S3, CloudFiles, Dropbox, FTP, SFTP, SCP, RSync, Local, Qiniu, Ninefold), compressors (Gzip, Bzip2), encryptors (OpenSSL, GPG), and notifiers (Mail, Twitter, Campfire, Prowl, Hipchat, PagerDuty, Pushover, Slack, HttpPost, Nagios, FlowDock, Zabbix, DataDog, SES, Command). The codebase has been refactored with autoloaded modules for Storage, Syncer, Database, Compressor, Encryptor, and Notifier, along with new classes for Archive, Binder, Cleaner, Packager, Pipeline, Splitter, and Template. Core Ruby libraries like time, fileutils, tempfile, syslog, yaml, etc., are now explicitly required.

lib · high confidence

New CLI templates for archive, compression, encryption, and model generation

The templates/cli directory now includes new template files that define the structure for generating backup models and configuring components. Specifically, it adds templates for archive configuration (including a new root path option), compressor settings (bzip2, gzip, custom), encryptors (GPG, OpenSSL), and a model generator that assembles these components. This introduces a more modular and configurable approach to setting up backup models via the CLI, allowing users to generate preconfigured models with specific archive, storage, and notification settings.

templates/cli · high confidence

New OpenSSL and GPG encryptor implementations

The Backup::Encryptor::OpenSSL and Backup::Encryptor::GPG classes have been introduced to provide modern encryption capabilities. The OpenSSL encryptor now uses PBKDF2 with 310,000 iterations for password-based encryption, supports password files, and automatically removes the unencrypted file after encryption. The GPG encryptor supports asymmetric, symmetric, and both modes of operation, allowing users to configure public keys, passphrases, and GnuPG settings via a defaults block. Both encryptors inherit from a new Backup::Encryptor::Base class that handles default configuration loading and logging.

lib/backup/encryptor · high confidence

New cloud syncer architecture with concurrency and exclusion support

The cloud syncers (S3, CloudFiles) now share a new base class that supports concurrent file transfers via configurable thread counts, retry policies, and file exclusion patterns (including regexes) to skip specific files or directories during sync operations.

lib/backup/syncer/cloud · high confidence

New configuration DSL and helpers for model and path options

The configuration system has been refactored to introduce a Domain Specific Language (DSL) for defining backup models and setting path options. Users can now use constant names (e.g., \database MySQL\) instead of strings, and can configure root, data, and temporary paths directly in the configuration file. The change also adds support for various storage, database, and notifier types via the DSL, and includes helper methods for deprecation warnings and default value loading.

lib/backup/config · medium confidence

New storage backends and base architecture for backup transfers

The backup system now supports storing backups to Amazon S3, Rackspace CloudFiles, Dropbox, Qiniu, FTP, SFTP, SCP, RSync, and local storage. Each storage type is implemented as a dedicated class (e.g., \Backup::Storage::S3\) that inherits from a new \Backup::Storage::Base\ class. This base class introduces a \keep\ attribute to manage backup retention (cycling) and a \storage\_id\ for identifying multiple storages of the same type. The \Cycler\ module handles the logic for removing old backups based on the \keep\ setting, supporting both count-based and time-based retention policies. Configuration options specific to each storage type (like \chunk\_size\ for S3 or \passive\_mode\ for FTP) are exposed as attributes, and the system ensures that remote paths are correctly constructed and that errors during removal are logged as warnings rather than fatal exceptions.

lib/backup/storage · high confidence

Notifier abstraction and new notification integrations

The notifier system has been refactored to use a shared \Backup::Notifier::Base\ class, which provides common configuration options (such as \on\_success\, \on\_warning\, \on\_failure\, retry logic, and custom messages) to all notifier implementations. This change introduces new notifiers for Campfire, Command, DataDog, Flowdock, Hipchat, HTTP POST, Nagios, PagerDuty, Prowl, Pushover, SES, Slack, Twitter, and Zabbix, while also adding CC, BCC, and Reply-To support to the Mail and SES notifiers.

lib/backup/notifier · high confidence

Behavioural changes

Dropbox storage now uses new template-based authorization flow

The Dropbox storage backend has been updated to use a new Backup::Template class, replacing previous boilerplate with ERB templates for authorization and caching. Users will now see clearer, template-driven messages during Dropbox authorization, including specific instructions about cache file locations and cross-machine usage.

templates/storage · medium confidence

Extracted general template content into dedicated files

The general template content has been extracted from the main template files into separate, dedicated files: 'templates/general/links' now contains the project, documentation, and issue tracker URLs, while 'templates/general/version.erb' displays the Backup version and Ruby description. This separation reduces boilerplate in the core Ruby code and improves maintainability.

templates/general · high confidence

Introduce abstract Database::Base class to standardize backup behavior

A new \Backup::Database::Base\ class has been introduced to provide a shared foundation for all database backup adapters. This base class centralizes common functionality, including the \perform!\ execution flow (logging start/finish, preparing the dump path), automatic generation of unique identifiers for multiple instances of the same database type, and consistent filename generation. All specific database adapters (MySQL, PostgreSQL, MongoDB, Redis, Riak, SQLite, and OpenLDAP) now inherit from this base, ensuring consistent behavior and reducing code duplication across the library.

lib/backup/database · high confidence

Introduce base syncer class with optional ID and exclusion support

The backup system now uses a new \Backup::Syncer::Base\ class that serves as the foundation for all syncer implementations. This change introduces an optional \syncer\_id\ parameter for logging differentiation, adds an \exclude\ method to define file patterns to skip during sync, and initializes \directories\ and \excludes\ as empty arrays by default. The base class also includes logging for start/finish states and supports a \mirror\ flag for cloud syncers.

lib/backup/syncer · medium confidence

Mail notifier templates updated to include job timing and duration

The mail notification templates for failure, success, and warning states have been updated to display the job's start time, finish time, and total duration. Additionally, the templates now conditionally display a message about the attached backup log when the \send\_log\ option is enabled.

templates/notifier · high confidence

New modular compressor architecture with Bzip2, Gzip (rsyncable), and Custom support

The backup system now uses a modular compressor architecture with a shared base class. Users can configure compression via three new classes: Bzip2 (with adjustable compression levels), Gzip (supporting the --rsyncable option for efficient rsync updates), and a Custom compressor for arbitrary command-line tools. This replaces the previous implementation, providing more granular control over compression settings and file extensions.

lib/backup/compressor · medium confidence

Refactor RSync syncer into modular components

The RSync syncer implementation has been restructured into separate classes: a shared base class (Base) containing common rsync command building logic, a Local syncer for local backups, and Push/Pull syncers for remote operations. This refactoring introduces support for rsync daemon mode, optional archive flag, and configurable SSH/RSync options, allowing users to configure additional rsync arguments, disable archive mode, and choose between SSH and rsync daemon connection modes for remote syncs.

lib/backup/syncer/rsync · medium confidence

Refactor and expand logging infrastructure with dedicated backends

The logging system has been refactored to support multiple output destinations via new, distinct classes: \Console\ for colored terminal output, \Logfile\ for persistent file logging with automatic truncation, and \Syslog\ for system-level logging with configurable priorities. Additionally, a \FogAdapter\ was introduced to route Fog library logs into the application's logger, and the console logger now respects a \--quiet\ flag to suppress output.

lib/backup/logger · high confidence

Simplified backup CLI entry point

The backup binary was refactored to remove the inline Ruby script that previously loaded dependencies and defined the CLI class. It now simply requires the core library and starts the Backup::CLI, resulting in a cleaner, more maintainable entry point for the command-line interface.

bin · high confidence

Test coverage

Added acceptance tests for Archive, Config, and Splitter components; Added acceptance tests for GPG encryption modes; Added acceptance tests for RSync syncer modes; Added acceptance tests for backup storage backends; Added acceptance tests for database backup models; Added comprehensive RSpec test coverage for core Backup components; Added comprehensive RSpec tests for the RSync syncer components; Added integration test suite for archive and splitter functionality; Added live integration tests for CloudFiles and S3 syncers; Added live integration tests for CloudFiles, Dropbox, and S3 storage backends; Added live test configuration and test runner setup; Added live tests for the Mail notification notifier; Added shared examples for cloud syncer behavior; Added shared test suites for Config, Database, Notifier, and Storage components; Added specs for CloudIO::S3 and CloudIO::CloudFiles upload logic; Added specs for storage backends; Added test coverage for Cloud syncers; Added test coverage for backup compressor implementations; Added test coverage for config DSL and helpers; Added test coverage for database backup adapters; Added test coverage for multiple notification services; Added test coverage for the Backup::Encryptor::Base, GPG, and OpenSSL encryptor implementations; Added test support infrastructure for Vagrant acceptance tests; Added test support utilities for file system sandboxing and error handling; Added tests for the logger subsystem.

Dependencies

Updated gem dependencies and development tooling

The project's gem dependencies have been updated to newer versions, including Thor, Open4, Fog, Excon, Net-SSH, Net-SCP, Net-SFTP, Net-FTP, Net-SMTP, Mail, PagerDuty, Twitter, Hipchat, Flowdock, Dogapi, AWS SDK, Qiniu, Nokogiri, and ActiveSupport. Development dependencies have also been updated, with RSpec upgraded to 3.8.0, RuboCop to 0.48.1, and Timecop to 0.9.4. Additionally, the Gemfile was restructured to separate CI and non-CI dependencies, and the gemspec was updated to specify a minimum Ruby version of 2.3.0.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 47 → 54 (+7.1)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 99 (-0.3)
  • Architecture 94 → 98 (+3.8)
  • Maturity 57 → 43 (-14.7)
  • Readiness 22 → 47 (+24.9)
  • Security 69 → 67 (-1.3)

Resolved (13)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • GPG.system_identifiers (cognitive 18) (GPG)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Low IaC: DS-0026 (Dockerfile)
  • No exposed public API
  • No tests found
  • Secret: private-key (spec-live/encryptor/gpg_keys.rb)
  • Test reliability not included
  • The README links only to static URLs for documentation/release notes; no live docs site is present. (README.md)

New (26)

  • CLI.perform (cognitive 20) (lib/backup/cli.rb)
  • Dormant codebase
  • Duplicated block (11 lines × 2) (lib/backup/notifier/mail.rb)
  • GPG.system_identifiers (cognitive 18) (lib/backup/encryptor/gpg.rb)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Inconsistent parameter naming for the same operation across different storage backends. Both methods accept a collection of identifiers to delete, but one uses 'objects_or_names' and the other 'objects_or_keys'.
  • Medium IaC: WD-DOCKER-0003 (Dockerfile)
  • Medium: security finding (details withheld)
  • Most significant orphaned file (lib/backup/encryptor/gpg.rb)
  • No dependency advisory monitoring
  • Outdated: activerecord
  • Outdated: bson_ext
  • Outdated: iconv
  • Outdated: mongo
  • Outdated: pg
  • Outdated: rake
  • Outdated: redis
  • …and 6 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

backup/backup was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 26 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 86c9b07c2a2974376888b1506001f77792d6359a — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-7c1cb6328e11.