@tuxcare-se/tuxcare-eportal-mcp
Version:
TuxCare ePortal MCP server for integrating with TuxCare ePortal API
144 lines • 5.81 kB
JavaScript
import axios from 'axios';
import { AuthManager } from './auth.js';
export class EPortalClient {
constructor(baseURL, authConfig) {
this.authManager = new AuthManager(authConfig);
this.client = axios.create({
baseURL: baseURL.endsWith('/') ? baseURL : `${baseURL}/`,
timeout: 30000,
headers: {
'Content-Type': 'application/json',
...this.authManager.getHeaders()
}
});
this.client.interceptors.response.use((response) => response, (error) => {
if (error.response?.status === 401) {
throw new Error('Authentication failed. Please check your credentials.');
}
if (error.response?.status === 403) {
throw new Error('Access denied. Please check your permissions.');
}
if (error.response?.data?.error) {
throw new Error(`API Error: ${error.response.data.error}`);
}
throw error;
});
}
// Server Management
async listServers(filters = {}) {
const params = new URLSearchParams();
Object.entries(filters).forEach(([key, value]) => {
if (value !== undefined) {
params.append(key, value.toString());
}
});
const response = await this.client.get('admin/api/servers', { params });
return response.data;
}
async registerHost(key, hostname) {
const data = new URLSearchParams();
data.append('key', key);
if (hostname) {
data.append('hostname', hostname);
}
const response = await this.client.post('admin/api/register', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
return response.data;
}
async unregisterHost(options) {
const params = new URLSearchParams();
if (options.hostname)
params.append('hostname', options.hostname);
if (options.ip)
params.append('ip', options.ip);
if (options.server_id)
params.append('server_id', options.server_id);
if (params.toString() === '') {
throw new Error('At least one parameter (hostname, ip, or server_id) is required');
}
const response = await this.client.post('admin/api/delete_server', null, { params });
return response.data;
}
async bulkUnregisterHosts(checkin_age) {
if (checkin_age < 1) {
throw new Error('checkin_age must be greater than or equal to 1');
}
const response = await this.client.delete('admin/api/servers', { params: { checkin_age } });
return response.data;
}
// Feed Management
async listFeeds() {
const response = await this.client.get('admin/api/feeds/');
return response.data;
}
async createOrModifyFeed(feed) {
const data = new URLSearchParams();
data.append('name', feed.name);
if (feed.auto !== undefined)
data.append('auto', feed.auto.toString());
if (feed.deploy_after !== undefined)
data.append('deploy_after', feed.deploy_after.toString());
const response = await this.client.post('admin/api/feeds/', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
return response.data;
}
async deleteFeed(name) {
const response = await this.client.delete(`admin/api/feeds/${name}`);
return response.data;
}
// Key Management
async listKeys() {
const response = await this.client.get('admin/api/keys/');
return response.data;
}
async createOrModifyKey(keyData) {
const data = new URLSearchParams();
if (keyData.key)
data.append('key', keyData.key);
if (keyData.feed)
data.append('feed', keyData.feed);
if (keyData.note)
data.append('note', keyData.note);
if (keyData.server_limit !== undefined)
data.append('server_limit', keyData.server_limit.toString());
const response = await this.client.post('admin/api/keys/', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
return response.data;
}
async deleteKey(key) {
const response = await this.client.delete(`admin/api/keys/${key}`);
return response.data;
}
// Patchset Management
async listPatchsets(filters = {}) {
const params = new URLSearchParams();
if (filters.feed)
params.append('feed', filters.feed);
if (filters.product)
params.append('product', filters.product);
const response = await this.client.get('admin/api/patchsets/', { params });
return response.data;
}
async managePatchsets(options) {
const params = new URLSearchParams();
params.append('patchset', options.patchset);
options.feed.forEach(feed => params.append('feed', feed));
params.append('action', options.action);
if (options.product)
params.append('product', options.product);
const response = await this.client.post('admin/api/patchsets/manage', null, { params });
return response.data;
}
// User Management
async listUsers() {
const response = await this.client.get('admin/api/users/');
return response.data;
}
// Server Tagging
async setTags(server_id, tags) {
const params = new URLSearchParams();
params.append('server_id', server_id);
if (tags)
params.append('tags', tags);
const response = await this.client.post('admin/api/set_tags', null, { params });
return response.data;
}
}
//# sourceMappingURL=api-client.js.map