diff --git a/generator/Makefile.am b/generator/Makefile.am index c281789a8..38f92a1b3 100644 --- a/generator/Makefile.am +++ b/generator/Makefile.am @@ -67,6 +67,8 @@ sources = \ events.mli \ fish.ml \ fish.mli \ + fish_commands.ml \ + fish_commands.mli \ GObject.ml \ GObject.mli \ golang.ml \ @@ -127,6 +129,7 @@ objects = \ actions_tsk.cmo \ actions.cmo \ structs.cmo \ + fish_commands.cmo \ optgroups.cmo \ prepopts.cmo \ events.cmo \ diff --git a/generator/actions.ml b/generator/actions.ml index 1fa3b02de..de61ecf4d 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -52,305 +52,6 @@ let daemon_functions = Actions_hivex.daemon_functions @ Actions_tsk.daemon_functions -(* Non-API meta-commands available only in guestfish. - * - * Note (1): The only fields which are actually used are the - * shortname, fish_alias, shortdesc and longdesc. - * - * Note (2): to refer to other commands, use L. - * - * Note (3): keep this list sorted by shortname. - *) -let fish_commands = [ - { defaults with - name = "alloc"; - fish_alias = ["allocate"]; - shortdesc = "allocate and add a disk file"; - longdesc = " alloc filename size - -This creates an empty (zeroed) file of the given size, and then adds -so it can be further examined. - -For more advanced image creation, see L. - -Size can be specified using standard suffixes, eg. C<1M>. - -To create a sparse file, use L instead. To create a -prepared disk image, see L." }; - - { defaults with - name = "copy_in"; - shortdesc = "copy local files or directories into an image"; - longdesc = " copy-in local [local ...] /remotedir - -C copies local files or directories recursively into the disk -image, placing them in the directory called F (which must -exist). This guestfish meta-command turns into a sequence of -L and other commands as necessary. - -Multiple local files and directories can be specified, but the last -parameter must always be a remote directory. Wildcards cannot be -used." }; - - { defaults with - name = "copy_out"; - shortdesc = "copy remote files or directories out of an image"; - longdesc = " copy-out remote [remote ...] localdir - -C copies remote files or directories recursively out of the -disk image, placing them on the host disk in a local directory called -C (which must exist). This guestfish meta-command turns -into a sequence of L, L and other commands as -necessary. - -Multiple remote files and directories can be specified, but the last -parameter must always be a local directory. To download to the -current directory, use C<.> as in: - - copy-out /home . - -Wildcards cannot be used in the ordinary command, but you can use -them with the help of L like this: - - glob copy-out /home/* ." }; - - { defaults with - name = "delete_event"; - shortdesc = "delete a previously registered event handler"; - longdesc = " delete-event name - -Delete the event handler which was previously registered as C. -If multiple event handlers were registered with the same name, they -are all deleted. - -See also the guestfish commands C and C." }; - - { defaults with - name = "display"; - shortdesc = "display an image"; - longdesc = " display filename - -Use C (a graphical display program) to display an image -file. It downloads the file, and runs C on it. - -To use an alternative program, set the C -environment variable. For example to use the GNOME display program: - - export GUESTFISH_DISPLAY_IMAGE=eog - -See also L." }; - - { defaults with - name = "echo"; - shortdesc = "display a line of text"; - longdesc = " echo [params ...] - -This echos the parameters to the terminal." }; - - { defaults with - name = "edit"; - fish_alias = ["vi"; "emacs"]; - shortdesc = "edit a file"; - longdesc = " edit filename - -This is used to edit a file. It downloads the file, edits it -locally using your editor, then uploads the result. - -The editor is C<$EDITOR>. However if you use the alternate -commands C or C you will get those corresponding -editors." }; - - { defaults with - name = "event"; - shortdesc = "register a handler for an event or events"; - longdesc = " event name eventset \"shell script ...\" - -Register a shell script fragment which is executed when an -event is raised. See L -for a discussion of the event API in libguestfs. - -The C parameter is a name that you give to this event -handler. It can be any string (even the empty string) and is -simply there so you can delete the handler using the guestfish -C command. - -The C parameter is a comma-separated list of one -or more events, for example C or C. The -special value C<*> means all events. - -The third and final parameter is the shell script fragment -(or any external command) that is executed when any of the -events in the eventset occurs. It is executed using -C<$SHELL -c>, or if C<$SHELL> is not set then F. - -The shell script fragment receives callback parameters as -arguments C<$1>, C<$2> etc. The actual event that was -called is available in the environment variable C<$EVENT>. - - event \"\" close \"echo closed\" - event messages appliance,library,trace \"echo $@\" - event \"\" progress \"echo progress: $3/$4\" - event \"\" * \"echo $EVENT $@\" - -See also the guestfish commands C and C." }; - - { defaults with - name = "glob"; - shortdesc = "expand wildcards in command"; - longdesc = " glob command args... - -Expand wildcards in any paths in the args list, and run C -repeatedly on each matching path. - -See L." }; - - { defaults with - name = "hexedit"; - shortdesc = "edit with a hex editor"; - longdesc = " hexedit - hexedit - hexedit - -Use hexedit (a hex editor) to edit all or part of a binary file -or block device. - -This command works by downloading potentially the whole file or -device, editing it locally, then uploading it. If the file or -device is large, you have to specify which part you wish to edit -by using C and/or C C parameters. -C and C are specified in bytes, with the usual -modifiers allowed such as C<1M> (1 megabyte). - -For example to edit the first few sectors of a disk you -might do: - - hexedit /dev/sda 1M - -which would allow you to edit anywhere within the first megabyte -of the disk. - -To edit the superblock of an ext2 filesystem on F, do: - - hexedit /dev/sda1 0x400 0x400 - -(assuming the superblock is in the standard location). - -This command requires the external L program. You -can specify another program to use by setting the C -environment variable. - -See also L." }; - - { defaults with - name = "lcd"; - shortdesc = "change working directory"; - longdesc = " lcd directory - -Change the local directory, ie. the current directory of guestfish -itself. - -Note that C won't do what you might expect." }; - - { defaults with - name = "list_events"; - shortdesc = "list event handlers"; - longdesc = " list-events - -List the event handlers registered using the guestfish -C command." }; - - { defaults with - name = "man"; - fish_alias = ["manual"]; - shortdesc = "open the manual"; - longdesc = " man - -Opens the manual page for guestfish." }; - - { defaults with - name = "more"; - fish_alias = ["less"]; - shortdesc = "view a file"; - longdesc = " more filename - - less filename - -This is used to view a file. - -The default viewer is C<$PAGER>. However if you use the alternate -command C you will get the C command specifically." }; - - { defaults with - name = "reopen"; - shortdesc = "close and reopen libguestfs handle"; - longdesc = " reopen - -Close and reopen the libguestfs handle. It is not necessary to use -this normally, because the handle is closed properly when guestfish -exits. However this is occasionally useful for testing." }; - - { defaults with - name = "setenv"; - shortdesc = "set an environment variable"; - longdesc = " setenv VAR value - -Set the environment variable C to the string C. - -To print the value of an environment variable use a shell command -such as: - - !echo $VAR" }; - - { defaults with - name = "sparse"; - shortdesc = "create a sparse disk image and add"; - longdesc = " sparse filename size - -This creates an empty sparse file of the given size, and then adds -so it can be further examined. - -In all respects it works the same as the L command, except that -the image file is allocated sparsely, which means that disk blocks are -not assigned to the file until they are needed. Sparse disk files -only use space when written to, but they are slower and there is a -danger you could run out of real disk space during a write operation. - -For more advanced image creation, see L. - -Size can be specified using standard suffixes, eg. C<1M>. - -See also the guestfish L command." }; - - { defaults with - name = "supported"; - shortdesc = "list supported groups of commands"; - longdesc = " supported - -This command returns a list of the optional groups -known to the daemon, and indicates which ones are -supported by this build of the libguestfs appliance. - -See also L." }; - - { defaults with - name = "time"; - shortdesc = "print elapsed time taken to run a command"; - longdesc = " time command args... - -Run the command as usual, but print the elapsed time afterwards. This -can be useful for benchmarking operations." }; - - { defaults with - name = "unsetenv"; - shortdesc = "unset an environment variable"; - longdesc = " unsetenv VAR - -Remove C from the environment." }; - -] - -(*----------------------------------------------------------------------*) - (* Some post-processing of the basic lists of actions. *) (* Add the name of the C function: diff --git a/generator/actions.mli b/generator/actions.mli index c943cb9a5..7ac57b6d2 100644 --- a/generator/actions.mli +++ b/generator/actions.mli @@ -53,9 +53,6 @@ val is_documented : Types.action -> bool val test_functions : Types.action list (** Internal test functions used to test the language bindings. *) -val fish_commands : Types.action list -(** Non-API meta-commands available only in guestfish. *) - val max_proc_nr : int (** The largest procedure number used (also saved in [lib/MAX_PROC_NR] and used as the minor version number of the shared library). *) diff --git a/generator/checks.ml b/generator/checks.ml index 4dfd207b1..516264d26 100644 --- a/generator/checks.ml +++ b/generator/checks.ml @@ -22,6 +22,7 @@ open Common_utils open Types open Utils open Actions +open Fish_commands (* Check function names etc. for consistency. *) let () = diff --git a/generator/fish.ml b/generator/fish.ml index 8be1f1ac4..c2846d0a9 100644 --- a/generator/fish.ml +++ b/generator/fish.ml @@ -31,6 +31,7 @@ open Structs open Prepopts open C open Events +open Fish_commands let generate_header = generate_header ~inputs:["generator/fish.ml"] diff --git a/generator/fish_commands.ml b/generator/fish_commands.ml new file mode 100644 index 000000000..507e8721a --- /dev/null +++ b/generator/fish_commands.ml @@ -0,0 +1,318 @@ +(* libguestfs + * Copyright (C) 2009-2017 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + *) + +(* Please read generator/README first. *) + +open Types + +(* Non-API meta-commands available only in guestfish. + * + * Note (1): The only fields which are actually used are the + * shortname, fish_alias, shortdesc and longdesc. + * + * Note (2): to refer to other commands, use L. + * + * Note (3): keep this list sorted by shortname. + *) +let fish_commands = [ + { defaults with + name = "alloc"; + fish_alias = ["allocate"]; + shortdesc = "allocate and add a disk file"; + longdesc = " alloc filename size + +This creates an empty (zeroed) file of the given size, and then adds +so it can be further examined. + +For more advanced image creation, see L. + +Size can be specified using standard suffixes, eg. C<1M>. + +To create a sparse file, use L instead. To create a +prepared disk image, see L." }; + + { defaults with + name = "copy_in"; + shortdesc = "copy local files or directories into an image"; + longdesc = " copy-in local [local ...] /remotedir + +C copies local files or directories recursively into the disk +image, placing them in the directory called F (which must +exist). This guestfish meta-command turns into a sequence of +L and other commands as necessary. + +Multiple local files and directories can be specified, but the last +parameter must always be a remote directory. Wildcards cannot be +used." }; + + { defaults with + name = "copy_out"; + shortdesc = "copy remote files or directories out of an image"; + longdesc = " copy-out remote [remote ...] localdir + +C copies remote files or directories recursively out of the +disk image, placing them on the host disk in a local directory called +C (which must exist). This guestfish meta-command turns +into a sequence of L, L and other commands as +necessary. + +Multiple remote files and directories can be specified, but the last +parameter must always be a local directory. To download to the +current directory, use C<.> as in: + + copy-out /home . + +Wildcards cannot be used in the ordinary command, but you can use +them with the help of L like this: + + glob copy-out /home/* ." }; + + { defaults with + name = "delete_event"; + shortdesc = "delete a previously registered event handler"; + longdesc = " delete-event name + +Delete the event handler which was previously registered as C. +If multiple event handlers were registered with the same name, they +are all deleted. + +See also the guestfish commands C and C." }; + + { defaults with + name = "display"; + shortdesc = "display an image"; + longdesc = " display filename + +Use C (a graphical display program) to display an image +file. It downloads the file, and runs C on it. + +To use an alternative program, set the C +environment variable. For example to use the GNOME display program: + + export GUESTFISH_DISPLAY_IMAGE=eog + +See also L." }; + + { defaults with + name = "echo"; + shortdesc = "display a line of text"; + longdesc = " echo [params ...] + +This echos the parameters to the terminal." }; + + { defaults with + name = "edit"; + fish_alias = ["vi"; "emacs"]; + shortdesc = "edit a file"; + longdesc = " edit filename + +This is used to edit a file. It downloads the file, edits it +locally using your editor, then uploads the result. + +The editor is C<$EDITOR>. However if you use the alternate +commands C or C you will get those corresponding +editors." }; + + { defaults with + name = "event"; + shortdesc = "register a handler for an event or events"; + longdesc = " event name eventset \"shell script ...\" + +Register a shell script fragment which is executed when an +event is raised. See L +for a discussion of the event API in libguestfs. + +The C parameter is a name that you give to this event +handler. It can be any string (even the empty string) and is +simply there so you can delete the handler using the guestfish +C command. + +The C parameter is a comma-separated list of one +or more events, for example C or C. The +special value C<*> means all events. + +The third and final parameter is the shell script fragment +(or any external command) that is executed when any of the +events in the eventset occurs. It is executed using +C<$SHELL -c>, or if C<$SHELL> is not set then F. + +The shell script fragment receives callback parameters as +arguments C<$1>, C<$2> etc. The actual event that was +called is available in the environment variable C<$EVENT>. + + event \"\" close \"echo closed\" + event messages appliance,library,trace \"echo $@\" + event \"\" progress \"echo progress: $3/$4\" + event \"\" * \"echo $EVENT $@\" + +See also the guestfish commands C and C." }; + + { defaults with + name = "glob"; + shortdesc = "expand wildcards in command"; + longdesc = " glob command args... + +Expand wildcards in any paths in the args list, and run C +repeatedly on each matching path. + +See L." }; + + { defaults with + name = "hexedit"; + shortdesc = "edit with a hex editor"; + longdesc = " hexedit + hexedit + hexedit + +Use hexedit (a hex editor) to edit all or part of a binary file +or block device. + +This command works by downloading potentially the whole file or +device, editing it locally, then uploading it. If the file or +device is large, you have to specify which part you wish to edit +by using C and/or C C parameters. +C and C are specified in bytes, with the usual +modifiers allowed such as C<1M> (1 megabyte). + +For example to edit the first few sectors of a disk you +might do: + + hexedit /dev/sda 1M + +which would allow you to edit anywhere within the first megabyte +of the disk. + +To edit the superblock of an ext2 filesystem on F, do: + + hexedit /dev/sda1 0x400 0x400 + +(assuming the superblock is in the standard location). + +This command requires the external L program. You +can specify another program to use by setting the C +environment variable. + +See also L." }; + + { defaults with + name = "lcd"; + shortdesc = "change working directory"; + longdesc = " lcd directory + +Change the local directory, ie. the current directory of guestfish +itself. + +Note that C won't do what you might expect." }; + + { defaults with + name = "list_events"; + shortdesc = "list event handlers"; + longdesc = " list-events + +List the event handlers registered using the guestfish +C command." }; + + { defaults with + name = "man"; + fish_alias = ["manual"]; + shortdesc = "open the manual"; + longdesc = " man + +Opens the manual page for guestfish." }; + + { defaults with + name = "more"; + fish_alias = ["less"]; + shortdesc = "view a file"; + longdesc = " more filename + + less filename + +This is used to view a file. + +The default viewer is C<$PAGER>. However if you use the alternate +command C you will get the C command specifically." }; + + { defaults with + name = "reopen"; + shortdesc = "close and reopen libguestfs handle"; + longdesc = " reopen + +Close and reopen the libguestfs handle. It is not necessary to use +this normally, because the handle is closed properly when guestfish +exits. However this is occasionally useful for testing." }; + + { defaults with + name = "setenv"; + shortdesc = "set an environment variable"; + longdesc = " setenv VAR value + +Set the environment variable C to the string C. + +To print the value of an environment variable use a shell command +such as: + + !echo $VAR" }; + + { defaults with + name = "sparse"; + shortdesc = "create a sparse disk image and add"; + longdesc = " sparse filename size + +This creates an empty sparse file of the given size, and then adds +so it can be further examined. + +In all respects it works the same as the L command, except that +the image file is allocated sparsely, which means that disk blocks are +not assigned to the file until they are needed. Sparse disk files +only use space when written to, but they are slower and there is a +danger you could run out of real disk space during a write operation. + +For more advanced image creation, see L. + +Size can be specified using standard suffixes, eg. C<1M>. + +See also the guestfish L command." }; + + { defaults with + name = "supported"; + shortdesc = "list supported groups of commands"; + longdesc = " supported + +This command returns a list of the optional groups +known to the daemon, and indicates which ones are +supported by this build of the libguestfs appliance. + +See also L." }; + + { defaults with + name = "time"; + shortdesc = "print elapsed time taken to run a command"; + longdesc = " time command args... + +Run the command as usual, but print the elapsed time afterwards. This +can be useful for benchmarking operations." }; + + { defaults with + name = "unsetenv"; + shortdesc = "unset an environment variable"; + longdesc = " unsetenv VAR + +Remove C from the environment." }; + +] diff --git a/generator/fish_commands.mli b/generator/fish_commands.mli new file mode 100644 index 000000000..02dd598ec --- /dev/null +++ b/generator/fish_commands.mli @@ -0,0 +1,21 @@ +(* libguestfs + * Copyright (C) 2009-2017 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + *) + +(* Please read generator/README first. *) + +val fish_commands : Types.action list