mirror of
git://git.proxmox.com/git/spiceterm.git
synced 2025-08-22 02:07:24 +00:00
implement command line options using getopt
This commit is contained in:
parent
1631c5a9a7
commit
68c2b067e2
4
Makefile
4
Makefile
@ -14,8 +14,8 @@ spiceterm: ${SOURCES} ${HEADERS} spiceterm.c
|
|||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: spiceterm
|
test: spiceterm
|
||||||
#./spiceterm & remote-viewer spice://localhost:5912
|
#./spiceterm & remote-viewer spice://localhost:5900
|
||||||
G_MESSAGES_DEBUG=all SPICE_DEBUG=1 ./spiceterm & G_MESSAGES_DEBUG=all SPICE_DEBUG=1 remote-viewer --debug 'spice://localhost?tls-port=5912' --spice-ca-file /etc/pve/pve-root-ca.pem --spice-secure-channels=all
|
G_MESSAGES_DEBUG=all SPICE_DEBUG=1 SPICE_TICKET=test ./spiceterm & G_MESSAGES_DEBUG=all SPICE_DEBUG=1 remote-viewer --debug 'spice://localhost?tls-port=5900' --spice-ca-file /etc/pve/pve-root-ca.pem --spice-secure-channels=all
|
||||||
|
|
||||||
.PHONY: distclean
|
.PHONY: distclean
|
||||||
distclean: clean
|
distclean: clean
|
||||||
|
12
auth-pve.c
12
auth-pve.c
@ -10,6 +10,18 @@
|
|||||||
static char *auth_path = "/";
|
static char *auth_path = "/";
|
||||||
static char *auth_perm = "Sys.Console";
|
static char *auth_perm = "Sys.Console";
|
||||||
|
|
||||||
|
void
|
||||||
|
pve_auth_set_path(char *path)
|
||||||
|
{
|
||||||
|
auth_path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pve_auth_set_permissions(char *perm)
|
||||||
|
{
|
||||||
|
auth_perm = perm;
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
urlencode(char *buf, const char *value)
|
urlencode(char *buf, const char *value)
|
||||||
{
|
{
|
||||||
|
6
input.c
6
input.c
@ -620,10 +620,10 @@ static SpiceCharDeviceInterface my_vdagent_sif = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
spiceTerm *
|
spiceTerm *
|
||||||
create_spiceterm(int argc, char** argv, uint32_t maxx, uint32_t maxy, guint timeout)
|
spiceterm_create(uint32_t width, uint32_t height, SpiceTermOptions *opts)
|
||||||
{
|
{
|
||||||
SpiceCoreInterface *core = basic_event_loop_init();
|
SpiceCoreInterface *core = basic_event_loop_init();
|
||||||
SpiceScreen *spice_screen = spice_screen_new(core, maxx, maxy, timeout);
|
SpiceScreen *spice_screen = spice_screen_new(core, width, height, opts);
|
||||||
|
|
||||||
//spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
|
//spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
|
||||||
|
|
||||||
@ -639,7 +639,7 @@ create_spiceterm(int argc, char** argv, uint32_t maxx, uint32_t maxy, guint time
|
|||||||
spice_server_add_interface(spice_screen->server, &vt->vdagent_sin.base);
|
spice_server_add_interface(spice_screen->server, &vt->vdagent_sin.base);
|
||||||
vt->screen = spice_screen;
|
vt->screen = spice_screen;
|
||||||
|
|
||||||
init_spiceterm(vt, maxx, maxy);
|
init_spiceterm(vt, width, height);
|
||||||
|
|
||||||
return vt;
|
return vt;
|
||||||
}
|
}
|
||||||
|
35
screen.c
35
screen.c
@ -752,9 +752,9 @@ static sasl_callback_t sasl_callbacks[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SpiceScreen *
|
SpiceScreen *
|
||||||
spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height, guint timeout)
|
spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height,
|
||||||
|
SpiceTermOptions *opts)
|
||||||
{
|
{
|
||||||
int port = 5912;
|
|
||||||
SpiceScreen *spice_screen = g_new0(SpiceScreen, 1);
|
SpiceScreen *spice_screen = g_new0(SpiceScreen, 1);
|
||||||
SpiceServer* server = spice_server_new();
|
SpiceServer* server = spice_server_new();
|
||||||
char *x509_key_file = "/etc/pve/local/pve-ssl.key";
|
char *x509_key_file = "/etc/pve/local/pve-ssl.key";
|
||||||
@ -764,8 +764,6 @@ spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height, guin
|
|||||||
char *x509_dh_file = NULL;
|
char *x509_dh_file = NULL;
|
||||||
char *tls_ciphers = "DES-CBC3-SHA";
|
char *tls_ciphers = "DES-CBC3-SHA";
|
||||||
|
|
||||||
gboolean use_auth = TRUE;
|
|
||||||
|
|
||||||
spice_screen->width = width;
|
spice_screen->width = width;
|
||||||
spice_screen->height = height;
|
spice_screen->height = height;
|
||||||
|
|
||||||
@ -781,12 +779,17 @@ spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height, guin
|
|||||||
spice_screen->core = core;
|
spice_screen->core = core;
|
||||||
spice_screen->server = server;
|
spice_screen->server = server;
|
||||||
|
|
||||||
printf("listening on port %d (secure)\n", port);
|
if (opts->addr) {
|
||||||
// spice_server_set_addr();
|
printf("listening on '%s:%d' (TLS)\n", opts->addr, opts->port);
|
||||||
|
spice_server_set_addr(server, opts->addr, 0);
|
||||||
|
} else {
|
||||||
|
printf("listening on '*:%d' (TLS)\n", opts->port);
|
||||||
|
}
|
||||||
|
|
||||||
// spice_server_set_port(spice_server, port);
|
// spice_server_set_port(spice_server, port);
|
||||||
//spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
|
//spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
|
||||||
|
|
||||||
spice_server_set_tls(server, port,
|
spice_server_set_tls(server, opts->port,
|
||||||
x509_cacert_file,
|
x509_cacert_file,
|
||||||
x509_cert_file,
|
x509_cert_file,
|
||||||
x509_key_file,
|
x509_key_file,
|
||||||
@ -794,11 +797,19 @@ spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height, guin
|
|||||||
x509_dh_file,
|
x509_dh_file,
|
||||||
tls_ciphers);
|
tls_ciphers);
|
||||||
|
|
||||||
if (use_auth) {
|
if (opts->noauth) {
|
||||||
spice_server_set_sasl(server, 1);
|
|
||||||
spice_server_set_sasl_callbacks(server, sasl_callbacks);
|
|
||||||
} else {
|
|
||||||
spice_server_set_noauth(server);
|
spice_server_set_noauth(server);
|
||||||
|
} else {
|
||||||
|
if (opts->sasl) {
|
||||||
|
spice_server_set_sasl(server, 1);
|
||||||
|
spice_server_set_sasl_appname(server, NULL); // enforce pve auth
|
||||||
|
spice_server_set_sasl_callbacks(server, sasl_callbacks);
|
||||||
|
} else {
|
||||||
|
char *ticket = getenv("SPICE_TICKET");
|
||||||
|
if (ticket) {
|
||||||
|
spice_server_set_ticket(server, ticket, 300, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = spice_server_init(server, core);
|
int res = spice_server_init(server, core);
|
||||||
@ -809,7 +820,7 @@ spice_screen_new(SpiceCoreInterface *core, uint32_t width, uint32_t height, guin
|
|||||||
cursor_init();
|
cursor_init();
|
||||||
|
|
||||||
spice_screen->conn_timeout_timer = core->timer_add(do_conn_timeout, spice_screen);
|
spice_screen->conn_timeout_timer = core->timer_add(do_conn_timeout, spice_screen);
|
||||||
spice_screen->core->timer_start(spice_screen->conn_timeout_timer, timeout*1000);
|
spice_screen->core->timer_start(spice_screen->conn_timeout_timer, opts->timeout*1000);
|
||||||
|
|
||||||
spice_server_add_interface(spice_screen->server, &spice_screen->qxl_instance.base);
|
spice_server_add_interface(spice_screen->server, &spice_screen->qxl_instance.base);
|
||||||
|
|
||||||
|
97
spiceterm.c
97
spiceterm.c
@ -41,6 +41,7 @@
|
|||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
#include "spiceterm.h"
|
#include "spiceterm.h"
|
||||||
|
|
||||||
@ -67,24 +68,11 @@ static int debug = 0;
|
|||||||
|
|
||||||
#define TERMIDCODE "[?1;2c" // vt100 ID
|
#define TERMIDCODE "[?1;2c" // vt100 ID
|
||||||
|
|
||||||
#define CHECK_ARGC(argc,argv,i) if (i >= argc-1) { \
|
|
||||||
fprintf(stderr, "ERROR: not enough arguments for: %s\n", argv[i]); \
|
|
||||||
print_usage(NULL); \
|
|
||||||
exit(1); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* these colours are from linux kernel drivers/char/vt.c */
|
/* these colours are from linux kernel drivers/char/vt.c */
|
||||||
|
|
||||||
unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7,
|
unsigned char color_table[] = { 0, 4, 2, 6, 1, 5, 3, 7,
|
||||||
8,12,10,14, 9,13,11,15 };
|
8,12,10,14, 9,13,11,15 };
|
||||||
|
|
||||||
static void
|
|
||||||
print_usage(const char *msg)
|
|
||||||
{
|
|
||||||
if (msg) { fprintf(stderr, "ERROR: %s\n", msg); }
|
|
||||||
fprintf(stderr, "USAGE: spiceterm [spiceopts] [-c command [args]]\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
draw_char_at(spiceTerm *vt, int x, int y, gunichar2 ch, TextAttributes attrib)
|
draw_char_at(spiceTerm *vt, int x, int y, gunichar2 ch, TextAttributes attrib)
|
||||||
{
|
{
|
||||||
@ -1611,32 +1599,93 @@ master_watch(int master, int event, void *opaque)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
spiceterm_print_usage(const char *msg)
|
||||||
|
{
|
||||||
|
if (msg) {
|
||||||
|
fprintf(stderr, "ERROR: %s\n", msg);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "USAGE: spiceterm [OPTIONS] [-- command [args]]\n");
|
||||||
|
fprintf(stderr, " --timeout <seconds> Wait this time before aborting (default is 10 seconds)\n");
|
||||||
|
fprintf(stderr, " --authpath <path> Authentication path (PVE AUTH)\n");
|
||||||
|
fprintf(stderr, " --permission <perm> Required permissions (PVE AUTH)\n");
|
||||||
|
fprintf(stderr, " --port <port> Bind to port <port>\n");
|
||||||
|
fprintf(stderr, " --addr <addr> Bind to address <addr>\n");
|
||||||
|
fprintf(stderr, " --sasl Enable SASL based authentication\n");
|
||||||
|
fprintf(stderr, " --noauth Disable authentication\n");
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char** argv)
|
main (int argc, char** argv)
|
||||||
{
|
{
|
||||||
int i;
|
int c;
|
||||||
char **cmdargv = NULL;
|
char **cmdargv = NULL;
|
||||||
char *command = "/bin/bash"; // execute normal shell as default
|
char *command = "/bin/bash"; // execute normal shell as default
|
||||||
int pid;
|
int pid;
|
||||||
int master;
|
int master;
|
||||||
char ptyname[1024];
|
char ptyname[1024];
|
||||||
struct winsize dimensions;
|
struct winsize dimensions;
|
||||||
|
SpiceTermOptions opts = {
|
||||||
|
.timeout = 10,
|
||||||
|
.port = 5900,
|
||||||
|
.addr = NULL,
|
||||||
|
.noauth = FALSE,
|
||||||
|
.sasl = FALSE,
|
||||||
|
};
|
||||||
|
|
||||||
g_thread_init(NULL);
|
g_thread_init(NULL);
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
static struct option long_options[] = {
|
||||||
if (!strcmp (argv[i], "-c")) {
|
{ "timeout", required_argument, 0, 't' },
|
||||||
command = argv[i+1];
|
{ "authpath", required_argument, 0, 'A' },
|
||||||
cmdargv = &argv[i+1];
|
{ "permissions", required_argument, 0, 'P' },
|
||||||
argc = i;
|
{ "port", required_argument, 0, 'p' },
|
||||||
argv[i] = NULL;
|
{ "addr", required_argument, 0, 'a' },
|
||||||
|
{ "noauth", no_argument, 0, 'n' },
|
||||||
|
{ "sasl", no_argument, 0, 's' },
|
||||||
|
{ NULL, 0, 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
while ((c = getopt_long(argc, argv, "nst:a:p:P:", long_options, NULL)) != -1) {
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'n':
|
||||||
|
opts.noauth = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
opts.sasl = TRUE;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
pve_auth_set_path(optarg);
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
pve_auth_set_permissions(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
opts.port = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
opts.addr = optarg;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
opts.timeout = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
spiceterm_print_usage(NULL);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
spiceterm_print_usage("getopt returned unknown character code");
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0) print_usage(NULL); // fixme:
|
if (optind < argc) {
|
||||||
|
command = argv[optind+1];
|
||||||
spiceTerm *vt = create_spiceterm (argc, argv, 744, 400, 10);
|
cmdargv = &argv[optind+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
spiceTerm *vt = spiceterm_create(744, 400, &opts);
|
||||||
|
|
||||||
setlocale(LC_ALL, ""); // set from environment
|
setlocale(LC_ALL, ""); // set from environment
|
||||||
|
|
||||||
|
16
spiceterm.h
16
spiceterm.h
@ -24,6 +24,14 @@ typedef struct TextCell {
|
|||||||
#define MAX_HEIGHT 1440
|
#define MAX_HEIGHT 1440
|
||||||
#define MAX_WIDTH 2560
|
#define MAX_WIDTH 2560
|
||||||
|
|
||||||
|
typedef struct SpiceTermOptions {
|
||||||
|
guint timeout;
|
||||||
|
int port;
|
||||||
|
char *addr;
|
||||||
|
gboolean noauth;
|
||||||
|
gboolean sasl;
|
||||||
|
} SpiceTermOptions;
|
||||||
|
|
||||||
typedef struct SpiceScreen SpiceScreen;
|
typedef struct SpiceScreen SpiceScreen;
|
||||||
|
|
||||||
typedef struct CachedImage {
|
typedef struct CachedImage {
|
||||||
@ -66,7 +74,7 @@ struct SpiceScreen {
|
|||||||
void (*on_client_disconnected)(SpiceScreen *spice_screen);
|
void (*on_client_disconnected)(SpiceScreen *spice_screen);
|
||||||
};
|
};
|
||||||
|
|
||||||
SpiceScreen* spice_screen_new(SpiceCoreInterface* core, uint32_t width, uint32_t height, guint timeout);
|
SpiceScreen* spice_screen_new(SpiceCoreInterface* core, uint32_t width, uint32_t height, SpiceTermOptions *opts);
|
||||||
|
|
||||||
void spice_screen_resize(SpiceScreen *spice_screen, uint32_t width, uint32_t height);
|
void spice_screen_resize(SpiceScreen *spice_screen, uint32_t width, uint32_t height);
|
||||||
void spice_screen_draw_char(SpiceScreen *spice_screen, int x, int y, gunichar2 ch, TextAttributes attrib);
|
void spice_screen_draw_char(SpiceScreen *spice_screen, int x, int y, gunichar2 ch, TextAttributes attrib);
|
||||||
@ -152,13 +160,13 @@ void spiceterm_respond_esc(spiceTerm *vt, const char *esc);
|
|||||||
void spiceterm_respond_data(spiceTerm *vt, int len, uint8_t *data);
|
void spiceterm_respond_data(spiceTerm *vt, int len, uint8_t *data);
|
||||||
void spiceterm_update_watch_mask(spiceTerm *vt, gboolean writable);
|
void spiceterm_update_watch_mask(spiceTerm *vt, gboolean writable);
|
||||||
|
|
||||||
spiceTerm *create_spiceterm(int argc, char** argv, uint32_t maxx,
|
spiceTerm *spiceterm_create(uint32_t width, uint32_t height, SpiceTermOptions *opts);
|
||||||
uint32_t maxy, guint timeout);
|
|
||||||
|
|
||||||
gboolean vdagent_owns_clipboard(spiceTerm *vt);
|
gboolean vdagent_owns_clipboard(spiceTerm *vt);
|
||||||
void vdagent_request_clipboard(spiceTerm *vt);
|
void vdagent_request_clipboard(spiceTerm *vt);
|
||||||
void vdagent_grab_clipboard(spiceTerm *vt);
|
void vdagent_grab_clipboard(spiceTerm *vt);
|
||||||
|
|
||||||
int pve_auth_verify(const char *clientip, const char *username, const char *passwd);
|
int pve_auth_verify(const char *clientip, const char *username, const char *passwd);
|
||||||
|
void pve_auth_set_path(char *path);
|
||||||
|
void pve_auth_set_permissions(char *perm);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user