diff options
38 files changed, 433 insertions, 234 deletions
@@ -310,6 +310,7 @@ pod2htm?.tmp /rescue/virt-rescue /rescue/virt-rescue.1 /resize/.depend +/resize/resize_gettext.ml /resize/stamp-virt-resize.pod /resize/utils_tests /resize/virt-resize @@ -326,6 +327,7 @@ pod2htm?.tmp /ruby/Rakefile /run /sparsify/.depend +/sparsify/sparsify_gettext.ml /sparsify/stamp-virt-sparsify.pod /sparsify/virt-sparsify /sparsify/virt-sparsify.1 @@ -354,6 +356,7 @@ pod2htm?.tmp /sysprep/stamp-script2.sh /sysprep/stamp-virt-sysprep.pod /sysprep/sysprep-extra-options.pod +/sysprep/sysprep_gettext.ml /sysprep/sysprep-operations.pod /sysprep/virt-sysprep /sysprep/virt-sysprep.1 diff --git a/Makefile.am b/Makefile.am index fe37b821..97d76ed1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -211,8 +211,9 @@ dist-hook: mv AUTHORS-t AUTHORS cp AUTHORS $(distdir)/AUTHORS -# Update the list of translatable files (po/POTFILES). This has to be -# in the top-level Makefile.am so that we have access to DIST_SUBDIRS. +# Update the list of translatable files (po/POTFILES po/POTFILES-ml). +# This has to be in the top-level Makefile.am so that we have access +# to DIST_SUBDIRS. all-local: cd $(srcdir); \ find $(DIST_SUBDIRS) \ @@ -230,6 +231,9 @@ all-local: grep -v '^images/' | \ LC_ALL=C sort | \ sed 's,^\./,,' > po/POTFILES + cd $(srcdir); \ + find resize sparsify sysprep -name '*.ml' | \ + LC_ALL=C sort > po/POTFILES-ml # Make clean. @@ -100,6 +100,8 @@ For basic functionality and the C tools: - OCaml if you want to rebuild the generated files, and also to build the OCaml bindings (optional) +- ocaml-gettext if you want to translate OCaml tools (optional) + - po4a for translating manpages and POD files. This is optional when compiling from the tarball, but mandatory if you compile from git. diff --git a/configure.ac b/configure.ac index bcd03828..132f0e82 100644 --- a/configure.ac +++ b/configure.ac @@ -776,6 +776,95 @@ AM_CONDITIONAL([HAVE_OCAML], AM_CONDITIONAL([HAVE_OCAMLDOC], [test "x$OCAMLDOC" != "xno"]) +OCAML_PKG_gettext=no +AS_IF([test "x$OCAMLC" != "xno"],[ + dnl Check for ocaml-gettext package to translate OCaml tools. + AC_CHECK_OCAML_PKG(gettext) + + dnl Write gettext modules for each OCaml tool. If OCaml gettext + dnl is not available then we write dummy functions. + for program in resize sparsify sysprep; do + output=$program/${program}_gettext.ml + AC_MSG_NOTICE([creating $output]) + rm -f $output + + cat <<EOF > $output +(* This file is generated automatically by ./configure. *) + +(** Gettext functions for virt-$program. + + The ${program}_gettext module provides gettext functions for + $program, or dummy functions if ocaml-gettext was not available + at configure time. + + {b Note}: Don't translate debug strings, or strings which are + meant to be read/written only by machine. + + There are two ways to translate constant strings in OCaml programs. + + For ordinary strings, replace [["string"]] with [[s_"string"]]. Since + this is a function call to a function called [[s_]], you may have + to put parentheses around the expression. + + For format strings, use: + +{v + printf (f_"zeroing filesystem %s") filename; +v} + + Note for format strings, the parentheses are almost always required, + and they just go around the [[(f_"string")]], {i not} around the other + arguments of the printf function. + + At build time, a program parses the OCaml code into an abstract + syntax tree and statically determines all calls to the special + [[s_]] and [[f_]] functions, which means: (a) You can be very loose + with syntax, unlike ordinary xgettext, but (b) you cannot rename + these functions. +*) + +EOF + + if test "x$OCAML_PKG_gettext" != "xno"; then + # ocaml-gettext available: real module. + cat <<EOF >>$output +module Gettext = Gettext.Program ( + struct + let textdomain = "$PACKAGE_NAME" + let codeset = None + let dir = None + let dependencies = [[]] + end +) (GettextStub.Native) +EOF + else + # No gettext: module containing dummy gettext functions. + cat <<EOF >>$output +module Gettext = struct + external s_ : string -> string = "%identity" + external f_ : ('a, 'b, 'c, 'd, 'e, 'f) format6 + -> ('a, 'b, 'c, 'd, 'e, 'f) format6 + = "%identity" + let sn_ : string -> string -> int -> string + = fun s p n -> if n = 1 then s else p + let fn_ : ('a, 'b, 'c, 'd, 'e, 'f) format6 + -> ('a, 'b, 'c, 'd, 'e, 'f) format6 + -> int -> ('a, 'b, 'c, 'd, 'e, 'f) format6 + = fun s p n -> if n = 1 then s else p +end +EOF + fi + + chmod -w $output + done +]) +AM_CONDITIONAL([HAVE_OCAML_PKG_GETTEXT], + [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno" && test "x$OCAML_PKG_gettext" != "xno"]) + +AC_CHECK_PROG([OCAML_GETTEXT],[ocaml-gettext],[ocaml-gettext],[no]) +AM_CONDITIONAL([HAVE_OCAML_GETTEXT], + [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno" && test "x$OCAML_PKG_gettext" != "xno" && test "x$OCAML_GETTEXT" != "xno"]) + dnl Check for Perl (optional, for Perl bindings and Perl tools). PERL=no AC_ARG_ENABLE([perl], diff --git a/po/Makefile.am b/po/Makefile.am index de455a3d..90b23c1f 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -25,12 +25,13 @@ MSGID_BUGS_ADDRESS = https://bugzilla.redhat.com/enter_bug.cgi?component=libgues # Don't use LINGUAS (uppercase) as Gentoo defines it (RHBZ#804464). linguas := en_GB es gu hi kn ml mr nl or pa pl ta te uk -POTFILES := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES) -POFILES := $(linguas:%=%.po) -GMOFILES := $(linguas:%=%.gmo) +POTFILES := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES) +POTFILES_ML := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES-ml) +POFILES := $(linguas:%=%.po) +GMOFILES := $(linguas:%=%.gmo) EXTRA_DIST = \ - POTFILES \ + POTFILES POTFILES-ml \ $(DOMAIN).pot \ $(POFILES) \ $(GMOFILES) @@ -48,8 +49,8 @@ update-po: update-gmo: Makefile $(GMOFILES) -$(DOMAIN).pot: Makefile $(POTFILES) - rm -f $@ $@-t +$(DOMAIN).pot: Makefile $(POTFILES) $(POTFILES-ml) + rm -f $@-t $@-ml $(XGETTEXT) \ -o $@-t \ --default-domain=$(DOMAIN) \ @@ -66,6 +67,16 @@ $(DOMAIN).pot: Makefile $(POTFILES) --msgid-bugs-address="$(MSGID_BUGS_ADDRESS)" \ --directory=$(top_srcdir) \ --files-from=$(abs_srcdir)/POTFILES +if HAVE_OCAML_GETTEXT + cd $(top_srcdir) && \ + $(OCAML_GETTEXT) --action extract --extract-pot po/$@-ml \ + $$(cat $(abs_srcdir)/POTFILES-ml) +# Don't trust msgcat since it will definitely screw up. Instead, chop +# the head from the second file and append it to the first. + echo >> $@-t + awk '/^#:/{i++}i{print}' < $@-ml >> $@-t + rm $@-ml +endif mv $@-t $@ %.po: $(DOMAIN).pot diff --git a/po/POTFILES-ml b/po/POTFILES-ml new file mode 100644 index 00000000..b08aff99 --- /dev/null +++ b/po/POTFILES-ml @@ -0,0 +1,36 @@ +resize/progress.ml +resize/resize.ml +resize/resize_gettext.ml +resize/utils.ml +resize/utils_tests.ml +sparsify/progress.ml +sparsify/sparsify.ml +sparsify/sparsify_gettext.ml +sparsify/utils.ml +sysprep/main.ml +sysprep/sysprep_gettext.ml +sysprep/sysprep_operation.ml +sysprep/sysprep_operation_bash_history.ml +sysprep/sysprep_operation_cron_spool.ml +sysprep/sysprep_operation_dhcp_client_state.ml +sysprep/sysprep_operation_dhcp_server_state.ml +sysprep/sysprep_operation_dovecot_data.ml +sysprep/sysprep_operation_flag_reconfiguration.ml +sysprep/sysprep_operation_hostname.ml +sysprep/sysprep_operation_logfiles.ml +sysprep/sysprep_operation_mail_spool.ml +sysprep/sysprep_operation_net_hwaddr.ml +sysprep/sysprep_operation_package_manager_cache.ml +sysprep/sysprep_operation_random_seed.ml +sysprep/sysprep_operation_rhn_systemid.ml +sysprep/sysprep_operation_samba_db_log.ml +sysprep/sysprep_operation_script.ml +sysprep/sysprep_operation_smolt_uuid.ml +sysprep/sysprep_operation_ssh_hostkeys.ml +sysprep/sysprep_operation_ssh_userdir.ml +sysprep/sysprep_operation_sssd_db_log.ml +sysprep/sysprep_operation_udev_persistent_net.ml +sysprep/sysprep_operation_user_account.ml +sysprep/sysprep_operation_utmp.ml +sysprep/sysprep_operation_yum_uuid.ml +sysprep/utils.ml diff --git a/resize/Makefile.am b/resize/Makefile.am index bd15a329..d23b4dee 100644 --- a/resize/Makefile.am +++ b/resize/Makefile.am @@ -30,6 +30,7 @@ SOURCES = \ progress.mli \ progress.ml \ resize.ml \ + resize_gettext.ml \ utils.ml \ utils_tests.ml @@ -39,6 +40,7 @@ if HAVE_OCAML OBJECTS = \ $(top_builddir)/fish/guestfish-progress.o \ progress_c.o \ + resize_gettext.cmx \ utils.cmx \ progress.cmx \ resize.cmx @@ -49,6 +51,9 @@ bin_SCRIPTS = virt-resize # option to be passed to gcc, so we don't try linking against an # installed copy of libguestfs. OCAMLPACKAGES = -package str -I $(top_builddir)/src/.libs -I ../ocaml +if HAVE_OCAML_PKG_GETTEXT +OCAMLPACKAGES += -package gettext-stub +endif OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES) OCAMLOPTFLAGS = $(OCAMLCFLAGS) @@ -93,7 +98,7 @@ CLEANFILES += stamp-virt-resize.pod check_SCRIPTS = utils_tests -utils_tests: utils.cmx utils_tests.cmx +utils_tests: resize_gettext.cmx utils.cmx utils_tests.cmx $(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \ mlguestfs.cmxa -linkpkg $^ -cclib -lncurses -o $@ diff --git a/resize/resize.ml b/resize/resize.ml index 95bc774a..256148d3 100644 --- a/resize/resize.ml +++ b/resize/resize.ml @@ -18,6 +18,8 @@ open Printf +open Resize_gettext.Gettext + module G = Guestfs open Utils @@ -38,7 +40,7 @@ let infile, outfile, align_first, alignment, copy_boot_loader, let display_version () = let g = new G.guestfs () in let version = g#version () in - printf "virt-resize %Ld.%Ld.%Ld%s\n" + printf (f_"virt-resize %Ld.%Ld.%Ld%s\n") version.G.major version.G.minor version.G.release version.G.extra; exit 0 in @@ -54,8 +56,8 @@ let infile, outfile, align_first, alignment, copy_boot_loader, let dryrun = ref false in let expand = ref "" in let set_expand s = - if s = "" then error "%s: empty --expand option" prog - else if !expand <> "" then error "--expand option given twice" + if s = "" then error (f_"%s: empty --expand option") prog + else if !expand <> "" then error (f_"--expand option given twice") else expand := s in let expand_content = ref true in @@ -71,51 +73,51 @@ let infile, outfile, align_first, alignment, copy_boot_loader, let resizes_force = ref [] in let shrink = ref "" in let set_shrink s = - if s = "" then error "empty --shrink option" - else if !shrink <> "" then error "--shrink option given twice" + if s = "" then error (f_"empty --shrink option") + else if !shrink <> "" then error (f_"--shrink option given twice") else shrink := s in let argspec = Arg.align [ - "--align-first", Arg.Set_string align_first, "never|always|auto Align first partition (default: auto)"; - "--alignment", Arg.Set_int alignment, "sectors Set partition alignment (default: 128 sectors)"; - "--no-copy-boot-loader", Arg.Clear copy_boot_loader, " Don't copy boot loader"; - "-d", Arg.Set debug, " Enable debugging messages"; + "--align-first", Arg.Set_string align_first, s_"never|always|auto" ^ " " ^ s_"Align first partition (default: auto)"; + "--alignment", Arg.Set_int alignment, s_"sectors" ^ " " ^ s_"Set partition alignment (default: 128 sectors)"; + "--no-copy-boot-loader", Arg.Clear copy_boot_loader, " " ^ s_"Don't copy boot loader"; + "-d", Arg.Set debug, " " ^ s_"Enable debugging messages"; "--debug", Arg.Set debug, " -\"-"; - "--debug-gc",Arg.Set debug_gc, " Debug GC and memory allocations"; - "--delete", Arg.String (add deletes), "part Delete partition"; - "--expand", Arg.String set_expand, "part Expand partition"; - "--no-expand-content", Arg.Clear expand_content, " Don't expand content"; - "--no-extra-partition", Arg.Clear extra_partition, " Don't create extra partition"; - "--format", Arg.Set_string format, "format Format of input disk"; - "--ignore", Arg.String (add ignores), "part Ignore partition"; - "--lv-expand", Arg.String (add lv_expands), "lv Expand logical volume"; - "--LV-expand", Arg.String (add lv_expands), "lv -\"-"; - "--lvexpand", Arg.String (add lv_expands), "lv -\"-"; - "--LVexpand", Arg.String (add lv_expands), "lv -\"-"; - "--machine-readable", Arg.Set machine_readable, " Make output machine readable"; - "-n", Arg.Set dryrun, " Don't perform changes"; + "--debug-gc",Arg.Set debug_gc, " " ^ s_"Debug GC and memory allocations"; + "--delete", Arg.String (add deletes), s_"part" ^ " " ^ s_"Delete partition"; + "--expand", Arg.String set_expand, s_"part" ^ " " ^ s_"Expand partition"; + "--no-expand-content", Arg.Clear expand_content, " " ^ s_"Don't expand content"; + "--no-extra-partition", Arg.Clear extra_partition, " " ^ s_"Don't create extra partition"; + "--format", Arg.Set_string format, s_"format" ^ " " ^ s_"Format of input disk"; + "--ignore", Arg.String (add ignores), s_"part" ^ " " ^ s_"Ignore partition"; + "--lv-expand", Arg.String (add lv_expands), s_"lv" ^ " " ^ s_"Expand logical volume"; + "--LV-expand", Arg.String (add lv_expands), s_"lv" ^ " -\"-"; + "--lvexpand", Arg.String (add lv_expands), s_"lv" ^ " -\"-"; + "--LVexpand", Arg.String (add lv_expands), s_"lv" ^ " -\"-"; + "--machine-readable", Arg.Set machine_readable, " " ^ s_"Make output machine readable"; + "-n", Arg.Set dryrun, " " ^ s_"Don't perform changes"; "--dryrun", Arg.Set dryrun, " -\"-"; "--dry-run", Arg.Set dryrun, " -\"-"; - "--ntfsresize-force", Arg.Set ntfsresize_force, " Force ntfsresize"; - "--output-format", Arg.Set_string output_format, "format Format of output disk"; - "-q", Arg.Set quiet, " Don't print the summary"; + "--ntfsresize-force", Arg.Set ntfsresize_force, " " ^ s_"Force ntfsresize"; + "--output-format", Arg.Set_string output_format, s_"format" ^ " " ^ s_"Format of output disk"; + "-q", Arg.Set quiet, " " ^ s_"Don't print the summary"; "--quiet", Arg.Set quiet, " -\"-"; - "--resize", Arg.String (add resizes), "part=size Resize partition"; - "--resize-force", Arg.String (add resizes_force), "part=size Forcefully resize partition"; - "--shrink", Arg.String set_shrink, "part Shrink partition"; - "-V", Arg.Unit display_version, " Display version and exit"; + "--resize", Arg.String (add resizes), s_"part=size" ^ " " ^ s_"Resize partition"; + "--resize-force", Arg.String (add resizes_force), s_"part=size" ^ " " ^ s_"Forcefully resize partition"; + "--shrink", Arg.String set_shrink, s_"part" ^ " " ^ s_"Shrink partition"; + "-V", Arg.Unit display_version, " " ^ s_"Display version and exit"; "--version", Arg.Unit display_version, " -\"-"; ] in let disks = ref [] in let anon_fun s = disks := s :: !disks in let usage_msg = - sprintf "\ + sprintf (f_"\ %s: resize a virtual machine disk A short summary of the options is given below. For detailed help please read the man page virt-resize(1). -" +") prog in Arg.parse argspec anon_fun usage_msg; @@ -147,7 +149,7 @@ read the man page virt-resize(1). let shrink = match !shrink with "" -> None | str -> Some str in if alignment < 1 then - error "alignment cannot be < 1"; + error (f_"alignment cannot be < 1"); let alignment = Int64.of_int alignment in let align_first = @@ -156,7 +158,7 @@ read the man page virt-resize(1). | "always" -> `Always | "auto" -> `Auto | _ -> - error "unknown --align-first option: use never|always|auto" in + error (f_"unknown --align-first option: use never|always|auto") in (* No arguments and machine-readable mode? Print out some facts * about what this binary supports. We only need to print out new @@ -185,13 +187,13 @@ read the man page virt-resize(1). match List.rev !disks with | [infile; outfile] -> infile, outfile | _ -> - error "usage is: %s [--options] indisk outdisk" prog in + error (f_"usage is: %s [--options] indisk outdisk") prog in (* Simple-minded check that the user isn't trying to use the * same disk for input and output. *) if infile = outfile then - error "you cannot use the same disk image for input and output"; + error (f_"you cannot use the same disk image for input and output"); infile, outfile, align_first, alignment, copy_boot_loader, debug, debug_gc, deletes, @@ -225,7 +227,7 @@ let connect_both_disks () = let g = if not quiet then - printf "Examining %s ...\n%!" infile; + printf (f_"Examining %s ...\n%!") infile; let g = connect_both_disks () in @@ -263,10 +265,10 @@ let max_bootloader = (* Check the disks are at least as big as the bootloader. *) let () = if insize < Int64.of_int max_bootloader then - error "%s: file is too small to be a disk image (%Ld bytes)" + error (f_"%s: file is too small to be a disk image (%Ld bytes)") infile insize; if outsize < Int64.of_int max_bootloader then - error "%s: file is too small to be a disk image (%Ld bytes)" + error (f_"%s: file is too small to be a disk image (%Ld bytes)") outfile outsize (* Get the source partition type. *) @@ -280,7 +282,7 @@ let parttype, parttype_string = | "msdos" -> MBR, "msdos" | "gpt" -> GPT, "gpt" | _ -> - error "%s: unknown partition table type\nvirt-resize only supports MBR (DOS) and GPT partition tables." infile + error (f_"%s: unknown partition table type\nvirt-resize only supports MBR (DOS) and GPT partition tables.") infile (* Build a data structure describing the source disk's partition layout. * @@ -330,7 +332,7 @@ and string_of_partition_content = function | ContentExtendedPartition -> "extended partition" and string_of_partition_content_no_size = function | ContentUnknown -> "unknown data" - | ContentPV _ -> sprintf "LVM PV" + | ContentPV _ -> "LVM PV" | ContentFS (fs, _) -> sprintf "filesystem %s" fs | ContentExtendedPartition -> "extended partition" @@ -344,7 +346,7 @@ let get_partition_content = else if fs = "LVM2_member" then ( let rec loop = function | [] -> - error "%s: physical volume not returned by pvs_full" + error (f_"%s: physical volume not returned by pvs_full") dev | pv :: _ when canonicalize pv.G.pv_name = dev -> ContentPV pv.G.pv_size @@ -369,7 +371,7 @@ let partitions : partition list = let parts = Array.to_list (g#part_list "/dev/sda") in if List.length parts = 0 then - error "the source disk has no partitions"; + error (f_"the source disk has no partitions"); (* Filter out logical partitions. See note above. *) let parts = @@ -414,12 +416,12 @@ let partitions : partition list = | { p_name = name; p_part = { G.part_size = size }; p_type = ContentPV pv_size } when size < pv_size -> - error "%s: partition size %Ld < physical volume size %Ld" + error (f_"%s: partition size %Ld < physical volume size %Ld") name size pv_size | { p_name = name; p_part = { G.part_size = size }; p_type = ContentFS (_, fs_size) } when size < fs_size -> - error "%s: partition size %Ld < filesystem size %Ld" + error (f_"%s: partition size %Ld < filesystem size %Ld") name size fs_size | _ -> () ) partitions; @@ -429,7 +431,7 @@ let partitions : partition list = | [] -> () | { p_name = name; p_part = { G.part_start = part_start } } :: _ when end_of_prev > part_start -> - error "%s: this partition overlaps the previous one" name + error (f_"%s: this partition overlaps the previous one") name | { p_part = { G.part_end = part_end } } :: parts -> loop part_end parts in loop 0L partitions; @@ -482,10 +484,10 @@ type expand_content_method = | PVResize | Resize2fs | NTFSResize | BtrfsFilesystemResize let string_of_expand_content_method = function - | PVResize -> "pvresize" - | Resize2fs -> "resize2fs" - | NTFSResize -> "ntfsresize" - | BtrfsFilesystemResize -> "btrfs-filesystem-resize" + | PVResize -> s_"pvresize" + | Resize2fs -> s_"resize2fs" + | NTFSResize -> s_"ntfsresize" + | BtrfsFilesystemResize -> s_"btrfs-filesystem-resize" let can_expand_content = if expand_content then @@ -532,15 +534,15 @@ let find_partition = let partition = try Hashtbl.find hash name with Not_found -> - error "%s: partition not found in the source disk image (this error came from '%s' option on the command line). Try running this command: virt-filesystems --partitions --long -a %s" + error (f_"%s: partition not found in the source disk image (this error came from '%s' option on the command line). Try running this command: virt-filesystems --partitions --long -a %s") name option infile in if partition.p_operation = OpIgnore then - error "%s: partition already ignored, you cannot use it in '%s' option" + error (f_"%s: partition already ignored, you cannot use it in '%s' option") name option; if partition.p_operation = OpDelete then - error "%s: partition already deleted, you cannot use it in '%s' option" + error (f_"%s: partition already deleted, you cannot use it in '%s' option") name option; partition @@ -572,11 +574,11 @@ let mark_partition_for_resize ~option ?(force = false) p newsize = (match p.p_operation with | OpResize _ -> - error "%s: this partition has already been marked for resizing" + error (f_"%s: this partition has already been marked for resizing") name | OpIgnore | OpDelete -> (* This error should have been caught already by find_partition ... *) - error "%s: this partition has already been ignored or deleted" + error (f_"%s: this partition has already been ignored or deleted") name | OpCopy -> () ); @@ -591,18 +593,18 @@ let mark_partition_for_resize ~option ?(force = false) p newsize = *) match p.p_type with | ContentUnknown -> - error "%s: This partition has unknown content which might be damaged by shrinking it. If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)" + error (f_"%s: This partition has unknown content which might be damaged by shrinking it. If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)") name option | ContentPV size when size > newsize -> - error "%s: This partition has contains an LVM physical volume which will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld bytes). If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)" + error (f_"%s: This partition has contains an LVM physical volume which will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld bytes). If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)") name size newsize option | ContentPV _ -> () | ContentFS (fstype, size) when size > newsize -> - error "%s: This partition has contains a %s filesystem which will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld bytes). If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)" + error (f_"%s: This partition has contains a %s filesystem which will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld bytes). If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy any data on this partition. (This error came from '%s' option on the command line.)") name fstype size newsize option | ContentFS _ -> () | ContentExtendedPartition -> - error "%s: This extended partition contains logical partitions which might be damaged by shrinking it. If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy logical partitions within this partition. (This error came from '%s' option on the command line.)" + error (f_"%s: This extended partition contains logical partitions which might be damaged by shrinking it. If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy logical partitions within this partition. (This error came from '%s' option on the command line.)") name option ); @@ -620,7 +622,7 @@ let () = if n == 0 then raise Not_found; String.sub arg 0 i, String.sub arg (i+1) n with Not_found -> - error "%s: missing size field in '%s' option" arg option in + error (f_"%s: missing size field in '%s' option") arg option in let p = find_partition ~option dev in @@ -629,7 +631,7 @@ let () = let newsize = parse_size oldsize sizefield in if newsize <= 0L then - error "%s: new partition size is zero or negative" dev; + error (f_"%s: new partition size is zero or negative") dev; mark_partition_for_resize ~option ~force p newsize in @@ -668,7 +670,7 @@ let calculate_surplus () = (* Handle --expand and --shrink options. *) let () = if expand <> None && shrink <> None then - error "you cannot use options --expand and --shrink together"; + error (f_"you cannot use options --expand and --shrink together"); if expand <> None || shrink <> None then ( let surplus = calculate_surplus () in @@ -680,7 +682,7 @@ let () = | None -> () | Some dev -> if surplus < 0L then - error "You cannot use --expand when there is no surplus space to expand into. You need to make the target disk larger by at least %s." + error (f_"You cannot use --expand when there is no surplus space to expand into. You need to make the target disk larger by at least %s.") (human_size (Int64.neg surplus)); let option = "--expand" in @@ -692,7 +694,7 @@ let () = | None -> () | Some dev -> if surplus > 0L then - error "You cannot use --shrink when there is no deficit (see 'deficit' in the virt-resize(1) man page)."; + error (f_"You cannot use --shrink when there is no deficit (see 'deficit' in the virt-resize(1) man page)."); let option = "--shrink" in let p = find_partition ~option dev in @@ -709,7 +711,7 @@ let surplus = if surplus < 0L then ( let deficit = Int64.neg surplus in - error "There is a deficit of %Ld bytes (%s). You need to make the target disk larger by at least this amount or adjust your resizing requests." + error (f_"There is a deficit of %Ld bytes (%s). You need to make the target disk larger by at least this amount or adjust your resizing requests.") deficit (human_size deficit) ); @@ -725,7 +727,7 @@ let () = let lv = try Hashtbl.find hash name with Not_found -> - error "%s: logical volume not found in the source disk image (this error came from '--lv-expand' option on the command line). Try running this command: virt-filesystems --logical-volumes --long -a %s" + error (f_"%s: logical volume not found in the source disk image (this error came from '--lv-expand' option on the command line). Try running this command: virt-filesystems --logical-volumes --long -a %s") name infile in lv.lv_operation <- LVOpExpand ) lv_expands @@ -743,16 +745,16 @@ let () = let text = match p.p_operation with | OpCopy -> - sprintf "%s: This partition will be left alone." name + sprintf (f_"%s: This partition will be left alone.") name | OpIgnore -> - sprintf "%s: This partition will be created, but the contents will be ignored (ie. not copied to the target)." name + sprintf (f_"%s: This partition will be created, but the contents will be ignored (ie. not copied to the target).") name | OpDelete -> - sprintf "%s: This partition will be deleted." name + sprintf (f_"%s: This partition will be deleted.") name | OpResize newsize -> - sprintf "%s: This partition will be resized from %s to %s." + sprintf (f_"%s: This partition will be resized from %s to %s.") name (human_size oldsize) (human_size newsize) ^ if can_expand_content p.p_type then ( - sprintf " The %s on %s will be expanded using the '%s' method." + sprintf (f_" The %s on %s will be expanded using the '%s' method.") (string_of_partition_content_no_size p.p_type) name (string_of_expand_content_method @@ -768,10 +770,10 @@ let () = | LVOpNone -> () | LVOpExpand -> let text = - sprintf "%s: This logical volume will be expanded to maximum size." + sprintf (f_"%s: This logical volume will be expanded to maximum size.") name ^ if can_expand_content lv.lv_type then ( - sprintf " The %s on %s will be expanded using the '%s' method." + sprintf (f_" The %s on %s will be expanded using the '%s' method.") (string_of_partition_content_no_size lv.lv_type) name (string_of_expand_content_method @@ -783,14 +785,14 @@ let () = if surplus > 0L then ( let text = - sprintf "There is a surplus of %s." (human_size surplus) ^ + sprintf (f_"There is a surplus of %s.") (human_size surplus) ^ if extra_partition then ( if surplus >= min_extra_partition then - sprintf " An extra partition will be created for the surplus." + s_" An extra partition will be created for the surplus." else - sprintf " The surplus space is not large enough for an extra partition to be created and so it will just be ignored." + s_" The surplus space is not large enough for an extra partition to be created and so it will just be ignored." ) else - sprintf " The surplus space will be ignored. Run a partitioning program in the guest to partition this extra space if you want." in + s_" The surplus space will be ignored. Run a partitioning program in the guest to partition this extra space if you want." in wrap (text ^ "\n\n") ); @@ -824,7 +826,7 @@ let g = * relaunching another handle. *) if not quiet then - printf "Setting up initial partition table on %s ...\n%!" outfile; + printf (f_"Setting up initial partition table on %s ...\n%!") outfile; let last_error = ref "" in let rec initialize_partition_table g attempts = @@ -845,7 +847,7 @@ let g = let g, ok = initialize_partition_table g 5 in if not ok then - error "Failed to initialize the partition table on the target disk. You need to wipe or recreate the target disk and then run virt-resize again.\n\nThe underlying error was: %s" !last_error; + error (f_"Failed to initialize the partition table on the target disk. You need to wipe or recreate the target disk and then run virt-resize again.\n\nThe underlying error was: %s") !last_error; g @@ -858,7 +860,7 @@ let () = if copy_boot_loader then ( let bootsect = g#pread_device "/dev/sda" 446 0L in if String.length bootsect < 446 then - error "pread-device: short read"; + error (f_"pread-device: short read"); ignore (g#pwrite_device "/dev/sdb" bootsect 0L); let start = @@ -871,7 +873,7 @@ let () = let loader = g#pread_device "/dev/sda" max_bootloader start in if String.length loader < max_bootloader then - error "pread-device: short read"; + error (f_"pread-device: short read"); ignore (g#pwrite_device "/dev/sdb" loader start) ) @@ -1016,7 +1018,7 @@ let () = let target = sprintf "/dev/sdb%d" p.p_target_partnum in if not quiet then - printf "Copying %s ...\n%!" source; + printf (f_"Copying %s ...\n%!") source; (match p.p_type with | ContentUnknown | ContentPV _ | ContentFS _ -> @@ -1069,10 +1071,10 @@ let () = (* Sanity check: it contains the NTFS magic. *) let magic = g#pread_device target 8 3L in if magic <> "NTFS " then - eprintf "warning: first partition is NTFS but does not contain NTFS boot loader magic\n%!" + eprintf (f_"warning: first partition is NTFS but does not contain NTFS boot loader magic\n%!") else ( if not quiet then - printf "Fixing first NTFS partition boot record ...\n%!"; + printf (f_"Fixing first NTFS partition boot record ...\n%!"); if debug then ( let old_hidden = int_of_le32 (g#pread_device target 4 0x1c_L) in @@ -1147,7 +1149,7 @@ let () = let meth = expand_content_method p.p_type in if not quiet then - printf "Expanding %s%s using the '%s' method ...\n%!" + printf (f_"Expanding %s%s using the '%s' method ...\n%!") source (if source <> target then sprintf " (now %s)" target else "") (string_of_expand_content_method meth); @@ -1164,7 +1166,7 @@ let () = let meth = expand_content_method lv.lv_type in if not quiet then - printf "Expanding %s using the '%s' method ...\n%!" + printf (f_"Expanding %s using the '%s' method ...\n%!") name (string_of_expand_content_method meth); @@ -1185,7 +1187,7 @@ let () = if not quiet then ( print_newline (); - wrap "Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.\n"; + wrap (s_"Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.\n"); ); if debug_gc then diff --git a/resize/utils.ml b/resize/utils.ml index 3c253da2..d99f489b 100644 --- a/resize/utils.ml +++ b/resize/utils.ml @@ -18,6 +18,8 @@ open Printf +open Resize_gettext.Gettext + module G = Guestfs let ( +^ ) = Int64.add @@ -72,11 +74,11 @@ let wrap ?(chan = stdout) ?(hanging = 0) str = let error fs = let display str = - wrap ~chan:stderr ("virt-resize: error: " ^ str); + wrap ~chan:stderr (s_"virt-resize: error: " ^ str); prerr_newline (); prerr_newline (); wrap ~chan:stderr - "If reporting bugs, run virt-resize with the '-d' option and include the complete output."; + (s_"If reporting bugs, run virt-resize with the '-d' option and include the complete output."); prerr_newline (); exit 1 in diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am index efe8278d..7de66b72 100644 --- a/sparsify/Makefile.am +++ b/sparsify/Makefile.am @@ -30,6 +30,7 @@ SOURCES = \ progress.mli \ progress.ml \ sparsify.ml \ + sparsify_gettext.ml \ utils.ml if HAVE_OCAML @@ -38,6 +39,7 @@ if HAVE_OCAML OBJECTS = \ $(top_builddir)/fish/guestfish-progress.o \ progress_c.o \ + sparsify_gettext.cmx \ utils.cmx \ progress.cmx \ sparsify.cmx @@ -48,6 +50,9 @@ bin_SCRIPTS = virt-sparsify # option to be passed to gcc, so we don't try linking against an # installed copy of libguestfs. OCAMLPACKAGES = -package unix -I $(top_builddir)/src/.libs -I $(top_builddir)/ocaml +if HAVE_OCAML_PKG_GETTEXT +OCAMLPACKAGES += -package gettext-stub +endif OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES) OCAMLOPTFLAGS = $(OCAMLCFLAGS) diff --git a/sparsify/sparsify.ml b/sparsify/sparsify.ml index a1382e63..600a9e5f 100644 --- a/sparsify/sparsify.ml +++ b/sparsify/sparsify.ml @@ -19,6 +19,8 @@ open Unix open Printf +open Sparsify_gettext.Gettext + module G = Guestfs open Utils @@ -54,33 +56,33 @@ let indisk, outdisk, compress, convert, debug_gc, let zeroes = ref [] in let argspec = Arg.align [ - "--compress", Arg.Set compress, " Compressed output format"; - "--convert", Arg.Set_string convert, "format Format of output disk (default: same as input)"; - "--debug-gc", Arg.Set debug_gc, " Debug GC and memory allocations"; - "--format", Arg.Set_string format, "format Format of input disk"; - "--ignore", Arg.String (add ignores), "fs Ignore filesystem"; - "--machine-readable", Arg.Set machine_readable, " Make output machine readable"; - "-o", Arg.Set_string option, "option Add qemu-img options"; - "-q", Arg.Set quiet, " Quiet output"; + "--compress", Arg.Set compress, " " ^ s_"Compressed output format"; + "--convert", Arg.Set_string convert, s_"format" ^ " " ^ s_"Format of output disk (default: same as input)"; + "--debug-gc", Arg.Set debug_gc, " " ^ s_"Debug GC and memory allocations"; + "--format", Arg.Set_string format, s_"format" ^ " " ^ s_"Format of input disk"; + "--ignore", Arg.String (add ignores), s_"fs" ^ " " ^ s_"Ignore filesystem"; + "--machine-readable", Arg.Set machine_readable, " " ^ s_"Make output machine readable"; + "-o", Arg.Set_string option, s_"option" ^ " " ^ s_"Add qemu-img options"; + "-q", Arg.Set quiet, " " ^ s_"Quiet output"; "--quiet", Arg.Set quiet, " -\"-"; - "-v", Arg.Set verbose, " Enable debugging messages"; + "-v", Arg.Set verbose, " " ^ s_"Enable debugging messages"; "--verbose", Arg.Set verbose, " -\"-"; - "-V", Arg.Unit display_version, " Display version and exit"; + "-V", Arg.Unit display_version, " " ^ s_"Display version and exit"; "--version", Arg.Unit display_version, " -\"-"; - "-x", Arg.Set trace, " Enable tracing of libguestfs calls"; - "--zero", Arg.String (add zeroes), "fs Zero filesystem"; + "-x", Arg.Set trace, " " ^ s_"Enable tracing of libguestfs calls"; + "--zero", Arg.String (add zeroes), s_"fs" ^ " " ^ s_"Zero filesystem"; ] in let disks = ref [] in let anon_fun s = disks := s :: !disks in let usage_msg = - sprintf "\ + sprintf (f_"\ %s: sparsify a virtual machine disk virt-sparsify [--options] indisk outdisk A short summary of the options is given below. For detailed help please read the man page virt-sparsify(1). -" +") prog in Arg.parse argspec anon_fun usage_msg; @@ -125,7 +127,7 @@ read the man page virt-sparsify(1). * same disk for input and output. *) if indisk = outdisk then - error "you cannot use the same disk image for input and output"; + error (f_"you cannot use the same disk image for input and output"); (* The input disk must be an absolute path, so we can store the name * in the overlay disk. @@ -141,10 +143,10 @@ read the man page virt-sparsify(1). (* Check filenames don't contain a colon (limitation of qemu-img). *) if contains_colon indisk then - error "input filename '%s' contains a colon (':'); qemu-img command line syntax prevents us from using such an image" indisk; + error (f_"input filename '%s' contains a colon (':'); qemu-img command line syntax prevents us from using such an image") indisk; if contains_colon outdisk then - error "output filename '%s' contains a colon (':'); qemu-img command line syntax prevents us from using such an image" outdisk; + error (f_"output filename '%s' contains a colon (':'); qemu-img command line syntax prevents us from using such an image") outdisk; indisk, outdisk, compress, convert, debug_gc, format, ignores, machine_readable, @@ -152,7 +154,7 @@ read the man page virt-sparsify(1). let () = if not quiet then - printf "Create overlay file to protect source disk ...\n%!" + printf (f_"Create overlay file to protect source disk ...\n%!") (* Create the temporary overlay file. *) let overlaydisk = @@ -178,13 +180,13 @@ let overlaydisk = if verbose then printf "%s\n%!" cmd; if Sys.command cmd <> 0 then - error "external command failed: %s" cmd; + error (f_"external command failed: %s") cmd; tmp let () = if not quiet then - printf "Examine source disk ...\n%!" + printf (f_"Examine source disk ...\n%!") (* Connect to libguestfs. *) let g = @@ -221,7 +223,7 @@ let () = if not (is_ignored fs) then ( if List.mem fs zeroes then ( if not quiet then - printf "Zeroing %s ...\n%!" fs; + printf (f_"Zeroing %s ...\n%!") fs; g#zero_device fs ) else ( @@ -231,7 +233,7 @@ let () = if mounted then ( if not quiet then - printf "Fill free space in %s with zero ...\n%!" fs; + printf (f_"Fill free space in %s with zero ...\n%!") fs; g#zero_free_space "/" ) else ( @@ -247,7 +249,7 @@ let () = if is_linux_x86_swap then ( if not quiet then - printf "Clearing Linux swap on %s ...\n%!" fs; + printf (f_"Clearing Linux swap on %s ...\n%!") fs; (* Don't use mkswap. Just preserve the header containing * the label, UUID and swap format version (libguestfs @@ -256,7 +258,7 @@ let () = let header = g#pread_device fs 4096 0L in g#zero_device fs; if g#pwrite_device fs header 0L <> 4096 then - error "pwrite: short write restoring swap partition header" + error (f_"pwrite: short write restoring swap partition header") ) ) ); @@ -282,7 +284,7 @@ let () = if created then ( if not quiet then - printf "Fill free space in volgroup %s with zero ...\n%!" vg; + printf (f_"Fill free space in volgroup %s with zero ...\n%!") vg; g#zero_device lvdev; g#sync (); @@ -313,11 +315,11 @@ let output_format = (match stat with | WEXITED 0 -> () | WEXITED _ -> - error "external command failed: %s" cmd + error (f_"external command failed: %s") cmd | WSIGNALED i -> - error "external command '%s' killed by signal %d" cmd i + error (f_"external command '%s' killed by signal %d") cmd i | WSTOPPED i -> - error "external command '%s' stopped by signal %d" cmd i + error (f_"external command '%s' stopped by signal %d") cmd i ); if string_prefix line "QEMU QCOW Image (v2)" then "qcow2" @@ -331,7 +333,7 @@ let output_format = *) let () = if not quiet then - printf "Copy to destination and make sparse ...\n%!"; + printf (f_"Copy to destination and make sparse ...\n%!"); let cmd = sprintf "qemu-img convert -f qcow2 -O %s%s%s %s %s" @@ -344,13 +346,13 @@ let () = if verbose then printf "%s\n%!" cmd; if Sys.command cmd <> 0 then - error "external command failed: %s" cmd + error (f_"external command failed: %s") cmd (* Finished. *) let () = if not quiet then ( print_newline (); - wrap "Sparsify operation completed with no errors. Before deleting the old disk, carefully check that the target disk boots and works correctly.\n"; + wrap (s_"Sparsify operation completed with no errors. Before deleting the old disk, carefully check that the target disk boots and works correctly.\n"); ); if debug_gc then diff --git a/sparsify/utils.ml b/sparsify/utils.ml index d2be12c8..dd27ba88 100644 --- a/sparsify/utils.ml +++ b/sparsify/utils.ml @@ -22,6 +22,8 @@ open Printf +open Sparsify_gettext.Gettext + module G = Guestfs let (//) = Filename.concat @@ -104,7 +106,7 @@ let error fs = prerr_newline (); prerr_newline (); wrap ~chan:stderr - "If reporting bugs, run virt-sparsify with the '-v' and '-x' options and include the complete output."; + (s_"If reporting bugs, run virt-sparsify with the '-v' and '-x' options and include the complete output."); prerr_newline (); exit 1 in diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am index 2424071e..38acfd2c 100644 --- a/sysprep/Makefile.am +++ b/sysprep/Makefile.am @@ -31,6 +31,7 @@ CLEANFILES = \ # Alphabetical order. SOURCES = \ main.ml \ + sysprep_gettext.ml \ sysprep_operation.ml \ sysprep_operation.mli \ sysprep_operation_bash_history.ml \ @@ -62,6 +63,7 @@ if HAVE_OCAML # Note this list must be in dependency order. OBJECTS = \ + sysprep_gettext.cmx \ utils.cmx \ sysprep_operation.cmx \ sysprep_operation_bash_history.cmx \ @@ -95,6 +97,9 @@ bin_SCRIPTS = virt-sysprep # option to be passed to gcc, so we don't try linking against an # installed copy of libguestfs. OCAMLPACKAGES = -package unix -I $(top_builddir)/src/.libs -I $(top_builddir)/ocaml +if HAVE_OCAML_PKG_GETTEXT +OCAMLPACKAGES += -package gettext-stub +endif OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES) OCAMLOPTFLAGS = $(OCAMLCFLAGS) diff --git a/sysprep/main.ml b/sysprep/main.ml index 12238162..ca5664de 100644 --- a/sysprep/main.ml +++ b/sysprep/main.ml @@ -19,6 +19,8 @@ open Unix open Printf +open Sysprep_gettext.Gettext + open Utils module G = Guestfs @@ -53,7 +55,7 @@ let debug_gc, operations, g, selinux_relabel, quiet = files := (file, format) :: !files and set_domain dom = if !domain <> None then ( - eprintf "%s: --domain option can only be given once\n" prog; + eprintf (f_"%s: --domain option can only be given once\n") prog; exit 1 ); domain := Some dom @@ -65,11 +67,11 @@ let debug_gc, operations, g, selinux_relabel, quiet = exit 0 and set_enable ops = if !operations <> None then ( - eprintf "%s: --enable option can only be given once\n" prog; + eprintf (f_"%s: --enable option can only be given once\n") prog; exit 1 ); if ops = "" then ( - eprintf "%s: you cannot pass an empty argument to --enable\n" prog; + eprintf (f_"%s: you cannot pass an empty argument to --enable\n") prog; exit 1 ); let ops = string_split "," ops in @@ -77,7 +79,8 @@ let debug_gc, operations, g, selinux_relabel, quiet = fun opset op_name -> try Sysprep_operation.add_to_set op_name opset with Not_found -> - eprintf "%s: --enable: '%s' is not a known operation\n" prog op_name; + eprintf (f_"%s: --enable: '%s' is not a known operation\n") + prog op_name; exit 1 ) Sysprep_operation.empty_set ops in operations := Some opset @@ -91,38 +94,38 @@ let debug_gc, operations, g, selinux_relabel, quiet = in let basic_args = [ - "-a", Arg.String add_file, "file Add disk image file"; - "--add", Arg.String add_file, "file Add disk image file"; - "-c", Arg.Set_string libvirturi, "uri Set libvirt URI"; - "--connect", Arg.Set_string libvirturi, "uri Set libvirt URI"; - "--debug-gc", Arg.Set debug_gc, " Debug GC and memory allocations (internal)"; - "-d", Arg.String set_domain, "domain Set libvirt guest name"; - "--domain", Arg.String set_domain, "domain Set libvirt guest name"; - "-n", Arg.Set dryrun, " Perform a dry run"; - "--dryrun", Arg.Set dryrun, " Perform a dry run"; - "--dry-run", Arg.Set dryrun, " Perform a dry run"; - "--dump-pod", Arg.Unit dump_pod, " Dump POD (internal)"; - "--dump-pod-options", Arg.Unit dump_pod_options, " Dump POD for options (internal)"; - "--enable", Arg.String set_enable, "operations Enable specific operations"; - "--format", Arg.Set_string format, "format Set format (default: auto)"; - "--list-operations", Arg.Unit list_operations, " List supported operations"; - "-q", Arg.Set quiet, " Don't print log messages"; - "--quiet", Arg.Set quiet, " Don't print log messages"; - "--selinux-relabel", Arg.Unit force_selinux_relabel, " Force SELinux relabel"; - "--no-selinux-relabel", Arg.Unit no_force_selinux_relabel, " Never do SELinux relabel"; - "-v", Arg.Set verbose, " Enable debugging messages"; - "--verbose", Arg.Set verbose, " Enable debugging messages"; - "-V", Arg.Unit display_version, " Display version and exit"; - "--version", Arg.Unit display_version, " Display version and exit"; - "-x", Arg.Set trace, " Enable tracing of libguestfs calls"; + "-a", Arg.String add_file, s_"file" ^ " " ^ s_"Add disk image file"; + "--add", Arg.String add_file, s_"file" ^ " " ^ s_"Add disk image file"; + "-c", Arg.Set_string libvirturi, s_"uri" ^ " " ^ s_"Set libvirt URI"; + "--connect", Arg.Set_string libvirturi, s_"uri" ^ " " ^ s_"Set libvirt URI"; + "--debug-gc", Arg.Set debug_gc, " " ^ s_"Debug GC and memory allocations (internal)"; + "-d", Arg.String set_domain, s_"domain" ^ " " ^ s_"Set libvirt guest name"; + "--domain", Arg.String set_domain, s_"domain" ^ " " ^ s_"Set libvirt guest name"; + "-n", Arg.Set dryrun, " " ^ s_"Perform a dry run"; + "--dryrun", Arg.Set dryrun, " " ^ s_"Perform a dry run"; + "--dry-run", Arg.Set dryrun, " " ^ s_"Perform a dry run"; + "--dump-pod", Arg.Unit dump_pod, " " ^ s_"Dump POD (internal)"; + "--dump-pod-options", Arg.Unit dump_pod_options, " " ^ s_"Dump POD for options (internal)"; + "--enable", Arg.String set_enable, s_"operations" ^ " " ^ s_"Enable specific operations"; + "--format", Arg.Set_string format, s_"format" ^ " " ^ s_"Set format (default: auto)"; + "--list-operations", Arg.Unit list_operations, " " ^ s_"List supported operations"; + "-q", Arg.Set quiet, " " ^ s_"Don't print log messages"; + "--quiet", Arg.Set quiet, " " ^ s_"Don't print log messages"; + "--selinux-relabel", Arg.Unit force_selinux_relabel, " " ^ s_"Force SELinux relabel"; + "--no-selinux-relabel", Arg.Unit no_force_selinux_relabel, " " ^ s_"Never do SELinux relabel"; + "-v", Arg.Set verbose, " " ^ s_"Enable debugging messages"; + "--verbose", Arg.Set verbose, " " ^ s_"Enable debugging messages"; + "-V", Arg.Unit display_version, " " ^ s_"Display version and exit"; + "--version", Arg.Unit display_version, " " ^ s_"Display version and exit"; + "-x", Arg.Set trace, " " ^ s_"Enable tracing of libguestfs calls"; ] in let args = basic_args @ Sysprep_operation.extra_args () in let args = List.sort (fun (a,_,_) (b,_,_) -> compare_command_line_args a b) args in let argspec = Arg.align args in - let anon_fun _ = raise (Arg.Bad "extra parameter on the command line") in + let anon_fun _ = raise (Arg.Bad (s_"extra parameter on the command line")) in let usage_msg = - sprintf "\ + sprintf (f_"\ %s: reset or unconfigure a virtual machine so clones can be made virt-sysprep [--options] -d domname @@ -131,7 +134,7 @@ let debug_gc, operations, g, selinux_relabel, quiet = A short summary of the options is given below. For detailed help please read the man page virt-sysprep(1). -" +") prog in Arg.parse argspec anon_fun usage_msg; @@ -142,8 +145,8 @@ read the man page virt-sysprep(1). let add = match files, domain with | [], None -> - eprintf "%s: you must give either -a or -d options\n" prog; - eprintf "Read virt-sysprep(1) man page for further information.\n"; + eprintf (f_"%s: you must give either -a or -d options\n") prog; + eprintf (f_"Read virt-sysprep(1) man page for further information.\n"); exit 1 | [], Some dom -> fun (g : Guestfs.guestfs) readonly -> @@ -151,8 +154,8 @@ read the man page virt-sysprep(1). let readonlydisk = "ignore" (* ignore CDs, data drives *) in ignore (g#add_domain ~readonly ?libvirturi ~allowuuid ~readonlydisk dom) | _, Some _ -> - eprintf "%s: you cannot give -a and -d options together\n" prog; - eprintf "Read virt-sysprep(1) man page for further information.\n"; + eprintf (f_"%s: you cannot give -a and -d options together\n") prog; + eprintf (f_"Read virt-sysprep(1) man page for further information.\n"); exit 1 | files, None -> fun g readonly -> @@ -172,7 +175,7 @@ read the man page virt-sysprep(1). let verbose = !verbose in if not quiet then - printf "Examining the guest ...\n%!"; + printf (f_"Examining the guest ...\n%!"); (* Connect to libguestfs. *) let g = new G.guestfs () in @@ -187,7 +190,7 @@ let () = (* Inspection. *) match Array.to_list (g#inspect_os ()) with | [] -> - eprintf "%s: no operating systems were found in the guest image\n" prog; + eprintf (f_"%s: no operating systems were found in the guest image\n") prog; exit 1 | roots -> List.iter ( @@ -201,7 +204,7 @@ let () = List.iter ( fun (mp, dev) -> try g#mount dev mp - with Guestfs.Error msg -> eprintf "%s (ignored)\n" msg + with Guestfs.Error msg -> eprintf (f_"%s (ignored)\n") msg ) mps; (* Perform the operations. *) diff --git a/sysprep/sysprep_operation.ml b/sysprep/sysprep_operation.ml index d3a12fef..e22d3a2b 100644 --- a/sysprep/sysprep_operation.ml +++ b/sysprep/sysprep_operation.ml @@ -20,6 +20,8 @@ open Utils open Printf +open Sysprep_gettext.Gettext + type flag = [ `Created_files ] type operation = { @@ -66,7 +68,7 @@ and check_no_dupes ops = List.fold_left ( fun opset op -> if OperationSet.mem op opset then ( - eprintf "virt-sysprep: duplicate operation name (%s)\n" op.name; + eprintf (f_"virt-sysprep: duplicate operation name (%s)\n") op.name; exit 1 ); add_to_set op.name opset @@ -75,23 +77,24 @@ and check_no_dupes ops = and check op = let n = String.length op.name in if n = 0 then ( - eprintf "virt-sysprep: operation name is an empty string\n"; + eprintf (f_"virt-sysprep: operation name is an empty string\n"); exit 1; ); for i = 0 to n-1 do match String.unsafe_get op.name i with | 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' -> () | c -> - eprintf "virt-sysprep: disallowed character (%c) in operation name\n" c; + eprintf (f_"virt-sysprep: disallowed character (%c) in operation name\n") + c; exit 1 done; let n = String.length op.heading in if n = 0 then ( - eprintf "virt-sysprep: operation %s has no heading\n" op.name; + eprintf (f_"virt-sysprep: operation %s has no heading\n") op.name; exit 1 ); if op.heading.[n-1] = '\n' || op.heading.[n-1] = '.' then ( - eprintf "virt-sysprep: heading for %s must not end with newline or period\n" + eprintf (f_"virt-sysprep: heading for %s must not end with newline or period\n") op.name; exit 1 ); @@ -100,11 +103,12 @@ and check op = | Some description -> let n = String.length description in if n = 0 then ( - eprintf "virt-sysprep: operation %s has no POD\n" op.name; + eprintf (f_"virt-sysprep: operation %s has no POD\n") op.name; exit 1 ); if description.[n-1] = '\n' then ( - eprintf "virt-sysprep: POD for %s must not end with newline\n" op.name; + eprintf (f_"virt-sysprep: POD for %s must not end with newline\n") + op.name; exit 1 ) ) diff --git a/sysprep/sysprep_operation_bash_history.ml b/sysprep/sysprep_operation_bash_history.ml index dbd6c500..56fd9f3b 100644 --- a/sysprep/sysprep_operation_bash_history.ml +++ b/sysprep/sysprep_operation_bash_history.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -35,10 +36,10 @@ let bash_history_perform g root = let bash_history_op = { name = "bash-history"; enabled_by_default = true; - heading = "Remove the bash history in the guest"; - pod_description = Some "\ + heading = s_"Remove the bash history in the guest"; + pod_description = Some (s_"\ Remove the bash history of user \"root\" and any other users -who have a C<.bash_history> file in their home directory."; +who have a C<.bash_history> file in their home directory."); extra_args = []; perform = bash_history_perform; } diff --git a/sysprep/sysprep_operation_cron_spool.ml b/sysprep/sysprep_operation_cron_spool.ml index daa3c683..20f1b205 100644 --- a/sysprep/sysprep_operation_cron_spool.ml +++ b/sysprep/sysprep_operation_cron_spool.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -27,7 +28,7 @@ let cron_spool_perform g root = let cron_spool_op = { name = "cron-spool"; enabled_by_default = true; - heading = "Remove user at-jobs and cron-jobs"; + heading = s_"Remove user at-jobs and cron-jobs"; pod_description = None; extra_args = []; perform = cron_spool_perform; diff --git a/sysprep/sysprep_operation_dhcp_client_state.ml b/sysprep/sysprep_operation_dhcp_client_state.ml index 279893d8..585424cd 100644 --- a/sysprep/sysprep_operation_dhcp_client_state.ml +++ b/sysprep/sysprep_operation_dhcp_client_state.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -32,7 +33,7 @@ let dhcp_client_state_perform g root = let dhcp_client_state_op = { name = "dhcp-client-state"; enabled_by_default = true; - heading = "Remove DHCP client leases"; + heading = s_"Remove DHCP client leases"; pod_description = None; extra_args = []; perform = dhcp_client_state_perform; diff --git a/sysprep/sysprep_operation_dhcp_server_state.ml b/sysprep/sysprep_operation_dhcp_server_state.ml index b28aa69f..7629dee3 100644 --- a/sysprep/sysprep_operation_dhcp_server_state.ml +++ b/sysprep/sysprep_operation_dhcp_server_state.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -27,7 +28,7 @@ let dhcp_server_state_perform g root = let dhcp_server_state_op = { name = "dhcp-server-state"; enabled_by_default = true; - heading = "Remove DHCP server leases"; + heading = s_"Remove DHCP server leases"; pod_description = None; extra_args = []; perform = dhcp_server_state_perform; diff --git a/sysprep/sysprep_operation_dovecot_data.ml b/sysprep/sysprep_operation_dovecot_data.ml index 65825ba3..14cbe8d9 100644 --- a/sysprep/sysprep_operation_dovecot_data.ml +++ b/sysprep/sysprep_operation_dovecot_data.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -34,7 +35,7 @@ let dovecot_data_perform g root = let dovecot_data_op = { name = "dovecot-data"; enabled_by_default = true; - heading = "Remove Dovecot (mail server) data"; + heading = s_"Remove Dovecot (mail server) data"; pod_description = None; extra_args = []; perform = dovecot_data_perform; diff --git a/sysprep/sysprep_operation_flag_reconfiguration.ml b/sysprep/sysprep_operation_flag_reconfiguration.ml index 755b1d01..0efee02e 100644 --- a/sysprep/sysprep_operation_flag_reconfiguration.ml +++ b/sysprep/sysprep_operation_flag_reconfiguration.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -31,10 +32,10 @@ let flag_reconfiguration g root = let flag_reconfiguration_op = { name = "flag-reconfiguration"; enabled_by_default = false; - heading = "Flag the system for reconfiguration"; - pod_description = Some "\ + heading = s_"Flag the system for reconfiguration"; + pod_description = Some (s_"\ Note that this may require user intervention when the -guest is booted."; +guest is booted."); extra_args = []; perform = flag_reconfiguration; } diff --git a/sysprep/sysprep_operation_hostname.ml b/sysprep/sysprep_operation_hostname.ml index 395691c5..f832a18a 100644 --- a/sysprep/sysprep_operation_hostname.ml +++ b/sysprep/sysprep_operation_hostname.ml @@ -20,6 +20,7 @@ open Printf open Utils open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -53,16 +54,16 @@ let hostname_perform g root = let hostname_op = { name = "hostname"; enabled_by_default = true; - heading = "Change the hostname of the guest"; - pod_description = Some "\ + heading = s_"Change the hostname of the guest"; + pod_description = Some (s_"\ This operation changes the hostname of the guest to the value given in the I<--hostname> parameter. If the I<--hostname> parameter is not given, then the hostname is changed -to C<localhost.localdomain>."; +to C<localhost.localdomain>."); extra_args = [ - ("--hostname", Arg.Set_string hostname, "hostname New hostname"), - "\ + ("--hostname", Arg.Set_string hostname, s_"hostname" ^ " " ^ s_"New hostname"), + s_"\ Change the hostname. If not given, defaults to C<localhost.localdomain>." ]; perform = hostname_perform; diff --git a/sysprep/sysprep_operation_logfiles.ml b/sysprep/sysprep_operation_logfiles.ml index cf728037..aa3c986c 100644 --- a/sysprep/sysprep_operation_logfiles.ml +++ b/sysprep/sysprep_operation_logfiles.ml @@ -19,6 +19,7 @@ open Printf open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -81,12 +82,12 @@ let logfiles_perform g root = let logfiles_op = { name = "logfiles"; enabled_by_default = true; - heading = "Remove many log files from the guest"; + heading = s_"Remove many log files from the guest"; pod_description = Some ( - sprintf "\ + sprintf (f_"\ On Linux the following files are removed: -%s" globs_as_pod); +%s") globs_as_pod); extra_args = []; perform = logfiles_perform; } diff --git a/sysprep/sysprep_operation_mail_spool.ml b/sysprep/sysprep_operation_mail_spool.ml index 25f42727..11dd292c 100644 --- a/sysprep/sysprep_operation_mail_spool.ml +++ b/sysprep/sysprep_operation_mail_spool.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -32,7 +33,7 @@ let mail_spool_perform g root = let mail_spool_op = { name = "mail-spool"; enabled_by_default = true; - heading = "Remove email from the local mail spool directory"; + heading = s_"Remove email from the local mail spool directory"; pod_description = None; extra_args = []; perform = mail_spool_perform; diff --git a/sysprep/sysprep_operation_net_hwaddr.ml b/sysprep/sysprep_operation_net_hwaddr.ml index 57ca2b98..52770174 100644 --- a/sysprep/sysprep_operation_net_hwaddr.ml +++ b/sysprep/sysprep_operation_net_hwaddr.ml @@ -18,6 +18,7 @@ open Utils open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -45,10 +46,10 @@ let net_hwaddr_perform g root = let net_hwaddr_op = { name = "net-hwaddr"; enabled_by_default = true; - heading = "Remove HWADDR (hard-coded MAC address) configuration"; - pod_description = Some "\ + heading = s_"Remove HWADDR (hard-coded MAC address) configuration"; + pod_description = Some (s_"\ For Fedora and Red Hat Enterprise Linux, -this is removed from C<ifcfg-*> files."; +this is removed from C<ifcfg-*> files."); extra_args = []; perform = net_hwaddr_perform; } diff --git a/sysprep/sysprep_operation_package_manager_cache.ml b/sysprep/sysprep_operation_package_manager_cache.ml index 80eefa31..957b10d2 100644 --- a/sysprep/sysprep_operation_package_manager_cache.ml +++ b/sysprep/sysprep_operation_package_manager_cache.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -36,7 +37,7 @@ let package_manager_cache_perform g root = let package_manager_cache_op = { name = "package-manager-cache"; enabled_by_default = true; - heading = "Remove package manager cache"; + heading = s_"Remove package manager cache"; pod_description = None; extra_args = []; perform = package_manager_cache_perform; diff --git a/sysprep/sysprep_operation_random_seed.ml b/sysprep/sysprep_operation_random_seed.ml index c6e8d858..5fbe9a41 100644 --- a/sysprep/sysprep_operation_random_seed.ml +++ b/sysprep/sysprep_operation_random_seed.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -46,12 +47,12 @@ let random_seed_perform g root = let random_seed_op = { name = "random-seed"; enabled_by_default = true; - heading = "Generate random seed for guest"; - pod_description = Some "\ + heading = s_"Generate random seed for guest"; + pod_description = Some (s_"\ Write some random bytes from the host into the random seed file of the guest. -See L</RANDOM SEED> below."; +See L</RANDOM SEED> below."); extra_args = []; perform = random_seed_perform; } diff --git a/sysprep/sysprep_operation_rhn_systemid.ml b/sysprep/sysprep_operation_rhn_systemid.ml index 9d9f2f8b..c86de7a3 100644 --- a/sysprep/sysprep_operation_rhn_systemid.ml +++ b/sysprep/sysprep_operation_rhn_systemid.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -33,7 +34,7 @@ let rhn_systemid_perform g root = let rhn_systemid_op = { name = "rhn-systemid"; enabled_by_default = true; - heading = "Remove the RHN system ID"; + heading = s_"Remove the RHN system ID"; pod_description = None; extra_args = []; perform = rhn_systemid_perform; diff --git a/sysprep/sysprep_operation_samba_db_log.ml b/sysprep/sysprep_operation_samba_db_log.ml index a02ba9de..6bd67998 100644 --- a/sysprep/sysprep_operation_samba_db_log.ml +++ b/sysprep/sysprep_operation_samba_db_log.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -43,7 +44,7 @@ let samba_db_log_perform g root = let samba_db_log_op = { name = "samba-db-log"; enabled_by_default = true; - heading = "Remove the database and log files of Samba"; + heading = s_"Remove the database and log files of Samba"; pod_description = None; extra_args = []; perform = samba_db_log_perform; diff --git a/sysprep/sysprep_operation_script.ml b/sysprep/sysprep_operation_script.ml index bcbba739..1f33c053 100644 --- a/sysprep/sysprep_operation_script.ml +++ b/sysprep/sysprep_operation_script.ml @@ -21,13 +21,14 @@ open Unix open Utils open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs let scriptdir = ref None let set_scriptdir dir = if !scriptdir <> None then ( - eprintf "virt-sysprep: --scriptdir cannot be used more than once\n"; + eprintf (f_"virt-sysprep: --scriptdir cannot be used more than once\n"); exit 1 ); scriptdir := Some dir @@ -61,17 +62,17 @@ let rec script_perform (g : Guestfs.guestfs) root = match snd (waitpid [] pid) with | WEXITED 0 -> true | WEXITED i -> - eprintf "virt-sysprep: script: failed (code %d)\n" i; + eprintf (f_"virt-sysprep: script: failed (code %d)\n") i; false | WSIGNALED i | WSTOPPED i -> - eprintf "virt-sysprep: script: killed by signal (%d)\n" i; + eprintf (f_"virt-sysprep: script: killed by signal (%d)\n") i; false in (* Remote temporary directory / mountpoint. *) if cleanup then rmdir scriptdir; - if not ok then failwith "script failed" + if not ok then failwith (s_"script failed") ); [] @@ -114,8 +115,8 @@ trap cleanup INT TERM QUIT EXIT ERR\n" let script_op = { name = "script"; enabled_by_default = true; - heading = "Run arbitrary scripts against the guest"; - pod_description = Some "\ + heading = s_"Run arbitrary scripts against the guest"; + pod_description = Some (s_"\ The C<script> module lets you run arbitrary shell scripts or programs against the guest. @@ -133,10 +134,10 @@ guest's DNS configuration file, but C<rm /etc/resolv.conf> would (try to) remove the host's file. Normally a temporary mount point for the guest is used, but you -can choose a specific one by using the I<--scriptdir> parameter."; +can choose a specific one by using the I<--scriptdir> parameter."); extra_args = [ - ("--scriptdir", Arg.String set_scriptdir, "dir Mount point on host"), - "\ + ("--scriptdir", Arg.String set_scriptdir, s_"dir" ^ " " ^ s_"Mount point on host"), + s_"\ The mount point (an empty directory on the host) used when the C<script> operation is enabled and one or more scripts are specified using I<--script> parameter(s). @@ -145,8 +146,8 @@ B<Note:> C<scriptdir> B<must> be an absolute path. If I<--scriptdir> is not specified then a temporary mountpoint will be created."; - ("--script", Arg.String add_script, "script Script or program to run on guest"), - "\ + ("--script", Arg.String add_script, s_"script" ^ " " ^ s_"Script or program to run on guest"), + s_"\ Run the named C<script> (a shell script or program) against the guest. The script can be any program on the host. The script's current directory will be the guest's root directory. diff --git a/sysprep/sysprep_operation_smolt_uuid.ml b/sysprep/sysprep_operation_smolt_uuid.ml index 85e788ec..25f73725 100644 --- a/sysprep/sysprep_operation_smolt_uuid.ml +++ b/sysprep/sysprep_operation_smolt_uuid.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -37,7 +38,7 @@ let smolt_uuid_perform g root = let smolt_uuid_op = { name = "smolt-uuid"; enabled_by_default = true; - heading = "Remove the Smolt hardware UUID"; + heading = s_"Remove the Smolt hardware UUID"; pod_description = None; extra_args = []; perform = smolt_uuid_perform; diff --git a/sysprep/sysprep_operation_ssh_hostkeys.ml b/sysprep/sysprep_operation_ssh_hostkeys.ml index db45b44c..62ea32e9 100644 --- a/sysprep/sysprep_operation_ssh_hostkeys.ml +++ b/sysprep/sysprep_operation_ssh_hostkeys.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -32,8 +33,8 @@ let ssh_hostkeys_perform g root = let ssh_hostkeys_op = { name = "ssh-hostkeys"; enabled_by_default = true; - heading = "Remove the SSH host keys in the guest"; - pod_description = Some "\ + heading = s_"Remove the SSH host keys in the guest"; + pod_description = Some (s_"\ The SSH host keys are regenerated (differently) next time the guest is booted. @@ -43,7 +44,7 @@ you a stark warning about the host key changing: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!"; + IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!"); extra_args = []; perform = ssh_hostkeys_perform; } diff --git a/sysprep/sysprep_operation_ssh_userdir.ml b/sysprep/sysprep_operation_ssh_userdir.ml index 9ea10171..3141c9e2 100644 --- a/sysprep/sysprep_operation_ssh_userdir.ml +++ b/sysprep/sysprep_operation_ssh_userdir.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -35,10 +36,10 @@ let ssh_userdir_perform g root = let ssh_userdir_op = { name = "ssh-userdir"; enabled_by_default = true; - heading = "Remove \".ssh\" directories in the guest"; - pod_description = Some "\ + heading = s_"Remove \".ssh\" directories in the guest"; + pod_description = Some (s_"\ Remove the C<.ssh> directory of user \"root\" and any other -users who have a C<.ssh> directory in their home directory."; +users who have a C<.ssh> directory in their home directory."); extra_args = []; perform = ssh_userdir_perform; } diff --git a/sysprep/sysprep_operation_sssd_db_log.ml b/sysprep/sysprep_operation_sssd_db_log.ml index 79e69508..8b1923a7 100644 --- a/sysprep/sysprep_operation_sssd_db_log.ml +++ b/sysprep/sysprep_operation_sssd_db_log.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -41,7 +42,7 @@ let sssd_db_log_perform g root = let sssd_db_log_op = { name = "sssd-db-log"; enabled_by_default = true; - heading = "Remove the database and log files of sssd"; + heading = s_"Remove the database and log files of sssd"; pod_description = None; extra_args = []; perform = sssd_db_log_perform; diff --git a/sysprep/sysprep_operation_udev_persistent_net.ml b/sysprep/sysprep_operation_udev_persistent_net.ml index 95133d1f..6de2589e 100644 --- a/sysprep/sysprep_operation_udev_persistent_net.ml +++ b/sysprep/sysprep_operation_udev_persistent_net.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -32,15 +33,15 @@ let udev_persistent_net_perform g root = let udev_persistent_net_op = { name = "udev-persistent-net"; enabled_by_default = true; - heading = "Remove udev persistent net rules"; - pod_description = Some "\ + heading = s_"Remove udev persistent net rules"; + pod_description = Some (s_"\ Remove udev persistent net rules which map the guest's existing MAC address to a fixed ethernet device (eg. eth0). After a guest is cloned, the MAC address usually changes. Since the old MAC address occupies the old name (eg. eth0), this means the fresh MAC address is assigned to a new name (eg. eth1) and this is usually -undesirable. Erasing the udev persistent net rules avoids this."; +undesirable. Erasing the udev persistent net rules avoids this."); extra_args = []; perform = udev_persistent_net_perform; } diff --git a/sysprep/sysprep_operation_user_account.ml b/sysprep/sysprep_operation_user_account.ml index 63757051..02201eb3 100644 --- a/sysprep/sysprep_operation_user_account.ml +++ b/sysprep/sysprep_operation_user_account.ml @@ -18,9 +18,11 @@ open Printf -open Sysprep_operation open Utils +open Sysprep_operation +open Sysprep_gettext.Gettext + module G = Guestfs let user_account_perform g root = @@ -59,10 +61,10 @@ let user_account_perform g root = let user_account_op = { name = "user-account"; enabled_by_default = false; - heading = "Remove the user accounts in the guest"; - pod_description = Some "\ + heading = s_"Remove the user accounts in the guest"; + pod_description = Some (s_"\ Remove all the user accounts and their home directories. -The \"root\" account is not removed."; +The \"root\" account is not removed."); extra_args = []; perform = user_account_perform; } diff --git a/sysprep/sysprep_operation_utmp.ml b/sysprep/sysprep_operation_utmp.ml index cdcf01f8..c4a548d5 100644 --- a/sysprep/sysprep_operation_utmp.ml +++ b/sysprep/sysprep_operation_utmp.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -31,11 +32,11 @@ let utmp_perform g root = let utmp_op = { name = "utmp"; enabled_by_default = true; - heading = "Remove the utmp file"; - pod_description = Some "\ + heading = s_"Remove the utmp file"; + pod_description = Some (s_"\ This file records who is currently logged in on a machine. In modern Linux distros it is stored in a ramdisk and hence not part of the -virtual machine's disk, but it was stored on disk in older distros."; +virtual machine's disk, but it was stored on disk in older distros."); extra_args = []; perform = utmp_perform; } diff --git a/sysprep/sysprep_operation_yum_uuid.ml b/sysprep/sysprep_operation_yum_uuid.ml index cc5fec1e..ec69ca50 100644 --- a/sysprep/sysprep_operation_yum_uuid.ml +++ b/sysprep/sysprep_operation_yum_uuid.ml @@ -17,6 +17,7 @@ *) open Sysprep_operation +open Sysprep_gettext.Gettext module G = Guestfs @@ -31,10 +32,10 @@ let yum_uuid_perform g root = let yum_uuid_op = { name = "yum-uuid"; enabled_by_default = true; - heading = "Remove the yum UUID"; - pod_description = Some "\ + heading = s_"Remove the yum UUID"; + pod_description = Some (s_"\ Yum creates a fresh UUID the next time it runs when it notices that the -original UUID has been erased."; +original UUID has been erased."); extra_args = []; perform = yum_uuid_perform; } |