Bug 1379895
| Summary: | Virsh/virt-admin client doesn't write the history commands into file | ||||||
|---|---|---|---|---|---|---|---|
| Product: | Red Hat Enterprise Linux 7 | Reporter: | Fangge Jin <fjin> | ||||
| Component: | libvirt | Assignee: | John Ferlan <jferlan> | ||||
| Status: | CLOSED ERRATA | QA Contact: | Lili Zhu <lizhu> | ||||
| Severity: | medium | Docs Contact: | |||||
| Priority: | medium | ||||||
| Version: | 7.3 | CC: | dyuan, eskultet, jdenemar, jferlan, mzhan, rbalakri, tlavigne, xuzhang, zpeng | ||||
| Target Milestone: | rc | Keywords: | Regression | ||||
| Target Release: | --- | ||||||
| Hardware: | x86_64 | ||||||
| OS: | Linux | ||||||
| Whiteboard: | |||||||
| Fixed In Version: | libvirt-2.5.0-1.el7 | Doc Type: | Bug Fix | ||||
| Doc Text: |
Cause: Erroneous skip of setting if interactive mode was not set; however, the field to check is cleared for 'quit' and 'exit' commands (NB: using <ctrl>D would save the history).
Consequence: When exiting the "virsh" using the 'quit' or 'exit' command, the shell history will be lost.
Fix: Removed the unnecessary check for flag.
Result: When exiting the "virsh" shell using the 'quit' or 'exit' command, the shell history will be updated.
|
Story Points: | --- | ||||
| Clone Of: | Environment: | ||||||
| Last Closed: | 2017-08-01 17:16:43 UTC | Type: | Bug | ||||
| Regression: | --- | Mount Type: | --- | ||||
| Documentation: | --- | CRM: | |||||
| Verified Versions: | Category: | --- | |||||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
| Cloudforms Team: | --- | Target Upstream Version: | |||||
| Embargoed: | |||||||
| Attachments: |
|
||||||
Instead of typing "exit" or "quit", press the key combo <ctrl>D and the history file is automagically created. IOW: 'write_history' is called. So something in the exit/quit handling is amiss... This is because during main() loop processing/parsing interactive commands runs while "ctl->imode" is true. When exit or quit is typed, cmdQuit() is called clearing the 'imode' setting. When "<ctrl>D" is typed, the main() loop processing will "break" from the loop because EOF is found. When the loop is exited, main() will call virshDeinit() which calls vshDeinit() which will only call vshReadlineDeinit() [e.g. the function that writes out the history file] if ctl->imode is set. Since exit/quit clear it, the history file isn't written. The "workaround" is to use <ctrl>D (which fortunately I've trained my fingers to do long ago). In 7.2, the vshReadlineDeinit() was called unconditionally from vshDeinit() [this prior to a rather massive change from libvirt commit id '834c5720'.] I've posted a patch upstream : http://www.redhat.com/archives/libvir-list/2016-September/msg01312.html The patch has been pushed upstream:
commit bcfa2f427d53264830ff5fa5d029b6897773702d
Author: John Ferlan <jferlan>
Date: Wed Sep 28 15:01:55 2016 -0400
vsh: Write out history on "quit" or "exit" in interactive mode
...
$ git describe bcfa2f427d53264830ff5fa5d029b6897773702d
v2.3.0-rc1-9-gbcfa2f4
$
Test with upstream version v2.3.0-40-g0f3f8ac, it works well.
Steps:
1.
# ll /root/.cache/libvirt/
total 0
2. Enter interactive mode of virsh client and do some operations:
1) # virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # echo 1
1
virsh # echo 2
2
virsh # quit
2) # virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # echo 3
3
virsh # echo 4
4
virsh # exit
3) # virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # echo 5
5
virsh # echo 6
6
virsh #
(Press Ctrl+D)
3. Check the history file, the history commands are all recorded correctly:
# cat /root/.cache/libvirt/virsh/history
echo 1
echo 2
quit
echo 3
echo 4
exit
echo 5
echo 6
4. Re-do step 2 and step3 with virt-admin client, it also works well.
Reproduce this bug with build libvirt-2.0.0-10.el7.x86_64
steps to reproduce:
Scenario 1: virsh
1.
# ll /root/.cache/libvirt/
total 0
2.
# virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # list --all
Id Name State
----------------------------------------------------
- rhel6.9-mt6.6 shut off
- rhel6.9-q35 shut off
- rhel7.4-mt7.3 shut off
- rhel7.4-q35 shut off
virsh # echo 1
1
virsh # echo 2
2
virsh # exit
3.
# ll /root/.cache/libvirt/
total 0
Scenario 2: virt-admin
1. # virt-admin
Welcome to virt-admin, the administrating virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virt-admin # srv-list
Id Name
---------------
0 admin
1 libvirtd
virt-admin # srv-clients-list admin
Id Transport Connected since
--------------------------------------------------
1 unix 2017-06-15 10:33:24+0800
virt-admin # srv-clients-list libvirtd
Id Transport Connected since
--------------------------------------------------
virt-admin # exit
# ll /root/.cache/libvirt/
Verify this bug with build libvirt-3.2.0-10.el7.x86_64
Steps to verify:
Scenario 1: virsh
1.
# ll /root/.cache/libvirt/
total 0
2.
# virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # echo 1
1
virsh # echo 2
2
virsh # list --all
Id Name State
----------------------------------------------------
- rhel6.9-mt6.6 shut off
virsh #
(Press Ctrl+D)
3.# ll /root/.cache/libvirt/virsh/
total 4
-rw-------. 1 root root 45 Jun 15 11:01 history
4.
# virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # echo 5
5
virsh # echo 6
6
virsh # exit
5.
# cat /root/.cache/libvirt/virsh/history
echo 1
echo 2
list --all
echo 5
echo 6
exit
Scenario 2: virt-admin
1.
# virt-admin
Welcome to virt-admin, the administrating virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virt-admin # echo 7
7
virt-admin # echo 8
8
virt-admin # exit
2.
# cat /root/.cache/libvirt/virt-admin/history
echo 7
echo 8
exit
As the result match the expectations, so mark the bug as verified.
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHEA-2017:1846 Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHEA-2017:1846 |
Created attachment 1205380 [details] strace output of virsh client Description of problem: There are two problems that exist for both virsh client and virt-admin client, take virsh client as example: 1)Virsh client doesn't create history file automatically # ll /root/.cache/libvirt/ total 0 # virsh Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # echo 1 1 virsh # echo 2 2 virsh # exit After execute some commands in interactive mode and exit, no history file is created. # ll /root/.cache/libvirt/ total 0 2)After I create history file manually, virsh client still doesn't flush the history commands into the file. # mkdir /root/.cache/libvirt/virsh # touch /root/.cache/libvirt/virsh/history # strace -o /tmp/strace virsh Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # echo 1 1 virsh # echo 2 2 virsh # exit # cat /root/.cache/libvirt/virsh/history (no output) Version-Release number of selected component: libvirt-2.0.0-10.el7.x86_64 How reproducible: 100% Steps to Reproduce: As description Actual results: As description Expected results: 1) Virsh/virt-admin client can create history file automatically if no such file exists 2) Virsh/virt-admin client can flush the history commands into file when exits the interactive mode Additional info: RHEl7.2 build libvirt-1.2.17-13.el7_2.5.x86_64 works well