openapi: 3.0.3

info:
  title: OgAgent API
  description: OgAgent API
  version: 0.0.1

paths:
  /opengnsys/status:
    post:
      summary: Get status of the agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StatusReq'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatusRes'

  /opengnsys/poweroff:
    post:
      summary: Power agent off
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObj'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaunchedRes'

  /opengnsys/reboot:
    post:
      summary: Reboot agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObj'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaunchedRes'

  /opengnsys/script:
    post:
      summary: Run script on agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScriptReq'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScriptRes'

  /opengnsys/terminatescript:
    post:
      summary: Terminate running script on agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TerminateScriptReq'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmptyObj'

  /opengnsys/preparescripts:
    post:
      summary: Prepare list of scripts running on agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObj'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmptyObj'

  /opengnsys/getscripts:
    post:
      summary: Get the list of scripts running on agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObj'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetScriptsRes'

  /opengnsys/logoff:
    post:
      summary: Log remote user off
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyObj'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LogoffRes'

  /opengnsys/popup:
    post:
      summary: Show message on agent
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Popup'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LaunchedRes'

components:
  schemas:
    EmptyObj:
      type: object
      additionalProperties: false

    Jobid:
      type: string
      example:
        - "deadbeef"

    StatusReq:
      type: object
      properties:
        detail:
          type: boolean

    StatusRes:
      type: object
      required:
        - status
      properties:
        status:
          type: string
          enum:
            - "LNX"
            - "OSX"
            - "WIN"
        loggedin:
          type: boolean
        session:
          type: string
          example:
            - "x11"
        agent_version:
          type: string
        os_version:
          type: string
        sys_load:
          type: number

    LaunchedRes:
      type: object
      required:
        - op
      properties:
        op:
          type: string
          enum:
            - "launched"

    ScriptReq:
      type: object
      required:
        - script
      properties:
        script:
          type: string
          example:
            - "uptime\nwho"
            - "Start-Process notepad.exe"
        client:
          type: boolean
          default: false

    ScriptRes:
      type: object
      required:
        - op
      properties:
        op:
          type: string
          enum:
            - "launched"
        jobid:
          $ref: '#/components/schemas/Jobid'

    TerminateScriptReq:
      type: object
      required:
        - jobid
      properties:
        jobid:
          $ref: '#/components/schemas/Jobid'


    RunningScript:
      type: object
      required:
        - jobid
        - pid
        - starttime
        - script
        - client
        - status
        - stdout
        - stderr
      properties:
        jobid:
          $ref: '#/components/schemas/Jobid'
        pid:
          type: integer
        starttime:
          type: string
          example: "2024-12-31 23:59:59.123456+0000"
        script:
          type: string
        client:
          type: boolean
        status:
          type: string
          enum:
            - "running"
            - "finished"
        stdout:
          type: string
        stderr:
          type: string
        rc:
          type: integer

    GetScriptsRes:
      type: array
      items:
        $ref: '#/components/schemas/RunningScript'          

    LogoffRes:
      type: object
      required:
        - op
      properties:
        op:
          type: string
          enum:
            - "sent to client"

    Popup:
      type: object
      properties:
        title:
          type: string
        message:
          type: string
