refs #198 adds new ogbootbundle with controller functions and service to connect so stunnel4

pull/3/head
Luis Gerardo Romero Garcia 2024-02-15 11:40:22 +01:00
parent 66e4e2d3cb
commit ddc8a5faa3
32 changed files with 1644 additions and 0 deletions

107
composer.json 100644
View File

@ -0,0 +1,107 @@
{
"type": "project",
"license": "proprietary",
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"php": ">=7.2.0",
"ext-ctype": "*",
"ext-iconv": "*",
"doctrine/annotations": "^1.6",
"doctrine/doctrine-bundle": "^2.0",
"doctrine/doctrine-migrations-bundle": "^3.0",
"doctrine/orm": "^2.7",
"phpdocumentor/reflection-docblock": "^5.0",
"phpstan/phpdoc-parser": "^0.4",
"zircote/swagger-php": "3.*",
"symfony/runtime": "5.*",
"symfony/asset": "5.*",
"symfony/console": "5.*",
"symfony/doctrine-messenger": "5.*",
"symfony/dotenv": "5.*",
"symfony/expression-language": "5.*",
"symfony/flex": "^1.17",
"symfony/form": "5.*",
"symfony/framework-bundle": "5.*",
"symfony/http-client": "5.*",
"symfony/intl": "5.*",
"symfony/mailer": "5.*",
"symfony/mime": "5.*",
"symfony/monolog-bundle": "^3.0",
"symfony/notifier": "5.*",
"symfony/process": "5.*",
"symfony/property-access": "5.*",
"symfony/property-info": "5.*",
"symfony/security-bundle": "5.*",
"symfony/serializer": "5.*",
"symfony/string": "5.*",
"symfony/translation": "5.*",
"symfony/twig-bundle": "5.*",
"symfony/validator": "5.*",
"symfony/web-link": "5.*",
"symfony/yaml": "5.*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0"
},
"require-dev": {
"phpunit/phpunit": "^8.5",
"symfony/browser-kit": "5.*",
"symfony/css-selector": "5.*",
"symfony/debug-bundle": "5.*",
"symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^5.0",
"symfony/stopwatch": "5.*",
"symfony/web-profiler-bundle": "5.*"
},
"config": {
"platform": {
"php": "8.3"
},
"allow-plugins": {
"composer/package-versions-deprecated": true,
"symfony/flex": true,
"symfony/runtime": true
},
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.*"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

16
public/index.css 100644
View File

@ -0,0 +1,16 @@
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}

19
public/index.html 100644
View File

@ -0,0 +1,19 @@
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Swagger UI</title>
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
<link rel="stylesheet" type="text/css" href="index.css" />
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
<script src="./swagger-initializer.js" charset="UTF-8"> </script>
</body>
</html>

9
public/index.php 100644
View File

@ -0,0 +1,9 @@
<?php
use App\Kernel;
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};

View File

@ -0,0 +1,79 @@
<!doctype html>
<html lang="en-US">
<head>
<title>Swagger UI: OAuth2 Redirect</title>
</head>
<body>
<script>
'use strict';
function run () {
var oauth2 = window.opener.swaggerUIRedirectOauth2;
var sentState = oauth2.state;
var redirectUrl = oauth2.redirectUrl;
var isValid, qp, arr;
if (/code|token|error/.test(window.location.hash)) {
qp = window.location.hash.substring(1).replace('?', '&');
} else {
qp = location.search.substring(1);
}
arr = qp.split("&");
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
qp = qp ? JSON.parse('{' + arr.join() + '}',
function (key, value) {
return key === "" ? value : decodeURIComponent(value);
}
) : {};
isValid = qp.state === sentState;
if ((
oauth2.auth.schema.get("flow") === "accessCode" ||
oauth2.auth.schema.get("flow") === "authorizationCode" ||
oauth2.auth.schema.get("flow") === "authorization_code"
) && !oauth2.auth.code) {
if (!isValid) {
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "warning",
message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server."
});
}
if (qp.code) {
delete oauth2.state;
oauth2.auth.code = qp.code;
oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
} else {
let oauthErrorMsg;
if (qp.error) {
oauthErrorMsg = "["+qp.error+"]: " +
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
(qp.error_uri ? "More info: "+qp.error_uri : "");
}
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "error",
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server."
});
}
} else {
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
}
window.close();
}
if (document.readyState !== 'loading') {
run();
} else {
document.addEventListener('DOMContentLoaded', function () {
run();
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,20 @@
window.onload = function() {
//<editor-fold desc="Changeable Configuration Block">
// the following lines will be replaced by docker/configurator, when it runs in a docker-container
window.ui = SwaggerUIBundle({
url: "http://192.168.0.27:8080/swagger.json",
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
});
//</editor-fold>
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

549
public/swagger.json 100644
View File

@ -0,0 +1,549 @@
{
"openapi": "3.0.0",
"info": {
"title": "My API",
"version": "1.0"
},
"paths": {
"/opengnsys3/rest/dhcp/subnet": {
"get": {
"operationId": "ece42bc4084486aedf42734bdb0b84cb",
"responses": {
"200": {
"description": "Devuelve todas las subredes",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Subnet"
}
}
}
}
},
"400": {
"description": "Error al obtener las subredes"
}
}
},
"post": {
"summary": "Add a new DHCP subnet",
"operationId": "36e86a6932056e774180d074d3d63ad0",
"requestBody": {
"description": "JSON payload",
"required": true,
"content": {
"application/json": {
"schema": {
"properties": {
"subnetId": {
"type": "integer",
"example": 2
},
"mask": {
"type": "string",
"example": "255.255.255.0"
},
"address": {
"type": "string",
"example": "192.168.1.0"
},
"nextServer": {
"type": "string",
"example": "192.168.1.1"
},
"bootFileName": {
"type": "string",
"example": "pxelinux.0"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Subnet added successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
}
},
"/opengnsys3/rest/dhcp/subnet/{subnetId}": {
"put": {
"summary": "Modify a DHCP subnet",
"operationId": "c002afa59d07660be24fda34e1498c13",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "ID of the subnet to modify",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"description": "Data to modify the subnet",
"required": true,
"content": {
"application/json": {
"schema": {
"properties": {
"mask": {
"type": "string"
},
"address": {
"type": "string"
},
"nextServer": {
"type": "string"
},
"bootFileName": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Subnet modified successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
},
"delete": {
"summary": "Delete a DHCP subnet",
"operationId": "299c4287d729ca98c47ef613720051f4",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "ID of the subnet to delete",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "Subnet deleted successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
}
},
"/opengnsys3/rest/dhcp/subnet/{subnetId}/host": {
"get": {
"summary": "Get all hosts in a subnet",
"operationId": "2511366de74accc3d7356814ced1cf50",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "The ID of the subnet",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "List of hosts in the subnet",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Host"
}
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"500": {
"description": "Server error",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
},
"put": {
"summary": "Update a DHCP host",
"operationId": "6106fe2802e2f913ddb35df61b5fde35",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "The ID of the subnet",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"description": "Data for the host to update",
"required": true,
"content": {
"application/json": {
"schema": {
"properties": {
"host": {
"type": "string",
"example": "pc11"
},
"oldMacAddress": {
"type": "string",
"example": "56:6f:c7:4f:00:4f"
},
"oldAddress": {
"type": "string",
"example": "192.168.1.11"
},
"macAddress": {
"type": "string",
"example": "56:6f:c7:4f:01:01"
},
"address": {
"type": "string",
"example": "192.168.1.11"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Host updated successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
},
"post": {
"summary": "Add a DHCP host to a subnet",
"operationId": "f5d3e1de64faa4e5b14cdc7d3bd0c427",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "ID of the subnet to add the host to",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"description": "Data for the new host",
"required": true,
"content": {
"application/json": {
"schema": {
"properties": {
"host": {
"type": "string",
"example": "pc11"
},
"macAddress": {
"type": "string",
"example": "56:6f:c7:4f:00:4f"
},
"address": {
"type": "string",
"example": "172.30.4.11"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Host added successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
},
"delete": {
"summary": "Delete a DHCP host from a specific subnet",
"operationId": "542cc5fc093ff121c154504e9cad270f",
"parameters": [
{
"name": "subnetId",
"in": "path",
"description": "The ID of the subnet",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"description": "Data for the host to delete",
"required": true,
"content": {
"application/json": {
"schema": {
"properties": {
"host": {
"type": "string",
"example": "pc11"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "Host deleted successfully",
"content": {
"application/json": {
"schema": {
"properties": {
"success": {
"type": "string"
}
},
"type": "object"
}
}
}
},
"400": {
"description": "Error occurred",
"content": {
"application/json": {
"schema": {
"properties": {
"error": {
"type": "string"
}
},
"type": "object"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"Subnet": {
"properties": {
"id": {
"description": "The ID of the subnet",
"type": "integer"
},
"subnet": {
"description": "The name of the subnet",
"type": "string"
},
"next-server": {
"description": "The next server in the subnet",
"type": "string"
},
"boot-file-name": {
"description": "The boot file name for the subnet",
"type": "string"
},
"reservations": {
"type": "array",
"items": {
"description": "The reservations in the subnet",
"type": "object"
}
}
},
"type": "object"
},
"Host": {
"properties": {
"host": {
"type": "string",
"example": "pc11"
},
"macAddress": {
"type": "string",
"example": "56:6f:c7:4f:00:4f"
},
"address": {
"type": "string",
"example": "172.30.4.11"
}
},
"type": "object"
}
}
}
}

341
public/swagger.yml 100644
View File

@ -0,0 +1,341 @@
openapi: 3.0.0
info:
title: 'Ogdhcp API'
version: '1.0'
paths:
/opengnsys3/rest/dhcp/subnets:
get:
operationId: 8f92a1cbcb8cd176bdc4ae272b3ad303
responses:
'200':
description: 'Devuelve todas las subredes'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Subnet'
'400':
description: 'Error al obtener las subredes'
post:
summary: 'Add a new DHCP subnet'
operationId: 88949bae5e7784ce2721ffafe7c88c0a
requestBody:
description: 'JSON payload'
required: true
content:
application/json:
schema:
properties:
subnetId:
type: integer
example: 2
mask:
type: string
example: 255.255.255.0
address:
type: string
example: 192.168.1.0
nextServer:
type: string
example: 192.168.1.1
bootFileName:
type: string
example: pxelinux.0
type: object
responses:
'200':
description: 'Subnet added successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
'/opengnsys3/rest/dhcp/subnets/{subnetId}':
put:
summary: 'Modify a DHCP subnet'
operationId: 548b55fc0e1ad59ea5b5c909dfd07c71
parameters:
-
name: subnetId
in: path
description: 'ID of the subnet to modify'
required: true
schema:
type: integer
requestBody:
description: 'Data to modify the subnet'
required: true
content:
application/json:
schema:
properties:
mask:
type: string
address:
type: string
nextServer:
type: string
bootFileName:
type: string
type: object
responses:
'200':
description: 'Subnet modified successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
delete:
summary: 'Delete a DHCP subnet'
operationId: c1c1c34729bdd85857b22e6e2bdc41de
parameters:
-
name: subnetId
in: path
description: 'ID of the subnet to delete'
required: true
schema:
type: integer
responses:
'200':
description: 'Subnet deleted successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
'/opengnsys3/rest/dhcp/subnets/{subnetId}/hosts':
get:
summary: 'Get all hosts in a subnet'
operationId: 0989ca622a6a7e23f5af8e3bdd6f6b05
parameters:
-
name: subnetId
in: path
description: 'The ID of the subnet'
required: true
schema:
type: integer
responses:
'200':
description: 'List of hosts in the subnet'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Host'
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
'500':
description: 'Server error'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
put:
summary: 'Update a DHCP host'
operationId: 1541441cd53685aaf6df45ab48befaa8
parameters:
-
name: subnetId
in: path
description: 'The ID of the subnet'
required: true
schema:
type: integer
requestBody:
description: 'Data for the host to update'
required: true
content:
application/json:
schema:
properties:
host:
type: string
example: pc11
oldMacAddress:
type: string
example: '56:6f:c7:4f:00:4f'
oldAddress:
type: string
example: 192.168.1.11
macAddress:
type: string
example: '56:6f:c7:4f:01:01'
address:
type: string
example: 192.168.1.11
type: object
responses:
'200':
description: 'Host updated successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
post:
summary: 'Add a DHCP host to a subnet'
operationId: 3f897dcd7c04787ac9c42ddbb57cb800
parameters:
-
name: subnetId
in: path
description: 'ID of the subnet to add the host to'
required: true
schema:
type: integer
requestBody:
description: 'Data for the new host'
required: true
content:
application/json:
schema:
properties:
host:
type: string
example: pc11
macAddress:
type: string
example: '56:6f:c7:4f:00:4f'
address:
type: string
example: 172.30.4.11
type: object
responses:
'200':
description: 'Host added successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
delete:
summary: 'Delete a DHCP host from a specific subnet'
operationId: f652c52b39d57d283401df66a7930b5f
parameters:
-
name: subnetId
in: path
description: 'The ID of the subnet'
required: true
schema:
type: integer
requestBody:
description: 'Data for the host to delete'
required: true
content:
application/json:
schema:
properties:
host:
type: string
example: pc11
type: object
responses:
'200':
description: 'Host deleted successfully'
content:
application/json:
schema:
properties:
success: { type: string }
type: object
'400':
description: 'Error occurred'
content:
application/json:
schema:
properties:
error: { type: string }
type: object
components:
schemas:
Subnet:
properties:
id:
description: 'The ID of the subnet'
type: integer
subnet:
description: 'The name of the subnet'
type: string
next-server:
description: 'The next server in the subnet'
type: string
boot-file-name:
description: 'The boot file name for the subnet'
type: string
reservations:
type: array
items:
description: 'The reservations in the subnet'
type: object
type: object
Host:
properties:
host:
type: string
example: pc11
macAddress:
type: string
example: '56:6f:c7:4f:00:4f'
address:
type: string
example: 172.30.4.11
type: object

View File

@ -0,0 +1 @@
[]

0
src/Controller/.gitignore vendored 100644
View File

0
src/Entity/.gitignore vendored 100644
View File

11
src/Kernel.php 100644
View File

@ -0,0 +1,11 @@
<?php
namespace App;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
class Kernel extends BaseKernel
{
use MicroKernelTrait;
}

View File

View File

@ -0,0 +1,338 @@
<?php
// src/OgBootBundle/Controller/OgBootController.php
namespace App\OgBootBundle\Controller;
require_once __DIR__ . '/../constants.php';
use OpenApi\Annotations as OA;
use Psr\Log\LoggerInterface;
use App\OgBootBundle\Service\CurlRequestService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Exception;
class OgBootController
{
private $logger;
/**
* @OA\Info(title="Ogboot API", version="1.0")
*/
private $curlRequestService;
public function __construct(CurlRequestService $curlRequestService, LoggerInterface $logger)
{
$this->curlRequestService = $curlRequestService;
$this->logger = $logger;
}
/**
* @OA\Post(
* path="/clients/poweroff",
* summary="Power off a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1"))
* )
* ),
* @OA\Response(
* response=200,
* description="Clients powered off successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/poweroff", name="poweroff", methods={"POST"})
*/
public function poweroff(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_POWEROFF, POST, [OG_REST_PARAM_CLIENTS => $ips]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @OA\Post(
* path="/clients/reboot",
* summary="Reboot a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1"))
* )
* ),
* @OA\Response(
* response=200,
* description="Clients rebooted successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/reboot", name="reboot", methods={"POST"})
*/
public function reboot(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_REBOOT, POST, [OG_REST_PARAM_CLIENTS => $ips]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @OA\Post(
* path="/clients/stop",
* summary="Stop a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1"))
* )
* ),
* @OA\Response(
* response=200,
* description="Clients stopped successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/stop", name="stop", methods={"POST"})
*/
public function stop(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_REBOOT, POST, [OG_REST_PARAM_CLIENTS => $ips]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @OA\Post(
* path="/clients/refresh",
* summary="Refresh a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1"))
* )
* ),
* @OA\Response(
* response=200,
* description="Clients refreshed successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/refresh", name="refresh", methods={"POST"})
*/
public function refresh(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_REFRESH, POST, [OG_REST_PARAM_CLIENTS => $ips]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @OA\Post(
* path="/clients/hardware",
* summary="Get hardware info of a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1"))
* )
* ),
* @OA\Response(
* response=200,
* description="Hardware info retrieved successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/hardware", name="hardware", methods={"POST"})
*/
public function hardware(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_HARDWARE, POST, [OG_REST_PARAM_CLIENTS => $ips]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* @OA\Post(
* path="/clients/software",
* summary="Get software info of a client",
* @OA\RequestBody(
* description="JSON payload",
* required=true,
* @OA\JsonContent(
* type="object",
* @OA\Property(property="clients", type="array", @OA\Items(type="string", example="192.168.1.1")),
* @OA\Property(property="disk", type="string", example="disk1"),
* @OA\Property(property="part", type="string", example="part1")
* )
* ),
* @OA\Response(
* response=200,
* description="Software info retrieved successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="success", type="string")
* )
* ),
* @OA\Response(
* response=400,
* description="Error occurred",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string")
* )
* )
* )
* @Route("/clients/software", name="software", methods={"POST"})
*/
public function software(Request $request): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['clients']) || !isset($data['disk']) || !isset($data['part'])) {
return new Response('Invalid data', Response::HTTP_BAD_REQUEST);
}
$ips = $data['clients'];
$disk = $data['disk'];
$part = $data['part'];
$result = $this->curlRequestService->common_request(OG_REST_CMD_SOFTWARE, POST, [OG_REST_PARAM_CLIENTS => $ips, OG_REST_PARAM_DISK => $disk, OG_REST_PARAM_PART => $part]);
if ($result) {
return new Response('Success', Response::HTTP_OK);
} else {
return new Response('Failed', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
}

View File

@ -0,0 +1,10 @@
<?php
// src/OgBootBundle/OgBootBundle.php
namespace App\OgBootBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class OgBootBundle extends Bundle
{
}

View File

@ -0,0 +1,63 @@
<?php
// src/OgBootBundle/Service/CurlRequestService.php
namespace App\OgBootBundle\Service;
require_once __DIR__ . '/../constants.php';
use Exception;
include_once (__DIR__ . '/../../../etc/php-vars.php');
$conf_file = parse_ini_file(__DIR__ . '/../../../etc/ogAdmServer.cfg');
define('OG_REST_API_TOKEN', 'Authorization: ' . $conf_file['APITOKEN']);
class CurlRequestService
{
function common_request($command, $type, $data = null) {
$json = json_encode($data);
$service_url = OG_REST_URL.$command;
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
OG_REST_API_TOKEN,
));
curl_setopt ($curl, CURLOPT_SSLCERT, __DIR__ . '/../../../etc/ssl/WebConsole.crt.pem');
curl_setopt ($curl, CURLOPT_SSLKEY, __DIR__ . '/../../../etc/ssl/WebConsole.key.pem');
switch ($type) {
default:
case GET:
break;
case POST:
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
}
$curl_response = curl_exec($curl);
$info = curl_getinfo($curl);
if ($curl_response === false || $info['http_code'] != 200) {
syslog(LOG_ERR, 'error occured during curl exec. Additioanl info: ' . print_r($info, TRUE));
return 0;
}
curl_close($curl);
syslog(LOG_INFO, 'response '.$command.' ok!');
return json_decode($curl_response, true);
}
public function convertMaskToCIDR($mask)
{
$bits = 0;
$mask = explode(".", $mask);
foreach ($mask as $octect)
$bits += strlen(str_replace("0", "", decbin($octect)));
return $bits;
}
}

View File

@ -0,0 +1,58 @@
<?php
define('GET', 1);
define('POST', 2);
define('CUSTOM', 3);
define('OG_REST_CMD_CLIENTS', 'clients');
define('OG_REST_CMD_WOL', 'wol');
define('OG_REST_CMD_SESSION', 'session');
define('OG_REST_CMD_RUN', 'shell/run');
define('OG_REST_CMD_OUTPUT', 'shell/output');
define('OG_REST_CMD_POWEROFF', 'poweroff');
define('OG_REST_CMD_REBOOT', 'reboot');
define('OG_REST_CMD_STOP', 'stop');
define('OG_REST_CMD_REFRESH', 'refresh');
define('OG_REST_CMD_HARDWARE', 'hardware');
define('OG_REST_CMD_SOFTWARE', 'software');
define('OG_REST_CMD_CREATE_IMAGE', 'image/create');
define('OG_REST_CMD_RESTORE_IMAGE', 'image/restore');
define('OG_REST_CMD_SETUP', 'setup');
define('OG_REST_CMD_CREATE_BASIC_IMAGE', 'image/create/basic');
define('OG_REST_CMD_CREATE_INCREMENTAL_IMAGE', 'image/create/incremental');
define('OG_REST_CMD_RESTORE_BASIC_IMAGE', 'image/restore/basic');
define('OG_REST_CMD_RESTORE_INCREMENTAL_IMAGE', 'image/restore/incremental');
define('OG_REST_CMD_RUN_SCHEDULE', 'run/schedule');
define('OG_REST_PARAM_CLIENTS', 'clients');
define('OG_REST_PARAM_ADDR', 'addr');
define('OG_REST_PARAM_MAC', 'mac');
define('OG_REST_PARAM_DISK', 'disk');
define('OG_REST_PARAM_PART', 'partition');
define('OG_REST_PARAM_RUN', 'run');
define('OG_REST_PARAM_TYPE', 'type');
define('OG_REST_PARAM_STATE', 'state');
define('OG_REST_PARAM_NAME', 'name');
define('OG_REST_PARAM_REPOS', 'repository');
define('OG_REST_PARAM_ID', 'id');
define('OG_REST_PARAM_CODE', 'code');
define('OG_REST_PARAM_PROFILE', 'profile');
define('OG_REST_PARAM_CACHE', 'cache');
define('OG_REST_PARAM_CACHE_SIZE', 'cache_size');
define('OG_REST_PARAM_FILE_SYSTEM', 'filesystem');
define('OG_REST_PARAM_SIZE', 'size');
define('OG_REST_PARAM_FORMAT', 'format');
define('OG_REST_PARAM_PARTITION_SETUP', 'partition_setup');
define('OG_REST_PARAM_SYNC_PARAMS', 'sync_params');
define('OG_REST_PARAM_SYNC', 'sync');
define('OG_REST_PARAM_DIFF', 'diff');
define('OG_REST_PARAM_REMOVE', 'remove');
define('OG_REST_PARAM_COMPRESS', 'compress');
define('OG_REST_PARAM_CLEANUP', 'cleanup');
define('OG_REST_PARAM_CLEANUP_CACHE', 'cleanup_cache');
define('OG_REST_PARAM_REMOVE_DST', 'remove_dst');
define('OG_REST_PARAM_PATH', 'path');
define('OG_REST_PARAM_DIFF_ID', 'diff_id');
define('OG_REST_PARAM_DIFF_NAME', 'diff_name');
define('OG_REST_PARAM_METHOD', 'method');
define('OG_REST_PARAM_ECHO', 'echo');
?>

0
src/Repository/.gitignore vendored 100644
View File