From 1d33c17b533818c50a8ed490ddfe1aad84971d55 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Sun, 27 Oct 2019 19:42:52 +0100 Subject: [PATCH] use a variant for uname result, not strings --- src/vmm_core.ml | 18 +++++++++++++++++- src/vmm_unix.ml | 27 +++++++++++++-------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/vmm_core.ml b/src/vmm_core.ml index fb02b6e..181221c 100644 --- a/src/vmm_core.ml +++ b/src/vmm_core.ml @@ -355,7 +355,23 @@ let should_restart config name = function 126 (bash, unused) command invoked cannot execute 127 (bash, unused) command not found 128+n (bash, unused) fatal error signal n - 255 solo5-abort -> OCaml 4.10: fatal error (instead of 2) -> restart *) + 255 solo5-abort -> OCaml 4.10: fatal error (instead of 2) -> restart + +opam exit codes: + 1 False. Returned when a boolean return value is expected, e.g. when running with --check, or for queries like opam lint. + 2 Bad command-line arguments, or command-line arguments pointing to an invalid context (e.g. file not following the expected format). + 5 Not found. You requested something (package, version, repository, etc.) that couldn't be found. + 10 Aborted. The operation required confirmation, which wasn't given. + 15 Could not acquire the locks required for the operation. + 20 There is no solution to the user request. This can be caused by asking to install two incompatible packages, for example. + 30 Error in package definition, or other metadata files. Using --strict raises this error more often. + 31 Package script error. Some package operations were unsuccessful. This may be an error in the packages or an incompatibility with your system. This can be a partial error. + 40 Sync error. Could not fetch some remotes from the network. This can be a partial error. + 50 Configuration error. Opam or system configuration doesn't allow operation, and needs fixing. + 60 Solver failure. The solver failed to return a sound answer. It can be due to a broken external solver, or an error in solver configuration. + 99 Internal error. Something went wrong, likely due to a bug in opam itself. + 130 User interrupt. SIGINT was received, generally due to the user pressing Ctrl-C. + *) let opt_mem i = match config.Unikernel.fail_behaviour with | `Quit -> assert false diff --git a/src/vmm_unix.ml b/src/vmm_unix.ml index 155a596..e16353c 100644 --- a/src/vmm_unix.ml +++ b/src/vmm_unix.ml @@ -89,20 +89,24 @@ let rec fifo_exists file = | Unix.Unix_error (e, _, _) -> R.error_msgf "file %a exists: %s" Fpath.pp file (Unix.error_message e) +type supported = FreeBSD | Linux + let uname = let cmd = Bos.Cmd.(v "uname" % "-s") in lazy (match Bos.OS.Cmd.(run_out cmd |> out_string) with - | Ok (s, _) -> s + | Ok (s, _) when s = "FreeBSD" -> FreeBSD + | Ok (s, _) when s = "Linux" -> Linux + | Ok (s, _) -> invalid_arg (Printf.sprintf "OS %s not supported" s) | Error (`Msg m) -> invalid_arg m) let create_tap bridge = match Lazy.force uname with - | x when x = "FreeBSD" -> + | FreeBSD -> let cmd = Bos.Cmd.(v "ifconfig" % "tap" % "create") in Bos.OS.Cmd.run_out cmd |> Bos.OS.Cmd.out_string >>= fun (name, _) -> Bos.OS.Cmd.run Bos.Cmd.(v "ifconfig" % bridge % "addm" % name) >>= fun () -> Ok name - | x when x = "Linux" -> + | Linux -> let prefix = "vmmtap" in let rec find_n x = let nam = prefix ^ string_of_int x in @@ -114,15 +118,13 @@ let create_tap bridge = Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "tuntap" % "add" % "mode" % "tap" % tap) >>= fun () -> Bos.OS.Cmd.run Bos.Cmd.(v "brctl" % "addif" % bridge % tap) >>= fun () -> Ok tap - | x -> Error (`Msg ("unsupported operating system " ^ x)) let destroy_tap tapname = match Lazy.force uname with - | x when x = "FreeBSD" -> + | FreeBSD -> Bos.OS.Cmd.run Bos.Cmd.(v "ifconfig" % tapname % "destroy") - | x when x = "Linux" -> + | Linux -> Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "tuntap" % "del" % "dev" % tapname % "mode" % "tap") - | x -> Error (`Msg ("unsupported operating system " ^ x)) let prepare name vm = (match vm.Unikernel.typ with @@ -153,8 +155,8 @@ let prepare name vm = let vm_device vm = match Lazy.force uname with - | x when x = "FreeBSD" -> Ok ("solo5-" ^ string_of_int vm.Unikernel.pid) - | _ -> Error (`Msg "don't know what you mean, sorry") + | FreeBSD -> Ok ("solo5-" ^ string_of_int vm.Unikernel.pid) + | _ -> Error (`Msg "don't know what you mean (trying to find vm device)") let free_system_resources name taps = (* same order as prepare! *) @@ -165,11 +167,8 @@ let free_system_resources name taps = let cpuset cpu = let cpustring = string_of_int cpu in match Lazy.force uname with - | x when x = "FreeBSD" -> - Ok ([ "cpuset" ; "-l" ; cpustring ]) - | x when x = "Linux" -> - Ok ([ "taskset" ; "-c" ; cpustring ]) - | x -> Error (`Msg ("unsupported operating system " ^ x)) + | FreeBSD -> Ok ([ "cpuset" ; "-l" ; cpustring ]) + | Linux -> Ok ([ "taskset" ; "-c" ; cpustring ]) let exec name config bridge_taps blocks = let net, macs =