diff options
| author | Christian Breunig <christian@breunig.cc> | 2025-03-06 16:39:01 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-06 16:39:01 +0100 | 
| commit | 0ca77717a03358ce45bb4448e63e10000101d8b1 (patch) | |
| tree | 219383343ffbb706136ba0da00d2624b395af220 /src/services/vyos-http-api-server | |
| parent | 67a4363ed91e3f68e12428526e311b71f532285a (diff) | |
| parent | 9fe7d85f78e967c251b3437a90e1a5f01dab1868 (diff) | |
| download | vyos-1x-0ca77717a03358ce45bb4448e63e10000101d8b1.tar.gz vyos-1x-0ca77717a03358ce45bb4448e63e10000101d8b1.zip | |
Merge pull request #4380 from oniko94/feature/T4406-vyos-info-api-endpoint
T4406: Add public API endpoint to display information
Diffstat (limited to 'src/services/vyos-http-api-server')
| -rwxr-xr-x | src/services/vyos-http-api-server | 46 | 
1 files changed, 44 insertions, 2 deletions
| diff --git a/src/services/vyos-http-api-server b/src/services/vyos-http-api-server index 558561182..be3dd5051 100755 --- a/src/services/vyos-http-api-server +++ b/src/services/vyos-http-api-server @@ -20,18 +20,22 @@ import grp  import json  import logging  import signal +import traceback  from time import sleep +from typing import Annotated -from fastapi import FastAPI +from fastapi import FastAPI, Query  from fastapi.exceptions import RequestValidationError  from uvicorn import Config as UvicornConfig  from uvicorn import Server as UvicornServer  from vyos.configsession import ConfigSession  from vyos.defaults import api_config_state +from vyos.utils.file import read_file +from vyos.version import get_version  from api.session import SessionState -from api.rest.models import error +from api.rest.models import error, InfoQueryParams, success  CFG_GROUP = 'vyattacfg' @@ -57,11 +61,49 @@ app = FastAPI(debug=True,                title="VyOS API",                version="0.1.0") +  @app.exception_handler(RequestValidationError)  async def validation_exception_handler(_request, exc):      return error(400, str(exc.errors()[0])) +@app.get('/info') +def info(q: Annotated[InfoQueryParams, Query()]): +    show_version = q.version +    show_hostname = q.hostname + +    prelogin_file = r'/etc/issue' +    hostname_file = r'/etc/hostname' +    default = 'Welcome to VyOS' + +    try: +        res = { +            'banner': '', +            'hostname': '', +            'version': '' +        } +        if show_version: +            res.update(version=get_version()) + +        if show_hostname: +            try: +                hostname = read_file(hostname_file) +            except Exception: +                hostname = 'vyos' +            res.update(hostname=hostname) + +        banner = read_file(prelogin_file, defaultonfailure=default) +        if banner == f'{default} - \\n \\l': +            banner = banner.partition(default)[1] + +        res.update(banner=banner) +    except Exception: +        LOG.critical(traceback.format_exc()) +        return error(500, 'An internal error occured. Check the logs for details.') + +    return success(res) + +  ###  # Modify uvicorn to allow reloading server within the configsession  ### | 
