Skip to content

Add HA Sync (XMLRPC config sync) endpoint (/api/v2/system/hasync) #843

Closed

Description

@TechAsen

Hi,

I would like to request adding support for managing pfSense HA Sync / XMLRPC configuration via the REST API package.

This would allow automation of HA deployments and configuration management without using the GUI.

Proposed endpoint:

  • /api/v2/system/hasync
  • Methods: GET, PATCH
  • Singleton model backed by config path: hasync

Fields to expose:

  • synchronizetoip
  • pfsyncpeerip
  • pfsyncinterface
  • username
  • password (write-only)
  • synchronizeusers
  • synchronizeauthservers
  • synchronizecerts
  • synchronizerules
  • synchronizeschedules
  • synchronizealiases
  • synchronizenat
  • synchronizeipsec
  • synchronizeopenvpn
  • synchronizedhcpd
  • synchronizedhcrelay
  • synchronizedhcrelay6
  • synchronizewol
  • synchronizestaticroutes
  • synchronizevirtualip
  • synchronizetrafficshaper
  • synchronizetrafficshaperlimiter
  • synchronizednsforwarder
  • synchronizecaptiveportal
  • pfsyncenabled

On PATCH the configuration should be applied similarly to GUI:

  • filter_configure_sync()
  • filter_configure()

Implementation draft is attached below.

[Hasinc.inc]

<?php

namespace RESTAPI\Models;

require_once 'RESTAPI/autoloader.inc';

use RESTAPI\Core\Model;
use RESTAPI\Fields\StringField;

class Hasync extends Model {
    public function __construct(...$options) {
        parent::__construct(...$options);

        $this->config_path = 'hasync';
        $this->many = false;

        // Core fields
        $this->synchronizetoip  = new StringField(allow_null: true);
        $this->pfsyncpeerip     = new StringField(allow_null: true);
        $this->pfsyncinterface  = new StringField(allow_null: true);

        $this->username         = new StringField(allow_null: true);
        $this->password         = new StringField(allow_null: true, write_only: true);

        // on/off flags
        foreach ([
            'synchronizeusers',
            'synchronizeauthservers',
            'synchronizecerts',
            'synchronizerules',
            'synchronizeschedules',
            'synchronizealiases',
            'synchronizenat',
            'synchronizeipsec',
            'synchronizeopenvpn',
            'synchronizedhcpd',
            'synchronizedhcrelay',
            'synchronizedhcrelay6',
            'synchronizewol',
            'synchronizestaticroutes',
            'synchronizevirtualip',
            'synchronizetrafficshaper',
            'synchronizetrafficshaperlimiter',
            'synchronizednsforwarder',
            'synchronizecaptiveportal',
            'pfsyncenabled',
        ] as $flag) {
            $this->$flag = new StringField(allow_null: true);
        }
    }

    public function apply_update(): void {
        @require_once('filter.inc');

        // Apply sync settings + reload
        if (function_exists('filter_configure_sync')) {
            filter_configure_sync();
        }
        if (function_exists('filter_configure')) {
            filter_configure();
        }
    }
}

HasyncEndpoint.inc

<?php

namespace RESTAPI\Endpoints;

require_once 'RESTAPI/autoloader.inc';

use RESTAPI\Core\Endpoint;

/**
 * HA Sync settings endpoint (singleton model)
 */
class HasyncEndpoint extends Endpoint {
    public function __construct() {
        $this->url = '/api/v2/system/hasync';
        $this->model_name = 'Hasync';
        $this->request_method_options = ['GET', 'PATCH'];

        parent::__construct();
    }
}

Activity

  1. added
    backlogIssues backlogged for inclusion in future releases
    on Feb 18, 2026
  2. hydro-b commented on Jul 22, 2026

    @hydro-b

    As I am looking for a way to completely automate all settings for HA pfSense setups this would be a very welcome feature.

  3. linked a pull request that will close this issuev2.9.0 Features & Fixes #924on Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    backlogIssues backlogged for inclusion in future releasesfeature requestNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions