HR Connector (import)
HR Connector
Is part of solutions Native connectors and it uses a ready-made Python script for the Generic Python Script connector. With this native HR connector, customers can import personal and organizational data from their HR solution. The connector has been designed for the IGA solution, but it can be modified to be used in all Pro and IGA solutions. It supports XML, CSV and JSON formats, and includes data validation and comparison to the previous file.
When the HR connector is taken into use, customer responsibilities are:
- Generate file(s) according to instructions described in the "Generate file from HR solution" chapter
- Schedule file(s) generation according to the agreed schedule in the delivery
- Provide an SFTP server (and access to it), where files are delivered and from where the HR connector can fetch file(s)
Release 26.2 introduced an improved Python script for HR import: HR-Connector-scheduled.py. You can change your HR connector to use this new one, or keep using the older IGAConnector.py if you haven't had any issues with it.

Is the HR Connector Suitable for My Use Case?
Choose the HR connector if:
- The HR file is in flat XML, CSV or JSON format
- The customer has an SFTP server
- The data contains at least Last name, First name, Employment start date, Title ID, Manager ID, Organizational unit ID
- The data contains at least one of these unique values: Social security number / national ID / Employee number
How HR connector works
General overview
The HR connector uses the Generic Python Script connector for reading data from the file. The connector is designed to be used in IGA solution user lifecycle management use cases. Using it for another purpose requires the script to be exported from the host machine and modified according to customer requirements. Note that it is also possible to create a new script from the beginning and use a custom script connector to validate and import it.
The HR connector supports one or several work periods, as long as work periods are generated as described in the "Generate file from HR solution" chapter.
Basic principles for the HR connector:
- The connector uses extra arguments, defined in the scheduled-based provisioning task, for finding the file from the path (if an extra argument is missing, the process stops)
- Files are transformed to JSON format (dict) and stored as JSON
- Each file can be run as a full or partial run
- A partial run always compares data to the archived file (if the archive file is missing, the process stops)
- In a JSON-formatted file, all mapped attributes are mandatory, and the task stops the import if mandatory attributes are missing from any imported object. CSV format works differently: it is enough that all mapped attributes are found as columns in the header row.
- The connector creates an IGA admin task in the IGA solution, including errors and JSON files containing archived and imported rows, after the import has been executed.
Good to remember!
Reviewing extra arguments (after the scheduled task has been saved for the HR connector) requires that the password is saved in a secure place, so changes to the arguments can be made later if needed.
Connector files:
| File (on EPE-worker container) | Description |
|---|---|
| /tmp/custom-provisioning-scripts/3_log.txt | Contains logs. Number in the file name is the task ID. |
| /tmp/custom-provisioning-scripts/3_output.json | Includes the rows that passed validation and should be imported to the IGA solution. Number in the file name is the task ID. |
| /tmp/custom-provisioning-scripts/data/archive/(data_type)_archive.json | Stores all rows from the file that has been run, including valid and invalid rows. File is overwritten each run. |
| /tmp/custom-provisioning-scripts/data/archive/error_(data_type)_archive.json | Stores rows that did not pass validation during the run. These rows are not imported to the IGA solution. File is overwritten each run. |
|
/tmp/custom-provisioning-scripts/only_scheduled/HR-Connector-scheduled.py
OR
/tmp/custom-provisioning-scripts/only_scheduled/IGAConnector.py |
Connector script. There can be several scripts in that folder; from the Task UI, you choose which script is run by which task. |
| /tmp/custom-provisioning-scripts/misc-files/translation.json | 1. Used for translating report cases to a given language. 2. New languages can be added by adding a "language" key, for example "de" or "en", under all cases with key "text". Each report case needs the new language, otherwise the connector runs into an error. 3. To use a specific language, extra arguments need a "language" key with a value found in translation.json |
Generate file from HR solution
The HR connector expects that the file is generated from the HR solution based on the following logic, and that the file is stored on the customer's SFTP server, where the connector can fetch the file(s). Note that encoding needs to be UTF-8.
Note
File encoding needs to be UTF-8.
It is recommended to use the Linux line separator.
If you use the CSV file format, the default field separator used by the HR connector script is ; (semicolon).
Generating the file varies according to the HR solution the customer is using. For example, the IGA solution in particular requires that information is received from the past and from the future.
For Workday HR solutions, it is recommended to create a custom report in Workday that reports the needed information, and use JSON format for that report.
Good to know!
Sometimes HR solutions generate a new last-update timestamp in situations where information does not actually need to be delivered to the solution — for example, salary payments are often run before pay day. This unnecessary data causes a lot of provisioning towards the target systems, and usually solving these issues takes time away from the customer's admins/agents.
It is recommended to validate data before full automation is started, based on received information (data quality ensured). The Matrix42 IGA solution supports simulating changes (read more here).
Examples of information used for generating the required file:
| Logic | Additional information |
|---|---|
| All users with active work period(s) | Users are selected based on work period dates |
| All users with an active work period in the future | One month ahead |
| All users with an active work period in the past | One month from the past; this is needed if changes to user information are made after employment has already ended |
| Users are sorted based on unique ID | Unique ID can be either employee number or social security number |
| Last update timestamp | Users can be selected based on the last update timestamp, but check with the customer's HR specialist which changes update the timestamp |
Recommendations related to SFTP server folder structure
If a customer wants to use the HR connector to import several different types of data, it is recommended to have one HR connector per data type.
For example, if a customer wants to import organizations and users, they should have two connectors, such as "HR connector Organizations" and "HR connector Users".
With those two connectors on the same FTP server, the folder structure could be, for example:
/sftp/iga/in/organisation
/sftp/iga/in/organization/archive
/sftp/iga/in/user
/sftp/iga/in/user/archive
The data folder should contain only one file at a time.
With that folder structure, you can use these script parameters for HR connector Organizations:
"sftp_remote_path_data":"/sftp/iga/in/organization",
"sftp_remote_path_archive":"/sftp/iga/in/organization/archive",
"file_path":"./organization/*.csv"
And similarly, different script parameters for HR connector Users.
Configuration
Pre-requirements
Please make sure the following tasks are done before running the scheduled task for the HR connector:
-
HR-Connector-scheduled.py or IGAConnector.py script can be found on the customer's test & production environments
- If it is missing, please contact Matrix42 Service Desk
- HR connector is configured in the customer's Pro/IGA solution test environment
-
HR connector is tested in the customer's Pro/IGA solution test environment
- Create needed test data, test users and test cases
- Data quality has been confirmed by the customer's HR specialists & future IGA admin
- File is correctly generated, scheduled and stored on the customer's SFTP server
-
For the IGA solution, implement the configuration instructions for user lifecycle management use cases
- IGA set work period information data card(s) are in place
- IGA set account information data card(s) are in place
- Simulation phase has been agreed, and IGA admin validates received data for an agreed period of time before provisioning (once data quality is ensured, full automation can be enabled by changing settings in the IGA set work period information data card(s))
General guidance for scheduled tasks
General guidance for scheduled tasks
How to Create New Scheduled Task to import data
For configuring scheduled-based provisioning task, you will need access to Administration / Connectors tab.
1. Open the Administration area (a cogwheel symbol).
2. Open Connectors view.
3. Choose Connector for Scheduled-based task and select New Task
Note! If connector is not created, you have to choose first New connector and after that New task.

4. Continue with connector specific instructions: Native Connectors
Should I use Incremental, Full or Both?
Scheduled task can be either Incremental or Full -type.
Do not import permissions with AD and LDAP incremental task
Incremental task has issue with permissions importing. At the moment it is recommended not to import group memberships with incremental scheduled task.
On Microsoft Active Directory and OpenLDAP connectors, remove this mapping on incremental task:

Setting on Scheduled tasks:

Incremental type is supported only for Microsoft Active Directory, LDAP and Microsoft Graph API (formerly known as Entra ID) Connectors.
Incremental type means, that Native Connectors (EPE) fetches data from source system, using changed timestamp information, so it fetches only data which is changed or added after previous incremental task run.
When Incremental type task is run for very first time, it does a full fetch (and it marks the current timestamp to EPE database), thereafter, task uses that timestamp to ask the data source for data that changed since that timestamp (and then EPE updates the timestamp to EPE database for next task run). Clearing task cache doesn't affect this timestamp, so Incremental task is always incremental after first run.
Full type is supported for all Connectors.
Full type import fetches always all data (it's configured to fetch) from source system, on every run.
Tasks internal cache
Both Full and Incremental type tasks use also Task cache in EPE, which makes certain imports faster and lighter for M42 system.
Beginning from version 2026.1.1
Tasks internal cache clean scheduling was moved from properties file to Task UI.
With that change you can now also decide per scheduled task when internal cache is cleared, or if it's not cleared at all. In normal situations cache is recommended to be cleared at some point to guarantee correct data on datacards. If template and imported data doesn't contain references, cache can be cleared quite rarely. With references, it's recommended to clear cache daily or weekly to guarantee correct data on datacards.

Versions before 2026.1.1
By default that task cache is cleared ad midnight UTC time. When cache is cleared, next import after that is run without caching used to reason if data fetched should be pushed to ESM, all fetched data is pushed to ESM. But after that, next task runs until next time cache is cleared, are using EPE cache to determine if fetched data needs to be pushed to ESM or not.
You can configure at what time of day task cache is emptied, by changing global setting in EPE datapump configuration:
/opt/epe/datapump-itsm/config/custom.properties
which is by default set to: clearCacheHours24HourFormat=0
You can also clear cache many times a day, but that needs to be thinked carefully, as it has impact on overall performance as EPE will push changes to ESM, that probably are already there, example(do not add spaces to attribute value): clearCacheHours24HourFormat=6,12
After changing this value, reboot EPE datapump container to take change into use.
Recommendations
Have always by default Full type scheduled task.
If you want to fetch changes to data fetched already by full task, more frequently than you can run full task, add also incremental task. Usually incremental task is not needed.
Recommended Scheduling Sequence
Recommended scheduling sequence, depends how much data is read from Customers system/directory to the Matrix42 Core, Pro or IGA solution and is import Incremental or Full.
Examples for scheduling,
| Total amount of users | Total amount of groups | Full load sequence | Incremental load sequence |
| < 500 | < 1000 |
Every 30 minutes if partial load is not used Four (4) times a day if partial load is used |
Every 10 minutes |
| < 2000 | < 2000 |
Every 60 minutes, if partial load is not used Four (4) times a day if partial load is used |
Every 15 minutes |
| < 5000 | < 3000 |
Every four (4) hours, if partial load is not used Twice a day if partial load is used |
Every 15 minutes |
| < 10 000 | < 5000 | Maximum imports twice a day, no matter if partial load is or is not used | Every 30 minutes |
| < 50 000 | < 7000 | Maximum import once a day, no matter if partial load is or is not used | Every 60 minutes |
| Over 50 000 | Over 7000 | There might be a need for another EPE-worker, please contact Product Owner | Separately evaluated |
Please note that if there are several tasks running at the same time you may need more EPE-workers. The tasks should be scheduled at different times and can be completed according to the table above. However, if there are more than 6 tasks running at the same time, the number of epeworkers should be increased. It's best practice not to schedule tasks to run at same time, if possible.
Recommendations related to performance
If the amount fo data to be imported is over 10000 concider these things:
Adjust log level of ESM and DATAPUMP to ERROR-level, to lowe the amount of logging during task run
Have as few as possible automations starting immediately for imported datacards (listeners, handlers, workflows), as those make ESM to take longer time handling new datacards.
Set removed accounts and entitlements status removed/disabled
With this functionality, you can mark account and entitlement status to e.g. Deleted or Disabled, when account or entitlement is removed from source system. Starting from version 2025.3 you can also set status to generic objects (not only to accounts/identities and entitlements/groups).
For version 2025.3 and newer
In version 2025.3 these settings are moved from properties files to Task UI. Also you can now set these settings for Generic objects, which have not been possible before this version.
There is separate configuration for each scheduled task, and for all mapping types. Here is example of this config on task:

Unique check added on 26.2 version
When this Set value for deleted objects option is enabled, at least one of the attributes mapped to the unique id must also be marked as Unique on the target template. If none of the mapped attributes are unique, the task cannot be saved and the message "Unique id must be mapped to at least one unique attribute of template" is shown.
For version 2025.2 and older
This functionality is available for “full” type scheduled tasks.
Settings are on datapump dockers configuration file. To change those parameter values, you need to set those in /opt/epe/datapump-itsm/config/custom.properties file.
Configuration
To enable disabling functionality, datapump config should have these parameters set to true:
disable.unknown.esm.users=truedisable.unknown.esm.groups=true
Those 2 parameters are false by default in 2024.2 and 2025.1 versions. In 2025.2 and newer version those are true by default.
Next are these parameters:
personTemplateStatusCodeAttributeKey=accountStatuspersonTemplateStatusAttributeDisabledValueKey=DeletedgroupTemplateStatusCodeAttributeKey=statusgroupTemplateStatusAttributeDisabledValueKey=5 - Removed
First two attributes should point to the DatacardHiddenState attribute in the User template, and tell which value should be send there when the user is deleted.
By default its accountStatus and Value 5 - Removed on IGA Account template.
All these needs to match with the attribute configuration:

Same thing applies for the next two paramaters, but its for Groups.'
If you need to change those parameters in properties file, do changes in Datapump container to file: /opt/epe/datapump-itsm/config/custom.properties and those changes will then survive over container reboot and will be copied on reboot to /opt/epe/datapump-itsm/config/application.properties.
Description
Tasks save their __taskid__ shown as Task Id mapping in the UI to the datacards, its then used to determine if the datacard was added by this task. In case there are multiple tasks with different sets of users.
This field was previously used as datasourceid, but since we moved to the model where connector can have multiple tasks its identifier cannot be used anymore, thats why the field was repurposed as taskid instead.
Taking users as an example, when task runs ESM is asked for the list of users that have its taskid in Task Id mapping field, and doesn't have a personTemplateStatusAttributeDisabledValueKey value in the personTemplateStatusCodeAttributeKey
This result is then compared to what the task fetched, and the datacards of users that were not fetched have their personTemplateStatusattribute set to value specified in the config - 5 - Removedby default.
Example log below shows described process and informs that one user was removed.

Same thing applies to groups but groupTemplateStatusattributes are used instead.
Notes
- Feature works only with full fetch scheduled tasks..
- No support for generic templates yet, only identity and access
- When migrating from the previous versions where datasourceid was still used it needs to run at least once to set its taskid’s in the datacards first.
- EPE identifies Disabled users or groups as the ones that were removed from the AD, at the present we do not support statuses related to the entity beign active or not.
- EPE does not enable users back on its own.
- If more than one tasks fetches the same users or groups it may overwrite the taskid in the datacard depending on which task ran last. It is suggested that many full type tasks are not fetching same user or group.
- Always do configuration file changes to custom.properties, do not change only application.properties as those changes are lost on container reboot if you have not done same changes to custom.properties.
Configuring the HR connector and scheduled task
To access connector management, the user needs permissions to Platform configuration.
1. Open the solution administration area (a gear symbol).
2. Open the connectors view.
3. Choose New connector.

2. Select Data Source type to be Custom Backend

3. Fill in information:
- Fill in a unique connector name for the connector; note that the name cannot be changed afterwards.
- Select HR-Connector-scheduled.py or IGAConnector.py script from the provisioning script field.
- A parameters encryption password is needed for hiding/revealing parameters after the connector has been saved.
- A Web API user is needed when the HR connector is writing data to the customer's Pro/IGA solution.
- A Web API password is needed when the HR connector is writing data to the customer's Pro/IGA solution.

4. Reveal & modify parameters according to customer definitions
-
Save the encryption password in a secure place; you will need it later if there is a need to adjust the parameters. See References - Parameters table below for more information about Parameters.
Example parameters:{"objectGUID_field_name":"objectGUID", "sftp_server_fqdn":"transfer.xx.com", "sftp_server_ssh_port_number":"22", "sftp_username":"username_here", "sftp_password":"username_here", "sftp_remote_path_data":"/sftp/data", "sftp_remote_path_archive":"/sftp/archive","file_path":"./data/workperiod*.csv", // Path and file pattern where the file is located. Mandatory value"data_type":"workperiod", // Values: costcenter, organization, title or workperiod. Mandatory value"run_type":"partial", // Run type specifies if comparison to the previous file will be done. Values: full or partial. Optional value, default is 'partial'"update_limit": 100, // How many updates are allowed to the IGA system. Mandatory value"override_update_limit":false, // Overrides the update limit if the amount of updates is more than the given limit. Values: true or false. Optional value, default is 'false'"minimum_row_count": 10, // The minimum number of rows that should exist in the file. Optional value"webapi_user": "IGA.WebAPI", // Web API user for report creation. Requires Create and Read permissions to the IGA Administration task. Mandatory value"webapi_password": "aeiou", // Web API user's password. Mandatory value"webapi_url":"https://eisdemo.efectecloud-demo.com", // URL to the ESM environment. Mandatory value"report_template_code":"IGAWorkflowTaskInformation", // Target template code. Mandatory value"report_folder_code":"iga_tasks", // Target folder code. Mandatory value"debug": false, // Enables debug logging. Values: true or false. Optional value, default is 'false'"language": "en" // Sets the IGA Administration Task report language. Optional value, default is 'en'}

5. Create a new scheduled task for the HR connector

6. Fill in Task Details
- Unique task name for the connector; note that the name cannot be changed afterwards.
- Task usage is set to scheduled.
- Mappings type is set to generic (one template).

- Attribute name for ObjectGUID. Write the name of your input data column/attribute that contains the unique identifier for the row, for example: objectGUID.

7. Fill in failure information
Optional settings for failure handling: if the scheduled task fails, it can create a data card that displays the error. If failure settings are defined, the administrator does not need to manually check the status of scheduled tasks.
- Failure template – select a template for the data card that is created in case of errors during provisioning (connection to data sources, timeouts, etc.)
- Failure folder – select the folder where the failure data card is stored.
- Failure attribute – select the attribute in the failure template where the error information should be stored.

8. Fill in mappings for the generic template
Generic data is read into any template the user wants; it is mandatory to set the target folder, data source ID, and unique values used for identifying data between the customer's HR system and the Matrix42 Pro/IGA solution.
- Target template – select a template to define attribute mappings
- Target folder – select a folder from a list of folders, narrowed down to match compatibility with the selected template.
- Data Source Type mapping – optional. Contains a constant string of the Generic Python Script connector type.
- Task ID mapping – mandatory to map, for example to a datasourceid or taskid attribute. This is used by the "Set value to datacard for objects deleted from source system" feature. This same attribute must also be in the mappings table, and must be a non-unique attribute.
-
Attribute mappings:
- HR attribute (external attribute) – which attribute from the file is mapped to Pro/IGA
- Local attribute – which attribute in Pro/IGA the data is mapped to

9. If you need to modify the actual script, it needs to be downloaded from the customer's host machine, modified and uploaded again.
- If you don't have access to the host machine, please contact Matrix42 Service Desk for assistance.
10. Save your changes
11. Before running the scheduled task for the HR connector:
- Check that all configuration related to workflows and settings in data cards is in place.
- When running for the first time, make sure that provisioning is disabled towards directories & applications.
12. Run the task manually, or wait until the scheduled run starts.
13. Validate that data has been read into the correct data cards and that the correct attributes are in place.
14. Troubleshooting
- If a failure template is used, check the correct data card.
- Check scheduled task history from connector management.
- Check logs.
Good to remember!
Remember to save all passwords in a secure place.
Reference
Parameters
Parameters define the settings for the HR connector, which are validated when the script is run.
Remember to store the password in a secure place, in case you need to review parameters after the scheduled task has been saved.
The HR connector uses the following parameters:
| Parameter | Description | Mandatory / optional |
|---|---|---|
| file_path | Path and file pattern, where the file is located. | Mandatory |
| data_type | Values: costcenter, organization, title or workperiod. | Mandatory |
| csv_field_delimiter | Character used as the field separator when parsing a CSV input file. Only relevant when the file format is CSV. Only available on HR-Connector-scheduled.py. |
Optional |
| update_limit | How many updates are allowed to the Pro/IGA solution. Limit is only used when run type is partial. | Mandatory |
| run_type | Specifies if comparison to the previous file will be done. Values: full load or partial; default is partial. | Mandatory |
| override_update_limit | Overrides the update limit if the amount of updates is more than the given limit. Values: true or false; default is false. | Mandatory |
| minimum_row_count | The minimum number of rows that should exist in the file. | Optional |
| webapi_user | Web API user (ESM user) for report creation. Requires create and update permissions to the IGA admin task. | Mandatory |
| webapi_password | Web API user's password. | Mandatory |
| webapi_url | URL to the Pro/IGA solution's Web API. | Mandatory |
| report_template_code | Target template code. | Mandatory |
| report_folder_code | Target folder code. | Mandatory |
| debug | Enables debug logging. Values: true or false; default is false. If set to true, log messages are more detailed, but the task runs slightly slower. Logs can be found in the epe-worker container's /custom-provisioning-scripts folder. | Optional |
Validation
Validation means that the HR connector checks that all mandatory information related to users is received from the HR solution; if it is missing, the HR connector creates an IGA admin task by default.
A customer can define more attributes to be read, outside of the list below, but this requires the HR connector's script to be modified (read more in the "How to customize import" chapter).
| Attribute | Description | Mandatory / optional |
|---|---|---|
| Row ID | Unique ID for the user's work period in the file | Mandatory |
| Last name | User's last name, required for example when generating the user's email address | Mandatory |
| First name | User's first name, required for example when generating the user's email address | Mandatory |
| Social security number / national ID | Required if selected as the unique ID for the user (or for example if bank ID authentication is also delivered) | Mandatory / optional |
| Employee number (employee ID) | Required if selected as the unique ID for the user | Mandatory / optional |
| Employment start date | When the user's work period started or is going to start | Mandatory |
| Title ID | Unique title ID for the user's title (relation to title name) | Mandatory |
| Manager ID | Unique ID for the user's manager, usually the manager's employee ID | Mandatory |
| Organizational unit ID | Unique organization unit ID (relation to organization unit name) | Mandatory |
| Spoken name | Can be used for example in the email address; commonly used in Scandinavia, when a user is able to select which of their official names they are called by | Optional |
| Second name | Commonly used for identifying users with the same name; if a name clash appears, second-name letters are used in the email address | Optional |
| Employment end date | When the user's work period is ending/ended; used for starting off-board processes | Optional |
| Employment type | Permanent, temporary, hour-based, external | Optional |
| Is user manager? | A user's title does not necessarily always indicate whether they are a manager; some HR solutions have this information available as a separate attribute | Optional |
| Title | Name for the user's title ID | Optional |
| Manager name | Name for the user's manager ID | Optional |
| User type | Internal, external | Optional |
| Cost center | User's cost center name | Optional |
| Organizational unit name | Recommended to be read from the HR solution especially where a customer wants to update organizational unit information in directories or applications, and/or when IGA automated rules are used | Optional |
Exceptions
A customer can define in which template, folder and attribute the HR connector generates the following exceptions:
| Exception | Description | IGA admin actions |
|---|---|---|
| File is not received or is empty | If the file does not exist on the customer's SFTP server, or is empty, an IGA admin task is generated for more detailed troubleshooting. | IGA admin validates why the file was not generated from the HR system or why it is empty. File needs to be re-generated and the HR connector's scheduled task is run again. |
| User is missing a unique ID | Users with a unique ID are imported; an IGA admin task is created for manual review of users whose unique ID is missing. | The user's unique ID must be entered in the HR solution, the file is re-generated and the scheduled task is run manually. |
| Scheduled task is missing extra arguments | Mandatory extra arguments are: file_path, data_type, update_limit, webapi_user, webapi_password, webapi_url, report_template_code. | Extra arguments need to be added to the scheduled-based provisioning task, and the task needs to be re-run. |
| Archive file is missing | An archive file is mandatory for a partial run to complete. | IGA admin task is created for solving the missing-file issue; once found, the scheduled task needs to be re-run. |
| Missing mandatory field (object) or value of the field | The row is blocked and the import is finalized. | IGA admin can see from the connector report (IGA admin task) if any rows were blocked. Information needs to be added to the source system, the file re-generated and the task run again. |
| Update limit (update_limit) is exceeded | Import is interrupted (not run). | IGA admin task is created for solving the issue, and the scheduled task is re-run. |
| Minimum row count is not reached | Import is interrupted (not run). | IGA admin task is created for solving the issue, and the scheduled task is re-run. |
| Multiple files matching the naming criteria in the SFTP server | Import is interrupted (not run). | Extra files need to be removed and the HR connector's scheduled task needs to be re-run. |
How to customize import
How to create and modify custom Python scripts
General info
Generic Python Script connector comes with couple out-of-the box Python scripts. You should not modify those. Instead, if you need to make modifications to those, copy-paste those to new name and then do your modifications to newly named python script file. And as last step, modify your connector to use that script.
Work order:
- Create your custom scheduled or task-based script
- Take it into use to connector from Connectors UI
Scheduled scripts
How to take your custom python script into use for scheduled tasks, guidance for 1 host and 1 worker environment:
Note! Do not change "default" .py files which came with environment installation.
Copy your customly named (in this example mypythonscript.py) python script to these folders from HOST (remember to use correct tenant_name in path):
cp mypythonscript.py /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/only_scheduled
cp mypythonscript.py /var/lib/efecteone/tenant_files/{tenant_name}/epe-worker-1/files/custom-provisioning-scripts
cp mypythonscript.py /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts
Change your custom python script file permission to 755 on all those above locations where you copied your script(in this example mypythonscript.py) (remember to use correct tenant_name in path):
chmod 755 /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/only_scheduled/mypythonscript.py
chmod 755 /var/lib/efecteone/tenant_files/{tenant_name}/epe-worker-1/files/custom-provisioning-scripts/mypythonscript.py
chmod 755 /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/mypythonscript.py
If you have more hosts, repeat on every host.
If you have more workers, repeat to every worker(check that worker folder name is correct).
Event-based scripts
How to take your custom python script into use for event-based tasks, guidance for 1 host environment:
Note! Do not change "default" .py files which came with environment installation.
Copy your customly named (in this example mypythonscript.py) python script to these folders from HOST (remember to use correct tenant_name in path):
cp mypythonscript.py /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/only_event
cp mypythonscript.py /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts
Change your custom python script file permission to 755 on all those above locations where you copied your script(in this example mypythonscript.py) (remember to use correct tenant_name in path):
chmod 755 /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/only_event/mypythonscript.py
chmod 755 /var/lib/efecteone/tenant_files/{tenant_name}/epe-master/files/custom-provisioning-scripts/mypythonscript.py
If you have more hosts, repeat on every host.
Example/base for custom Event-based python script
This script reads attribute values from Connector and from Orchestration node. And prints values to logs. You can use this as a starting point for your own custom python script for Event-based tasks.
#!/usr/bin/python3
import json
import sys
import logging
def main():
# Configure logging, change log file name
logging.basicConfig(filename='python_event_task_abc.log', level=logging.INFO, format='%(asctime)s - %(message)s')
# Read inputs from stdin
lines = sys.stdin.read().splitlines()
if len(lines) != 2:
print("Error: Expected exactly two lines of input.")
raise Exception("Expected exactly two lines of input.")
# Parse the first line, this contains connector variables
try:
connector_parameters = json.loads(lines[0])
host = connector_parameters.get('host', None)
password = connector_parameters.get('password', None)
logging.info(f"Connector parameters, Host={host}")
# read custom connector parameters here
except json.JSONDecodeError:
raise Exception("Connector parameters is not a valid JSON string.")
# Parse the second line, this contains mappings data from template datacard
try:
task_mappings = json.loads(lines[1])
logging.info(f"Task mappings JSON: {task_mappings}")
#read task mappings data here
# Implement your logic here
except json.JSONDecodeError as e:
raise Exception("Task mappings is not a valid JSON string.") from e
# Exceptions raised are controlling workflow orchestration node flow, on exception it goes to Exception path, otherwise it goes to Completed path. Exception raised can be seen on Provisioning exception attribute value.
except Exception as e:
raise Exception("An unexpected error occurred") from e
if __name__ == "__main__":
main()
Take customly named script into use to connector
How to take your customly named Python script into use, by selecting it from Connectors UI. Select your script from connectors Provisioning script -dropdown:

Implementation and work estimations
Only Matrix42 has access to host, which is needed for these custom scripts to be installed.
These expansion possibilities always need Matrix42 consultants review, before implementation and work estimations can be agreed.
What's new in HR-Connector-scheduled.py
Comparison with the previous script
HR-Connector-scheduled.py is the new baseline script for the HR connector, delivered as the direct successor to IGAConnector.py. It uses the same Generic Python Script connector mechanism, the same parameter model, and the same validation/exception approach described elsewhere in this article: it is not a redesign, but a hardened and extended version intended as the foundation for future HR connector improvements.
New HR connector deliveries should use HR-Connector-scheduled.py. Connectors already configured with IGAConnector.py keep running on that script until the provisioning script is explicitly changed in the connector configuration, so check the script selection before assuming a connector has been upgraded.
| Area | IGAConnector.py (previous) | HR-Connector-scheduled.py (new) |
|---|---|---|
| Supported object templates |
costcenter, organization, title, workperiod
|
Supports any template |
| CSV delimiter | Fixed to ; (semicolon) | Configurable via the new csv_field_delimiter parameter |
| Partial (delta) run with no data changes | Run was flagged as failed (red) in Connector Management even though it completed correctly | Run is correctly reported as successful when no changes are detected |
| Logging output | Duplicate messages across functions, actual exception text not surfaced, misleading messages (e.g. file-not-found logged for an encoding error) | Function-level context on each log line, actual exception detail included, no empty-ID placeholders, no swallowed errors |
Update limit check (override_update_limit: false) |
Could fail internally without creating an IGA Administration Task, leaving the run's failure unexplained | Reliably creates an IGA Administration Task reporting the exceeded update limit, with no unnecessary error noise |
| Unique-ID field validation | Only checked that the unique-ID column existed in the header row, so a row with an empty value in that column still passed | Checks that the unique-ID field (objectGUID) actually contains a value; rows with a missing unique ID are rejected and reported. Other mapped fields are not individually checked for emptiness. |
Table of Contents

