Compare commits

..

No commits in common. "20451db88cdc9d91454e3747f37777ae805d3fda" and "5f58a2ebb2f262ae46190d6e20125796bb8b4e1d" have entirely different histories.

4 changed files with 36 additions and 179 deletions

View file

@ -7,8 +7,6 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
#include <linux/vm_sockets.h>
struct msghdr mk_msghdr(); struct msghdr mk_msghdr();
int ch_connect(const char*, const char*); int ch_connect(const char*, const char*);
ssize_t send_fd(int, int); ssize_t send_fd(int, int);
@ -20,8 +18,7 @@ void print_usage() {
"Usage:\n" "Usage:\n"
"\tch-proxy uvm/$USER_VM_NAME [PORT]\n" "\tch-proxy uvm/$USER_VM_NAME [PORT]\n"
"\tch-proxy uuvm/$VM_NAME [PORT]\n" "\tch-proxy uuvm/$VM_NAME [PORT]\n"
"\tch-proxy vsock-mux%$PATH [PORT]\n" "\tch-proxy vsock-mux%$PATH [PORT]\n");
"\tch-proxy vsock/cid[:port]\n");
} }
char *extract_vsock_mux(const char *host_string) { char *extract_vsock_mux(const char *host_string) {
@ -70,50 +67,6 @@ char *extract_muvm(const char *host_string) {
return result; return result;
} }
int extract_cid(const char *host, int *cid, int *port) {
if (errno != 0) {
perror("extract_cid(...): errno unclean");
exit(EXIT_FAILURE);
}
const char PREFIX[] = "vsock/";
const ssize_t PREFIX_LEN = sizeof(PREFIX) - 1;
if (strncmp(host, PREFIX, PREFIX_LEN) != 0) {
return 1;
}
char *in = NULL;
const char *end = host + strlen(host);
const char *sCid = host + PREFIX_LEN;
long x;
x = strtol(sCid, &in, 10);
if (errno != 0) {
perror("strtol(cid, ...)");
exit(EXIT_FAILURE);
}
*cid = (int) x;
if (in == end) {
*port = 22;
return 0;
} else if (in[0] != ':') {
perror("extract_cid(...): expected a string of the form cid[:port]");
perror(host);
exit(EXIT_FAILURE);
}
const char *sPort = in + 1;
x = strtol(sPort, &in, 10);
if (errno != 0) {
perror("strtol(port, ...)");
exit(EXIT_FAILURE);
}
*port = (int) x;
return 0;
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
if (!(2 <= argc && argc <= 3)) { if (!(2 <= argc && argc <= 3)) {
fprintf(stderr, "%s: Wrong # of arguments: %d\n", argv[0], argc); fprintf(stderr, "%s: Wrong # of arguments: %d\n", argv[0], argc);
@ -126,47 +79,21 @@ int main(int argc, char** argv) {
const char *ssh_host = argv[1]; const char *ssh_host = argv[1];
const char *port_string = argc == 3 ? argv[2] : PORT_DEFAULT; const char *port_string = argc == 3 ? argv[2] : PORT_DEFAULT;
int cid = -1, port = -1; char *path_un;
char *path_un = NULL;
if ((path_un = extract_uvm(ssh_host)) != NULL) { if ((path_un = extract_uvm(ssh_host)) != NULL) {
} else if ((path_un = extract_muvm(ssh_host)) != NULL) { } else if ((path_un = extract_muvm(ssh_host)) != NULL) {
} else if ((path_un = extract_vsock_mux(ssh_host)) != NULL) { } else if ((path_un = extract_vsock_mux(ssh_host)) != NULL) {
} else if (extract_cid(ssh_host, &cid, &port) == 0) {
} else { } else {
fprintf(stderr, "ch-proxy/main: unexpected host string format: %s\n", ssh_host); fprintf(stderr, "ch-proxy/main: unexpected host stirng format: %s\n", ssh_host);
print_usage(); print_usage();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
int s = -1; const int s = ch_connect(path_un, port_string);
if (s == -1) {
if (path_un != NULL) { perror("ssh-vsock-proxy/main/ch_connect");
s = ch_connect(path_un, port_string); return EXIT_FAILURE;
if (s == -1) { };
perror("ssh-vsock-proxy/main/ch_connect");
return EXIT_FAILURE;
};
} else if (cid != -1 && port != -1) {
struct sockaddr_vm sa = {
.svm_family = AF_VSOCK,
.svm_reserved1 = 0,
.svm_port = port,
.svm_cid = cid,
};
memset(sa.svm_zero, 0, sizeof(sa.svm_zero));
s = socket(AF_VSOCK, SOCK_STREAM, 0);
if (s == -1) {
perror("socket(AF_VSOCK, ...)");
exit(EXIT_FAILURE);
}
if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) != 0) {
perror("connect(socket(AF_VSOCK, ...), ...)");
exit(EXIT_FAILURE);
}
} else {
perror("Couldn't parse neither uuvm/ strings nor vsock/cid[:port]");
exit(EXIT_FAILURE);
}
if (send_fd(1, s) == -1) { if (send_fd(1, s) == -1) {
perror("ssh-vsock-proxy/main/send_fd"); perror("ssh-vsock-proxy/main/send_fd");

View file

@ -2,7 +2,6 @@
lib, lib,
newScope, newScope,
makeDesktopItem, makeDesktopItem,
writeShellScript,
writeShellScriptBin, writeShellScriptBin,
}: }:
@ -19,34 +18,29 @@ lib.makeScope newScope (self: {
mkRunInVM = vmName: lib.getExe (self.mkRunInVMPkg vmName); mkRunInVM = vmName: lib.getExe (self.mkRunInVMPkg vmName);
mkRunInVMPkg = mkRunInVMPkg =
vmName: vmName:
lib.warn "Use `\${runInVM} foobar` instead of `\${mkRunInVMPkg foobar}`" ( writeShellScriptBin "run-in-${vmName}" ''
writeShellScriptBin "run-in-${vmName}" "${lib.getExe self.runInVM} ${vmName} $@" localArgs=(
); ${lib.optionalString self.useSessionUnits "--user"}
runInVM = writeShellScriptBin "run-in" '' --property=Requires=${self.vmUnitPrefix}${vmName}.service
vmName=$1 --property=After=${self.vmUnitPrefix}${vmName}.service
shift --property=SyslogIdentifier="$1 (${vmName})"
localArgs=( )
${lib.optionalString self.useSessionUnits "--user"} remoteArgs=(
--property=Requires="${self.vmUnitPrefix}$vmName".service systemd-run
--property=After="${self.vmUnitPrefix}$vmName".service --user
--property=SyslogIdentifier="$1 ($vmName)" --property=StandardError="journal+console"
) --property=StandardOutput="journal+console"
remoteArgs=( --property=OOMScoreAdjust=${toString self.oomScoreAdjust}
systemd-run ${lib.optionalString (self.waylandProxyUnit != null) ''
--user --property=Requires=${self.waylandProxyUnit}
--property=StandardError="journal+console" --property=After=${self.waylandProxyUnit}
--property=StandardOutput="journal+console" ''}
--property=OOMScoreAdjust=${toString self.oomScoreAdjust} )
${lib.optionalString (self.waylandProxyUnit != null) '' systemd-run \
--property=Requires=${self.waylandProxyUnit} "''${localArgs[@]}" \
--property=After=${self.waylandProxyUnit} ssh ${self.vmUser}@${self.vmSshPrefix}${vmName} \
''} "''${remoteArgs[@]}" $@
) '';
systemd-run \
"''${localArgs[@]}" \
ssh "${self.vmUser}@${self.vmSshPrefix}$vmName" \
"''${remoteArgs[@]}" $@
'';
# Actual .desktop item adapters # Actual .desktop item adapters
toVM = toVM =

View file

@ -1,63 +0,0 @@
{ writeShellScriptBin }:
writeShellScriptBin "request-usb" ''
set -euo pipefail
parseArgs() {
N_CONSTRAINTS=0
while [[ -n "''${1:-}" ]]; do
local x=
case "$1" in
"--manufacturer" )
N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 ))
MANUFACTURER="$2"
shift 2
;;
"--manufacturer="* )
N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 ))
MANUFACTURER=''${1#--manufacturer=}
shift 1
;;
"--" )
break
;;
*)
printUsage
;;
esac
done
}
printUsage() {
echo "$(caller)" >&2
echo "Usage: request-usb [--manufacturer=MANUFACTURER]" >&2
exit 1
}
findFirst() {
local d=
[[ ''${N_CONSTRAINTS:-0} != 0 ]] || printUsage
for d in /sys/bus/usb/devices/* ; do
[[ -e "$d/manufacturer" ]] || continue
[[ -e "$d/uevent" ]] || continue
read -r x < "$d/manufacturer"
if ! [[ -z "''${MANUFACTURER:-}" || "$MANUFACTURER" = "$x" ]] ; then
continue
fi
# NOTE: Other predicates here
# ...
echo -n "$d"
return
done
return 1
}
parseArgs $@
d=$(findFirst)
export $( cat "$d/uevent" )
sudo chown "$USER" /dev/bus/usb/"$BUSNUM"/"$DEVNUM"
echo -n /dev/bus/usb/"$BUSNUM"/"$DEVNUM"
''

View file

@ -8,7 +8,6 @@
}: }:
let let
inherit (config._module.args) inputs;
cfg = config.vmapps; cfg = config.vmapps;
desktopItems' = pkgs.callPackage ../pkgs/desktopAdapters.nix { }; desktopItems' = pkgs.callPackage ../pkgs/desktopAdapters.nix { };
desktopItems = desktopItems'.overrideScope ( desktopItems = desktopItems'.overrideScope (
@ -29,8 +28,8 @@ let
modules = extraModules ++ [ modules = extraModules ++ [
{ {
microvm.hypervisor = "cloud-hypervisor"; microvm.hypervisor = "cloud-hypervisor";
microvm.hotpluggedMem = lib.mkDefault 128; microvm.hotpluggedMem = 128;
microvm.hotplugMem = lib.mkDefault 512; microvm.hotplugMem = 512;
microvm.shares = [ microvm.shares = [
{ {
source = "send"; source = "send";
@ -51,10 +50,10 @@ let
./uvms-guest.nix ./uvms-guest.nix
./vsock-connect-guest.nix ./vsock-connect-guest.nix
(modulesPath + "/profiles/minimal.nix") (modulesPath + "/profiles/minimal.nix")
(inputs."microvm.nix" + "/nixos-modules/microvm") (config._module.args.inputs."microvm.nix" + "/nixos-modules/microvm")
]; ];
specialArgs = { specialArgs = {
inherit inputs; inherit (config._module.args) inputs;
}; };
}; };
runner = evaluated.config.microvm.declaredRunner; runner = evaluated.config.microvm.declaredRunner;
@ -240,7 +239,7 @@ in
[ [
{ {
environment.systemPackages = [ environment.systemPackages = [
(desktopItems.runInVM) (desktopItems.mkRunInVMPkg "browser")
(pkgs.makeDesktopItem ( (pkgs.makeDesktopItem (
desktopItems.toBrowser ( desktopItems.toBrowser (
(desktopItems.toVM "browser" { (desktopItems.toVM "browser" {