/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef GUAC_KUBERNETES_H #define GUAC_KUBERNETES_H #include "common/clipboard.h" #include "common/recording.h" #include "io.h" #include "settings.h" #include "terminal/terminal.h" #include #include #include /** * The name of the WebSocket protocol specific to Kubernetes which should be * sent to the Kubernetes server when attaching to a pod. */ #define GUAC_KUBERNETES_LWS_PROTOCOL "v4.channel.k8s.io" /** * The maximum number of messages to allow within the outbound message buffer. * If messages are sent despite the buffer being full, those messages will be * dropped. */ #define GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES 8 /** * The maximum number of milliseconds to wait for a libwebsockets event to * occur before entering another iteration of the libwebsockets event loop. */ #define GUAC_KUBERNETES_SERVICE_INTERVAL 1000 /** * Kubernetes-specific client data. */ typedef struct guac_kubernetes_client { /** * Kubernetes connection settings. */ guac_kubernetes_settings* settings; /** * The libwebsockets context associated with the connected WebSocket. */ struct lws_context* context; /** * The connected WebSocket. */ struct lws* wsi; /** * Outbound message ring buffer for outbound WebSocket messages. As * libwebsockets uses an event loop for all operations, outbound messages * may be sent only in context of a particular event received via a * callback. Until that event is received, pending data must accumulate in * a buffer. */ guac_kubernetes_message outbound_messages[GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES]; /** * The number of messages currently waiting in the outbound message * buffer. */ int outbound_messages_waiting; /** * The index of the oldest entry in the outbound message buffer. Newer * messages follow this entry. */ int outbound_messages_top; /** * Lock which is acquired when the outbound message buffer is being read * or manipulated. */ pthread_mutex_t outbound_message_lock; /** * The Kubernetes client thread. */ pthread_t client_thread; /** * The current clipboard contents. */ guac_common_clipboard* clipboard; /** * The terminal which will render all output from the Kubernetes pod. */ guac_terminal* term; /** * The number of rows last sent to Kubernetes in a terminal resize * request. */ int rows; /** * The number of columns last sent to Kubernetes in a terminal resize * request. */ int columns; /** * The in-progress session recording, or NULL if no recording is in * progress. */ guac_common_recording* recording; } guac_kubernetes_client; /** * Main Kubernetes client thread, handling transfer of STDOUT/STDERR of an * attached Kubernetes pod to STDOUT of the terminal. */ void* guac_kubernetes_client_thread(void* data); /** * Sends a message to the Kubernetes server requesting that the terminal be * resized to the given dimensions. This message may be queued until the * underlying WebSocket connection is ready to send. * * @param client * The guac_client associated with the Kubernetes connection. * * @param rows * The new terminal size in rows. * * @param columns * The new terminal size in columns. */ void guac_kubernetes_resize(guac_client* client, int rows, int columns); /** * Sends messages to the Kubernetes server such that the terminal is forced * to redraw. This function should be invoked at the beginning of each * session in order to restore expected display state. * * @param client * The guac_client associated with the Kubernetes connection. */ void guac_kubernetes_force_redraw(guac_client* client); #endif