UNPKG

sc-zabbix-api

Version:

TypeScript client for Zabbix JSON-RPC API with token authentication

313 lines (224 loc) 7.48 kB
# SC Zabbix API Client A TypeScript library for consuming the Zabbix JSON-RPC API with support for both token authentication and user/password login. ## Features - ✅ Authentication via API token - ✅ Authentication via username/password with session management - ✅ Full TypeScript support with strong typing - ✅ ES modules compatible - ✅ Specific methods for common operations - ✅ Generic method for custom calls - ✅ Robust error handling with detailed error types - ✅ Automatic retry logic with exponential backoff - ✅ Connection timeout handling and testing - ✅ Automatic session management for login-based authentication ## Installation ```bash npm install ``` ## Configuration 1. Copy the `.env.example` file to `.env`: ```bash cp .env.example .env ``` 2. Configure your Zabbix credentials in the `.env` file: ```bash ZABBIX_URL=https://your-zabbix-server.com/api_jsonrpc.php ZABBIX_TOKEN=your-api-token-here ZABBIX_TIMEOUT=10000 ``` ### Configuration Options The `ZabbixApiConfig` interface supports the following options: - `url: string` - Zabbix API URL (usually ends with `/api_jsonrpc.php`) - `token?: string` - Zabbix API token (for token authentication) - `username?: string` - Username (for session authentication) - `password?: string` - Password (for session authentication) - `timeout?: number` - Default timeout in milliseconds (default: 10000) - `loginTimeout?: number` - Timeout for login operations in milliseconds (default: 15000) - `retries?: number` - Number of retry attempts for failed requests (default: 3) - `retryDelay?: number` - Base delay between retries in milliseconds (default: 1000) ## Basic Usage ### Option 1: Using API Token ```typescript import { SCZabbixApi } from "sc-zabbix-api"; const zabbixApi = new SCZabbixApi({ url: "https://your-zabbix-server.com/api_jsonrpc.php", token: "your-api-token-here", timeout: 10000, // optional }); // Get all hosts const hosts = await zabbixApi.HostGet(); ``` ### Option 2: Using Username/Password ```typescript import { SCZabbixApi } from "sc-zabbix-api"; const zabbixApi = new SCZabbixApi({ url: "https://your-zabbix-server.com/api_jsonrpc.php", timeout: 10000, // optional }); // Login with username and password const loginResponse = await zabbixApi.UserLogin({ username: "your-username", password: "your-password", userData: true, // optional: retrieve user data }); console.log("Session ID:", loginResponse.result.sessionid); // Now you can make API calls const hosts = await zabbixApi.HostGet(); // Don't forget to logout when done await zabbixApi.UserLogout(); ``` ### Error Handling The library provides enhanced error handling with specific error types: ```typescript import { SCZabbixApi, ZabbixConnectionError } from "sc-zabbix-api"; try { const api = new SCZabbixApi({ url: "https://your-zabbix-server.com/api_jsonrpc.php", token: "your-token", timeout: 5000, retries: 3, }); // Test connectivity const connectionTest = await api.testConnection(); if (!connectionTest.success) { console.error(`Connection failed: ${connectionTest.error}`); return; } const hosts = await api.HostGet(); } catch (error) { if (error instanceof Error && "type" in error) { const connError = error as ZabbixConnectionError; switch (connError.type) { case "TIMEOUT": console.error("Request timed out - try increasing timeout"); break; case "CONNECTION_REFUSED": console.error( "Server refused connection - check URL and server status" ); break; case "NETWORK_ERROR": console.error("Network error - check connectivity"); break; case "AUTH_ERROR": console.error("Authentication failed - check credentials"); break; } } } ``` ### Example: Get Hosts with Parameters ```typescript // Get hosts with specific parameters const hosts = await zabbixApi.HostGet({ output: ["hostid", "host", "name", "status"], filter: { status: [0], // Only enabled hosts }, selectInterfaces: ["ip", "port", "type"], limit: 100, }); const items = await zabbixApi.getItems("12345"); // Generic call for any API method const result = await zabbixApi.call("hostgroup.get", { output: ["groupid", "name"], }); ``` ## API ### Constructor ```typescript new SCZabbixApi(config: ZabbixApiConfig) ``` **ZabbixApiConfig:** - `url: string` - Zabbix API URL (usually ends with `/api_jsonrpc.php`) - `token?: string` - Zabbix API token (for token authentication) - `username?: string` - Username (for session authentication) - `password?: string` - Password (for session authentication) - `timeout?: number` - Default timeout in milliseconds (default: 10000) - `loginTimeout?: number` - Timeout for login operations in milliseconds (default: 15000) - `retries?: number` - Number of retry attempts for failed requests (default: 3) - `retryDelay?: number` - Base delay between retries in milliseconds (default: 1000) ### Methods #### Connection Testing - `testConnection()` - Test connectivity to Zabbix server and return latency information #### Authentication - `UserLogin(params)` - Authenticate with username and password - `UserCheckAuthentication(params?)` - Check if current session/token is valid - `UserLogout()` - Logout and invalidate current session #### Information - `ApiinfoVersion()` - Get Zabbix API version #### Hosts - `HostGet(params?)` - Retrieve hosts #### Items - `ItemGet(params?)` - Retrieve items - `ItemCreate(params)` - Create new items - `ItemUpdate(params)` - Update existing items - `ItemDelete(itemIds)` - Delete items by ID #### getHosts(): Promise<Host[]> Returns all Zabbix hosts. **Returns:** Array of `Host` objects with `hostid` and `host`. #### getItems(hostId: string): Promise<Item[]> Returns all items from a specific host. **Parameters:** - `hostId: string` - Host ID **Returns:** Array of `Item` objects with `itemid`, `name`, `key_` and `lastvalue`. #### call<T, P>(method: string, params: P): Promise<T> Generic method for custom calls to the Zabbix API. **Parameters:** - `method: string` - API method name (e.g., 'host.get', 'item.get') - `params: P` - Parameters for the method **Returns:** Typed result as specified. ## Types ### Host ```typescript interface Host { hostid: string; host: string; } ``` ### Item ```typescript interface Item { itemid: string; name: string; key_: string; lastvalue: string; } ``` ## How to get an API token 1. Access your Zabbix instance 2. Go to **Administration****General****API tokens** 3. Click **Create API token** 4. Fill in the name and select the user 5. Configure expiration (if needed) 6. Click **Add** 7. Copy the generated token ## Tests Run tests using Vitest: ```bash # Run all tests npm test # Run tests with visual interface npm run test:ui # Run tests once (CI/CD) npm run test:run # Run tests with coverage npm run test:coverage ``` **Important:** Tests make real calls to your Zabbix API. Make sure to configure the `.env` file with your credentials before running tests. ## Build ```bash npm run build ``` ## Development ```bash npm run dev # Watch mode ``` ## Development Testing ```bash npm test # Watch mode for tests ``` ## Zabbix API Documentation For more information about available methods, see the [official Zabbix API documentation](https://www.zabbix.com/documentation/current/en/manual/api/reference). ## License MIT