mirror of
				https://gitlab.com/libvirt/libvirt.git
				synced 2025-11-02 04:24:20 +03:00 
			
		
		
		
	Compare commits
	
		
			10 Commits
		
	
	
		
			v4.1.0-rc1
			...
			v1.2.17-ma
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 49fa383bb0 | ||
|  | 08acad56ce | ||
|  | 4268b1f102 | ||
|  | d055989083 | ||
|  | 98242f94cd | ||
|  | a3ee6885d9 | ||
|  | a0080cbc17 | ||
|  | 45e32f2ea5 | ||
|  | 02b9226ee3 | ||
|  | ea16e3ef07 | 
| @@ -1,40 +0,0 @@ | ||||
| -I@abs_top_builddir@ | ||||
| -I@abs_top_srcdir@ | ||||
| -I@abs_top_builddir@/gnulib/lib | ||||
| -I@abs_top_srcdir@/gnulib/lib | ||||
| -I@abs_top_builddir@/include | ||||
| -I@abs_top_srcdir@/include | ||||
| -I@abs_top_builddir@/src | ||||
| -I@abs_top_srcdir@/src | ||||
| -I@abs_top_builddir@/src/access | ||||
| -I@abs_top_srcdir@/src/access | ||||
| -I@abs_top_builddir@/src/admin | ||||
| -I@abs_top_srcdir@/src/admin | ||||
| -I@abs_top_builddir@/src/bhyve | ||||
| -I@abs_top_srcdir@/src/bhyve | ||||
| -I@abs_top_builddir@/src/conf | ||||
| -I@abs_top_srcdir@/src/conf | ||||
| -I@abs_top_builddir@/src/libxl | ||||
| -I@abs_top_srcdir@/src/libxl | ||||
| -I@abs_top_builddir@/src/locking | ||||
| -I@abs_top_srcdir@/src/locking | ||||
| -I@abs_top_builddir@/src/logging | ||||
| -I@abs_top_srcdir@/src/logging | ||||
| -I@abs_top_builddir@/src/lxc | ||||
| -I@abs_top_srcdir@/src/lxc | ||||
| -I@abs_top_builddir@/src/qemu | ||||
| -I@abs_top_srcdir@/src/qemu | ||||
| -I@abs_top_builddir@/src/remote | ||||
| -I@abs_top_srcdir@/src/remote | ||||
| -I@abs_top_builddir@/src/rpc | ||||
| -I@abs_top_srcdir@/src/rpc | ||||
| -I@abs_top_builddir@/src/secret | ||||
| -I@abs_top_srcdir@/src/secret | ||||
| -I@abs_top_builddir@/src/security | ||||
| -I@abs_top_srcdir@/src/security | ||||
| -I@abs_top_builddir@/src/util | ||||
| -I@abs_top_srcdir@/src/util | ||||
| -I@abs_top_builddir@/src/vmx | ||||
| -I@abs_top_srcdir@/src/vmx | ||||
| -I@abs_top_builddir@/src/xenconfig | ||||
| -I@abs_top_srcdir@/src/xenconfig | ||||
							
								
								
									
										64
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,5 @@ | ||||
| *#*# | ||||
| *.#*# | ||||
| *.[187] | ||||
| *.[187].in | ||||
| *.a | ||||
| *.cov | ||||
| *.exe | ||||
| @@ -11,7 +9,6 @@ | ||||
| *.gcov | ||||
| *.html | ||||
| *.i | ||||
| *.init | ||||
| *.la | ||||
| *.lo | ||||
| *.loT | ||||
| @@ -21,12 +18,9 @@ | ||||
| *.pyc | ||||
| *.rej | ||||
| *.s | ||||
| *.service | ||||
| *.socket | ||||
| *.swp | ||||
| *~ | ||||
| .#* | ||||
| .color_coded | ||||
| .deps | ||||
| .dirstamp | ||||
| .gdb_history | ||||
| @@ -36,7 +30,6 @@ | ||||
| .lvimrc | ||||
| .memdump | ||||
| .sc-start-sc_* | ||||
| .ycm_extra_conf.py | ||||
| /ABOUT-NLS | ||||
| /AUTHORS | ||||
| /ChangeLog | ||||
| @@ -45,7 +38,8 @@ | ||||
| /NEWS | ||||
| /aclocal.m4 | ||||
| /autom4te.cache | ||||
| /build-aux/* | ||||
| /build-aux | ||||
| /build-aux/ | ||||
| /build/ | ||||
| /confdefs.h | ||||
| /config.cache | ||||
| @@ -59,6 +53,18 @@ | ||||
| /configure | ||||
| /configure.lineno | ||||
| /conftest.* | ||||
| /daemon/*_dispatch.h | ||||
| /daemon/libvirt_qemud | ||||
| /daemon/libvirtd | ||||
| /daemon/libvirtd*.logrotate | ||||
| /daemon/libvirtd.8 | ||||
| /daemon/libvirtd.8.in | ||||
| /daemon/libvirtd.init | ||||
| /daemon/libvirtd.pod | ||||
| /daemon/libvirtd.policy | ||||
| /daemon/libvirtd.service | ||||
| /daemon/libvirtd.socket | ||||
| /daemon/test_libvirtd.aug | ||||
| /docs/aclperms.htmlinc | ||||
| /docs/apibuild.py.stamp | ||||
| /docs/devhelp/libvirt.devhelp | ||||
| @@ -68,16 +74,8 @@ | ||||
| /docs/libvirt-lxc-*.xml | ||||
| /docs/libvirt-qemu-*.xml | ||||
| /docs/libvirt-refs.xml | ||||
| /docs/news.html.in | ||||
| /docs/search.php | ||||
| /docs/todo.html.in | ||||
| /examples/admin/client_close | ||||
| /examples/admin/client_info | ||||
| /examples/admin/client_limits | ||||
| /examples/admin/list_clients | ||||
| /examples/admin/list_servers | ||||
| /examples/admin/logging | ||||
| /examples/admin/threadpool_params | ||||
| /examples/object-events/event-test | ||||
| /examples/dominfo/info1 | ||||
| /examples/domsuspend/suspend | ||||
| @@ -85,13 +83,12 @@ | ||||
| /examples/domtop/domtop | ||||
| /examples/hellolibvirt/hellolibvirt | ||||
| /examples/openauth/openauth | ||||
| /examples/rename/rename | ||||
| /gnulib/lib/* | ||||
| /gnulib/m4/* | ||||
| /gnulib/tests/* | ||||
| /include/libvirt/libvirt-common.h | ||||
| /include/libvirt/libvirt.h | ||||
| /libtool | ||||
| /libvirt-*.tar.xz | ||||
| /libvirt-*.tar.gz | ||||
| /libvirt-[0-9]* | ||||
| /libvirt*.pc | ||||
| /libvirt.spec | ||||
| @@ -117,7 +114,6 @@ | ||||
| /src/access/viraccessapicheckqemu.h | ||||
| /src/admin/admin_client.h | ||||
| /src/admin/admin_protocol.[ch] | ||||
| /src/admin/admin_server_dispatch_stubs.h | ||||
| /src/esx/*.generated.* | ||||
| /src/hyperv/*.generated.* | ||||
| /src/libvirt*.def | ||||
| @@ -128,14 +124,10 @@ | ||||
| /src/libvirt_access_lxc.xml | ||||
| /src/libvirt_access_qemu.syms | ||||
| /src/libvirt_access_qemu.xml | ||||
| /src/libvirt_admin.syms | ||||
| /src/libvirt_*.stp | ||||
| /src/libvirt_*helper | ||||
| /src/libvirt_*probes.h | ||||
| /src/libvirt_lxc | ||||
| /src/libvirtd | ||||
| /src/libvirtd*.logrotate | ||||
| /src/libvirtd.policy | ||||
| /src/locking/libxl-lockd.conf | ||||
| /src/locking/libxl-sanlock.conf | ||||
| /src/locking/lock_daemon_dispatch_stubs.h | ||||
| @@ -143,8 +135,6 @@ | ||||
| /src/locking/qemu-lockd.conf | ||||
| /src/locking/qemu-sanlock.conf | ||||
| /src/locking/test_libvirt_sanlock.aug | ||||
| /src/logging/log_daemon_dispatch_stubs.h | ||||
| /src/logging/log_protocol.[ch] | ||||
| /src/lxc/lxc_controller_dispatch.h | ||||
| /src/lxc/lxc_monitor_dispatch.h | ||||
| /src/lxc/lxc_monitor_protocol.c | ||||
| @@ -154,39 +144,36 @@ | ||||
| /src/qemu/test_libvirtd_qemu.aug | ||||
| /src/remote/*_client_bodies.h | ||||
| /src/remote/*_protocol.[ch] | ||||
| /src/remote/*_stubs.h | ||||
| /src/rpc/virkeepaliveprotocol.[ch] | ||||
| /src/rpc/virnetprotocol.[ch] | ||||
| /src/test_libvirt*.aug | ||||
| /src/test_virtlockd.aug | ||||
| /src/test_virtlogd.aug | ||||
| /src/util/virkeycodetable*.h | ||||
| /src/util/virkeynametable*.h | ||||
| /src/util/virkeymaps.h | ||||
| /src/virt-aa-helper | ||||
| /src/virtlockd | ||||
| /src/virtlogd | ||||
| /src/virt-guest-shutdown.target | ||||
| /src/virtlockd.8 | ||||
| /src/virtlockd.8.in | ||||
| /src/virtlockd.init | ||||
| /tests/*.log | ||||
| /tests/*.pid | ||||
| /tests/*.trs | ||||
| /tests/*test | ||||
| /tests/commandhelper | ||||
| /tests/qemucapsprobe | ||||
| !/tests/virsh-self-test | ||||
| /tests/*test | ||||
| !/tests/*schematest | ||||
| !/tests/virt-aa-helper-test | ||||
| !/tests/virt-admin-self-test | ||||
| /tests/objectlocking | ||||
| /tests/objectlocking-files.txt | ||||
| /tests/objectlocking.cm[ix] | ||||
| /tests/reconnect | ||||
| /tests/ssh | ||||
| /tests/test_file_access.txt | ||||
| /tests/test_conf | ||||
| /tools/*.[18] | ||||
| /tools/libvirt-guests.init | ||||
| /tools/libvirt-guests.service | ||||
| /tools/libvirt-guests.sh | ||||
| /tools/virt-login-shell | ||||
| /tools/virsh | ||||
| /tools/virsh-*-edit.c | ||||
| /tools/virt-admin | ||||
| /tools/virt-*-validate | ||||
| /tools/virt-sanlock-cleanup | ||||
| /tools/wireshark/src/plugin.c | ||||
| @@ -208,7 +195,6 @@ stamp-h | ||||
| stamp-h.in | ||||
| stamp-h1 | ||||
| tags | ||||
| !/build-aux/*.pl | ||||
| !/gnulib/lib/Makefile.am | ||||
| !/gnulib/tests/Makefile.am | ||||
| !/m4/virt-*.m4 | ||||
|   | ||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,3 @@ | ||||
| [submodule "gnulib"] | ||||
| 	path = .gnulib | ||||
| 	url = git://git.sv.gnu.org/gnulib.git | ||||
| [submodule "keycodemapdb"] | ||||
| 	path = src/keycodemapdb | ||||
| 	url = https://gitlab.com/keycodemap/keycodemapdb.git | ||||
|   | ||||
							
								
								
									
										2
									
								
								.gnulib
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.gnulib
									
									
									
									
									
								
							 Submodule .gnulib updated: 7e7c5c7952...f39477dba7
									
								
							
							
								
								
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							| @@ -61,4 +61,3 @@ Marco Bozzolan <redshift@gmx.com> | ||||
| Pritesh Kothari <pritesh.kothari@sun.com> | ||||
| Wang Yufei (James) <james.wangyufei@huawei.com> | ||||
| Deepak C Shetty <dpkshetty@gmail.com> | ||||
| Daniel P. Berrangé <berrange@redhat.com> | ||||
|   | ||||
							
								
								
									
										130
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										130
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,130 +0,0 @@ | ||||
| sudo: false | ||||
| language: c | ||||
| cache: ccache | ||||
|  | ||||
| matrix: | ||||
|   include: | ||||
|     - compiler: gcc | ||||
|       dist: precise | ||||
|     - compiler: gcc | ||||
|       dist: trusty | ||||
|     - compiler: clang | ||||
|       dist: precise | ||||
|     - compiler: clang | ||||
|       dist: trusty | ||||
|     - compiler: clang | ||||
|       os: osx | ||||
|  | ||||
| addons: | ||||
|   apt: | ||||
|     # Please keep this list sorted alphabetically | ||||
|     packages: | ||||
|       - augeas-tools | ||||
|       - autoconf | ||||
|       - automake | ||||
|       - autopoint | ||||
|       - ccache | ||||
|       - dnsmasq-base | ||||
|       - dwarves | ||||
|       - ebtables | ||||
|       - gcc | ||||
|       - gettext | ||||
|       - glusterfs-client | ||||
|       - libacl1-dev | ||||
|       - libapparmor-dev | ||||
|       - libattr1-dev | ||||
|       - libaudit-dev | ||||
|       - libavahi-client-dev | ||||
|       - libblkid-dev | ||||
|       - libc-dev-bin | ||||
|       - libc6-dev | ||||
|       - libcap-ng-dev | ||||
|       - libcurl4-gnutls-dev | ||||
|       - libdbus-1-dev | ||||
|       - libdevmapper-dev | ||||
|       - libfuse-dev | ||||
|       - libgnutls-dev | ||||
|       - libnetcf-dev | ||||
|       - libnl-3-dev | ||||
|       - libnl-route-3-dev | ||||
|       - libnuma-dev | ||||
|       - libopenwsman-dev | ||||
|       - libparted-dev | ||||
|       - libpcap-dev | ||||
|       - libpciaccess-dev | ||||
|       - librbd-dev | ||||
|       - libreadline-dev | ||||
|       - libsasl2-dev | ||||
|       - libselinux1-dev | ||||
|       - libssh2-1-dev | ||||
|       - libssh-dev | ||||
|       - libtool | ||||
|       - libudev-dev | ||||
|       - libxen-dev | ||||
|       - libxml2-dev | ||||
|       - libxml2-utils | ||||
|       - libyajl-dev | ||||
|       - lvm2 | ||||
|       - make | ||||
| #     - nfs-common    # broken on trusty since build #807 (2018-01-09) | ||||
|       - open-iscsi | ||||
|       - parted | ||||
|       - patch | ||||
|       - perl | ||||
|       - pkg-config | ||||
|       - policykit-1 | ||||
|       - qemu-utils | ||||
|       - radvd | ||||
|       - scrub | ||||
|       - sheepdog | ||||
|       - systemtap-sdt-dev | ||||
|       - xsltproc | ||||
|       - zfs-fuse | ||||
|  | ||||
| git: | ||||
|   submodules: true | ||||
|  | ||||
| env: | ||||
|   global: | ||||
|     # The custom $PATH is just to pick up some extra binaries installed | ||||
|     # through homebrew on macOS and it's completely harmless on Linux | ||||
|     - PATH="/usr/local/opt/gettext/bin:/usr/local/opt/rpcgen/bin:$PATH" | ||||
|     # The hyperv driver fails to build with clang on precise due to this | ||||
|     # error being raised in one of openwsman header files | ||||
|     - CFLAGS="-Wno-error=variadic-macros" | ||||
|     - VIR_TEST_DEBUG=1 | ||||
|  | ||||
| before_install: | ||||
|   - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update && brew upgrade && brew install rpcgen yajl; fi | ||||
|  | ||||
| before_script: | ||||
|   - ./autogen.sh | ||||
|  | ||||
| script: | ||||
|   # Many unit tests still fail on macOS, and there are a bunch of issues with | ||||
|   # syntax-check as well, so skip those steps on that platform for now | ||||
|   - make -j3 && if [ "$TRAVIS_OS_NAME" != "osx" ]; then make -j3 syntax-check && make -j3 check; fi | ||||
|  | ||||
| after_failure: | ||||
|   - echo '============================================================================' | ||||
|   - 'if [ -f $(pwd)/tests/test-suite.log ]; then | ||||
|         cat $(pwd)/tests/test-suite.log; | ||||
|     else | ||||
|         echo "=== NO LOG FILE FOUND ==="; | ||||
|     fi' | ||||
|  | ||||
| notifications: | ||||
|   irc: | ||||
|     # The channel name "irc.oftc.net#virt" is encrypted against libvirt/libvirt | ||||
|     # to prevent IRC notifications from github forks. This was created using: | ||||
|     # $ travis encrypt -r "libvirt/libvirt" "irc.oftc.net#virt" | ||||
|     channels: | ||||
|       - secure: "hUPdkLxX7nh75+clpnk4U0XLExLfV9DFKSvQSAUtf5JtDNMslj7AeOCf2wcbkNsEhkiF557odTAnov1s5m1w/yaa56zbjFAh5agzqRKya3QjqsrvlBKw/WuN+l82iMNLLeebTgCPAXrbAbGWH8YmYssp/7+eMsnKaVh84EQQNbMCHlLg6ovE26Fs18mZ6J5RC3OPa1vbv+xkdCHvGg/Oyp4K8bpU7RYyimA56jdxI/OfdTH9HxntHYSzykR7hDbyzZhdIlAUyRKReQVjcV5+R8fdDL/1imyGA/88KTztMeKXpZ5Rf+Ss3vYLZb6qsLLegCZ4AU/q0vvbWxjpZGJZoeyrVpfBTZdYGIzmLTMl9GYXXa/gDwFlbvRDiPDG4TIy6GlMUROinj7KRKEHu1fWRYu012ife5OjidxcwrTnz21vYaCv3AKWPpMPxwIzQPkY1hex9uLLX6z+TrAxxDLF+7UzRT9w2RLFBkLYlj2aDVrLAVb/ynRsxDz5CGzC61FSQVft2e308SkGjdn8YxvguCuXv+N70Fu1cvFyh5XYeHb4fbBRo0Ctzaec78leHlQvRGWKJxXDXRkE2lvvBc7YbBNSAYh7Fs8Y+zY7l7rMxvXdrt3nuaNQhe74V3yhxPDAld66qmAn9TYMmaZW2f5/KKKILLbCa0t2MxiAc6L2OI8=" | ||||
|     on_success: change | ||||
|     on_failure: always | ||||
|   email: | ||||
|     # The list name 'libvirt-ci@redhat.com" is encrypted against libvirt/libvirt | ||||
|     # to prevent IRC notifications from github forks. This was created using: | ||||
|     # $ travis encrypt -r "libvirt/libvirt" "libvirt-ci@redhat.com" | ||||
|     recipients: | ||||
|       - secure: "QcU9eP96P0RlDNzVRZl/4sxyydPStGzECrpgJhr2IPB/7pHk23yaBrmUsq9S830tB+jwLGma1IscNB8uf7Sf7WY+cYIpfR8v030OffWnaipo/Gcs0dpnlfURWHjOFQI3RJzGEihsqvbwUFOwsM+3IDyO3qdWaiT6cN2Tj9ROlwYCySSX5YWzLyX7arBZ4lp8ESs7ohQaEwp2cegnMP2oGPJJe4SebvlCDjHZbjkU5aEradwUWnRQDJZWTKknpNLArVFxN2/ixp6f/MGY4DmkHoDweio6mHIPN5zTs5Jt32aiX6wDBa+bBa4v8TCRqzhYkQ63ZZhNV8bY5Uf9ufTdyvt96yIANyakd85b1QpMdAX76IyJi1l0/Uub6DTQZAcq3vK7iPjGeTVSpyoXrqTfGy4JxMjqDoocpWvv8ALX1wrYI/HfN2R2Aepw9jModTimOsebYhJ1yMhSt8qnh5AQNftGKL2JBKoA1LWdU2YJ5fO1bGjKNiVEkGFQTPYFWrYCUY5JcT+s5WCzNeMNm8s9na8liYhGl3WtS3rPr5M8bof+BMsBhG2hQ0loduc94x2GkvyhQZUgRbqrwNR+y4hn+rWFC3hBzzyiAULs43vY/PJ+eBdKEf3VAc0MkhQ8GgXGSA61fR6aXYonroI/WnBVItwDmUnnMfSziZXxk09GLl4=" | ||||
| @@ -1,45 +0,0 @@ | ||||
| flags = [ | ||||
|   '-I@abs_top_builddir@', | ||||
|   '-I@abs_top_srcdir@', | ||||
|   '-I@abs_top_builddir@/gnulib/lib', | ||||
|   '-I@abs_top_srcdir@/gnulib/lib', | ||||
|   '-I@abs_top_builddir@/include', | ||||
|   '-I@abs_top_srcdir@/include', | ||||
|   '-I@abs_top_builddir@/src', | ||||
|   '-I@abs_top_srcdir@/src', | ||||
|   '-I@abs_top_builddir@/src/access', | ||||
|   '-I@abs_top_srcdir@/src/access', | ||||
|   '-I@abs_top_builddir@/src/admin', | ||||
|   '-I@abs_top_srcdir@/src/admin', | ||||
|   '-I@abs_top_builddir@/src/bhyve', | ||||
|   '-I@abs_top_srcdir@/src/bhyve', | ||||
|   '-I@abs_top_builddir@/src/conf', | ||||
|   '-I@abs_top_srcdir@/src/conf', | ||||
|   '-I@abs_top_builddir@/src/libxl', | ||||
|   '-I@abs_top_srcdir@/src/libxl', | ||||
|   '-I@abs_top_builddir@/src/locking', | ||||
|   '-I@abs_top_srcdir@/src/locking', | ||||
|   '-I@abs_top_builddir@/src/logging', | ||||
|   '-I@abs_top_srcdir@/src/logging', | ||||
|   '-I@abs_top_builddir@/src/lxc', | ||||
|   '-I@abs_top_srcdir@/src/lxc', | ||||
|   '-I@abs_top_builddir@/src/qemu', | ||||
|   '-I@abs_top_srcdir@/src/qemu', | ||||
|   '-I@abs_top_builddir@/src/remote', | ||||
|   '-I@abs_top_srcdir@/src/remote', | ||||
|   '-I@abs_top_builddir@/src/rpc', | ||||
|   '-I@abs_top_srcdir@/src/rpc', | ||||
|   '-I@abs_top_builddir@/src/secret', | ||||
|   '-I@abs_top_srcdir@/src/secret', | ||||
|   '-I@abs_top_builddir@/src/security', | ||||
|   '-I@abs_top_srcdir@/src/security', | ||||
|   '-I@abs_top_builddir@/src/util', | ||||
|   '-I@abs_top_srcdir@/src/util', | ||||
|   '-I@abs_top_builddir@/src/vmx', | ||||
|   '-I@abs_top_srcdir@/src/vmx', | ||||
|   '-I@abs_top_builddir@/src/xenconfig', | ||||
|   '-I@abs_top_srcdir@/src/xenconfig', | ||||
| ] | ||||
|  | ||||
| def FlagsForFile(filename, **kwargs): | ||||
|   return { 'flags': flags, 'do_cache': True } | ||||
| @@ -8,14 +8,13 @@ Daniel Veillard <veillard@redhat.com> or <daniel@veillard.com> | ||||
| The primary maintainers and people with commit access rights: | ||||
|  | ||||
| Alex Jia <ajia@redhat.com> | ||||
| Andrea Bolognani <abologna@redhat.com> | ||||
| Cédric Bosdonnat <cbosdonnat@suse.com> | ||||
| Christian Ehrhardt <christian.ehrhardt@canonical.com> | ||||
| Christophe Fergeau <cfergeau@redhat.com> | ||||
| Claudio Bley <claudio.bley@gmail.com> | ||||
| Cole Robinson <crobinso@redhat.com> | ||||
| Daniel Berrange <berrange@redhat.com> | ||||
| Daniel Veillard <veillard@redhat.com> | ||||
| Dmitry Guryanov <dguryanov@parallels.com> | ||||
| Doug Goldstein <cardoe@gentoo.org> | ||||
| Eric Blake <eblake@redhat.com> | ||||
| Erik Skultety <eskultet@redhat.com> | ||||
| @@ -29,7 +28,6 @@ Laine Stump <laine@redhat.com> | ||||
| Mark McLoughlin <markmc@redhat.com> | ||||
| Martin Kletzander <mkletzan@redhat.com> | ||||
| Matthias Bolte <matthias.bolte@googlemail.com> | ||||
| Maxim Nestratov <mnestratov@virtuozzo.com> | ||||
| Michal Prívozník <mprivozn@redhat.com> | ||||
| Pavel Hrdina <phrdina@redhat.com> | ||||
| Peter Krempa <pkrempa@redhat.com> | ||||
| @@ -46,7 +44,6 @@ Chris Lalancette <clalance@redhat.com> | ||||
| Dan Smith <danms@us.ibm.com> | ||||
| Dave Allan <dallan@redhat.com> | ||||
| Dave Leskovec <dlesko@linux.vnet.ibm.com> | ||||
| Dmitry Guryanov <dguryanov@parallels.com> | ||||
| Guannan Ren <gren@redhat.com> | ||||
| Jim Meyering <meyering@redhat.com> | ||||
| John Levon <john.levon@sun.com> | ||||
| @@ -61,6 +58,7 @@ Amit Shah <amit.shah@redhat.com> | ||||
| Andrew Puch <apuch@redhat.com> | ||||
| Anton Protopopov <aspsk2@gmail.com> | ||||
| Ben Guthro <ben.guthro@gmail.com> | ||||
| Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> | ||||
| Daniel Hokka Zakrisson <daniel@hozac.com> | ||||
| Dan Wendlandt <dan@nicira.com> | ||||
| David Lively <dlively@virtualiron.com> | ||||
|   | ||||
| @@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know | ||||
| that what they have is not the original version, so that the original | ||||
| author's reputation will not be affected by problems that might be | ||||
| introduced by others. | ||||
|  | ||||
|  | ||||
|   Finally, software patents pose a constant threat to the existence of | ||||
| any free program.  We wish to make sure that a company cannot | ||||
| effectively restrict the users of a free program by obtaining a | ||||
| @@ -111,7 +111,7 @@ modification follow.  Pay close attention to the difference between a | ||||
| "work based on the library" and a "work that uses the library".  The | ||||
| former contains code derived from the library, whereas the latter must | ||||
| be combined with the library in order to run. | ||||
|  | ||||
|  | ||||
|                   GNU LESSER GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
| @@ -158,7 +158,7 @@ Library. | ||||
|   You may charge a fee for the physical act of transferring a copy, | ||||
| and you may at your option offer warranty protection in exchange for a | ||||
| fee. | ||||
|  | ||||
|  | ||||
|   2. You may modify your copy or copies of the Library or any portion | ||||
| of it, thus forming a work based on the Library, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| @@ -216,7 +216,7 @@ instead of to this License.  (If a newer version than version 2 of the | ||||
| ordinary GNU General Public License has appeared, then you can specify | ||||
| that version instead if you wish.)  Do not make any other change in | ||||
| these notices. | ||||
|  | ||||
|  | ||||
|   Once this change is made in a given copy, it is irreversible for | ||||
| that copy, so the ordinary GNU General Public License applies to all | ||||
| subsequent copies and derivative works made from that copy. | ||||
| @@ -267,7 +267,7 @@ Library will still fall under Section 6.) | ||||
| distribute the object code for the work under the terms of Section 6. | ||||
| Any executables containing that work also fall under Section 6, | ||||
| whether or not they are linked directly with the Library itself. | ||||
|  | ||||
|  | ||||
|   6. As an exception to the Sections above, you may also combine or | ||||
| link a "work that uses the Library" with the Library to produce a | ||||
| work containing portions of the Library, and distribute that work | ||||
| @@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally | ||||
| accompany the operating system.  Such a contradiction means you cannot | ||||
| use both them and the Library together in an executable that you | ||||
| distribute. | ||||
|  | ||||
|  | ||||
|   7. You may place library facilities that are a work based on the | ||||
| Library side-by-side in a single library together with other library | ||||
| facilities not covered by this License, and distribute such a combined | ||||
| @@ -370,7 +370,7 @@ subject to these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties with | ||||
| this License. | ||||
|  | ||||
|  | ||||
|   11. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| @@ -422,7 +422,7 @@ conditions either of that version or of any later version published by | ||||
| the Free Software Foundation.  If the Library does not specify a | ||||
| license version number, you may choose any version ever published by | ||||
| the Free Software Foundation. | ||||
|  | ||||
|  | ||||
|   14. If you wish to incorporate parts of the Library into other free | ||||
| programs whose distribution conditions are incompatible with these, | ||||
| write to the author to ask for permission.  For software which is | ||||
| @@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | ||||
| DAMAGES. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|  | ||||
|            How to Apply These Terms to Your New Libraries | ||||
|  | ||||
|   If you develop a new library, and you want it to be of the greatest | ||||
|   | ||||
							
								
								
									
										79
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -19,14 +19,19 @@ | ||||
| LCOV = lcov | ||||
| GENHTML = genhtml | ||||
|  | ||||
| SUBDIRS = . gnulib/lib include/libvirt src tools docs gnulib/tests \ | ||||
|   tests po examples | ||||
|  | ||||
| XZ_OPT ?= -v -T0 | ||||
| export XZ_OPT | ||||
| SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \ | ||||
|   tests po examples/object-events examples/hellolibvirt \ | ||||
|   examples/dominfo examples/domsuspend examples/apparmor \ | ||||
|   examples/xml/nwfilter examples/openauth examples/systemtap \ | ||||
|   tools/wireshark examples/dommigrate \ | ||||
|   examples/lxcconvert examples/domtop | ||||
|  | ||||
| ACLOCAL_AMFLAGS = -I m4 | ||||
|  | ||||
| XML_EXAMPLES = \ | ||||
|   $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/examples/xml/, \ | ||||
| 					test/*.xml storage/*.xml))) | ||||
|  | ||||
| EXTRA_DIST = \ | ||||
|   config-post.h \ | ||||
|   ChangeLog-old \ | ||||
| @@ -36,46 +41,43 @@ EXTRA_DIST = \ | ||||
|   libvirt-qemu.pc.in \ | ||||
|   libvirt-lxc.pc.in \ | ||||
|   libvirt-admin.pc.in \ | ||||
|   autobuild.sh \ | ||||
|   Makefile.nonreentrant \ | ||||
|   autogen.sh \ | ||||
|   cfg.mk \ | ||||
|   run.in \ | ||||
|   README.md \ | ||||
|   AUTHORS.in | ||||
|   AUTHORS.in \ | ||||
|   $(XML_EXAMPLES) | ||||
|  | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc | ||||
| pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc | ||||
|  | ||||
| NEWS: \ | ||||
| 	  $(srcdir)/docs/news.xml \ | ||||
| 	  $(srcdir)/docs/news-ascii.xsl \ | ||||
| 	  $(srcdir)/docs/reformat-news.py | ||||
| 	$(AM_V_GEN) \ | ||||
| 	if [ -x $(XSLTPROC) ]; then \ | ||||
| 	  $(XSLTPROC) --nonet \ | ||||
| 	    $(srcdir)/docs/news-ascii.xsl \ | ||||
| 	    $(srcdir)/docs/news.xml \ | ||||
| 	  >$@-tmp \ | ||||
| 	    || { rm -f $@-tmp; exit 1; }; \ | ||||
| 	  $(srcdir)/docs/reformat-news.py $@-tmp >$@ \ | ||||
| 	    || { rm -f $@-tmp; exit 1; }; \ | ||||
| 	  rm -f $@-tmp; \ | ||||
| 	fi | ||||
| EXTRA_DIST += \ | ||||
| 	$(srcdir)/docs/news.xml \ | ||||
| 	$(srcdir)/docs/news-ascii.xsl \ | ||||
| 	$(srcdir)/docs/reformat-news.py | ||||
| NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in | ||||
| 	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then			\ | ||||
| 	  $(XSLTPROC) --nonet $(top_srcdir)/docs/news.xsl	\ | ||||
| 	     $(top_srcdir)/docs/news.html.in			\ | ||||
| 	   | perl -0777 -pe 's/\n\n+$$/\n/'			\ | ||||
| 	   | perl -pe 's/[ \t]+$$//'				\ | ||||
| 	   > $@-t && mv $@-t $@ ; fi | ||||
|  | ||||
| $(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \ | ||||
| 			$(top_srcdir)/docs/hacking2.xsl \ | ||||
| 			$(top_srcdir)/docs/wrapstring.xsl \ | ||||
| 			$(top_srcdir)/docs/hacking.html.in | ||||
| 	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	   $(XSLTPROC) --nonet $(top_srcdir)/docs/hacking1.xsl \ | ||||
| 		$(top_srcdir)/docs/hacking.html.in | \ | ||||
| 	   $(XSLTPROC) --nonet $(top_srcdir)/docs/hacking2.xsl - \ | ||||
| 	   | perl -0777 -pe 's/\n\n+$$/\n/' \ | ||||
| 	   > $@-t && mv $@-t $@ ; fi; | ||||
|  | ||||
| rpm: clean | ||||
| 	@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz) | ||||
| 	@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.gz) | ||||
|  | ||||
| check-local: all tests | ||||
|  | ||||
| check-access: | ||||
| 	@($(MAKE) $(AM_MAKEFLAGS) -C tests check-access) | ||||
|  | ||||
| cov: clean-cov | ||||
| 	$(MKDIR_P) $(top_builddir)/coverage | ||||
| 	mkdir $(top_builddir)/coverage | ||||
| 	$(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp \ | ||||
| 	  -d $(top_builddir)/src  -d $(top_builddir)/daemon \ | ||||
| 	  -d $(top_builddir)/tests | ||||
| @@ -90,6 +92,9 @@ clean-cov: | ||||
|  | ||||
| MAINTAINERCLEANFILES = .git-module-status | ||||
|  | ||||
| # disable this check | ||||
| distuninstallcheck: | ||||
|  | ||||
| dist-hook: gen-ChangeLog gen-AUTHORS | ||||
|  | ||||
| # Generate the ChangeLog file (with all entries since the switch to git) | ||||
| @@ -97,11 +102,11 @@ dist-hook: gen-ChangeLog gen-AUTHORS | ||||
| gen_start_date = 2009-07-04 | ||||
| .PHONY: gen-ChangeLog | ||||
| gen-ChangeLog: | ||||
| 	$(AM_V_GEN)if test -d .git; then \ | ||||
| 	  $(top_srcdir)/build-aux/gitlog-to-changelog \ | ||||
| 	    --since=$(gen_start_date) > $(distdir)/cl-t; \ | ||||
| 	  rm -f $(distdir)/ChangeLog; \ | ||||
| 	  mv $(distdir)/cl-t $(distdir)/ChangeLog; \ | ||||
| 	$(AM_V_GEN)if test -d .git; then			\ | ||||
| 	  $(top_srcdir)/build-aux/gitlog-to-changelog		\ | ||||
| 	    --since=$(gen_start_date) > $(distdir)/cl-t;	\ | ||||
| 	  rm -f $(distdir)/ChangeLog;				\ | ||||
| 	  mv $(distdir)/cl-t $(distdir)/ChangeLog;		\ | ||||
| 	fi | ||||
|  | ||||
| .PHONY: gen-AUTHORS | ||||
|   | ||||
| @@ -15,9 +15,9 @@ | ||||
| ## <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| # | ||||
| # Generated by running the following on Fedora 26: | ||||
| # Generated by running the following on Fedora 9: | ||||
| # | ||||
| #  nm -D --defined-only /lib64/libc.so.6 \ | ||||
| #  nm -D --defined-only /lib/libc.so.6  \ | ||||
| #      | grep '_r$' \ | ||||
| #      | awk '{print $3}' \ | ||||
| #      | grep -v __ \ | ||||
| @@ -43,7 +43,6 @@ NON_REENTRANT += ether_ntoa | ||||
| NON_REENTRANT += fcvt | ||||
| NON_REENTRANT += fgetgrent | ||||
| NON_REENTRANT += fgetpwent | ||||
| NON_REENTRANT += fgetsgent | ||||
| NON_REENTRANT += fgetspent | ||||
| NON_REENTRANT += getaliasbyname | ||||
| NON_REENTRANT += getaliasent | ||||
| @@ -73,8 +72,6 @@ NON_REENTRANT += getrpcent | ||||
| NON_REENTRANT += getservbyname | ||||
| NON_REENTRANT += getservbyport | ||||
| NON_REENTRANT += getservent | ||||
| NON_REENTRANT += getsgent | ||||
| NON_REENTRANT += getsgnam | ||||
| NON_REENTRANT += getspent | ||||
| NON_REENTRANT += getspnam | ||||
| NON_REENTRANT += getutent | ||||
| @@ -98,7 +95,6 @@ NON_REENTRANT += random | ||||
| NON_REENTRANT += rand | ||||
| NON_REENTRANT += seed48 | ||||
| NON_REENTRANT += setstate | ||||
| NON_REENTRANT += sgetsgent | ||||
| NON_REENTRANT += sgetspent | ||||
| NON_REENTRANT += srand48 | ||||
| NON_REENTRANT += srandom | ||||
| @@ -117,11 +113,3 @@ NON_REENTRANT += inet_nsap_ntoa | ||||
| NON_REENTRANT += inet_ntoa | ||||
| NON_REENTRANT += inet_ntop | ||||
| NON_REENTRANT += inet_pton | ||||
|  | ||||
| # Separate two nothings by space to get one space in a variable | ||||
| space = | ||||
| space += | ||||
| # The space needs to be in a variable otherwise it would be ignored. | ||||
| # And there must be no spaces around the commas because they would | ||||
| # not be ignored, logically. | ||||
| NON_REENTRANT_RE=$(subst $(space),|,$(NON_REENTRANT)) | ||||
|   | ||||
							
								
								
									
										13
									
								
								README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
|  | ||||
|          LibVirt : simple API for virtualization | ||||
|  | ||||
|   Libvirt is a C toolkit to interact with the virtualization capabilities | ||||
| of recent versions of Linux (and other OSes). It is free software | ||||
| available under the GNU Lesser General Public License. Virtualization of | ||||
| the Linux Operating System means the ability to run multiple instances of | ||||
| Operating Systems concurrently on a single hardware system where the basic | ||||
| resources are driven by a Linux instance. The library aim at providing | ||||
| long term stable C API initially for the Xen paravirtualization but | ||||
| should be able to integrate other virtualization mechanisms if needed. | ||||
|  | ||||
| Daniel Veillard <veillard@redhat.com> | ||||
| @@ -2,8 +2,7 @@ | ||||
|  | ||||
| These notes intend to help people working on the checked-out sources. | ||||
| These requirements do not apply when building from a distribution tarball. | ||||
| See also docs/hacking.html (after building libvirt using the information | ||||
| included in this file) for more detailed contribution guidelines. | ||||
| See also HACKING for more detailed libvirt contribution guidelines. | ||||
|  | ||||
| * Requirements | ||||
|  | ||||
|   | ||||
							
								
								
									
										83
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,83 +0,0 @@ | ||||
| [](https://travis-ci.org/libvirt/libvirt) | ||||
|  [](https://bestpractices.coreinfrastructure.org/projects/355) | ||||
|  | ||||
| Libvirt API for virtualization | ||||
| ============================== | ||||
|  | ||||
| Libvirt provides a portable, long term stable C API for managing the | ||||
| virtualization technologies provided by many operating systems. It | ||||
| includes support for QEMU, KVM, Xen, LXC, bhyve, Virtuozzo, VMware | ||||
| vCenter and ESX, VMware Desktop, Hyper-V, VirtualBox and the POWER | ||||
| Hypervisor. | ||||
|  | ||||
| For some of these hypervisors, it provides a stateful management | ||||
| daemon which runs on the virtualization host allowing access to the | ||||
| API both by non-privileged local users and remote users. | ||||
|  | ||||
| Layered packages provide bindings of the libvirt C API into other | ||||
| languages including Python, Perl, PHP, Go, Java, OCaml, as well as | ||||
| mappings into object systems such as GObject, CIM and SNMP. | ||||
|  | ||||
| Further information about the libvirt project can be found on the | ||||
| website: | ||||
|  | ||||
| [https://libvirt.org](https://libvirt.org) | ||||
|  | ||||
|  | ||||
| License | ||||
| ------- | ||||
|  | ||||
| The libvirt C API is distributed under the terms of GNU Lesser General | ||||
| Public License, version 2.1 (or later). Some parts of the code that are | ||||
| not part of the C library may have the more restrictive GNU General | ||||
| Public License, version 2.1 (or later). See the files `COPYING.LESSER` | ||||
| and `COPYING` for full license terms & conditions. | ||||
|  | ||||
|  | ||||
| Installation | ||||
| ------------ | ||||
|  | ||||
| Libvirt uses the GNU Autotools build system, so in general can be built | ||||
| and installed with the usual commands. For example, to build in a manner | ||||
| that is suitable for installing as root, use: | ||||
|  | ||||
| ``` | ||||
| $ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var | ||||
| $ make | ||||
| $ sudo make install | ||||
| ``` | ||||
|  | ||||
| While to build & install as an unprivileged user | ||||
|  | ||||
| ``` | ||||
| $ ./configure --prefix=$HOME/usr | ||||
| $ make | ||||
| $ make install | ||||
| ``` | ||||
|  | ||||
| The libvirt code relies on a large number of 3rd party libraries. These will | ||||
| be detected during execution of the `configure` script and a summary printed | ||||
| which lists any missing (optional) dependencies. | ||||
|  | ||||
|  | ||||
| Contributing | ||||
| ------------ | ||||
|  | ||||
| The libvirt project welcomes contributions in many ways. For most components | ||||
| the best way to contribute is to send patches to the primary development | ||||
| mailing list. Further guidance on this can be found on the website: | ||||
|  | ||||
| [https://libvirt.org/contribute.html](https://libvirt.org/contribute.html) | ||||
|  | ||||
|  | ||||
| Contact | ||||
| ------- | ||||
|  | ||||
| The libvirt project has two primary mailing lists: | ||||
|  | ||||
|   * libvirt-users@redhat.com (**for user discussions**) | ||||
|   * libvir-list@redhat.com (**for development only**) | ||||
|  | ||||
| Further details on contacting the project are available on the website: | ||||
|  | ||||
| [https://libvirt.org/contact.html](https://libvirt.org/contact.html) | ||||
							
								
								
									
										22
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
|          libvirt TODO list | ||||
|          ================= | ||||
|  | ||||
| The TODO list changes frequently, so is maintained online | ||||
| in the libvirt bugzilla | ||||
|  | ||||
|   http://bugzilla.redhat.com/ | ||||
|  | ||||
| Search against | ||||
|  | ||||
|     Product: Virtualization Tools | ||||
|   Component: libvirt | ||||
|     Subject: RFE | ||||
|  | ||||
| Or browse dependent bugs under | ||||
|  | ||||
|   https://bugzilla.redhat.com/show_bug.cgi?id=libvirtTodo | ||||
|  | ||||
| Summarized reports automatically generated from bugzilla | ||||
| and provided online at | ||||
|  | ||||
|   http://libvirt.org/todo.html | ||||
							
								
								
									
										122
									
								
								autobuild.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										122
									
								
								autobuild.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| set -e | ||||
| set -v | ||||
|  | ||||
| # Make things clean. | ||||
|  | ||||
| test -n "$1" && RESULTS=$1 || RESULTS=results.log | ||||
| : ${AUTOBUILD_INSTALL_ROOT=$HOME/builder} | ||||
|  | ||||
| # If run under the autobuilder, we must use --nodeps with rpmbuild; | ||||
| # but this can lead to odd error diagnosis for normal development. | ||||
| nodeps= | ||||
| if test "${AUTOBUILD_COUNTER+set}"; then | ||||
|   nodeps=--nodeps | ||||
| fi | ||||
|  | ||||
| test -f Makefile && make -k distclean || : | ||||
| rm -rf coverage | ||||
|  | ||||
| rm -rf build | ||||
| mkdir build | ||||
| cd build | ||||
|  | ||||
| # Run with options not normally exercised by the rpm build, for | ||||
| # more complete code coverage. | ||||
| ../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \ | ||||
|   --enable-expensive-tests \ | ||||
|   --enable-test-coverage \ | ||||
|   --disable-nls \ | ||||
|   --enable-werror \ | ||||
|   --enable-static | ||||
|  | ||||
| # If the MAKEFLAGS envvar does not yet include a -j option, | ||||
| # add -jN where N depends on the number of processors. | ||||
| case $MAKEFLAGS in | ||||
|   *-j*) ;; | ||||
|   *) n=$(getconf _NPROCESSORS_ONLN 2> /dev/null) | ||||
|     test "$n" -gt 0 || n=1 | ||||
|     n=$(expr $n + 1) | ||||
|     MAKEFLAGS="$MAKEFLAGS -j$n" | ||||
|     export MAKEFLAGS | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| make | ||||
| make install | ||||
|  | ||||
| # set -o pipefail is a bashism; this use of exec is the POSIX alternative | ||||
| exec 3>&1 | ||||
| st=$( | ||||
|   exec 4>&1 >&3 | ||||
|   { make check syntax-check 2>&1 3>&- 4>&-; echo $? >&4; } | tee "$RESULTS" | ||||
| ) | ||||
| exec 3>&- | ||||
| test "$st" = 0 | ||||
| test -x /usr/bin/lcov && make cov | ||||
|  | ||||
| rm -f *.tar.gz | ||||
| make dist | ||||
|  | ||||
| if test -n "$AUTOBUILD_COUNTER" ; then | ||||
|   EXTRA_RELEASE=".auto$AUTOBUILD_COUNTER" | ||||
| else | ||||
|   NOW=`date +"%s"` | ||||
|   EXTRA_RELEASE=".$USER$NOW" | ||||
| fi | ||||
|  | ||||
| if test -f /usr/bin/rpmbuild ; then | ||||
|   rpmbuild $nodeps \ | ||||
|      --define "extra_release $EXTRA_RELEASE" \ | ||||
|      --define "_sourcedir `pwd`" \ | ||||
|      -ba --clean libvirt.spec | ||||
| fi | ||||
|  | ||||
| # Test mingw32 cross-compile | ||||
| if test -x /usr/bin/i686-w64-mingw32-gcc ; then | ||||
|   make distclean | ||||
|  | ||||
|   PKG_CONFIG_LIBDIR="/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/i686-w64-mingw32/sys-root/mingw/share/pkgconfig" \ | ||||
|   PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig" \ | ||||
|   CC="i686-w64-mingw32-gcc" \ | ||||
|   ../configure \ | ||||
|     --build=$(uname -m)-w64-linux \ | ||||
|     --host=i686-w64-mingw32 \ | ||||
|     --prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \ | ||||
|     --enable-expensive-tests \ | ||||
|     --enable-werror | ||||
|  | ||||
|   make | ||||
|   make install | ||||
|  | ||||
| fi | ||||
|  | ||||
| # Test mingw64 cross-compile | ||||
| if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then | ||||
|   make distclean | ||||
|  | ||||
|   PKG_CONFIG_LIBDIR="/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/x86_64-w64-mingw32/sys-root/mingw/share/pkgconfig" \ | ||||
|   PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig" \ | ||||
|   CC="x86_64-w64-mingw32-gcc" \ | ||||
|   ../configure \ | ||||
|     --build=$(uname -m)-w64-linux \ | ||||
|     --host=x86_64-w64-mingw32 \ | ||||
|     --prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \ | ||||
|     --enable-expensive-tests \ | ||||
|     --enable-werror | ||||
|  | ||||
|   make | ||||
|   make install | ||||
|  | ||||
| fi | ||||
|  | ||||
|  | ||||
| if test -x /usr/bin/i686-w64-mingw32-gcc && test -x /usr/bin/x86_64-w64-mingw32-gcc ; then | ||||
|   if test -f /usr/bin/rpmbuild ; then | ||||
|     rpmbuild $nodeps \ | ||||
|        --define "extra_release $EXTRA_RELEASE" \ | ||||
|        --define "_sourcedir `pwd`" \ | ||||
|        -ba --clean mingw-libvirt.spec | ||||
|   fi | ||||
| fi | ||||
							
								
								
									
										270
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										270
									
								
								autogen.sh
									
									
									
									
									
								
							| @@ -1,209 +1,117 @@ | ||||
| #!/bin/sh | ||||
| # Run this to generate all the initial makefiles, etc. | ||||
|  | ||||
| die() | ||||
| { | ||||
|     echo "error: $1" >&2 | ||||
| set -e | ||||
|  | ||||
| srcdir=`dirname "$0"` | ||||
| test -z "$srcdir" && srcdir=. | ||||
|  | ||||
| THEDIR=`pwd` | ||||
| cd "$srcdir" | ||||
|  | ||||
| test -f src/libvirt.c || { | ||||
|     echo "You must run this script in the top-level libvirt directory" | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| starting_point=$(pwd) | ||||
|  | ||||
| srcdir=$(dirname "$0") | ||||
| test "$srcdir" || srcdir=. | ||||
|  | ||||
| cd "$srcdir" || { | ||||
|     die "Failed to cd into $srcdir" | ||||
| } | ||||
|  | ||||
| test -f src/libvirt.c || { | ||||
|     die "$0 must live in the top-level libvirt directory" | ||||
| } | ||||
|  | ||||
| dry_run= | ||||
| EXTRA_ARGS= | ||||
| no_git= | ||||
| gnulib_srcdir= | ||||
| extra_args= | ||||
| while test "$#" -gt 0; do | ||||
|     case "$1" in | ||||
|     --dry-run) | ||||
|         # This variable will serve both as an indicator of the fact that | ||||
|         # a dry run has been requested, and to store the result of the | ||||
|         # dry run. It will be ultimately used as return code for the | ||||
|         # script: 0 means no action is necessary, 2 means that autogen.sh | ||||
|         # needs to be executed, and 1 is reserved for failures | ||||
|         dry_run=0 | ||||
|         shift | ||||
|         ;; | ||||
|     --no-git) | ||||
|         no_git=" $1" | ||||
|         shift | ||||
|         ;; | ||||
|     --gnulib-srcdir=*) | ||||
|         gnulib_srcdir=" $1" | ||||
|         shift | ||||
|         ;; | ||||
|     --gnulib-srcdir) | ||||
|         gnulib_srcdir=" $1=$2" | ||||
|         shift | ||||
|         shift | ||||
|         ;; | ||||
|     --system) | ||||
|         prefix=/usr | ||||
|         sysconfdir=/etc | ||||
|         localstatedir=/var | ||||
|         if test -d $prefix/lib64; then | ||||
|             libdir=$prefix/lib64 | ||||
|         else | ||||
|             libdir=$prefix/lib | ||||
|         fi | ||||
|         extra_args="--prefix=$prefix --localstatedir=$localstatedir" | ||||
|         extra_args="$extra_args --sysconfdir=$sysconfdir --libdir=$libdir" | ||||
|         shift | ||||
|         ;; | ||||
|     *) | ||||
|         # All remaining arguments will be passed to configure verbatim | ||||
|         break | ||||
|         ;; | ||||
|     esac | ||||
| done | ||||
| no_git="$no_git$gnulib_srcdir" | ||||
| if test "x$1" = "x--no-git"; then | ||||
|   no_git=" $1" | ||||
|   shift | ||||
|   case "$1 $2" in | ||||
|     --gnulib-srcdir=*) no_git="$no_git $1"; shift ;; | ||||
|     --gnulib-srcdir\ *) no_git="$no_git $1=$2"; shift; shift;; | ||||
|   esac | ||||
| fi | ||||
| if test -z "$NOCONFIGURE" ; then | ||||
|   if test "x$1" = "x--system"; then | ||||
|     shift | ||||
|     prefix=/usr | ||||
|     libdir=$prefix/lib | ||||
|     sysconfdir=/etc | ||||
|     localstatedir=/var | ||||
|     if [ -d /usr/lib64 ]; then | ||||
|       libdir=$prefix/lib64 | ||||
|     fi | ||||
|     EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir" | ||||
|     echo "Running ./configure with $EXTRA_ARGS $@" | ||||
|   else | ||||
|     if test -z "$*" && test ! -f "$THEDIR/config.status"; then | ||||
|         echo "I am going to run ./configure with no arguments - if you wish" | ||||
|         echo "to pass any to it, please specify them on the $0 command line." | ||||
|     fi | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| gnulib_hash() | ||||
| # Compute the hash we'll use to determine whether rerunning bootstrap | ||||
| # is required.  The first is just the SHA1 that selects a gnulib snapshot. | ||||
| # The second ensures that whenever we change the set of gnulib modules used | ||||
| # by this package, we rerun bootstrap to pull in the matching set of files. | ||||
| # The third ensures that whenever we change the set of local gnulib diffs, | ||||
| # we rerun bootstrap to pull in those diffs. | ||||
| bootstrap_hash() | ||||
| { | ||||
|     local no_git=$1 | ||||
|  | ||||
|     if test "$no_git"; then | ||||
|         echo "no-git" | ||||
|         echo no-git | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     # Compute the hash we'll use to determine whether rerunning bootstrap | ||||
|     # is required. The first is just the SHA1 that selects a gnulib snapshot. | ||||
|     # The second ensures that whenever we change the set of gnulib modules used | ||||
|     # by this package, we rerun bootstrap to pull in the matching set of files. | ||||
|     # The third ensures that whenever we change the set of local gnulib diffs, | ||||
|     # we rerun bootstrap to pull in those diffs. | ||||
|     git submodule status .gnulib | awk '{ print $1 }' | ||||
|     git submodule status | sed 's/^[ +-]//;s/ .*//' | ||||
|     git hash-object bootstrap.conf | ||||
|     git ls-tree -d HEAD gnulib/local | awk '{ print $3 }' | ||||
|     git ls-tree -d HEAD gnulib/local | awk '{print $3}' | ||||
| } | ||||
|  | ||||
| # Only look into git submodules if we're in a git checkout | ||||
| # Ensure that whenever we pull in a gnulib update or otherwise change to a | ||||
| # different version (i.e., when switching branches), we also rerun ./bootstrap. | ||||
| # Also, running 'make rpm' tends to litter the po/ directory, and some people | ||||
| # like to run 'git clean -x -f po' to fix it; but only ./bootstrap regenerates | ||||
| # the required file po/Makevars. | ||||
| # Only run bootstrap from a git checkout, never from a tarball. | ||||
| if test -d .git || test -f .git; then | ||||
|  | ||||
|     # Check for dirty submodules | ||||
|     if test -z "$CLEAN_SUBMODULE"; then | ||||
|         for path in $(git submodule status | awk '{ print $2 }'); do | ||||
|             case "$(git diff "$path")" in | ||||
|                 *-dirty*) | ||||
|                     echo "error: $path is dirty, please investigate" >&2 | ||||
|                     echo "set CLEAN_SUBMODULE to discard submodule changes" >&2 | ||||
|                     exit 1 | ||||
|                     ;; | ||||
|             esac | ||||
|         done | ||||
|     curr_status=.git-module-status t= | ||||
|     if test "$no_git"; then | ||||
|         t=no-git | ||||
|     elif test -d .gnulib; then | ||||
|         t=$(bootstrap_hash; git diff .gnulib) | ||||
|     fi | ||||
|     if test "$CLEAN_SUBMODULE" && test -z "$no_git"; then | ||||
|         if test -z "$dry_run"; then | ||||
|             echo "Cleaning up submodules..." | ||||
|             git submodule foreach 'git clean -dfqx && git reset --hard' || { | ||||
|                 die "Cleaning up submodules failed" | ||||
|             } | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     # Update all submodules. If any of the submodules has not been | ||||
|     # initialized yet, it will be initialized now; moreover, any submodule | ||||
|     # with uncommitted changes will be returned to the expected state | ||||
|     echo "Updating submodules..." | ||||
|     git submodule update --init || { | ||||
|         die "Updating submodules failed" | ||||
|     } | ||||
|  | ||||
|     # The expected hash, eg. the one computed after the last | ||||
|     # successful bootstrap run, is stored on disk | ||||
|     state_file=.git-module-status | ||||
|     expected_hash=$(cat "$state_file" 2>/dev/null) | ||||
|     actual_hash=$(gnulib_hash "$no_git") | ||||
|  | ||||
|     if test "$actual_hash" = "$expected_hash" && \ | ||||
|        test -f po/Makevars && test -f AUTHORS; then | ||||
|         # The gnulib hash matches our expectations, and all the files | ||||
|         # that can only be generated through bootstrap are present: | ||||
|         # we just need to run autoreconf. Unless we're performing a | ||||
|         # dry run, of course... | ||||
|         if test -z "$dry_run"; then | ||||
|             echo "Running autoreconf..." | ||||
|             autoreconf -if || { | ||||
|                 die "autoreconf failed" | ||||
|             } | ||||
|         fi | ||||
|     case $t:${CLEAN_SUBMODULE+set} in | ||||
|         *:set) ;; | ||||
|         *-dirty*) | ||||
|             echo "error: gnulib submodule is dirty, please investigate" 2>&1 | ||||
|             echo "set env-var CLEAN_SUBMODULE to discard gnulib changes" 2>&1 | ||||
|             exit 1 ;; | ||||
|     esac | ||||
|     # Keep this test in sync with cfg.mk:_update_required | ||||
|     if test "$t" = "$(cat $curr_status 2>/dev/null)" \ | ||||
|         && test -f "po/Makevars" && test -f AUTHORS; then | ||||
|         # good, it's up to date, all we need is autoreconf | ||||
|         autoreconf -if | ||||
|     else | ||||
|         # Whenever the gnulib submodule or any of the related bits | ||||
|         # has been changed in some way (see gnulib_hash) we need to | ||||
|         # run bootstrap again. If we're performing a dry run, we | ||||
|         # change the return code instead to signal our caller | ||||
|         if test "$dry_run"; then | ||||
|             dry_run=2 | ||||
|         else | ||||
|             echo "Running bootstrap..." | ||||
|             ./bootstrap$no_git --bootstrap-sync || { | ||||
|                 die "bootstrap failed" | ||||
|             } | ||||
|             gnulib_hash >"$state_file" | ||||
|         if test -z "$no_git" && test ${CLEAN_SUBMODULE+set}; then | ||||
|             echo cleaning up submodules... | ||||
|             git submodule foreach 'git clean -dfqx && git reset --hard' | ||||
|         fi | ||||
|         echo running bootstrap$no_git... | ||||
|         ./bootstrap$no_git --bootstrap-sync && bootstrap_hash > $curr_status \ | ||||
|             || { echo "Failed to bootstrap, please investigate."; exit 1; } | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| # When performing a dry run, we can stop here | ||||
| test "$dry_run" && exit "$dry_run" | ||||
| test -n "$NOCONFIGURE" && exit 0 | ||||
|  | ||||
| # If asked not to run configure, we can stop here | ||||
| test "$NOCONFIGURE" && exit 0 | ||||
| cd "$THEDIR" | ||||
|  | ||||
| cd "$starting_point" || { | ||||
|     die "Failed to cd into $starting_point" | ||||
| } | ||||
|  | ||||
| if test "$OBJ_DIR"; then | ||||
|     mkdir -p "$OBJ_DIR" || { | ||||
|         die "Failed to create $OBJ_DIR" | ||||
|     } | ||||
|     cd "$OBJ_DIR" || { | ||||
|         die "Failed to cd into $OBJ_DIR" | ||||
|     } | ||||
| if test "x$OBJ_DIR" != x; then | ||||
|     mkdir -p "$OBJ_DIR" | ||||
|     cd "$OBJ_DIR" | ||||
| fi | ||||
|  | ||||
| # Make sure we can find GNU make and tell the user | ||||
| # the right command to run | ||||
| MAKE= | ||||
| for cmd in make gmake; do | ||||
|     if $cmd -v 2>&1 | grep -q "GNU Make"; then | ||||
|         MAKE=$cmd | ||||
|         break | ||||
|     fi | ||||
| done | ||||
| test "$MAKE" || { | ||||
|     die "GNU make is required to build libvirt" | ||||
| } | ||||
|  | ||||
| if test -z "$*" && test -z "$extra_args" && test -f config.status; then | ||||
|     echo "Running config.status..." | ||||
|     ./config.status --recheck || { | ||||
|         die "config.status failed" | ||||
|     } | ||||
| if test -z "$*" && test -z "$EXTRA_ARGS" && test -f config.status; then | ||||
|     ./config.status --recheck | ||||
| else | ||||
|     if test -z "$*" && test -z "$extra_args"; then | ||||
|         echo "I am going to run configure with no arguments - if you wish" | ||||
|         echo "to pass any to it, please specify them on the $0 command line." | ||||
|     else | ||||
|         echo "Running configure with $extra_args $@" | ||||
|     fi | ||||
|     "$srcdir/configure" $extra_args "$@" || { | ||||
|         die "configure failed" | ||||
|     } | ||||
| fi | ||||
|  | ||||
| echo | ||||
| echo "Now type '$MAKE' to compile libvirt." | ||||
|     $srcdir/configure $EXTRA_ARGS "$@" | ||||
| fi && { | ||||
|     echo | ||||
|     echo "Now type 'make' to compile libvirt." | ||||
| } | ||||
|   | ||||
							
								
								
									
										54
									
								
								bootstrap
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								bootstrap
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | ||||
| #! /bin/sh | ||||
| # Print a version string. | ||||
| scriptversion=2017-09-19.08; # UTC | ||||
| scriptversion=2014-12-08.12; # UTC | ||||
|  | ||||
| # Bootstrap this package from checked-out sources. | ||||
|  | ||||
| # Copyright (C) 2003-2018 Free Software Foundation, Inc. | ||||
| # Copyright (C) 2003-2015 Free Software Foundation, 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 | ||||
| @@ -17,7 +17,7 @@ scriptversion=2017-09-19.08; # UTC | ||||
| # 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, see <https://www.gnu.org/licenses/>. | ||||
| # along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| # Originally written by Paul Eggert.  The canonical version of this | ||||
| # script is maintained as build-aux/bootstrap in gnulib, however, to | ||||
| @@ -42,7 +42,7 @@ export LC_ALL | ||||
|  | ||||
| local_gl_dir=gl | ||||
|  | ||||
| # Honor $PERL, but work even if there is none. | ||||
| # Honour $PERL, but work even if there is none | ||||
| PERL="${PERL-perl}" | ||||
|  | ||||
| me=$0 | ||||
| @@ -141,7 +141,7 @@ po_download_command_format=\ | ||||
| # Fallback for downloading .po files (if rsync fails). | ||||
| po_download_command_format2=\ | ||||
| "wget --mirror -nd -q -np -A.po -P '%s' \ | ||||
|  https://translationproject.org/latest/%s/" | ||||
|  http://translationproject.org/latest/%s/" | ||||
|  | ||||
| # Prefer a non-empty tarname (4th argument of AC_INIT if given), else | ||||
| # fall back to the package name (1st argument with munging) | ||||
| @@ -418,30 +418,28 @@ sort_ver() { # sort -V is not generally available | ||||
|   done | ||||
| } | ||||
|  | ||||
| get_version_sed=' | ||||
| # Move version to start of line. | ||||
| s/.*[v ]\([0-9]\)/\1/ | ||||
|  | ||||
| # Skip lines that do not start with version. | ||||
| /^[0-9]/!d | ||||
|  | ||||
| # Remove characters after the version. | ||||
| s/[^.a-z0-9-].*// | ||||
|  | ||||
| # The first component must be digits only. | ||||
| s/^\([0-9]*\)[a-z-].*/\1/ | ||||
|  | ||||
| #the following essentially does s/5.005/5.5/ | ||||
| s/\.0*\([1-9]\)/.\1/g | ||||
| p | ||||
| q' | ||||
|  | ||||
| get_version() { | ||||
|   app=$1 | ||||
|  | ||||
|   $app --version >/dev/null 2>&1 || { $app --version; return 1; } | ||||
|  | ||||
|   $app --version 2>&1 | sed -n "$get_version_sed" | ||||
|   $app --version 2>&1 | | ||||
|   sed -n '# Move version to start of line. | ||||
|           s/.*[v ]\([0-9]\)/\1/ | ||||
|  | ||||
|           # Skip lines that do not start with version. | ||||
|           /^[0-9]/!d | ||||
|  | ||||
|           # Remove characters after the version. | ||||
|           s/[^.a-z0-9-].*// | ||||
|  | ||||
|           # The first component must be digits only. | ||||
|           s/^\([0-9]*\)[a-z-].*/\1/ | ||||
|  | ||||
|           #the following essentially does s/5.005/5.5/ | ||||
|           s/\.0*\([1-9]\)/.\1/g | ||||
|           p | ||||
|           q' | ||||
| } | ||||
|  | ||||
| check_versions() { | ||||
| @@ -699,7 +697,7 @@ download_po_files() { | ||||
|   echo "$me: getting translations into $subdir for $domain..." | ||||
|   cmd=$(printf "$po_download_command_format" "$domain" "$subdir") | ||||
|   eval "$cmd" && return | ||||
|   # Fallback to HTTPS. | ||||
|   # Fallback to HTTP. | ||||
|   cmd=$(printf "$po_download_command_format2" "$subdir" "$domain") | ||||
|   eval "$cmd" | ||||
| } | ||||
| @@ -790,9 +788,9 @@ symlink_to_dir() | ||||
|       # Leave any existing symlink alone, if it already points to the source, | ||||
|       # so that broken build tools that care about symlink times | ||||
|       # aren't confused into doing unnecessary builds.  Conversely, if the | ||||
|       # existing symlink's timestamp is older than the source, make it afresh, | ||||
|       # existing symlink's time stamp is older than the source, make it afresh, | ||||
|       # so that broken tools aren't confused into skipping needed builds.  See | ||||
|       # <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>. | ||||
|       # <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>. | ||||
|       test -h "$dst" && | ||||
|       src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 && | ||||
|       dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 && | ||||
| @@ -1023,6 +1021,6 @@ echo "$0: done.  Now you can run './configure'." | ||||
| # eval: (add-hook 'write-file-hooks 'time-stamp) | ||||
| # time-stamp-start: "scriptversion=" | ||||
| # time-stamp-format: "%:y-%02m-%02d.%02H" | ||||
| # time-stamp-time-zone: "UTC0" | ||||
| # time-stamp-time-zone: "UTC" | ||||
| # time-stamp-end: "; # UTC" | ||||
| # End: | ||||
|   | ||||
| @@ -54,7 +54,6 @@ func | ||||
| getaddrinfo | ||||
| getcwd-lgpl | ||||
| gethostname | ||||
| getopt-posix | ||||
| getpass | ||||
| getpeername | ||||
| getsockname | ||||
| @@ -121,7 +120,6 @@ time_r | ||||
| timegm | ||||
| ttyname_r | ||||
| uname | ||||
| unsetenv | ||||
| useless-if-before-free | ||||
| usleep | ||||
| vasprintf | ||||
| @@ -198,7 +196,10 @@ local_gl_dir=gnulib/local | ||||
| # Build prerequisites | ||||
| # Note that some of these programs are only required for 'make dist' to | ||||
| # succeed from a fresh git checkout; not all of these programs are | ||||
| # required to run 'make dist' on a tarball. | ||||
| # required to run 'make dist' on a tarball.  As a special case, we want | ||||
| # to require the equivalent of the Fedora python-devel package, but | ||||
| # RHEL 5 lacks the witness python-config package; we hack around that | ||||
| # old environment below. | ||||
| buildreq="\ | ||||
| autoconf   2.59 | ||||
| automake   1.9.6 | ||||
| @@ -209,12 +210,21 @@ gzip       - | ||||
| libtool    - | ||||
| patch      - | ||||
| perl       5.5 | ||||
| perl::XML::XPath - | ||||
| pkg-config - | ||||
| python-config - | ||||
| rpcgen     - | ||||
| tar        - | ||||
| xmllint	   - | ||||
| xsltproc   - | ||||
| " | ||||
| # Use rpm as a fallback to bypass the bootstrap probe for python-config, | ||||
| # for the sake of RHEL 5; without requiring it on newer systems that | ||||
| # have python-config to begin with. | ||||
| if `(${PYTHON_CONFIG-python-config} --version; | ||||
|      test $? -lt 126 || rpm -q python-devel) >/dev/null 2>&1`; then | ||||
|   PYTHON_CONFIG=true | ||||
| fi | ||||
|  | ||||
| # Automake requires that ChangeLog and AUTHORS exist. | ||||
| touch AUTHORS ChangeLog || exit 1 | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #!/usr/bin/env perl | ||||
| #!/usr/bin/perl | ||||
| # | ||||
| # augeas-gentest.pl: Generate an augeas test file, from an | ||||
| #                    example config file + test file template | ||||
|   | ||||
							
								
								
									
										204
									
								
								build-aux/bracket-spacing.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										204
									
								
								build-aux/bracket-spacing.pl
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| #!/usr/bin/perl | ||||
| # | ||||
| # bracket-spacing.pl: Report any usage of 'function (..args..)' | ||||
| # Also check for other syntax issues, such as correct use of ';' | ||||
| # | ||||
| # This library is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU Lesser General Public | ||||
| # License as published by the Free Software Foundation; either | ||||
| # version 2.1 of the License, or (at your option) any later version. | ||||
| # | ||||
| # This library 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 | ||||
| # Lesser General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Lesser General Public | ||||
| # License along with this library.  If not, see | ||||
| # <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # Authors: | ||||
| #     Daniel P. Berrange <berrange@redhat.com> | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| my $ret = 0; | ||||
| my $incomment = 0; | ||||
|  | ||||
| foreach my $file (@ARGV) { | ||||
|     # Per-file variables for multiline Curly Bracket (cb_) check | ||||
|     my $cb_linenum = 0; | ||||
|     my $cb_code = ""; | ||||
|     my $cb_scolon = 0; | ||||
|  | ||||
|     open FILE, $file; | ||||
|  | ||||
|     while (defined (my $line = <FILE>)) { | ||||
|         my $data = $line; | ||||
|         # For temporary modifications | ||||
|         my $tmpdata; | ||||
|  | ||||
|         # Kill any quoted , ; = or " | ||||
|         $data =~ s/'[";,=]'/'X'/g; | ||||
|  | ||||
|         # Kill any quoted strings | ||||
|         $data =~ s,"([^\\\"]|\\.)*","XXX",g; | ||||
|  | ||||
|         # Kill any C++ style comments | ||||
|         $data =~ s,//.*$,//,; | ||||
|  | ||||
|         next if $data =~ /^#/; | ||||
|  | ||||
|         # Kill contents of multi-line comments | ||||
|         # and detect end of multi-line comments | ||||
|         if ($incomment) { | ||||
|             if ($data =~ m,\*/,) { | ||||
|                 $incomment = 0; | ||||
|                 $data =~ s,^.*\*/,*/,; | ||||
|             } else { | ||||
|                 $data = ""; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Kill single line comments, and detect | ||||
|         # start of multi-line comments | ||||
|         if ($data =~ m,/\*.*\*/,) { | ||||
|             $data =~ s,/\*.*\*/,/* */,; | ||||
|         } elsif ($data =~ m,/\*,) { | ||||
|             $incomment = 1; | ||||
|             $data =~ s,/\*.*,/*,; | ||||
|         } | ||||
|  | ||||
|         # We need to match things like | ||||
|         # | ||||
|         #  int foo (int bar, bool wizz); | ||||
|         #  foo (bar, wizz); | ||||
|         # | ||||
|         # but not match things like: | ||||
|         # | ||||
|         #  typedef int (*foo)(bar wizz) | ||||
|         # | ||||
|         # we can't do this (efficiently) without | ||||
|         # missing things like | ||||
|         # | ||||
|         #  foo (*bar, wizz); | ||||
|         # | ||||
|         # We also don't want to spoil the $data so it can be used | ||||
|         # later on. | ||||
|         $tmpdata = $data; | ||||
|         while ($tmpdata =~ /(\w+)\s\((?!\*)/) { | ||||
|             my $kw = $1; | ||||
|  | ||||
|             # Allow space after keywords only | ||||
|             if ($kw =~ /^(if|for|while|switch|return)$/) { | ||||
|                 $tmpdata =~ s/($kw\s\()/XXX(/; | ||||
|             } else { | ||||
|                 print "Whitespace after non-keyword:\n"; | ||||
|                 print "$file:$.: $line"; | ||||
|                 $ret = 1; | ||||
|                 last; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Require whitespace immediately after keywords, | ||||
|         # but none after the opening bracket | ||||
|         if ($data =~ /\b(if|for|while|switch|return)\(/ || | ||||
|             $data =~ /\b(if|for|while|switch|return)\s+\(\s/) { | ||||
|             print "No whitespace after keyword:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace between )( of a function typedef | ||||
|         if ($data =~ /\(\*\w+\)\s+\(/) { | ||||
|             print "Whitespace between ')' and '(':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace following ( or prior to ) | ||||
|         if ($data =~ /\S\s+\)/ || | ||||
|             $data =~ /\(\s+\S/) { | ||||
|             print "Whitespace after '(' or before ')':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace before ";" or ",". Things like below are allowed: | ||||
|         # | ||||
|         # 1) The expression is empty for "for" loop. E.g. | ||||
|         #   for (i = 0; ; i++) | ||||
|         # | ||||
|         # 2) An empty statement. E.g. | ||||
|         #   while (write(statuswrite, &status, 1) == -1 && | ||||
|         #          errno == EINTR) | ||||
|         #       ; | ||||
|         # | ||||
|         if ($data =~ /[^;\s]\s+[;,]/) { | ||||
|             print "Whitespace before (semi)colon:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Require EOL, macro line continuation, or whitespace after ";". | ||||
|         # Allow "for (;;)" as an exception. | ||||
|         if ($data =~ /;[^	 \\\n;)]/) { | ||||
|             print "Invalid character after semicolon:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Require EOL, space, or enum/struct end after comma. | ||||
|         if ($data =~ /,[^ \\\n)}]/) { | ||||
|             print "Invalid character after comma:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Require spaces around assignment '=', compounds and '==' | ||||
|         # with the exception of virAssertCmpInt() | ||||
|         $tmpdata = $data; | ||||
|         $tmpdata =~ s/(virAssertCmpInt\(.* ).?=,/$1op,/; | ||||
|         if ($tmpdata =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=[^=]/ || | ||||
|             $tmpdata =~ /=[^= \\\n]/) { | ||||
|             print "Spacing around '=' or '==':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # One line conditional statements with one line bodies should | ||||
|         # not use curly brackets. | ||||
|         if ($data =~ /^\s*(if|while|for)\b.*\{$/) { | ||||
|             $cb_linenum = $.; | ||||
|             $cb_code = $line; | ||||
|             $cb_scolon = 0; | ||||
|         } | ||||
|  | ||||
|         # We need to check for exactly one semicolon inside the body, | ||||
|         # because empty statements (e.g. with comment only) are | ||||
|         # allowed | ||||
|         if ($cb_linenum == $. - 1 && $data =~ /^[^;]*;[^;]*$/) { | ||||
|             $cb_code .= $line; | ||||
|             $cb_scolon = 1; | ||||
|         } | ||||
|  | ||||
|         if ($data =~ /^\s*}\s*$/ && | ||||
|             $cb_linenum == $. - 2 && | ||||
|             $cb_scolon) { | ||||
|  | ||||
|             print "Curly brackets around single-line body:\n"; | ||||
|             print "$file:$cb_linenum-$.:\n$cb_code$line"; | ||||
|             $ret = 1; | ||||
|  | ||||
|             # There _should_ be no need to reset the values; but to | ||||
|             # keep my inner peace... | ||||
|             $cb_linenum = 0; | ||||
|             $cb_scolon = 0; | ||||
|             $cb_code = ""; | ||||
|         } | ||||
|     } | ||||
|     close FILE; | ||||
| } | ||||
|  | ||||
| exit $ret; | ||||
| @@ -1,204 +0,0 @@ | ||||
| #!/usr/bin/env perl | ||||
| # | ||||
| # check-spacing.pl: Report any usage of 'function (..args..)' | ||||
| # Also check for other syntax issues, such as correct use of ';' | ||||
| # | ||||
| # This library is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU Lesser General Public | ||||
| # License as published by the Free Software Foundation; either | ||||
| # version 2.1 of the License, or (at your option) any later version. | ||||
| # | ||||
| # This library 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 | ||||
| # Lesser General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Lesser General Public | ||||
| # License along with this library.  If not, see | ||||
| # <http://www.gnu.org/licenses/>. | ||||
| # | ||||
| # Authors: | ||||
| #     Daniel P. Berrange <berrange@redhat.com> | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| my $ret = 0; | ||||
| my $incomment = 0; | ||||
|  | ||||
| foreach my $file (@ARGV) { | ||||
|     # Per-file variables for multiline Curly Bracket (cb_) check | ||||
|     my $cb_linenum = 0; | ||||
|     my $cb_code = ""; | ||||
|     my $cb_scolon = 0; | ||||
|  | ||||
|     open FILE, $file; | ||||
|  | ||||
|     while (defined (my $line = <FILE>)) { | ||||
|         my $data = $line; | ||||
|         # For temporary modifications | ||||
|         my $tmpdata; | ||||
|  | ||||
|         # Kill any quoted , ; = or " | ||||
|         $data =~ s/'[";,=]'/'X'/g; | ||||
|  | ||||
|         # Kill any quoted strings | ||||
|         $data =~ s,"(?:[^\\\"]|\\.)*","XXX",g; | ||||
|  | ||||
|         # Kill any C++ style comments | ||||
|         $data =~ s,//.*$,//,; | ||||
|  | ||||
|         next if $data =~ /^#/; | ||||
|  | ||||
|         # Kill contents of multi-line comments | ||||
|         # and detect end of multi-line comments | ||||
|         if ($incomment) { | ||||
|             if ($data =~ m,\*/,) { | ||||
|                 $incomment = 0; | ||||
|                 $data =~ s,^.*\*/,*/,; | ||||
|             } else { | ||||
|                 $data = ""; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Kill single line comments, and detect | ||||
|         # start of multi-line comments | ||||
|         if ($data =~ m,/\*.*\*/,) { | ||||
|             $data =~ s,/\*.*\*/,/* */,; | ||||
|         } elsif ($data =~ m,/\*,) { | ||||
|             $incomment = 1; | ||||
|             $data =~ s,/\*.*,/*,; | ||||
|         } | ||||
|  | ||||
|         # We need to match things like | ||||
|         # | ||||
|         #  int foo (int bar, bool wizz); | ||||
|         #  foo (bar, wizz); | ||||
|         # | ||||
|         # but not match things like: | ||||
|         # | ||||
|         #  typedef int (*foo)(bar wizz) | ||||
|         # | ||||
|         # we can't do this (efficiently) without | ||||
|         # missing things like | ||||
|         # | ||||
|         #  foo (*bar, wizz); | ||||
|         # | ||||
|         # We also don't want to spoil the $data so it can be used | ||||
|         # later on. | ||||
|         $tmpdata = $data; | ||||
|         while ($tmpdata =~ /(\w+)\s\((?!\*)/) { | ||||
|             my $kw = $1; | ||||
|  | ||||
|             # Allow space after keywords only | ||||
|             if ($kw =~ /^(?:if|for|while|switch|return)$/) { | ||||
|                 $tmpdata =~ s/(?:$kw\s\()/XXX(/; | ||||
|             } else { | ||||
|                 print "Whitespace after non-keyword:\n"; | ||||
|                 print "$file:$.: $line"; | ||||
|                 $ret = 1; | ||||
|                 last; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Require whitespace immediately after keywords | ||||
|         if ($data =~ /\b(?:if|for|while|switch|return)\(/) { | ||||
|             print "No whitespace after keyword:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace between )( of a function typedef | ||||
|         if ($data =~ /\(\*\w+\)\s+\(/) { | ||||
|             print "Whitespace between ')' and '(':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace following ( or prior to ) | ||||
|         # but allow whitespace before ) on a single line | ||||
|         # (optionally followed by a semicolon) | ||||
|         if (($data =~ /\s\)/ && not $data =~ /^\s+\);?$/) || | ||||
|             $data =~ /\((?!$)\s/) { | ||||
|             print "Whitespace after '(' or before ')':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Forbid whitespace before ";" or ",". Things like below are allowed: | ||||
|         # | ||||
|         # 1) The expression is empty for "for" loop. E.g. | ||||
|         #   for (i = 0; ; i++) | ||||
|         # | ||||
|         # 2) An empty statement. E.g. | ||||
|         #   while (write(statuswrite, &status, 1) == -1 && | ||||
|         #          errno == EINTR) | ||||
|         #       ; | ||||
|         # | ||||
|         if ($data =~ /\s[;,]/) { | ||||
|             unless ($data =~ /\S; ; / || | ||||
|                     $data =~ /^\s+;/) { | ||||
|                 print "Whitespace before semicolon or comma:\n"; | ||||
|                 print "$file:$.: $line"; | ||||
|                 $ret = 1; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Require EOL, macro line continuation, or whitespace after ";". | ||||
|         # Allow "for (;;)" as an exception. | ||||
|         if ($data =~ /;[^	 \\\n;)]/) { | ||||
|             print "Invalid character after semicolon:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Require EOL, space, or enum/struct end after comma. | ||||
|         if ($data =~ /,[^ \\\n)}]/) { | ||||
|             print "Invalid character after comma:\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # Require spaces around assignment '=', compounds and '==' | ||||
|         if ($data =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=/ || | ||||
|             $data =~ /=[^= \\\n]/) { | ||||
|             print "Spacing around '=' or '==':\n"; | ||||
|             print "$file:$.: $line"; | ||||
|             $ret = 1; | ||||
|         } | ||||
|  | ||||
|         # One line conditional statements with one line bodies should | ||||
|         # not use curly brackets. | ||||
|         if ($data =~ /^\s*(if|while|for)\b.*\{$/) { | ||||
|             $cb_linenum = $.; | ||||
|             $cb_code = $line; | ||||
|             $cb_scolon = 0; | ||||
|         } | ||||
|  | ||||
|         # We need to check for exactly one semicolon inside the body, | ||||
|         # because empty statements (e.g. with comment only) are | ||||
|         # allowed | ||||
|         if ($cb_linenum == $. - 1 && $data =~ /^[^;]*;[^;]*$/) { | ||||
|             $cb_code .= $line; | ||||
|             $cb_scolon = 1; | ||||
|         } | ||||
|  | ||||
|         if ($data =~ /^\s*}\s*$/ && | ||||
|             $cb_linenum == $. - 2 && | ||||
|             $cb_scolon) { | ||||
|  | ||||
|             print "Curly brackets around single-line body:\n"; | ||||
|             print "$file:$cb_linenum-$.:\n$cb_code$line"; | ||||
|             $ret = 1; | ||||
|  | ||||
|             # There _should_ be no need to reset the values; but to | ||||
|             # keep my inner peace... | ||||
|             $cb_linenum = 0; | ||||
|             $cb_scolon = 0; | ||||
|             $cb_code = ""; | ||||
|         } | ||||
|     } | ||||
|     close FILE; | ||||
| } | ||||
|  | ||||
| exit $ret; | ||||
| @@ -1,72 +0,0 @@ | ||||
| #!/usr/bin/env perl | ||||
|  | ||||
| my %noninlined; | ||||
| my %mocked; | ||||
|  | ||||
| # Functions in public header don't get the noinline annotation | ||||
| # so whitelist them here | ||||
| $noninlined{"virEventAddTimeout"} = 1; | ||||
|  | ||||
| foreach my $arg (@ARGV) { | ||||
|     if ($arg =~ /\.h$/) { | ||||
|         #print "Scan header $arg\n"; | ||||
|         &scan_annotations($arg); | ||||
|     } elsif ($arg =~ /mock\.c$/) { | ||||
|         #print "Scan mock $arg\n"; | ||||
|         &scan_overrides($arg); | ||||
|     } | ||||
| } | ||||
|  | ||||
| my $warned = 0; | ||||
| foreach my $func (keys %mocked) { | ||||
|     next if exists $noninlined{$func}; | ||||
|  | ||||
|     $warned++; | ||||
|     print STDERR "$func is mocked at $mocked{$func} but missing noinline annotation\n"; | ||||
| } | ||||
|  | ||||
| exit $warned ? 1 : 0; | ||||
|  | ||||
|  | ||||
| sub scan_annotations { | ||||
|     my $file = shift; | ||||
|  | ||||
|     open FH, $file or die "cannot read $file: $!"; | ||||
|  | ||||
|     my $func; | ||||
|     while (<FH>) { | ||||
|         if (/^\s*(\w+)\(/ || /^(?:\w+\*?\s+)+(?:\*\s*)?(\w+)\(/) { | ||||
|             my $name = $1; | ||||
|             if ($name !~ /ATTRIBUTE/) { | ||||
|                 $func = $name; | ||||
|             } | ||||
|         } elsif (/^\s*$/) { | ||||
|             $func = undef; | ||||
|         } | ||||
|         if (/ATTRIBUTE_NOINLINE/) { | ||||
|             if (defined $func) { | ||||
|                 $noninlined{$func} = 1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     close FH | ||||
| } | ||||
|  | ||||
| sub scan_overrides { | ||||
|     my $file = shift; | ||||
|  | ||||
|     open FH, $file or die "cannot read $file: $!"; | ||||
|  | ||||
|     my $func; | ||||
|     while (<FH>) { | ||||
|         if (/^(\w+)\(/ || /^\w+\s*(?:\*\s*)?(\w+)\(/) { | ||||
|             my $name = $1; | ||||
|             if ($name =~ /^vir/) { | ||||
|                 $mocked{$name} = "$file:$."; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     close FH | ||||
| } | ||||
| @@ -1,26 +0,0 @@ | ||||
| #!/usr/bin/env perl | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| my $file = " "; | ||||
| my $ret = 0; | ||||
| my %includes = ( ); | ||||
| my $lineno = 0; | ||||
|  | ||||
| while (<>) { | ||||
|     if (not $file eq $ARGV) { | ||||
|         %includes = ( ); | ||||
|         $file = $ARGV; | ||||
|         $lineno = 0; | ||||
|     } | ||||
|     $lineno++; | ||||
|     if (/^# *include *[<"]([^>"]*\.h)[">]/) { | ||||
|         $includes{$1}++; | ||||
|         if ($includes{$1} == 2) { | ||||
|             $ret = 1; | ||||
|             print STDERR "$ARGV:$lineno: $_"; | ||||
|             print STDERR "Do not include a header more than once per file\n"; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| exit $ret; | ||||
| @@ -20,76 +20,26 @@ | ||||
|  * Since virt-login-shell will be setuid, we must do everything | ||||
|  * we can to avoid linking to other libraries. Many of them do | ||||
|  * unsafe things in functions marked __atttribute__((constructor)). | ||||
|  * The only way to avoid such deps is to re-compile the | ||||
|  * The only way avoid to avoid such deps is to re-compile the | ||||
|  * functions with the code in question disabled, and for that we | ||||
|  * must override the main config.h rules. Hence this file :-( | ||||
|  */ | ||||
|  | ||||
| #ifdef LIBVIRT_SETUID_RPC_CLIENT | ||||
| # undef HAVE_LIBDEVMAPPER_H | ||||
| # undef HAVE_LIBNL | ||||
| # undef HAVE_LIBNL3 | ||||
| # undef HAVE_LIBSASL2 | ||||
| # undef HAVE_SYS_ACL_H | ||||
| # undef WITH_CAPNG | ||||
| # undef WITH_CURL | ||||
| # undef WITH_DBUS | ||||
| # undef WITH_DEVMAPPER | ||||
| # undef WITH_DTRACE_PROBES | ||||
| # undef WITH_GNUTLS | ||||
| # undef WITH_GNUTLS_GCRYPT | ||||
| # undef WITH_LIBSSH | ||||
| # undef WITH_MACVTAP | ||||
| # undef WITH_NUMACTL | ||||
| # undef WITH_SASL | ||||
| # undef WITH_SSH2 | ||||
| # undef WITH_SYSTEMD_DAEMON | ||||
| # undef WITH_VIRTUALPORT | ||||
| # undef WITH_YAJL | ||||
| # undef WITH_YAJL2 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * With the NSS module it's the same story as virt-login-shell. See the | ||||
|  * explanation above. | ||||
|  */ | ||||
| #ifdef LIBVIRT_NSS | ||||
| # undef HAVE_LIBNL | ||||
| # undef HAVE_LIBNL3 | ||||
| # undef HAVE_LIBSASL2 | ||||
| # undef HAVE_SYS_ACL_H | ||||
| # undef WITH_CAPNG | ||||
| # undef WITH_CURL | ||||
| # undef WITH_DEVMAPPER | ||||
| # undef WITH_DTRACE_PROBES | ||||
| # undef WITH_GNUTLS | ||||
| # undef WITH_GNUTLS_GCRYPT | ||||
| # undef WITH_LIBSSH | ||||
| # undef WITH_MACVTAP | ||||
| # undef WITH_NUMACTL | ||||
| # undef WITH_SASL | ||||
| # undef WITH_SSH2 | ||||
| # undef WITH_VIRTUALPORT | ||||
| # undef WITH_SECDRIVER_SELINUX | ||||
| # undef WITH_SECDRIVER_APPARMOR | ||||
| # undef WITH_CAPNG | ||||
| #endif /* LIBVIRT_NSS */ | ||||
|  | ||||
| #ifndef __GNUC__ | ||||
| # error "Libvirt requires GCC >= 4.4, or CLang" | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Define __GNUC_PREREQ to a sane default if it isn't yet defined. | ||||
|  * This is done here so that it's included as early as possible; gnulib relies | ||||
|  * on this to be defined in features.h, which should be included from ctype.h. | ||||
|  * This doesn't happen on many non-glibc systems. | ||||
|  * When __GNUC_PREREQ is not defined, gnulib defines it to 0, which breaks things. | ||||
|  */ | ||||
| #ifndef __GNUC_PREREQ | ||||
| # define __GNUC_PREREQ(maj, min) \ | ||||
|     ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | ||||
| #endif | ||||
|  | ||||
| #if !(__GNUC_PREREQ(4, 4) || defined(__clang__)) | ||||
| # error "Libvirt requires GCC >= 4.4, or CLang" | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										2711
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										2711
									
								
								configure.ac
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										538
									
								
								daemon/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										538
									
								
								daemon/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,538 @@ | ||||
| ## Process this file with automake to produce Makefile.in | ||||
|  | ||||
| ## Copyright (C) 2005-2015 Red Hat, Inc. | ||||
| ## | ||||
| ## This library is free software; you can redistribute it and/or | ||||
| ## modify it under the terms of the GNU Lesser General Public | ||||
| ## License as published by the Free Software Foundation; either | ||||
| ## version 2.1 of the License, or (at your option) any later version. | ||||
| ## | ||||
| ## This library 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 | ||||
| ## Lesser General Public License for more details. | ||||
| ## | ||||
| ## You should have received a copy of the GNU Lesser General Public | ||||
| ## License along with this library.  If not, see | ||||
| ## <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| INCLUDES = \ | ||||
| 	-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \ | ||||
| 	-I$(top_srcdir) \ | ||||
| 	-I$(top_builddir)/include -I$(top_srcdir)/include \ | ||||
| 	-I$(top_builddir)/src -I$(top_srcdir)/src \ | ||||
| 	-I$(top_srcdir)/src/util \ | ||||
| 	-I$(top_srcdir)/src/conf \ | ||||
| 	-I$(top_srcdir)/src/rpc \ | ||||
| 	-I$(top_srcdir)/src/remote \ | ||||
| 	-I$(top_srcdir)/src/admin \ | ||||
| 	-I$(top_srcdir)/src/access \ | ||||
| 	$(GETTEXT_CPPFLAGS) | ||||
|  | ||||
| CLEANFILES = | ||||
|  | ||||
| DAEMON_GENERATED =			\ | ||||
| 		remote_dispatch.h	\ | ||||
| 		lxc_dispatch.h		\ | ||||
| 		qemu_dispatch.h		\ | ||||
| 		admin_dispatch.h	\ | ||||
| 		$(NULL) | ||||
|  | ||||
| DAEMON_SOURCES =					\ | ||||
| 		libvirtd.c libvirtd.h			\ | ||||
| 		remote.c remote.h			\ | ||||
| 		stream.c stream.h			\ | ||||
| 		$(DAEMON_GENERATED) | ||||
|  | ||||
| LIBVIRTD_CONF_SOURCES = libvirtd-config.c libvirtd-config.h | ||||
|  | ||||
| DISTCLEANFILES = | ||||
| EXTRA_DIST =						\ | ||||
| 	remote_dispatch.h				\ | ||||
| 	lxc_dispatch.h					\ | ||||
| 	qemu_dispatch.h					\ | ||||
| 	admin_dispatch.h				\ | ||||
| 	libvirtd.conf					\ | ||||
| 	libvirtd.init.in				\ | ||||
| 	libvirtd.upstart				\ | ||||
| 	libvirtd.policy.in				\ | ||||
| 	libvirt.rules					\ | ||||
| 	libvirtd.sasl					\ | ||||
| 	libvirtd.service.in				\ | ||||
| 	libvirtd.socket.in				\ | ||||
| 	libvirtd.sysconf				\ | ||||
| 	libvirtd.sysctl					\ | ||||
| 	libvirtd.aug                                    \ | ||||
| 	libvirtd.logrotate.in                           \ | ||||
| 	libvirtd.qemu.logrotate.in                      \ | ||||
| 	libvirtd.lxc.logrotate.in                       \ | ||||
| 	libvirtd.libxl.logrotate.in                     \ | ||||
| 	libvirtd.uml.logrotate.in                       \ | ||||
| 	test_libvirtd.aug.in                             \ | ||||
| 	THREADS.txt					\ | ||||
| 	libvirtd.pod.in					\ | ||||
| 	libvirtd.8.in					\ | ||||
| 	$(DAEMON_SOURCES)				\ | ||||
| 	$(LIBVIRTD_CONF_SOURCES)			\ | ||||
| 	$(NULL) | ||||
|  | ||||
| BUILT_SOURCES = | ||||
|  | ||||
| REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x | ||||
| LXC_PROTOCOL = $(top_srcdir)/src/remote/lxc_protocol.x | ||||
| QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x | ||||
| ADMIN_PROTOCOL = $(top_srcdir)/src/admin/admin_protocol.x | ||||
|  | ||||
| remote_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 		$(REMOTE_PROTOCOL) | ||||
| 	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 	  --mode=server remote REMOTE $(REMOTE_PROTOCOL) \ | ||||
| 	  > $(srcdir)/remote_dispatch.h | ||||
|  | ||||
| lxc_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 		$(LXC_PROTOCOL) | ||||
| 	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 	  --mode=server lxc LXC $(LXC_PROTOCOL) \ | ||||
| 	  > $(srcdir)/lxc_dispatch.h | ||||
|  | ||||
| qemu_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 		$(QEMU_PROTOCOL) | ||||
| 	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \ | ||||
| 	  --mode=server qemu QEMU $(QEMU_PROTOCOL) \ | ||||
| 	  > $(srcdir)/qemu_dispatch.h | ||||
|  | ||||
| admin_dispatch.h: $(srcdir)/../src/rpc/gendispatch.pl \ | ||||
| 		$(ADMIN_PROTOCOL) | ||||
| 	$(AM_V_GEN)$(PERL) -w $(srcdir)/../src/rpc/gendispatch.pl \ | ||||
| 	  --mode=server admin ADMIN $(ADMIN_PROTOCOL) \ | ||||
| 	  > $(srcdir)/admin_dispatch.h | ||||
|  | ||||
| if WITH_LIBVIRTD | ||||
|  | ||||
| # Build a convenience library, for reuse in tests/libvirtdconftest | ||||
| noinst_LTLIBRARIES = libvirtd_conf.la | ||||
| libvirtd_conf_la_SOURCES = $(LIBVIRTD_CONF_SOURCES) | ||||
| libvirtd_conf_la_CFLAGS = \ | ||||
| 	$(LIBXML_CFLAGS) \ | ||||
| 	$(XDR_CFLAGS) \ | ||||
| 	$(WARN_CFLAGS) $(PIE_CFLAGS) \ | ||||
| 	$(COVERAGE_CFLAGS) \ | ||||
| 	$(NULL) | ||||
| libvirtd_conf_la_LDFLAGS =				\ | ||||
| 	$(RELRO_LDFLAGS)				\ | ||||
| 	$(PIE_LDFLAGS)					\ | ||||
| 	$(COVERAGE_LDFLAGS)				\ | ||||
| 	$(NO_INDIRECT_LDFLAGS)				\ | ||||
| 	$(NULL) | ||||
| libvirtd_conf_la_LIBADD = $(LIBXML_LIBS) | ||||
|  | ||||
| noinst_LTLIBRARIES += libvirtd_admin.la | ||||
| libvirtd_admin_la_SOURCES = \ | ||||
| 		admin_server.c admin_server.h | ||||
|  | ||||
| libvirtd_admin_la_CFLAGS = \ | ||||
| 		$(AM_CFLAGS)		\ | ||||
| 		$(XDR_CFLAGS)		\ | ||||
| 		$(PIE_CFLAGS)		\ | ||||
| 		$(WARN_CFLAGS)		\ | ||||
| 		$(LIBXML_CFLAGS)	\ | ||||
| 		$(COVERAGE_CFLAGS) | ||||
|  | ||||
| libvirtd_admin_la_LDFLAGS = \ | ||||
| 		$(PIE_LDFLAGS)		\ | ||||
| 		$(RELRO_LDFLAGS)	\ | ||||
| 		$(COVERAGE_LDFLAGS)	\ | ||||
| 		$(NO_INDIRECT_LDFLAGS) | ||||
|  | ||||
| libvirtd_admin_la_LIBADD =	\ | ||||
| 		../src/libvirt-admin.la | ||||
|  | ||||
| man8_MANS = libvirtd.8 | ||||
|  | ||||
| sbin_PROGRAMS = libvirtd | ||||
|  | ||||
| confdir = $(sysconfdir)/libvirt/ | ||||
| conf_DATA = libvirtd.conf | ||||
|  | ||||
| augeasdir = $(datadir)/augeas/lenses | ||||
| augeas_DATA = libvirtd.aug | ||||
|  | ||||
| augeastestsdir = $(datadir)/augeas/lenses/tests | ||||
| augeastests_DATA = test_libvirtd.aug | ||||
|  | ||||
| CLEANFILES += test_libvirtd.aug | ||||
|  | ||||
| libvirtd.8: $(srcdir)/libvirtd.8.in | ||||
| 	$(AM_V_GEN)sed \ | ||||
| 	    -e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g' \ | ||||
| 	    < $< > $@-t && \ | ||||
| 	mv $@-t $@ | ||||
|  | ||||
| libvirtd_SOURCES = $(DAEMON_SOURCES) | ||||
|  | ||||
| #-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L | ||||
| libvirtd_CFLAGS = \ | ||||
| 	$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \ | ||||
| 	$(XDR_CFLAGS) $(DBUS_CFLAGS) $(LIBNL_CFLAGS) \ | ||||
| 	$(WARN_CFLAGS) $(PIE_CFLAGS) \ | ||||
| 	$(COVERAGE_CFLAGS) \ | ||||
| 	-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\"" | ||||
|  | ||||
| libvirtd_LDFLAGS =					\ | ||||
| 	$(RELRO_LDFLAGS)				\ | ||||
| 	$(PIE_LDFLAGS)					\ | ||||
| 	$(COVERAGE_LDFLAGS)				\ | ||||
| 	$(NO_INDIRECT_LDFLAGS)				\ | ||||
| 	$(NULL) | ||||
|  | ||||
| libvirtd_LDADD =					\ | ||||
| 	$(LIBXML_LIBS)					\ | ||||
| 	$(GNUTLS_LIBS)					\ | ||||
| 	$(SASL_LIBS)					\ | ||||
| 	$(DBUS_LIBS)					\ | ||||
| 	$(LIBNL_LIBS) | ||||
|  | ||||
| if WITH_DTRACE_PROBES | ||||
| libvirtd_LDADD += ../src/libvirt_probes.lo | ||||
| endif WITH_DTRACE_PROBES | ||||
|  | ||||
| libvirtd_LDADD += \ | ||||
| 	libvirtd_conf.la \ | ||||
| 	libvirtd_admin.la \ | ||||
| 	../src/libvirt-lxc.la \ | ||||
| 	../src/libvirt-qemu.la \ | ||||
| 	../src/libvirt_driver_remote.la \ | ||||
| 	$(NULL) | ||||
|  | ||||
| if ! WITH_DRIVER_MODULES | ||||
| if WITH_QEMU | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_qemu.la | ||||
| if WITH_DTRACE_PROBES | ||||
|     libvirtd_LDADD += ../src/libvirt_qemu_probes.lo | ||||
| endif WITH_DTRACE_PROBES | ||||
| endif WITH_QEMU | ||||
|  | ||||
| if WITH_LXC | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_lxc.la | ||||
| endif WITH_LXC | ||||
|  | ||||
| if WITH_XEN | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_xen.la | ||||
| endif WITH_XEN | ||||
|  | ||||
| if WITH_LIBXL | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_libxl.la | ||||
| endif WITH_LIBXL | ||||
|  | ||||
| if WITH_UML | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_uml.la | ||||
| endif WITH_UML | ||||
|  | ||||
| if WITH_VBOX | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_vbox.la | ||||
| endif WITH_VBOX | ||||
|  | ||||
| if WITH_STORAGE | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_storage.la | ||||
| endif WITH_STORAGE | ||||
|  | ||||
| if WITH_NETWORK | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_network.la | ||||
| endif WITH_NETWORK | ||||
|  | ||||
| if WITH_INTERFACE | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_interface.la | ||||
| endif WITH_INTERFACE | ||||
|  | ||||
| if WITH_NODE_DEVICES | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_nodedev.la | ||||
| endif WITH_NODE_DEVICES | ||||
|  | ||||
| if WITH_SECRETS | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_secret.la | ||||
| endif WITH_SECRETS | ||||
|  | ||||
| if WITH_NWFILTER | ||||
|     libvirtd_LDADD += ../src/libvirt_driver_nwfilter.la | ||||
| endif WITH_NWFILTER | ||||
| endif ! WITH_DRIVER_MODULES | ||||
|  | ||||
| libvirtd_LDADD += ../src/libvirt.la | ||||
|  | ||||
| if WITH_POLKIT | ||||
| if WITH_POLKIT0 | ||||
| policydir = $(datadir)/PolicyKit/policy | ||||
| policyauth = auth_admin_keep_session | ||||
| else ! WITH_POLKIT0 | ||||
| policydir = $(datadir)/polkit-1/actions | ||||
| policyauth = auth_admin_keep | ||||
| rulesdir = $(datadir)/polkit-1/rules.d | ||||
| rulesfile = libvirt.rules | ||||
| endif ! WITH_POLKIT0 | ||||
| endif WITH_POLKIT | ||||
|  | ||||
| libvirtd.policy: libvirtd.policy.in $(top_builddir)/config.status | ||||
| 	$(AM_V_GEN) sed \ | ||||
| 	    -e 's|[@]authaction[@]|$(policyauth)|g' \ | ||||
| 	    < $< > $@-t && \ | ||||
| 	mv $@-t $@ | ||||
| BUILT_SOURCES += libvirtd.policy | ||||
|  | ||||
| install-data-local: install-init-redhat install-init-systemd \ | ||||
| 		install-init-upstart \ | ||||
| 		install-data-sasl install-data-polkit \ | ||||
| 		install-logrotate install-sysctl | ||||
| 	$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt \ | ||||
| 		   $(DESTDIR)$(localstatedir)/run/libvirt \ | ||||
| 		   $(DESTDIR)$(localstatedir)/lib/libvirt | ||||
|  | ||||
| uninstall-local:: uninstall-init-redhat uninstall-init-systemd \ | ||||
| 		uninstall-init-upstart \ | ||||
| 		uninstall-data-sasl uninstall-data-polkit \ | ||||
| 		uninstall-logrotate uninstall-sysctl | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/log/libvirt || : | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/run/libvirt || : | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || : | ||||
|  | ||||
| if WITH_POLKIT | ||||
| install-data-polkit:: | ||||
| 	$(MKDIR_P) $(DESTDIR)$(policydir) | ||||
| 	$(INSTALL_DATA) libvirtd.policy $(DESTDIR)$(policydir)/org.libvirt.unix.policy | ||||
| if ! WITH_POLKIT0 | ||||
| 	$(MKDIR_P) $(DESTDIR)$(rulesdir) | ||||
| 	$(INSTALL_DATA) $(srcdir)/$(rulesfile) $(DESTDIR)$(rulesdir)/50-libvirt.rules | ||||
| endif ! WITH_POLKIT0 | ||||
|  | ||||
| uninstall-data-polkit:: | ||||
| 	rm -f $(DESTDIR)$(policydir)/org.libvirt.unix.policy | ||||
| 	rmdir $(DESTDIR)$(policydir) || : | ||||
| if ! WITH_POLKIT0 | ||||
| 	rm -f $(DESTDIR)$(rulesdir)/50-libvirt.rules | ||||
| 	rmdir $(DESTDIR)$(rulesdir) || : | ||||
| endif ! WITH_POLKIT0 | ||||
|  | ||||
| else ! WITH_POLKIT | ||||
| install-data-polkit:: | ||||
| uninstall-data-polkit:: | ||||
| endif ! WITH_POLKIT | ||||
|  | ||||
| remote.c: $(DAEMON_GENERATED) | ||||
| remote.h: $(DAEMON_GENERATED) | ||||
| admin_server.c: $(DAEMON_GENERATED) | ||||
|  | ||||
| LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \ | ||||
| 		  libvirtd.libxl.logrotate libvirtd.uml.logrotate \ | ||||
| 		  libvirtd.logrotate | ||||
|  | ||||
| BUILT_SOURCES += $(LOGROTATE_CONFS) | ||||
|  | ||||
| libvirtd.logrotate: libvirtd.logrotate.in | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    < $< > $@-t && \ | ||||
| 	mv $@-t $@ | ||||
|  | ||||
| libvirtd.qemu.logrotate: libvirtd.qemu.logrotate.in | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    < $< > $@-t && \ | ||||
| 	mv $@-t $@ | ||||
|  | ||||
| libvirtd.lxc.logrotate: libvirtd.lxc.logrotate.in | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
| libvirtd.libxl.logrotate: libvirtd.libxl.logrotate.in | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
| libvirtd.uml.logrotate: libvirtd.uml.logrotate.in | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
| install-logrotate: $(LOGROTATE_CONFS) | ||||
| 	$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt/qemu/ \ | ||||
| 		   $(DESTDIR)$(localstatedir)/log/libvirt/lxc/ \ | ||||
| 		   $(DESTDIR)$(localstatedir)/log/libvirt/uml/ \ | ||||
| 		   $(DESTDIR)$(sysconfdir)/logrotate.d/ | ||||
| 	$(INSTALL_DATA) libvirtd.logrotate \ | ||||
| 		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd | ||||
| 	$(INSTALL_DATA) libvirtd.qemu.logrotate \ | ||||
| 		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu | ||||
| 	$(INSTALL_DATA) libvirtd.lxc.logrotate \ | ||||
| 		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc | ||||
| 	$(INSTALL_DATA) libvirtd.libxl.logrotate \ | ||||
| 		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl | ||||
| 	$(INSTALL_DATA) libvirtd.uml.logrotate \ | ||||
| 		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml | ||||
|  | ||||
| uninstall-logrotate: | ||||
| 	rm -f $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd \ | ||||
| 	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu \ | ||||
| 	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc \ | ||||
| 	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl \ | ||||
| 	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/qemu || : | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/lxc || : | ||||
| 	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/uml || : | ||||
| 	rmdir $(DESTDIR)$(sysconfdir)/logrotate.d || : | ||||
|  | ||||
| install-sysconfig: | ||||
| 	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig | ||||
| 	$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \ | ||||
| 	  $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd | ||||
| uninstall-sysconfig: | ||||
| 	rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd | ||||
| 	rmdir $(DESTDIR)$(sysconfdir)/sysconfig || : | ||||
|  | ||||
| if WITH_SYSCTL | ||||
| # Use $(prefix)/lib rather than $(libdir), since man sysctl.d insists on | ||||
| # /usr/lib/sysctl.d/ even when libdir is /usr/lib64 | ||||
| install-sysctl: | ||||
| 	$(MKDIR_P) $(DESTDIR)$(prefix)/lib/sysctl.d | ||||
| 	$(INSTALL_DATA) $(srcdir)/libvirtd.sysctl \ | ||||
| 	  $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf | ||||
|  | ||||
| uninstall-sysctl: | ||||
| 	rm -f $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf | ||||
| 	rmdir $(DESTDIR)$(prefix)/lib/sysctl.d || : | ||||
| else ! WITH_SYSCTL | ||||
| install-sysctl: | ||||
| uninstall-sysctl: | ||||
| endif ! WITH_SYSCTL | ||||
|  | ||||
| if LIBVIRT_INIT_SCRIPT_RED_HAT | ||||
|  | ||||
| BUILT_SOURCES += libvirtd.init | ||||
|  | ||||
| install-init-redhat: install-sysconfig libvirtd.init | ||||
| 	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d | ||||
| 	$(INSTALL_SCRIPT) libvirtd.init \ | ||||
| 	  $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd | ||||
|  | ||||
| uninstall-init-redhat: uninstall-sysconfig | ||||
| 	rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd | ||||
| 	rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || : | ||||
| else ! LIBVIRT_INIT_SCRIPT_RED_HAT | ||||
| install-init-redhat: | ||||
| uninstall-init-redhat: | ||||
| endif ! LIBVIRT_INIT_SCRIPT_RED_HAT | ||||
|  | ||||
|  | ||||
| if LIBVIRT_INIT_SCRIPT_UPSTART | ||||
|  | ||||
| install-init-upstart: install-sysconfig | ||||
| 	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/event.d | ||||
| 	$(INSTALL_SCRIPT) libvirtd.upstart \ | ||||
| 	  $(DESTDIR)$(sysconfdir)/event.d/libvirtd | ||||
|  | ||||
| uninstall-init-upstart: uninstall-sysconfig | ||||
| 	rm -f $(DESTDIR)$(sysconfdir)/event.d/libvirtd | ||||
| 	rmdir $(DESTDIR)$(sysconfdir)/event.d || : | ||||
| else ! LIBVIRT_INIT_SCRIPT_UPSTART | ||||
| install-init-upstart: | ||||
| uninstall-init-upstart: | ||||
| endif ! LIBVIRT_INIT_SCRIPT_UPSTART | ||||
|  | ||||
|  | ||||
| if LIBVIRT_INIT_SCRIPT_SYSTEMD | ||||
|  | ||||
| SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system | ||||
| BUILT_SOURCES += libvirtd.service libvirtd.socket | ||||
|  | ||||
| install-init-systemd: install-sysconfig libvirtd.service libvirtd.socket | ||||
| 	$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR) | ||||
| 	$(INSTALL_DATA) libvirtd.service \ | ||||
| 	  $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service | ||||
| 	$(INSTALL_DATA) libvirtd.socket \ | ||||
| 	  $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket | ||||
|  | ||||
| uninstall-init-systemd: uninstall-sysconfig | ||||
| 	rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service | ||||
| 	rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket | ||||
| 	rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || : | ||||
| else ! LIBVIRT_INIT_SCRIPT_SYSTEMD | ||||
| install-init-systemd: | ||||
| uninstall-init-systemd: | ||||
| endif ! LIBVIRT_INIT_SCRIPT_SYSTEMD | ||||
|  | ||||
| libvirtd.init: libvirtd.init.in $(top_builddir)/config.status | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    -e 's|[@]sbindir[@]|$(sbindir)|g'			\ | ||||
| 	    -e 's|[@]sysconfdir[@]|$(sysconfdir)|g'		\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    chmod a+x $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
| libvirtd.service: libvirtd.service.in $(top_builddir)/config.status | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\ | ||||
| 	    -e 's|[@]sbindir[@]|$(sbindir)|g'			\ | ||||
| 	    -e 's|[@]sysconfdir[@]|$(sysconfdir)|g'		\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
| libvirtd.socket: libvirtd.socket.in $(top_builddir)/config.status | ||||
| 	$(AM_V_GEN)sed						\ | ||||
| 	    -e 's|[@]runstatedir[@]|$(runstatedir)|g'		\ | ||||
| 	    < $< > $@-t &&					\ | ||||
| 	    mv $@-t $@ | ||||
|  | ||||
|  | ||||
| check-local: check-augeas | ||||
|  | ||||
| AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl | ||||
|  | ||||
| test_libvirtd.aug: test_libvirtd.aug.in $(srcdir)/libvirtd.conf | ||||
| 	$(AM_V_GEN)$(AUG_GENTEST) $(srcdir)/libvirtd.conf $< $@ | ||||
|  | ||||
| check-augeas: test_libvirtd.aug | ||||
| 	$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \ | ||||
| 	  '$(AUGPARSE)' -I $(srcdir) test_libvirtd.aug; \ | ||||
| 	fi | ||||
|  | ||||
|  | ||||
| # This must be added last, since functions it provides/replaces | ||||
| # are used by nearly every other library. | ||||
| libvirtd_LDADD += ../gnulib/lib/libgnu.la $(LIBSOCKET) | ||||
|  | ||||
| else ! WITH_LIBVIRTD | ||||
| install-data-local: install-data-sasl | ||||
| uninstall-local:: uninstall-data-sasl | ||||
| endif ! WITH_LIBVIRTD | ||||
|  | ||||
| POD2MAN = pod2man -c "Virtualization Support" \ | ||||
| 			-r "$(PACKAGE)-$(VERSION)" -s 8 | ||||
|  | ||||
| $(srcdir)/libvirtd.8.in: libvirtd.pod.in $(top_srcdir)/configure.ac | ||||
| 	$(AM_V_GEN)$(POD2MAN) --name LIBVIRTD $< $@ \ | ||||
| 	    && if grep 'POD ERROR' $@ ; then rm $@; exit 1; fi | ||||
|  | ||||
| # This is needed for clients too, so can't wrap in | ||||
| # the WITH_LIBVIRTD conditional | ||||
| if WITH_SASL | ||||
| install-data-sasl: | ||||
| 	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sasl2/ | ||||
| 	$(INSTALL_DATA) $(srcdir)/libvirtd.sasl \ | ||||
| 		$(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf | ||||
|  | ||||
| uninstall-data-sasl: | ||||
| 	rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf | ||||
| 	rmdir $(DESTDIR)$(sysconfdir)/sasl2/ || : | ||||
| else ! WITH_SASL | ||||
| install-data-sasl: | ||||
| uninstall-data-sasl: | ||||
| endif ! WITH_SASL | ||||
|  | ||||
|  | ||||
| CLEANFILES += $(BUILT_SOURCES) $(man8_MANS) | ||||
| CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda | ||||
| MAINTAINERCLEANFILES = $(srcdir)/libvirtd.8.in $(DAEMON_GENERATED) | ||||
							
								
								
									
										52
									
								
								daemon/THREADS.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								daemon/THREADS.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
|  | ||||
|      Threading in the libvirtd daemon | ||||
|      ================================ | ||||
|  | ||||
| To allow efficient processing of RPC requests, the libvirtd daemon | ||||
| makes use of threads. | ||||
|  | ||||
|  - The process leader. This is the initial thread of control | ||||
|    when the daemon starts running. It is responsible for | ||||
|    initializing all the state, and starting the event loop. | ||||
|    Once that's all done, this thread does nothing except | ||||
|    wait for the event loop to quit, thus indicating an orderly | ||||
|    shutdown is required. | ||||
|  | ||||
|  - The event loop. This thread runs the event loop, sitting | ||||
|    in poll() on all monitored file handles, and calculating | ||||
|    and dispatching any timers that may be registered. When | ||||
|    this thread quits, the entire daemon will shutdown. | ||||
|  | ||||
|  - The workers. These 'n' threads all sit around waiting to | ||||
|    process incoming RPC requests. Since RPC requests may take | ||||
|    a long time to complete, with long idle periods, there will | ||||
|    be quite a few workers running. | ||||
|  | ||||
| The use of threads obviously requires locking to ensure safety when | ||||
| accessing/changing data structures. | ||||
|  | ||||
|  - the top level lock is on 'struct qemud_server'. This must be | ||||
|    held before acquiring any other lock | ||||
|  | ||||
|  - Each 'struct qemud_client' object has a lock. The server lock | ||||
|    must be held before acquiring it. Once the client lock is acquired | ||||
|    the server lock can (optionally) be dropped. | ||||
|  | ||||
|  - The event loop has its own self-contained lock. You can ignore | ||||
|    this as a caller of virEvent APIs. | ||||
|  | ||||
|  | ||||
| The server lock is used in conjunction with a condition variable | ||||
| to pass jobs from the event loop thread to the workers. The main | ||||
| event loop thread handles I/O from the client socket, and once a | ||||
| complete RPC message has been read off the wire (and optionally | ||||
| decrypted), it will be placed on the 'dx' job queue for the | ||||
| associated client object. The job condition will be signalled and | ||||
| a worker will wakup and process it. | ||||
|  | ||||
| The worker thread must quickly drop its locks on the server and | ||||
| client to allow the main event loop thread to continue running | ||||
| with its other work. Critically important, is that now libvirt | ||||
| API call will ever be made with the server or client locks held. | ||||
|  | ||||
| -- End | ||||
							
								
								
									
										117
									
								
								daemon/admin_server.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								daemon/admin_server.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| /* | ||||
|  * admin_server.c: | ||||
|  * | ||||
|  * Copyright (C) 2014-2015 Red Hat, Inc. | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Martin Kletzander <mkletzan@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include "internal.h" | ||||
| #include "libvirtd.h" | ||||
| #include "libvirt_internal.h" | ||||
|  | ||||
| #include "admin_protocol.h" | ||||
| #include "admin_server.h" | ||||
| #include "datatypes.h" | ||||
| #include "viralloc.h" | ||||
| #include "virerror.h" | ||||
| #include "virlog.h" | ||||
| #include "virnetdaemon.h" | ||||
| #include "virnetserver.h" | ||||
| #include "virstring.h" | ||||
| #include "virthreadjob.h" | ||||
|  | ||||
| #define VIR_FROM_THIS VIR_FROM_ADMIN | ||||
|  | ||||
| VIR_LOG_INIT("daemon.admin"); | ||||
|  | ||||
|  | ||||
| void | ||||
| remoteAdmClientFreeFunc(void *data) | ||||
| { | ||||
|     struct daemonAdmClientPrivate *priv = data; | ||||
|  | ||||
|     virMutexDestroy(&priv->lock); | ||||
|     virObjectUnref(priv->dmn); | ||||
|     VIR_FREE(priv); | ||||
| } | ||||
|  | ||||
| void * | ||||
| remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED, | ||||
|                         void *opaque) | ||||
| { | ||||
|     struct daemonAdmClientPrivate *priv; | ||||
|  | ||||
|     if (VIR_ALLOC(priv) < 0) | ||||
|         return NULL; | ||||
|  | ||||
|     if (virMutexInit(&priv->lock) < 0) { | ||||
|         VIR_FREE(priv); | ||||
|         virReportSystemError(errno, "%s", _("unable to init mutex")); | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * We don't necessarily need to ref this object right now as there | ||||
|      * must be one ref being held throughout the life of the daemon, | ||||
|      * but let's just be safe for future. | ||||
|      */ | ||||
|     priv->dmn = virObjectRef(opaque); | ||||
|  | ||||
|     return priv; | ||||
| } | ||||
|  | ||||
| /* Functions */ | ||||
| static int | ||||
| adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED, | ||||
|                          virNetServerClientPtr client, | ||||
|                          virNetMessagePtr msg ATTRIBUTE_UNUSED, | ||||
|                          virNetMessageErrorPtr rerr, | ||||
|                          struct admin_connect_open_args *args) | ||||
| { | ||||
|     unsigned int flags; | ||||
|     struct daemonAdmClientPrivate *priv = | ||||
|         virNetServerClientGetPrivateData(client); | ||||
|     int ret = -1; | ||||
|  | ||||
|     VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn); | ||||
|     virMutexLock(&priv->lock); | ||||
|  | ||||
|     flags = args->flags; | ||||
|     virCheckFlagsGoto(0, cleanup); | ||||
|  | ||||
|     ret = 0; | ||||
|  cleanup: | ||||
|     if (ret < 0) | ||||
|         virNetMessageSaveError(rerr); | ||||
|     virMutexUnlock(&priv->lock); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static int | ||||
| adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED, | ||||
|                           virNetServerClientPtr client, | ||||
|                           virNetMessagePtr msg ATTRIBUTE_UNUSED, | ||||
|                           virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED) | ||||
| { | ||||
|     virNetServerClientDelayedClose(client); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #include "admin_dispatch.h" | ||||
							
								
								
									
										36
									
								
								daemon/admin_server.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								daemon/admin_server.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| /* | ||||
|  * admin_server.h | ||||
|  * | ||||
|  * Copyright (C) 2014 Red Hat, Inc. | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Martin Kletzander <mkletzan@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef __LIBVIRTD_ADMIN_H__ | ||||
| # define __LIBVIRTD_ADMIN_H__ | ||||
|  | ||||
| # include "rpc/virnetserverprogram.h" | ||||
| # include "rpc/virnetserverclient.h" | ||||
|  | ||||
|  | ||||
| extern virNetServerProgramProc adminProcs[]; | ||||
| extern size_t adminNProcs; | ||||
|  | ||||
| void remoteAdmClientFreeFunc(void *data); | ||||
| void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque); | ||||
|  | ||||
| #endif /* __ADMIN_REMOTE_H__ */ | ||||
							
								
								
									
										526
									
								
								daemon/libvirtd-config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										526
									
								
								daemon/libvirtd-config.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,526 @@ | ||||
| /* | ||||
|  * libvirtd-config.c: daemon start of day, guest process & i/o management | ||||
|  * | ||||
|  * Copyright (C) 2006-2012, 2014, 2015 Red Hat, Inc. | ||||
|  * Copyright (C) 2006 Daniel P. Berrange | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include "libvirtd-config.h" | ||||
| #include "virconf.h" | ||||
| #include "viralloc.h" | ||||
| #include "virerror.h" | ||||
| #include "virlog.h" | ||||
| #include "rpc/virnetserver.h" | ||||
| #include "configmake.h" | ||||
| #include "remote/remote_protocol.h" | ||||
| #include "remote/remote_driver.h" | ||||
| #include "virstring.h" | ||||
| #include "virutil.h" | ||||
|  | ||||
| #define VIR_FROM_THIS VIR_FROM_CONF | ||||
|  | ||||
| VIR_LOG_INIT("daemon.libvirtd-config"); | ||||
|  | ||||
| /* Allocate an array of malloc'd strings from the config file, filename | ||||
|  * (used only in diagnostics), using handle "conf".  Upon error, return -1 | ||||
|  * and free any allocated memory.  Otherwise, save the array in *list_arg | ||||
|  * and return 0. | ||||
|  */ | ||||
| static int | ||||
| remoteConfigGetStringList(virConfPtr conf, const char *key, char ***list_arg, | ||||
|                           const char *filename) | ||||
| { | ||||
|     char **list; | ||||
|     virConfValuePtr p = virConfGetValue(conf, key); | ||||
|     if (!p) | ||||
|         return 0; | ||||
|  | ||||
|     switch (p->type) { | ||||
|     case VIR_CONF_STRING: | ||||
|         if (VIR_ALLOC_N(list, 2) < 0) { | ||||
|             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                            _("failed to allocate memory for %s config list"), | ||||
|                            key); | ||||
|             return -1; | ||||
|         } | ||||
|         if (VIR_STRDUP(list[0], p->str) < 0) { | ||||
|             VIR_FREE(list); | ||||
|             return -1; | ||||
|         } | ||||
|         list[1] = NULL; | ||||
|         break; | ||||
|  | ||||
|     case VIR_CONF_LIST: { | ||||
|         int len = 0; | ||||
|         size_t i; | ||||
|         virConfValuePtr pp; | ||||
|         for (pp = p->list; pp; pp = pp->next) | ||||
|             len++; | ||||
|         if (VIR_ALLOC_N(list, 1+len) < 0) { | ||||
|             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                            _("failed to allocate memory for %s config list"), | ||||
|                            key); | ||||
|             return -1; | ||||
|         } | ||||
|         for (i = 0, pp = p->list; pp; ++i, pp = pp->next) { | ||||
|             if (pp->type != VIR_CONF_STRING) { | ||||
|                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                                _("remoteReadConfigFile: %s: %s:" | ||||
|                                  " must be a string or list of strings"), | ||||
|                                filename, key); | ||||
|                 VIR_FREE(list); | ||||
|                 return -1; | ||||
|             } | ||||
|             if (VIR_STRDUP(list[i], pp->str) < 0) { | ||||
|                 size_t j; | ||||
|                 for (j = 0; j < i; j++) | ||||
|                     VIR_FREE(list[j]); | ||||
|                 VIR_FREE(list); | ||||
|                 return -1; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|         list[i] = NULL; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     default: | ||||
|         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                        _("remoteReadConfigFile: %s: %s:" | ||||
|                          " must be a string or list of strings"), | ||||
|                        filename, key); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     *list_arg = list; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* A helper function used by each of the following macros.  */ | ||||
| static int | ||||
| checkType(virConfValuePtr p, const char *filename, | ||||
|           const char *key, virConfType required_type) | ||||
| { | ||||
|     if (p->type != required_type) { | ||||
|         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                        _("remoteReadConfigFile: %s: %s: invalid type:" | ||||
|                          " got %s; expected %s"), filename, key, | ||||
|                        virConfTypeToString(p->type), | ||||
|                        virConfTypeToString(required_type)); | ||||
|         return -1; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* If there is no config data for the key, #var_name, then do nothing. | ||||
|    If there is valid data of type VIR_CONF_STRING, and VIR_STRDUP succeeds, | ||||
|    store the result in var_name.  Otherwise, (i.e. invalid type, or VIR_STRDUP | ||||
|    failure), give a diagnostic and "goto" the cleanup-and-fail label.  */ | ||||
| #define GET_CONF_STR(conf, filename, var_name)                          \ | ||||
|     do {                                                                \ | ||||
|         virConfValuePtr p = virConfGetValue(conf, #var_name);           \ | ||||
|         if (p) {                                                        \ | ||||
|             if (checkType(p, filename, #var_name, VIR_CONF_STRING) < 0) \ | ||||
|                 goto error;                                             \ | ||||
|             VIR_FREE(data->var_name);                                   \ | ||||
|             if (VIR_STRDUP(data->var_name, p->str) < 0)                 \ | ||||
|                 goto error;                                             \ | ||||
|         }                                                               \ | ||||
|     } while (0) | ||||
|  | ||||
| /* Like GET_CONF_STR, but for signed integral values.  */ | ||||
| #define GET_CONF_INT(conf, filename, var_name)                          \ | ||||
|     do {                                                                \ | ||||
|         virConfValuePtr p = virConfGetValue(conf, #var_name);           \ | ||||
|         if (p) {                                                        \ | ||||
|             if (p->type != VIR_CONF_ULONG &&                            \ | ||||
|                 checkType(p, filename, #var_name, VIR_CONF_LONG) < 0)   \ | ||||
|                 goto error;                                             \ | ||||
|             data->var_name = p->l;                                      \ | ||||
|         }                                                               \ | ||||
|     } while (0) | ||||
|  | ||||
| /* Like GET_CONF_STR, but for unsigned integral values.  */ | ||||
| #define GET_CONF_UINT(conf, filename, var_name)                         \ | ||||
|     do {                                                                \ | ||||
|         virConfValuePtr p = virConfGetValue(conf, #var_name);           \ | ||||
|         if (p) {                                                        \ | ||||
|             if (checkType(p, filename, #var_name, VIR_CONF_ULONG) < 0)  \ | ||||
|                 goto error;                                             \ | ||||
|             data->var_name = p->l;                                      \ | ||||
|         }                                                               \ | ||||
|     } while (0) | ||||
|  | ||||
|  | ||||
|  | ||||
| static int | ||||
| remoteConfigGetAuth(virConfPtr conf, | ||||
|                     const char *key, | ||||
|                     int *auth, | ||||
|                     const char *filename) | ||||
| { | ||||
|     virConfValuePtr p; | ||||
|  | ||||
|     p = virConfGetValue(conf, key); | ||||
|     if (!p) | ||||
|         return 0; | ||||
|  | ||||
|     if (checkType(p, filename, key, VIR_CONF_STRING) < 0) | ||||
|         return -1; | ||||
|  | ||||
|     if (!p->str) | ||||
|         return 0; | ||||
|  | ||||
|     if (STREQ(p->str, "none")) { | ||||
|         *auth = VIR_NET_SERVER_SERVICE_AUTH_NONE; | ||||
| #if WITH_SASL | ||||
|     } else if (STREQ(p->str, "sasl")) { | ||||
|         *auth = VIR_NET_SERVER_SERVICE_AUTH_SASL; | ||||
| #endif | ||||
|     } else if (STREQ(p->str, "polkit")) { | ||||
|         *auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT; | ||||
|     } else { | ||||
|         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, | ||||
|                        _("remoteReadConfigFile: %s: %s: unsupported auth %s"), | ||||
|                        filename, key, p->str); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| daemonConfigFilePath(bool privileged, char **configfile) | ||||
| { | ||||
|     if (privileged) { | ||||
|         if (VIR_STRDUP(*configfile, SYSCONFDIR "/libvirt/libvirtd.conf") < 0) | ||||
|             goto error; | ||||
|     } else { | ||||
|         char *configdir = NULL; | ||||
|  | ||||
|         if (!(configdir = virGetUserConfigDirectory())) | ||||
|             goto error; | ||||
|  | ||||
|         if (virAsprintf(configfile, "%s/libvirtd.conf", configdir) < 0) { | ||||
|             VIR_FREE(configdir); | ||||
|             goto error; | ||||
|         } | ||||
|         VIR_FREE(configdir); | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
|  | ||||
|  error: | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| struct daemonConfig* | ||||
| daemonConfigNew(bool privileged ATTRIBUTE_UNUSED) | ||||
| { | ||||
|     struct daemonConfig *data; | ||||
|     char *localhost; | ||||
|     int ret; | ||||
|  | ||||
|     if (VIR_ALLOC(data) < 0) | ||||
|         return NULL; | ||||
|  | ||||
|     data->listen_tls = 1; | ||||
|     data->listen_tcp = 0; | ||||
|  | ||||
|     if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 || | ||||
|         VIR_STRDUP(data->tcp_port, LIBVIRTD_TCP_PORT) < 0) | ||||
|         goto error; | ||||
|  | ||||
|     /* Only default to PolicyKit if running as root */ | ||||
| #if WITH_POLKIT | ||||
|     if (privileged) { | ||||
|         data->auth_unix_rw = REMOTE_AUTH_POLKIT; | ||||
|         data->auth_unix_ro = REMOTE_AUTH_POLKIT; | ||||
|     } else { | ||||
| #endif | ||||
|         data->auth_unix_rw = REMOTE_AUTH_NONE; | ||||
|         data->auth_unix_ro = REMOTE_AUTH_NONE; | ||||
| #if WITH_POLKIT | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     if (VIR_STRDUP(data->unix_sock_rw_perms, | ||||
|                    data->auth_unix_rw == REMOTE_AUTH_POLKIT ? "0777" : "0700") < 0 || | ||||
|         VIR_STRDUP(data->unix_sock_ro_perms, "0777") < 0 || | ||||
|         VIR_STRDUP(data->unix_sock_admin_perms, "0700") < 0) | ||||
|         goto error; | ||||
|  | ||||
| #if WITH_SASL | ||||
|     data->auth_tcp = REMOTE_AUTH_SASL; | ||||
| #else | ||||
|     data->auth_tcp = REMOTE_AUTH_NONE; | ||||
| #endif | ||||
|     data->auth_tls = REMOTE_AUTH_NONE; | ||||
|  | ||||
|     data->mdns_adv = 0; | ||||
|  | ||||
|     data->min_workers = 5; | ||||
|     data->max_workers = 20; | ||||
|     data->max_clients = 5000; | ||||
|     data->max_anonymous_clients = 20; | ||||
|  | ||||
|     data->prio_workers = 5; | ||||
|  | ||||
|     data->max_requests = 20; | ||||
|     data->max_client_requests = 5; | ||||
|  | ||||
|     data->audit_level = 1; | ||||
|     data->audit_logging = 0; | ||||
|  | ||||
|     data->keepalive_interval = 5; | ||||
|     data->keepalive_count = 5; | ||||
|     data->keepalive_required = 0; | ||||
|  | ||||
|     data->admin_min_workers = 5; | ||||
|     data->admin_max_workers = 20; | ||||
|     data->admin_max_clients = 5000; | ||||
|     data->admin_max_queued_clients = 20; | ||||
|     data->admin_max_client_requests = 5; | ||||
|  | ||||
|     data->admin_keepalive_interval = 5; | ||||
|     data->admin_keepalive_count = 5; | ||||
|     data->admin_keepalive_required = 0; | ||||
|  | ||||
|     localhost = virGetHostname(); | ||||
|     if (localhost == NULL) { | ||||
|         /* we couldn't resolve the hostname; assume that we are | ||||
|          * running in disconnected operation, and report a less | ||||
|          * useful Avahi string | ||||
|          */ | ||||
|         ret = VIR_STRDUP(data->mdns_name, "Virtualization Host"); | ||||
|     } else { | ||||
|         char *tmp; | ||||
|         /* Extract the host part of the potentially FQDN */ | ||||
|         if ((tmp = strchr(localhost, '.'))) | ||||
|             *tmp = '\0'; | ||||
|         ret = virAsprintf(&data->mdns_name, "Virtualization Host %s", | ||||
|                           localhost); | ||||
|     } | ||||
|     VIR_FREE(localhost); | ||||
|     if (ret < 0) | ||||
|         goto error; | ||||
|  | ||||
|     return data; | ||||
|  | ||||
|  error: | ||||
|     daemonConfigFree(data); | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| void | ||||
| daemonConfigFree(struct daemonConfig *data) | ||||
| { | ||||
|     char **tmp; | ||||
|  | ||||
|     if (!data) | ||||
|         return; | ||||
|  | ||||
|     VIR_FREE(data->listen_addr); | ||||
|     VIR_FREE(data->tls_port); | ||||
|     VIR_FREE(data->tcp_port); | ||||
|     tmp = data->access_drivers; | ||||
|     while (tmp && *tmp) { | ||||
|         VIR_FREE(*tmp); | ||||
|         tmp++; | ||||
|     } | ||||
|     VIR_FREE(data->access_drivers); | ||||
|  | ||||
|     VIR_FREE(data->unix_sock_admin_perms); | ||||
|     VIR_FREE(data->unix_sock_ro_perms); | ||||
|     VIR_FREE(data->unix_sock_rw_perms); | ||||
|     VIR_FREE(data->unix_sock_group); | ||||
|     VIR_FREE(data->unix_sock_dir); | ||||
|     VIR_FREE(data->mdns_name); | ||||
|  | ||||
|     tmp = data->tls_allowed_dn_list; | ||||
|     while (tmp && *tmp) { | ||||
|         VIR_FREE(*tmp); | ||||
|         tmp++; | ||||
|     } | ||||
|     VIR_FREE(data->tls_allowed_dn_list); | ||||
|  | ||||
|     tmp = data->sasl_allowed_username_list; | ||||
|     while (tmp && *tmp) { | ||||
|         VIR_FREE(*tmp); | ||||
|         tmp++; | ||||
|     } | ||||
|     VIR_FREE(data->sasl_allowed_username_list); | ||||
|  | ||||
|     VIR_FREE(data->key_file); | ||||
|     VIR_FREE(data->ca_file); | ||||
|     VIR_FREE(data->cert_file); | ||||
|     VIR_FREE(data->crl_file); | ||||
|  | ||||
|     VIR_FREE(data->host_uuid); | ||||
|     VIR_FREE(data->log_filters); | ||||
|     VIR_FREE(data->log_outputs); | ||||
|  | ||||
|     VIR_FREE(data); | ||||
| } | ||||
|  | ||||
| static int | ||||
| daemonConfigLoadOptions(struct daemonConfig *data, | ||||
|                         const char *filename, | ||||
|                         virConfPtr conf) | ||||
| { | ||||
|     GET_CONF_UINT(conf, filename, listen_tcp); | ||||
|     GET_CONF_UINT(conf, filename, listen_tls); | ||||
|     GET_CONF_STR(conf, filename, tls_port); | ||||
|     GET_CONF_STR(conf, filename, tcp_port); | ||||
|     GET_CONF_STR(conf, filename, listen_addr); | ||||
|  | ||||
|     if (remoteConfigGetAuth(conf, "auth_unix_rw", &data->auth_unix_rw, filename) < 0) | ||||
|         goto error; | ||||
| #if WITH_POLKIT | ||||
|     /* Change default perms to be wide-open if PolicyKit is enabled. | ||||
|      * Admin can always override in config file | ||||
|      */ | ||||
|     if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) { | ||||
|         VIR_FREE(data->unix_sock_rw_perms); | ||||
|         if (VIR_STRDUP(data->unix_sock_rw_perms, "0777") < 0) | ||||
|             goto error; | ||||
|     } | ||||
| #endif | ||||
|     if (remoteConfigGetAuth(conf, "auth_unix_ro", &data->auth_unix_ro, filename) < 0) | ||||
|         goto error; | ||||
|     if (remoteConfigGetAuth(conf, "auth_tcp", &data->auth_tcp, filename) < 0) | ||||
|         goto error; | ||||
|     if (remoteConfigGetAuth(conf, "auth_tls", &data->auth_tls, filename) < 0) | ||||
|         goto error; | ||||
|  | ||||
|     if (remoteConfigGetStringList(conf, "access_drivers", | ||||
|                                   &data->access_drivers, filename) < 0) | ||||
|         goto error; | ||||
|  | ||||
|     GET_CONF_STR(conf, filename, unix_sock_group); | ||||
|     GET_CONF_STR(conf, filename, unix_sock_admin_perms); | ||||
|     GET_CONF_STR(conf, filename, unix_sock_ro_perms); | ||||
|     GET_CONF_STR(conf, filename, unix_sock_rw_perms); | ||||
|  | ||||
|     GET_CONF_STR(conf, filename, unix_sock_dir); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, mdns_adv); | ||||
|     GET_CONF_STR(conf, filename, mdns_name); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, tls_no_sanity_certificate); | ||||
|     GET_CONF_UINT(conf, filename, tls_no_verify_certificate); | ||||
|  | ||||
|     GET_CONF_STR(conf, filename, key_file); | ||||
|     GET_CONF_STR(conf, filename, cert_file); | ||||
|     GET_CONF_STR(conf, filename, ca_file); | ||||
|     GET_CONF_STR(conf, filename, crl_file); | ||||
|  | ||||
|     if (remoteConfigGetStringList(conf, "tls_allowed_dn_list", | ||||
|                                   &data->tls_allowed_dn_list, filename) < 0) | ||||
|         goto error; | ||||
|  | ||||
|  | ||||
|     if (remoteConfigGetStringList(conf, "sasl_allowed_username_list", | ||||
|                                   &data->sasl_allowed_username_list, filename) < 0) | ||||
|         goto error; | ||||
|  | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, min_workers); | ||||
|     GET_CONF_UINT(conf, filename, max_workers); | ||||
|     GET_CONF_UINT(conf, filename, max_clients); | ||||
|     GET_CONF_UINT(conf, filename, max_queued_clients); | ||||
|     GET_CONF_UINT(conf, filename, max_anonymous_clients); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, prio_workers); | ||||
|  | ||||
|     GET_CONF_INT(conf, filename, max_requests); | ||||
|     GET_CONF_UINT(conf, filename, max_client_requests); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, admin_min_workers); | ||||
|     GET_CONF_UINT(conf, filename, admin_max_workers); | ||||
|     GET_CONF_UINT(conf, filename, admin_max_clients); | ||||
|     GET_CONF_UINT(conf, filename, admin_max_queued_clients); | ||||
|     GET_CONF_UINT(conf, filename, admin_max_client_requests); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, audit_level); | ||||
|     GET_CONF_UINT(conf, filename, audit_logging); | ||||
|  | ||||
|     GET_CONF_STR(conf, filename, host_uuid); | ||||
|  | ||||
|     GET_CONF_UINT(conf, filename, log_level); | ||||
|     GET_CONF_STR(conf, filename, log_filters); | ||||
|     GET_CONF_STR(conf, filename, log_outputs); | ||||
|  | ||||
|     GET_CONF_INT(conf, filename, keepalive_interval); | ||||
|     GET_CONF_UINT(conf, filename, keepalive_count); | ||||
|     GET_CONF_UINT(conf, filename, keepalive_required); | ||||
|  | ||||
|     GET_CONF_INT(conf, filename, admin_keepalive_interval); | ||||
|     GET_CONF_UINT(conf, filename, admin_keepalive_count); | ||||
|     GET_CONF_UINT(conf, filename, admin_keepalive_required); | ||||
|  | ||||
|     return 0; | ||||
|  | ||||
|  error: | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Read the config file if it exists. | ||||
|  * Only used in the remote case, hence the name. | ||||
|  */ | ||||
| int | ||||
| daemonConfigLoadFile(struct daemonConfig *data, | ||||
|                      const char *filename, | ||||
|                      bool allow_missing) | ||||
| { | ||||
|     virConfPtr conf; | ||||
|     int ret; | ||||
|  | ||||
|     if (allow_missing && | ||||
|         access(filename, R_OK) == -1 && | ||||
|         errno == ENOENT) | ||||
|         return 0; | ||||
|  | ||||
|     conf = virConfReadFile(filename, 0); | ||||
|     if (!conf) | ||||
|         return -1; | ||||
|  | ||||
|     ret = daemonConfigLoadOptions(data, filename, conf); | ||||
|     virConfFree(conf); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int daemonConfigLoadData(struct daemonConfig *data, | ||||
|                          const char *filename, | ||||
|                          const char *filedata) | ||||
| { | ||||
|     virConfPtr conf; | ||||
|     int ret; | ||||
|  | ||||
|     conf = virConfReadMem(filedata, strlen(filedata), 0); | ||||
|     if (!conf) | ||||
|         return -1; | ||||
|  | ||||
|     ret = daemonConfigLoadOptions(data, filename, conf); | ||||
|     virConfFree(conf); | ||||
|     return ret; | ||||
| } | ||||
							
								
								
									
										108
									
								
								daemon/libvirtd-config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								daemon/libvirtd-config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| /* | ||||
|  * libvirtd-config.h: daemon start of day, guest process & i/o management | ||||
|  * | ||||
|  * Copyright (C) 2006-2012, 2015 Red Hat, Inc. | ||||
|  * Copyright (C) 2006 Daniel P. Berrange | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef __LIBVIRTD_CONFIG_H__ | ||||
| # define __LIBVIRTD_CONFIG_H__ | ||||
|  | ||||
| # include "internal.h" | ||||
|  | ||||
| struct daemonConfig { | ||||
|     char *host_uuid; | ||||
|  | ||||
|     int listen_tls; | ||||
|     int listen_tcp; | ||||
|     char *listen_addr; | ||||
|     char *tls_port; | ||||
|     char *tcp_port; | ||||
|  | ||||
|     char *unix_sock_admin_perms; | ||||
|     char *unix_sock_ro_perms; | ||||
|     char *unix_sock_rw_perms; | ||||
|     char *unix_sock_group; | ||||
|     char *unix_sock_dir; | ||||
|  | ||||
|     int auth_unix_rw; | ||||
|     int auth_unix_ro; | ||||
|     int auth_tcp; | ||||
|     int auth_tls; | ||||
|  | ||||
|     char **access_drivers; | ||||
|  | ||||
|     int mdns_adv; | ||||
|     char *mdns_name; | ||||
|  | ||||
|     int tls_no_verify_certificate; | ||||
|     int tls_no_sanity_certificate; | ||||
|     char **tls_allowed_dn_list; | ||||
|     char **sasl_allowed_username_list; | ||||
|  | ||||
|     char *key_file; | ||||
|     char *cert_file; | ||||
|     char *ca_file; | ||||
|     char *crl_file; | ||||
|  | ||||
|     int min_workers; | ||||
|     int max_workers; | ||||
|     int max_clients; | ||||
|     int max_queued_clients; | ||||
|     int max_anonymous_clients; | ||||
|  | ||||
|     int prio_workers; | ||||
|  | ||||
|     int max_requests; | ||||
|     int max_client_requests; | ||||
|  | ||||
|     int log_level; | ||||
|     char *log_filters; | ||||
|     char *log_outputs; | ||||
|  | ||||
|     int audit_level; | ||||
|     int audit_logging; | ||||
|  | ||||
|     int keepalive_interval; | ||||
|     unsigned int keepalive_count; | ||||
|     int keepalive_required; | ||||
|  | ||||
|     int admin_min_workers; | ||||
|     int admin_max_workers; | ||||
|     int admin_max_clients; | ||||
|     int admin_max_queued_clients; | ||||
|     int admin_max_client_requests; | ||||
|  | ||||
|     int admin_keepalive_interval; | ||||
|     unsigned int admin_keepalive_count; | ||||
|     int admin_keepalive_required; | ||||
| }; | ||||
|  | ||||
|  | ||||
| int daemonConfigFilePath(bool privileged, char **configfile); | ||||
| struct daemonConfig* daemonConfigNew(bool privileged); | ||||
| void daemonConfigFree(struct daemonConfig *data); | ||||
| int daemonConfigLoadFile(struct daemonConfig *data, | ||||
|                          const char *filename, | ||||
|                          bool allow_missing); | ||||
| int daemonConfigLoadData(struct daemonConfig *data, | ||||
|                          const char *filename, | ||||
|                          const char *filedata); | ||||
|  | ||||
| #endif /* __LIBVIRTD_CONFIG_H__ */ | ||||
| @@ -13,7 +13,7 @@ module Libvirtd = | ||||
| 
 | ||||
|    let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\"" | ||||
|    let bool_val = store /0|1/ | ||||
|    let int_val = store /-?[0-9]+/ | ||||
|    let int_val = store /[0-9]+/ | ||||
|    let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ "" | ||||
|    let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end | ||||
| 
 | ||||
| @@ -53,13 +53,13 @@ module Libvirtd = | ||||
|                            | str_array_entry "tls_allowed_dn_list" | ||||
|                            | str_array_entry "sasl_allowed_username_list" | ||||
|                            | str_array_entry "access_drivers" | ||||
|                            | str_entry "tls_priority" | ||||
| 
 | ||||
|    let processing_entry = int_entry "min_workers" | ||||
|                         | int_entry "max_workers" | ||||
|                         | int_entry "max_clients" | ||||
|                         | int_entry "max_queued_clients" | ||||
|                         | int_entry "max_anonymous_clients" | ||||
|                         | int_entry "max_requests" | ||||
|                         | int_entry "max_client_requests" | ||||
|                         | int_entry "prio_workers" | ||||
| 
 | ||||
| @@ -86,8 +86,6 @@ module Libvirtd = | ||||
|                              | bool_entry "admin_keepalive_required" | ||||
| 
 | ||||
|    let misc_entry = str_entry "host_uuid" | ||||
|                   | str_entry "host_uuid_source" | ||||
|                   | int_entry "ovs_timeout" | ||||
| 
 | ||||
|    (* Each enty in the config is one of the following three ... *) | ||||
|    let entry = network_entry | ||||
							
								
								
									
										1625
									
								
								daemon/libvirtd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1625
									
								
								daemon/libvirtd.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										453
									
								
								daemon/libvirtd.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										453
									
								
								daemon/libvirtd.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,453 @@ | ||||
| # Master libvirt daemon configuration file | ||||
| # | ||||
| # For further information consult http://libvirt.org/format.html | ||||
| # | ||||
| # NOTE: the tests/daemon-conf regression test script requires | ||||
| # that each "PARAMETER = VALUE" line in this file have the parameter | ||||
| # name just after a leading "#". | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # Network connectivity controls | ||||
| # | ||||
|  | ||||
| # Flag listening for secure TLS connections on the public TCP/IP port. | ||||
| # NB, must pass the --listen flag to the libvirtd process for this to | ||||
| # have any effect. | ||||
| # | ||||
| # It is necessary to setup a CA and issue server certificates before | ||||
| # using this capability. | ||||
| # | ||||
| # This is enabled by default, uncomment this to disable it | ||||
| #listen_tls = 0 | ||||
|  | ||||
| # Listen for unencrypted TCP connections on the public TCP/IP port. | ||||
| # NB, must pass the --listen flag to the libvirtd process for this to | ||||
| # have any effect. | ||||
| # | ||||
| # Using the TCP socket requires SASL authentication by default. Only | ||||
| # SASL mechanisms which support data encryption are allowed. This is | ||||
| # DIGEST_MD5 and GSSAPI (Kerberos5) | ||||
| # | ||||
| # This is disabled by default, uncomment this to enable it. | ||||
| #listen_tcp = 1 | ||||
|  | ||||
|  | ||||
|  | ||||
| # Override the port for accepting secure TLS connections | ||||
| # This can be a port number, or service name | ||||
| # | ||||
| #tls_port = "16514" | ||||
|  | ||||
| # Override the port for accepting insecure TCP connections | ||||
| # This can be a port number, or service name | ||||
| # | ||||
| #tcp_port = "16509" | ||||
|  | ||||
|  | ||||
| # Override the default configuration which binds to all network | ||||
| # interfaces. This can be a numeric IPv4/6 address, or hostname | ||||
| # | ||||
| # If the libvirtd service is started in parallel with network | ||||
| # startup (e.g. with systemd), binding to addresses other than | ||||
| # the wildcards (0.0.0.0/::) might not be available yet. | ||||
| # | ||||
| #listen_addr = "192.168.0.1" | ||||
|  | ||||
|  | ||||
| # Flag toggling mDNS advertizement of the libvirt service. | ||||
| # | ||||
| # Alternatively can disable for all services on a host by | ||||
| # stopping the Avahi daemon | ||||
| # | ||||
| # This is disabled by default, uncomment this to enable it | ||||
| #mdns_adv = 1 | ||||
|  | ||||
| # Override the default mDNS advertizement name. This must be | ||||
| # unique on the immediate broadcast network. | ||||
| # | ||||
| # The default is "Virtualization Host HOSTNAME", where HOSTNAME | ||||
| # is substituted for the short hostname of the machine (without domain) | ||||
| # | ||||
| #mdns_name = "Virtualization Host Joe Demo" | ||||
|  | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # UNIX socket access controls | ||||
| # | ||||
|  | ||||
| # Beware that if you are changing *any* of these options, and you use | ||||
| # socket activation with systemd, you need to adjust the settings in | ||||
| # the libvirtd.socket file as well since it could impose a security | ||||
| # risk if you rely on file permission checking only. | ||||
|  | ||||
| # Set the UNIX domain socket group ownership. This can be used to | ||||
| # allow a 'trusted' set of users access to management capabilities | ||||
| # without becoming root. | ||||
| # | ||||
| # This is restricted to 'root' by default. | ||||
| #unix_sock_group = "libvirt" | ||||
|  | ||||
| # Set the UNIX socket permissions for the R/O socket. This is used | ||||
| # for monitoring VM status only | ||||
| # | ||||
| # Default allows any user. If setting group ownership, you may want to | ||||
| # restrict this too. | ||||
| #unix_sock_ro_perms = "0777" | ||||
|  | ||||
| # Set the UNIX socket permissions for the R/W socket. This is used | ||||
| # for full management of VMs | ||||
| # | ||||
| # Default allows only root. If PolicyKit is enabled on the socket, | ||||
| # the default will change to allow everyone (eg, 0777) | ||||
| # | ||||
| # If not using PolicyKit and setting group ownership for access | ||||
| # control, then you may want to relax this too. | ||||
| #unix_sock_rw_perms = "0770" | ||||
|  | ||||
| # Set the UNIX socket permissions for the admin interface socket. | ||||
| # | ||||
| # Default allows only owner (root), do not change it unless you are | ||||
| # sure to whom you are exposing the access to. | ||||
| #unix_sock_admin_perms = "0700" | ||||
|  | ||||
| # Set the name of the directory in which sockets will be found/created. | ||||
| #unix_sock_dir = "/var/run/libvirt" | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # Authentication. | ||||
| # | ||||
| #  - none: do not perform auth checks. If you can connect to the | ||||
| #          socket you are allowed. This is suitable if there are | ||||
| #          restrictions on connecting to the socket (eg, UNIX | ||||
| #          socket permissions), or if there is a lower layer in | ||||
| #          the network providing auth (eg, TLS/x509 certificates) | ||||
| # | ||||
| #  - sasl: use SASL infrastructure. The actual auth scheme is then | ||||
| #          controlled from /etc/sasl2/libvirt.conf. For the TCP | ||||
| #          socket only GSSAPI & DIGEST-MD5 mechanisms will be used. | ||||
| #          For non-TCP or TLS sockets, any scheme is allowed. | ||||
| # | ||||
| #  - polkit: use PolicyKit to authenticate. This is only suitable | ||||
| #            for use on the UNIX sockets. The default policy will | ||||
| #            require a user to supply their own password to gain | ||||
| #            full read/write access (aka sudo like), while anyone | ||||
| #            is allowed read/only access. | ||||
| # | ||||
| # Set an authentication scheme for UNIX read-only sockets | ||||
| # By default socket permissions allow anyone to connect | ||||
| # | ||||
| # To restrict monitoring of domains you may wish to enable | ||||
| # an authentication mechanism here | ||||
| #auth_unix_ro = "none" | ||||
|  | ||||
| # Set an authentication scheme for UNIX read-write sockets | ||||
| # By default socket permissions only allow root. If PolicyKit | ||||
| # support was compiled into libvirt, the default will be to | ||||
| # use 'polkit' auth. | ||||
| # | ||||
| # If the unix_sock_rw_perms are changed you may wish to enable | ||||
| # an authentication mechanism here | ||||
| #auth_unix_rw = "none" | ||||
|  | ||||
| # Change the authentication scheme for TCP sockets. | ||||
| # | ||||
| # If you don't enable SASL, then all TCP traffic is cleartext. | ||||
| # Don't do this outside of a dev/test scenario. For real world | ||||
| # use, always enable SASL and use the GSSAPI or DIGEST-MD5 | ||||
| # mechanism in /etc/sasl2/libvirt.conf | ||||
| #auth_tcp = "sasl" | ||||
|  | ||||
| # Change the authentication scheme for TLS sockets. | ||||
| # | ||||
| # TLS sockets already have encryption provided by the TLS | ||||
| # layer, and limited authentication is done by certificates | ||||
| # | ||||
| # It is possible to make use of any SASL authentication | ||||
| # mechanism as well, by using 'sasl' for this option | ||||
| #auth_tls = "none" | ||||
|  | ||||
|  | ||||
| # Change the API access control scheme | ||||
| # | ||||
| # By default an authenticated user is allowed access | ||||
| # to all APIs. Access drivers can place restrictions | ||||
| # on this. By default the 'nop' driver is enabled, | ||||
| # meaning no access control checks are done once a | ||||
| # client has authenticated with libvirtd | ||||
| # | ||||
| #access_drivers = [ "polkit" ] | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # TLS x509 certificate configuration | ||||
| # | ||||
|  | ||||
|  | ||||
| # Override the default server key file path | ||||
| # | ||||
| #key_file = "/etc/pki/libvirt/private/serverkey.pem" | ||||
|  | ||||
| # Override the default server certificate file path | ||||
| # | ||||
| #cert_file = "/etc/pki/libvirt/servercert.pem" | ||||
|  | ||||
| # Override the default CA certificate path | ||||
| # | ||||
| #ca_file = "/etc/pki/CA/cacert.pem" | ||||
|  | ||||
| # Specify a certificate revocation list. | ||||
| # | ||||
| # Defaults to not using a CRL, uncomment to enable it | ||||
| #crl_file = "/etc/pki/CA/crl.pem" | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # Authorization controls | ||||
| # | ||||
|  | ||||
|  | ||||
| # Flag to disable verification of our own server certificates | ||||
| # | ||||
| # When libvirtd starts it performs some sanity checks against | ||||
| # its own certificates. | ||||
| # | ||||
| # Default is to always run sanity checks. Uncommenting this | ||||
| # will disable sanity checks which is not a good idea | ||||
| #tls_no_sanity_certificate = 1 | ||||
|  | ||||
| # Flag to disable verification of client certificates | ||||
| # | ||||
| # Client certificate verification is the primary authentication mechanism. | ||||
| # Any client which does not present a certificate signed by the CA | ||||
| # will be rejected. | ||||
| # | ||||
| # Default is to always verify. Uncommenting this will disable | ||||
| # verification - make sure an IP whitelist is set | ||||
| #tls_no_verify_certificate = 1 | ||||
|  | ||||
|  | ||||
| # A whitelist of allowed x509 Distinguished Names | ||||
| # This list may contain wildcards such as | ||||
| # | ||||
| #    "C=GB,ST=London,L=London,O=Red Hat,CN=*" | ||||
| # | ||||
| # See the POSIX fnmatch function for the format of the wildcards. | ||||
| # | ||||
| # NB If this is an empty list, no client can connect, so comment out | ||||
| # entirely rather than using empty list to disable these checks | ||||
| # | ||||
| # By default, no DN's are checked | ||||
| #tls_allowed_dn_list = ["DN1", "DN2"] | ||||
|  | ||||
|  | ||||
| # A whitelist of allowed SASL usernames. The format for usernames | ||||
| # depends on the SASL authentication mechanism. Kerberos usernames | ||||
| # look like username@REALM | ||||
| # | ||||
| # This list may contain wildcards such as | ||||
| # | ||||
| #    "*@EXAMPLE.COM" | ||||
| # | ||||
| # See the POSIX fnmatch function for the format of the wildcards. | ||||
| # | ||||
| # NB If this is an empty list, no client can connect, so comment out | ||||
| # entirely rather than using empty list to disable these checks | ||||
| # | ||||
| # By default, no Username's are checked | ||||
| #sasl_allowed_username_list = ["joe@EXAMPLE.COM", "fred@EXAMPLE.COM" ] | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # Processing controls | ||||
| # | ||||
|  | ||||
| # The maximum number of concurrent client connections to allow | ||||
| # over all sockets combined. | ||||
| #max_clients = 5000 | ||||
|  | ||||
| # The maximum length of queue of connections waiting to be | ||||
| # accepted by the daemon. Note, that some protocols supporting | ||||
| # retransmission may obey this so that a later reattempt at | ||||
| # connection succeeds. | ||||
| #max_queued_clients = 1000 | ||||
|  | ||||
| # The maximum length of queue of accepted but not yet | ||||
| # authenticated clients. The default value is zero, meaning | ||||
| # the feature is disabled. | ||||
| #max_anonymous_clients = 20 | ||||
|  | ||||
| # The minimum limit sets the number of workers to start up | ||||
| # initially. If the number of active clients exceeds this, | ||||
| # then more threads are spawned, up to max_workers limit. | ||||
| # Typically you'd want max_workers to equal maximum number | ||||
| # of clients allowed | ||||
| #min_workers = 5 | ||||
| #max_workers = 20 | ||||
|  | ||||
|  | ||||
| # The number of priority workers. If all workers from above | ||||
| # pool are stuck, some calls marked as high priority | ||||
| # (notably domainDestroy) can be executed in this pool. | ||||
| #prio_workers = 5 | ||||
|  | ||||
| # Total global limit on concurrent RPC calls. Should be | ||||
| # at least as large as max_workers. Beyond this, RPC requests | ||||
| # will be read into memory and queued. This directly impacts | ||||
| # memory usage, currently each request requires 256 KB of | ||||
| # memory. So by default up to 5 MB of memory is used | ||||
| # | ||||
| # XXX this isn't actually enforced yet, only the per-client | ||||
| # limit is used so far | ||||
| #max_requests = 20 | ||||
|  | ||||
| # Limit on concurrent requests from a single client | ||||
| # connection. To avoid one client monopolizing the server | ||||
| # this should be a small fraction of the global max_requests | ||||
| # and max_workers parameter | ||||
| #max_client_requests = 5 | ||||
|  | ||||
| # Same processing controls, but this time for the admin interface. | ||||
| # For description of each option, be so kind to scroll few lines | ||||
| # upwards. | ||||
|  | ||||
| #admin_min_workers = 1 | ||||
| #admin_max_workers = 5 | ||||
| #admin_max_clients = 5 | ||||
| #admin_max_queued_clients = 5 | ||||
| #admin_max_client_requests = 5 | ||||
|  | ||||
| ################################################################# | ||||
| # | ||||
| # Logging controls | ||||
| # | ||||
|  | ||||
| # Logging level: 4 errors, 3 warnings, 2 information, 1 debug | ||||
| # basically 1 will log everything possible | ||||
| # Note: Journald may employ rate limiting of the messages logged | ||||
| # and thus lock up the libvirt daemon. To use the debug level with | ||||
| # journald you have to specify it explicitly in 'log_outputs', otherwise | ||||
| # only information level messages will be logged. | ||||
| #log_level = 3 | ||||
|  | ||||
| # Logging filters: | ||||
| # A filter allows to select a different logging level for a given category | ||||
| # of logs | ||||
| # The format for a filter is one of: | ||||
| #    x:name | ||||
| #    x:+name | ||||
| #      where name is a string which is matched against source file name, | ||||
| #      e.g., "remote", "qemu", or "util/json", the optional "+" prefix | ||||
| #      tells libvirt to log stack trace for each message matching name, | ||||
| #      and x is the minimal level where matching messages should be logged: | ||||
| #    1: DEBUG | ||||
| #    2: INFO | ||||
| #    3: WARNING | ||||
| #    4: ERROR | ||||
| # | ||||
| # Multiple filters can be defined in a single @filters, they just need to be | ||||
| # separated by spaces. | ||||
| # | ||||
| # e.g. to only get warning or errors from the remote layer and only errors | ||||
| # from the event layer: | ||||
| #log_filters="3:remote 4:event" | ||||
|  | ||||
| # Logging outputs: | ||||
| # An output is one of the places to save logging information | ||||
| # The format for an output can be: | ||||
| #    x:stderr | ||||
| #      output goes to stderr | ||||
| #    x:syslog:name | ||||
| #      use syslog for the output and use the given name as the ident | ||||
| #    x:file:file_path | ||||
| #      output to a file, with the given filepath | ||||
| #    x:journald | ||||
| #      output to journald logging system | ||||
| # In all case the x prefix is the minimal level, acting as a filter | ||||
| #    1: DEBUG | ||||
| #    2: INFO | ||||
| #    3: WARNING | ||||
| #    4: ERROR | ||||
| # | ||||
| # Multiple outputs can be defined, they just need to be separated by spaces. | ||||
| # e.g. to log all warnings and errors to syslog under the libvirtd ident: | ||||
| #log_outputs="3:syslog:libvirtd" | ||||
| # | ||||
|  | ||||
| # Log debug buffer size: | ||||
| # | ||||
| # This configuration option is no longer used, since the global | ||||
| # log buffer functionality has been removed. Please configure | ||||
| # suitable log_outputs/log_filters settings to obtain logs. | ||||
| #log_buffer_size = 64 | ||||
|  | ||||
|  | ||||
| ################################################################## | ||||
| # | ||||
| # Auditing | ||||
| # | ||||
| # This setting allows usage of the auditing subsystem to be altered: | ||||
| # | ||||
| #   audit_level == 0  -> disable all auditing | ||||
| #   audit_level == 1  -> enable auditing, only if enabled on host (default) | ||||
| #   audit_level == 2  -> enable auditing, and exit if disabled on host | ||||
| # | ||||
| #audit_level = 2 | ||||
| # | ||||
| # If set to 1, then audit messages will also be sent | ||||
| # via libvirt logging infrastructure. Defaults to 0 | ||||
| # | ||||
| #audit_logging = 1 | ||||
|  | ||||
| ################################################################### | ||||
| # UUID of the host: | ||||
| # Provide the UUID of the host here in case the command | ||||
| # 'dmidecode -s system-uuid' does not provide a valid uuid. In case | ||||
| # 'dmidecode' does not provide a valid UUID and none is provided here, a | ||||
| # temporary UUID will be generated. | ||||
| # Keep the format of the example UUID below. UUID must not have all digits | ||||
| # be the same. | ||||
|  | ||||
| # NB This default all-zeros UUID will not work. Replace | ||||
| # it with the output of the 'uuidgen' command and then | ||||
| # uncomment this entry | ||||
| #host_uuid = "00000000-0000-0000-0000-000000000000" | ||||
|  | ||||
| ################################################################### | ||||
| # Keepalive protocol: | ||||
| # This allows libvirtd to detect broken client connections or even | ||||
| # dead clients.  A keepalive message is sent to a client after | ||||
| # keepalive_interval seconds of inactivity to check if the client is | ||||
| # still responding; keepalive_count is a maximum number of keepalive | ||||
| # messages that are allowed to be sent to the client without getting | ||||
| # any response before the connection is considered broken.  In other | ||||
| # words, the connection is automatically closed approximately after | ||||
| # keepalive_interval * (keepalive_count + 1) seconds since the last | ||||
| # message received from the client.  If keepalive_interval is set to | ||||
| # -1, libvirtd will never send keepalive requests; however clients | ||||
| # can still send them and the daemon will send responses.  When | ||||
| # keepalive_count is set to 0, connections will be automatically | ||||
| # closed after keepalive_interval seconds of inactivity without | ||||
| # sending any keepalive messages. | ||||
| # | ||||
| #keepalive_interval = 5 | ||||
| #keepalive_count = 5 | ||||
| # | ||||
| # If set to 1, libvirtd will refuse to talk to clients that do not | ||||
| # support keepalive protocol.  Defaults to 0. | ||||
| # | ||||
| #keepalive_required = 1 | ||||
|  | ||||
| # Keepalive settings for the admin interface | ||||
| #admin_keepalive_interval = 5 | ||||
| #admin_keepalive_count = 5 | ||||
| # | ||||
| #admin_keepalive_required = 1 | ||||
							
								
								
									
										92
									
								
								daemon/libvirtd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								daemon/libvirtd.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| /* | ||||
|  * libvirtd.h: daemon data structure definitions | ||||
|  * | ||||
|  * Copyright (C) 2006-2015 Red Hat, Inc. | ||||
|  * Copyright (C) 2006 Daniel P. Berrange | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef LIBVIRTD_H__ | ||||
| # define LIBVIRTD_H__ | ||||
|  | ||||
| # define VIR_ENUM_SENTINELS | ||||
|  | ||||
| # include <rpc/types.h> | ||||
| # include <rpc/xdr.h> | ||||
| # include "remote_protocol.h" | ||||
| # include "admin_protocol.h" | ||||
| # include "lxc_protocol.h" | ||||
| # include "qemu_protocol.h" | ||||
| # include "virthread.h" | ||||
|  | ||||
| # if WITH_SASL | ||||
| #  include "virnetsaslcontext.h" | ||||
| # endif | ||||
| # include "virnetserverprogram.h" | ||||
|  | ||||
| typedef struct daemonClientStream daemonClientStream; | ||||
| typedef daemonClientStream *daemonClientStreamPtr; | ||||
| typedef struct daemonClientPrivate daemonClientPrivate; | ||||
| typedef daemonClientPrivate *daemonClientPrivatePtr; | ||||
| typedef struct daemonAdmClientPrivate daemonAdmClientPrivate; | ||||
| typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr; | ||||
| typedef struct daemonClientEventCallback daemonClientEventCallback; | ||||
| typedef daemonClientEventCallback *daemonClientEventCallbackPtr; | ||||
|  | ||||
| /* Stores the per-client connection state */ | ||||
| struct daemonClientPrivate { | ||||
|     /* Hold while accessing any data except conn */ | ||||
|     virMutex lock; | ||||
|  | ||||
|     daemonClientEventCallbackPtr *domainEventCallbacks; | ||||
|     size_t ndomainEventCallbacks; | ||||
|     daemonClientEventCallbackPtr *networkEventCallbacks; | ||||
|     size_t nnetworkEventCallbacks; | ||||
|     daemonClientEventCallbackPtr *qemuEventCallbacks; | ||||
|     size_t nqemuEventCallbacks; | ||||
|  | ||||
| # if WITH_SASL | ||||
|     virNetSASLSessionPtr sasl; | ||||
| # endif | ||||
|  | ||||
|     /* This is only valid if a remote open call has been made on this | ||||
|      * connection, otherwise it will be NULL.  Also if remote close is | ||||
|      * called, it will be set back to NULL if that succeeds. | ||||
|      */ | ||||
|     virConnectPtr conn; | ||||
|  | ||||
|     daemonClientStreamPtr streams; | ||||
|     bool keepalive_supported; | ||||
| }; | ||||
|  | ||||
| /* Separate private data for admin connection */ | ||||
| struct daemonAdmClientPrivate { | ||||
|     /* Just a placeholder, not that there is anything to be locked */ | ||||
|     virMutex lock; | ||||
|  | ||||
|     virNetDaemonPtr dmn; | ||||
| }; | ||||
|  | ||||
| # if WITH_SASL | ||||
| extern virNetSASLContextPtr saslCtxt; | ||||
| # endif | ||||
| extern virNetServerProgramPtr remoteProgram; | ||||
| extern virNetServerProgramPtr qemuProgram; | ||||
|  | ||||
| #endif | ||||
| @@ -1,20 +1,23 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| # the following is the LSB init header see | ||||
| # http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html | ||||
| # http://www.linux-foundation.org/spec//booksets/LSB-Core-generic/LSB-Core-generic.html#INITSCRCOMCONV | ||||
| # | ||||
| ### BEGIN INIT INFO | ||||
| # Provides: libvirtd | ||||
| # Required-Start: $network messagebus | ||||
| # Should-Start: $named | ||||
| # Should-Start: xend | ||||
| # Should-Start: avahi-daemon | ||||
| # Should-Start: virtlockd | ||||
| # Required-Stop: $network messagebus | ||||
| # Should-Stop: $named | ||||
| # Default-Start: 3 4 5 | ||||
| # Default-Stop: 0 1 2 6 | ||||
| # Required-Start: $network messagebus virtlogd | ||||
| # Required-Stop: $network messagebus | ||||
| # Should-Start: $named xend avahi-daemon virtlockd | ||||
| # Should-Stop: $named | ||||
| # Short-Description: daemon for libvirt virtualization API | ||||
| # Description: This is a daemon for managing guest instances | ||||
| #              and libvirt virtual networks | ||||
| #              See https://libvirt.org | ||||
| #              See http://libvirt.org | ||||
| ### END INIT INFO | ||||
| 
 | ||||
| # the following is chkconfig init header | ||||
| @@ -24,7 +27,7 @@ | ||||
| # chkconfig: 345 97 03 | ||||
| # description:  This is a daemon for managing guest instances \ | ||||
| #               and libvirt virtual networks \ | ||||
| #               See https://libvirt.org | ||||
| #               See http://libvirt.org | ||||
| # | ||||
| # processname: libvirtd | ||||
| # pidfile: @localstatedir@/run/libvirtd.pid | ||||
| @@ -5,4 +5,5 @@ | ||||
|         compress | ||||
|         delaycompress | ||||
|         copytruncate | ||||
|         minsize 100k | ||||
| } | ||||
| @@ -5,4 +5,5 @@ | ||||
|         compress | ||||
|         delaycompress | ||||
|         copytruncate | ||||
|         minsize 100k | ||||
| } | ||||
							
								
								
									
										208
									
								
								daemon/libvirtd.pod.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								daemon/libvirtd.pod.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,208 @@ | ||||
| =head1 NAME | ||||
|  | ||||
| libvirtd - libvirtd management daemon | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| B<libvirtd> [ -dlv ] [ -f config_file ] [ -p pid_file ] [ -t timeout_seconds ] | ||||
|  | ||||
| B<libvirtd> --version | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| The B<libvirtd> program is the server side daemon component of the libvirt | ||||
| virtualization management system. | ||||
|  | ||||
| This daemon runs on host servers and performs required management tasks for | ||||
| virtualized guests.  This includes activities such as starting, stopping | ||||
| and migrating guests between host servers, configuring and manipulating | ||||
| networking, and managing storage for use by guests. | ||||
|  | ||||
| The libvirt client libraries and utilities connect to this daemon to issue | ||||
| tasks and collect information about the configuration and resources of the host | ||||
| system and guests. | ||||
|  | ||||
| By default, the libvirtd daemon listens for requests on a local Unix domain | ||||
| socket.  Using the B<-l>|B<--listen> command line option, the libvirtd daemon | ||||
| can be instructed to additionally listen on a TCP/IP socket.  The TCP/IP socket | ||||
| to use is defined in the libvirtd configuration file. | ||||
|  | ||||
| Restarting libvirtd does not impact running guests.  Guests continue to operate | ||||
| and will be picked up automatically if their XML configuration has been | ||||
| defined.  Any guests whose XML configuration has not been defined will be lost | ||||
| from the configuration. | ||||
|  | ||||
| =head1 OPTIONS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item B<-h, --help> | ||||
|  | ||||
| Display command line help usage then exit. | ||||
|  | ||||
| =item B<-d, --daemon> | ||||
|  | ||||
| Run as a daemon & write PID file. | ||||
|  | ||||
| =item B<-f, --config> I<FILE> | ||||
|  | ||||
| Use this configuration file, overriding the default value. | ||||
|  | ||||
| =item B<-l, --listen> | ||||
|  | ||||
| Listen for TCP/IP connections. | ||||
|  | ||||
| =item B<-p, --pid-file> I<FILE> | ||||
|  | ||||
| Use this name for the PID file, overriding the default value. | ||||
|  | ||||
| =item B<-t, --timeout> I<SECONDS> | ||||
|  | ||||
| Exit after timeout period (in seconds) elapse with no client connections | ||||
| or registered resources.  Be aware that resources such as autostart | ||||
| networks will result in never reaching the timeout, even when there are | ||||
| no client connections. | ||||
|  | ||||
| =item B<-v, --verbose> | ||||
|  | ||||
| Enable output of verbose messages. | ||||
|  | ||||
| =item B<    --version> | ||||
|  | ||||
| Display version information then exit. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 SIGNALS | ||||
|  | ||||
| On receipt of B<SIGHUP> libvirtd will reload its configuration. | ||||
|  | ||||
| =head1 FILES | ||||
|  | ||||
| =head2 When run as B<root>. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<SYSCONFDIR/libvirtd.conf> | ||||
|  | ||||
| The default configuration file used by libvirtd, unless overridden on the | ||||
| command line using the B<-f>|B<--config> option. | ||||
|  | ||||
| =item F<LOCALSTATEDIR/run/libvirt/libvirt-sock> | ||||
|  | ||||
| =item F<LOCALSTATEDIR/run/libvirt/libvirt-sock-ro> | ||||
|  | ||||
| The sockets libvirtd will use. | ||||
|  | ||||
| =item F<SYSCONFDIR/pki/CA/cacert.pem> | ||||
|  | ||||
| The TLS B<Certificate Authority> certificate libvirtd will use. | ||||
|  | ||||
| =item F<SYSCONFDIR/pki/libvirt/servercert.pem> | ||||
|  | ||||
| The TLS B<Server> certificate libvirtd will use. | ||||
|  | ||||
| =item F<SYSCONFDIR/pki/libvirt/private/serverkey.pem> | ||||
|  | ||||
| The TLS B<Server> private key libvirtd will use. | ||||
|  | ||||
| =item F<LOCALSTATEDIR/run/libvirtd.pid> | ||||
|  | ||||
| The PID file to use, unless overridden by the B<-p>|B<--pid-file> option. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 When run as B<non-root>. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<$XDG_CONFIG_HOME/libvirtd.conf> | ||||
|  | ||||
| The default configuration file used by libvirtd, unless overridden on the | ||||
| command line using the B<-f>|B<--config> option. | ||||
|  | ||||
| =item F<$XDG_RUNTIME_DIR/libvirt/libvirt-sock> | ||||
|  | ||||
| The socket libvirtd will use. | ||||
|  | ||||
| =item F<$HOME/.pki/libvirt/cacert.pem> | ||||
|  | ||||
| The TLS B<Certificate Authority> certificate libvirtd will use. | ||||
|  | ||||
| =item F<$HOME/.pki/libvirt/servercert.pem> | ||||
|  | ||||
| The TLS B<Server> certificate libvirtd will use. | ||||
|  | ||||
| =item F<$HOME/.pki/libvirt/serverkey.pem> | ||||
|  | ||||
| The TLS B<Server> private key libvirtd will use. | ||||
|  | ||||
| =item F<$XDG_RUNTIME_DIR/libvirt/libvirtd.pid> | ||||
|  | ||||
| The PID file to use, unless overridden by the B<-p>|B<--pid-file> option. | ||||
|  | ||||
| =item If $XDG_CONFIG_HOME is not set in your environment, libvirtd will use F<$HOME/.config> | ||||
|  | ||||
| =item If $XDG_RUNTIME_DIR is not set in your environment, libvirtd will use F<$HOME/.cache> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 EXAMPLES | ||||
|  | ||||
| To retrieve the version of libvirtd: | ||||
|  | ||||
|  # libvirtd --version | ||||
|  libvirtd (libvirt) 0.8.2 | ||||
|  # | ||||
|  | ||||
| To start libvirtd, instructing it to daemonize and create a PID file: | ||||
|  | ||||
|  # libvirtd -d | ||||
|  # ls -la LOCALSTATEDIR/run/libvirtd.pid | ||||
|  -rw-r--r-- 1 root root 6 Jul  9 02:40 LOCALSTATEDIR/run/libvirtd.pid | ||||
|  # | ||||
|  | ||||
| =head1 BUGS | ||||
|  | ||||
| Please report all bugs you discover.  This should be done via either: | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item a) the mailing list | ||||
|  | ||||
| L<http://libvirt.org/contact.html> | ||||
|  | ||||
| =item or, | ||||
|  | ||||
| B<> | ||||
|  | ||||
| =item b) the bug tracker | ||||
|  | ||||
| L<http://libvirt.org/bugs.html> | ||||
|  | ||||
| =item Alternatively, you may report bugs to your software distributor / vendor. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Please refer to the AUTHORS file distributed with libvirt. | ||||
|  | ||||
| =head1 COPYRIGHT | ||||
|  | ||||
| Copyright (C) 2006-2012 Red Hat, Inc., and the authors listed in the | ||||
| libvirt AUTHORS file. | ||||
|  | ||||
| =head1 LICENSE | ||||
|  | ||||
| libvirtd is distributed under the terms of the GNU LGPL v2.1+. | ||||
| This is free software; see the source for copying conditions. There | ||||
| is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||||
| PURPOSE | ||||
|  | ||||
| =head1 SEE ALSO | ||||
|  | ||||
| L<virsh(1)>, L<virt-install(1)>, L<virt-xml-validate(1)>, L<virt-top(1)>, | ||||
| L<virt-df(1)>, L<http://www.libvirt.org/> | ||||
|  | ||||
| =cut | ||||
| @@ -5,4 +5,5 @@ | ||||
|         compress | ||||
|         delaycompress | ||||
|         copytruncate | ||||
|         minsize 100k | ||||
| } | ||||
							
								
								
									
										31
									
								
								daemon/libvirtd.sasl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								daemon/libvirtd.sasl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| # If you want to use the non-TLS socket, then you *must* include | ||||
| # the GSSAPI or DIGEST-MD5 mechanisms, because they are the only | ||||
| # ones that can offer session encryption as well as authentication. | ||||
| # | ||||
| # If you're only using TLS, then you can turn on any mechanisms | ||||
| # you like for authentication, because TLS provides the encryption | ||||
| # | ||||
| # Default to a simple username+password mechanism | ||||
| mech_list: digest-md5 | ||||
|  | ||||
| # Before you can use GSSAPI, you need a service principle on the | ||||
| # KDC server for libvirt, and that to be exported to the keytab | ||||
| # file listed below | ||||
| #mech_list: gssapi | ||||
| # | ||||
| # You can also list many mechanisms at once, then the user can choose | ||||
| # by adding  '?auth=sasl.gssapi' to their libvirt URI, eg | ||||
| #   qemu+tcp://hostname/system?auth=sasl.gssapi | ||||
| #mech_list: digest-md5 gssapi | ||||
|  | ||||
| # Some older builds of MIT kerberos on Linux ignore this option & | ||||
| # instead need KRB5_KTNAME env var. | ||||
| # For modern Linux, and other OS, this should be sufficient | ||||
| # | ||||
| # There is no default value here, uncomment if you need this | ||||
| #keytab: /etc/libvirt/krb5.tab | ||||
|  | ||||
| # If using digest-md5 for username/passwds, then this is the file | ||||
| # containing the passwds. Use 'saslpasswd2 -a libvirt [username]' | ||||
| # to add entries, and 'sasldblistusers2 -f [sasldb_path]' to browse it | ||||
| sasldb_path: /etc/libvirt/passwd.db | ||||
							
								
								
									
										22
									
								
								daemon/libvirtd.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								daemon/libvirtd.service.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| [Unit] | ||||
| Description=Virtualization daemon | ||||
| Before=libvirt-guests.service | ||||
| After=network.target | ||||
| After=dbus.service | ||||
| After=iscsid.service | ||||
| After=apparmor.service | ||||
| Documentation=man:libvirtd(8) | ||||
| Documentation=http://libvirt.org | ||||
|  | ||||
| [Service] | ||||
| Type=notify | ||||
| EnvironmentFile=-/etc/sysconfig/libvirtd | ||||
| ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS | ||||
| ExecReload=/bin/kill -HUP $MAINPID | ||||
| KillMode=process | ||||
| Restart=on-failure | ||||
| # Override the maximum number of opened files | ||||
| #LimitNOFILE=2048 | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
							
								
								
									
										11
									
								
								daemon/libvirtd.socket.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								daemon/libvirtd.socket.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| [Socket] | ||||
| ListenStream=@runstatedir@/libvirt/libvirt-sock | ||||
| ListenStream=@runstatedir@/libvirt/libvirt-sock-ro | ||||
|  | ||||
| ; The following settings must match libvirtd.conf file in order to | ||||
| ; work as expected because libvirtd can't change them later. | ||||
| ; SocketMode=0777 is safe only if authentication on the socket is set | ||||
| ; up.  For further information, please see the libvirtd.conf file. | ||||
| SocketMode=0777 | ||||
| SocketUser=root | ||||
| SocketGroup=root | ||||
| @@ -5,4 +5,5 @@ | ||||
|         compress | ||||
|         delaycompress | ||||
|         copytruncate | ||||
|         minsize 100k | ||||
| } | ||||
							
								
								
									
										6834
									
								
								daemon/remote.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6834
									
								
								daemon/remote.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										45
									
								
								daemon/remote.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								daemon/remote.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * remote.h: handlers for RPC method calls | ||||
|  * | ||||
|  * Copyright (C) 2007, 2008, 2009 Red Hat, Inc. | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Richard W.M. Jones <rjones@redhat.com> | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef __LIBVIRTD_REMOTE_H__ | ||||
| # define __LIBVIRTD_REMOTE_H__ | ||||
|  | ||||
| # include "remote_protocol.h" | ||||
| # include "rpc/virnetserverprogram.h" | ||||
| # include "rpc/virnetserverclient.h" | ||||
|  | ||||
|  | ||||
| extern virNetServerProgramProc remoteProcs[]; | ||||
| extern size_t remoteNProcs; | ||||
|  | ||||
| extern virNetServerProgramProc lxcProcs[]; | ||||
| extern size_t lxcNProcs; | ||||
|  | ||||
| extern virNetServerProgramProc qemuProcs[]; | ||||
| extern size_t qemuNProcs; | ||||
|  | ||||
| void remoteClientFreeFunc(void *data); | ||||
| void *remoteClientInitHook(virNetServerClientPtr client, | ||||
|                            void *opaque); | ||||
|  | ||||
| #endif /* __LIBVIRTD_REMOTE_H__ */ | ||||
							
								
								
									
										777
									
								
								daemon/stream.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										777
									
								
								daemon/stream.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,777 @@ | ||||
| /* | ||||
|  * stream.c: APIs for managing client streams | ||||
|  * | ||||
|  * Copyright (C) 2009-2014 Red Hat, Inc. | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include "stream.h" | ||||
| #include "remote.h" | ||||
| #include "viralloc.h" | ||||
| #include "virlog.h" | ||||
| #include "virnetserverclient.h" | ||||
| #include "virerror.h" | ||||
|  | ||||
| #define VIR_FROM_THIS VIR_FROM_STREAMS | ||||
|  | ||||
| VIR_LOG_INIT("daemon.stream"); | ||||
|  | ||||
| struct daemonClientStream { | ||||
|     daemonClientPrivatePtr priv; | ||||
|     int refs; | ||||
|  | ||||
|     virNetServerProgramPtr prog; | ||||
|  | ||||
|     virStreamPtr st; | ||||
|     int procedure; | ||||
|     int serial; | ||||
|  | ||||
|     unsigned int recvEOF : 1; | ||||
|     unsigned int closed : 1; | ||||
|  | ||||
|     int filterID; | ||||
|  | ||||
|     virNetMessagePtr rx; | ||||
|     int tx; | ||||
|  | ||||
|     daemonClientStreamPtr next; | ||||
| }; | ||||
|  | ||||
| static int | ||||
| daemonStreamHandleWrite(virNetServerClientPtr client, | ||||
|                         daemonClientStream *stream); | ||||
| static int | ||||
| daemonStreamHandleRead(virNetServerClientPtr client, | ||||
|                        daemonClientStream *stream); | ||||
| static int | ||||
| daemonStreamHandleFinish(virNetServerClientPtr client, | ||||
|                          daemonClientStream *stream, | ||||
|                          virNetMessagePtr msg); | ||||
| static int | ||||
| daemonStreamHandleAbort(virNetServerClientPtr client, | ||||
|                         daemonClientStream *stream, | ||||
|                         virNetMessagePtr msg); | ||||
|  | ||||
|  | ||||
|  | ||||
| static void | ||||
| daemonStreamUpdateEvents(daemonClientStream *stream) | ||||
| { | ||||
|     int newEvents = 0; | ||||
|     if (stream->rx) | ||||
|         newEvents |= VIR_STREAM_EVENT_WRITABLE; | ||||
|     if (stream->tx && !stream->recvEOF) | ||||
|         newEvents |= VIR_STREAM_EVENT_READABLE; | ||||
|  | ||||
|     virStreamEventUpdateCallback(stream->st, newEvents); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Invoked when an outgoing data packet message has been fully sent. | ||||
|  * This simply re-enables TX of further data. | ||||
|  * | ||||
|  * The idea is to stop the daemon growing without bound due to | ||||
|  * fast stream, but slow client | ||||
|  */ | ||||
| static void | ||||
| daemonStreamMessageFinished(virNetMessagePtr msg ATTRIBUTE_UNUSED, | ||||
|                             void *opaque) | ||||
| { | ||||
|     daemonClientStream *stream = opaque; | ||||
|     VIR_DEBUG("stream=%p proc=%d serial=%d", | ||||
|               stream, msg->header.proc, msg->header.serial); | ||||
|  | ||||
|     stream->tx = 1; | ||||
|     daemonStreamUpdateEvents(stream); | ||||
|  | ||||
|     daemonFreeClientStream(NULL, stream); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Callback that gets invoked when a stream becomes writable/readable | ||||
|  */ | ||||
| static void | ||||
| daemonStreamEvent(virStreamPtr st, int events, void *opaque) | ||||
| { | ||||
|     virNetServerClientPtr client = opaque; | ||||
|     daemonClientStream *stream; | ||||
|     daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client); | ||||
|  | ||||
|     virMutexLock(&priv->lock); | ||||
|  | ||||
|     stream = priv->streams; | ||||
|     while (stream) { | ||||
|         if (stream->st == st) | ||||
|             break; | ||||
|         stream = stream->next; | ||||
|     } | ||||
|  | ||||
|     if (!stream) { | ||||
|         VIR_WARN("event for client=%p stream st=%p, but missing stream state", client, st); | ||||
|         virStreamEventRemoveCallback(st); | ||||
|         goto cleanup; | ||||
|     } | ||||
|  | ||||
|     VIR_DEBUG("st=%p events=%d EOF=%d closed=%d", st, events, stream->recvEOF, stream->closed); | ||||
|  | ||||
|     if (!stream->closed && | ||||
|         (events & VIR_STREAM_EVENT_WRITABLE)) { | ||||
|         if (daemonStreamHandleWrite(client, stream) < 0) { | ||||
|             daemonRemoveClientStream(client, stream); | ||||
|             virNetServerClientClose(client); | ||||
|             goto cleanup; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!stream->closed && !stream->recvEOF && | ||||
|         (events & (VIR_STREAM_EVENT_READABLE))) { | ||||
|         events = events & ~(VIR_STREAM_EVENT_READABLE); | ||||
|         if (daemonStreamHandleRead(client, stream) < 0) { | ||||
|             daemonRemoveClientStream(client, stream); | ||||
|             virNetServerClientClose(client); | ||||
|             goto cleanup; | ||||
|         } | ||||
|         /* If we detected EOF during read processing, | ||||
|          * then clear hangup/error conditions, since | ||||
|          * we want the client to see the EOF message | ||||
|          * we just sent them | ||||
|          */ | ||||
|         if (stream->recvEOF) | ||||
|             events = events & ~(VIR_STREAM_EVENT_HANGUP | | ||||
|                                 VIR_STREAM_EVENT_ERROR); | ||||
|     } | ||||
|  | ||||
|     /* If we have a completion/abort message, always process it */ | ||||
|     if (stream->rx) { | ||||
|         virNetMessagePtr msg = stream->rx; | ||||
|         switch (msg->header.status) { | ||||
|         case VIR_NET_CONTINUE: | ||||
|             /* nada */ | ||||
|             break; | ||||
|         case VIR_NET_OK: | ||||
|             virNetMessageQueueServe(&stream->rx); | ||||
|             if (daemonStreamHandleFinish(client, stream, msg) < 0) { | ||||
|                 virNetMessageFree(msg); | ||||
|                 daemonRemoveClientStream(client, stream); | ||||
|                 virNetServerClientClose(client); | ||||
|                 goto cleanup; | ||||
|             } | ||||
|             break; | ||||
|         case VIR_NET_ERROR: | ||||
|         default: | ||||
|             virNetMessageQueueServe(&stream->rx); | ||||
|             if (daemonStreamHandleAbort(client, stream, msg) < 0) { | ||||
|                 virNetMessageFree(msg); | ||||
|                 daemonRemoveClientStream(client, stream); | ||||
|                 virNetServerClientClose(client); | ||||
|                 goto cleanup; | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /* If we got HANGUP, we need to only send an empty | ||||
|      * packet so the client sees an EOF and cleans up | ||||
|      */ | ||||
|     if (!stream->closed && !stream->recvEOF && | ||||
|         (events & VIR_STREAM_EVENT_HANGUP)) { | ||||
|         virNetMessagePtr msg; | ||||
|         events &= ~(VIR_STREAM_EVENT_HANGUP); | ||||
|         stream->tx = 0; | ||||
|         stream->recvEOF = 1; | ||||
|         if (!(msg = virNetMessageNew(false))) { | ||||
|             daemonRemoveClientStream(client, stream); | ||||
|             virNetServerClientClose(client); | ||||
|             goto cleanup; | ||||
|         } | ||||
|         msg->cb = daemonStreamMessageFinished; | ||||
|         msg->opaque = stream; | ||||
|         stream->refs++; | ||||
|         if (virNetServerProgramSendStreamData(remoteProgram, | ||||
|                                               client, | ||||
|                                               msg, | ||||
|                                               stream->procedure, | ||||
|                                               stream->serial, | ||||
|                                               "", 0) < 0) { | ||||
|             virNetMessageFree(msg); | ||||
|             daemonRemoveClientStream(client, stream); | ||||
|             virNetServerClientClose(client); | ||||
|             goto cleanup; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (!stream->closed && | ||||
|         (events & (VIR_STREAM_EVENT_ERROR | VIR_STREAM_EVENT_HANGUP))) { | ||||
|         int ret; | ||||
|         virNetMessagePtr msg; | ||||
|         virNetMessageError rerr; | ||||
|  | ||||
|         memset(&rerr, 0, sizeof(rerr)); | ||||
|         stream->closed = 1; | ||||
|         virStreamEventRemoveCallback(stream->st); | ||||
|         virStreamAbort(stream->st); | ||||
|         if (events & VIR_STREAM_EVENT_HANGUP) | ||||
|             virReportError(VIR_ERR_RPC, | ||||
|                            "%s", _("stream had unexpected termination")); | ||||
|         else | ||||
|             virReportError(VIR_ERR_RPC, | ||||
|                            "%s", _("stream had I/O failure")); | ||||
|  | ||||
|         msg = virNetMessageNew(false); | ||||
|         if (!msg) { | ||||
|             ret = -1; | ||||
|         } else { | ||||
|             ret = virNetServerProgramSendStreamError(remoteProgram, | ||||
|                                                      client, | ||||
|                                                      msg, | ||||
|                                                      &rerr, | ||||
|                                                      stream->procedure, | ||||
|                                                      stream->serial); | ||||
|         } | ||||
|         daemonRemoveClientStream(client, stream); | ||||
|         if (ret < 0) | ||||
|             virNetServerClientClose(client); | ||||
|         goto cleanup; | ||||
|     } | ||||
|  | ||||
|     if (stream->closed) { | ||||
|         daemonRemoveClientStream(client, stream); | ||||
|     } else { | ||||
|         daemonStreamUpdateEvents(stream); | ||||
|     } | ||||
|  | ||||
|  cleanup: | ||||
|     virMutexUnlock(&priv->lock); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * @client: a locked client object | ||||
|  * | ||||
|  * Invoked by the main loop when filtering incoming messages. | ||||
|  * | ||||
|  * Returns 1 if the message was processed, 0 if skipped, | ||||
|  * -1 on fatal client error | ||||
|  */ | ||||
| static int | ||||
| daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED, | ||||
|                    virNetMessagePtr msg, | ||||
|                    void *opaque) | ||||
| { | ||||
|     daemonClientStream *stream = opaque; | ||||
|     int ret = 0; | ||||
|  | ||||
|     virMutexLock(&stream->priv->lock); | ||||
|  | ||||
|     if (msg->header.type != VIR_NET_STREAM) | ||||
|         goto cleanup; | ||||
|  | ||||
|     if (!virNetServerProgramMatches(stream->prog, msg)) | ||||
|         goto cleanup; | ||||
|  | ||||
|     if (msg->header.proc != stream->procedure || | ||||
|         msg->header.serial != stream->serial) | ||||
|         goto cleanup; | ||||
|  | ||||
|     VIR_DEBUG("Incoming client=%p, rx=%p, serial=%d, proc=%d, status=%d", | ||||
|               client, stream->rx, msg->header.proc, | ||||
|               msg->header.serial, msg->header.status); | ||||
|  | ||||
|     virNetMessageQueuePush(&stream->rx, msg); | ||||
|     daemonStreamUpdateEvents(stream); | ||||
|     ret = 1; | ||||
|  | ||||
|  cleanup: | ||||
|     virMutexUnlock(&stream->priv->lock); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * @conn: a connection object to associate the stream with | ||||
|  * @header: the method call to associate with the stream | ||||
|  * | ||||
|  * Creates a new stream for this conn | ||||
|  * | ||||
|  * Returns a new stream object, or NULL upon OOM | ||||
|  */ | ||||
| daemonClientStream * | ||||
| daemonCreateClientStream(virNetServerClientPtr client, | ||||
|                          virStreamPtr st, | ||||
|                          virNetServerProgramPtr prog, | ||||
|                          virNetMessageHeaderPtr header) | ||||
| { | ||||
|     daemonClientStream *stream; | ||||
|     daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client); | ||||
|  | ||||
|     VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p", | ||||
|               client, header->proc, header->serial, st); | ||||
|  | ||||
|     if (VIR_ALLOC(stream) < 0) | ||||
|         return NULL; | ||||
|  | ||||
|     stream->refs = 1; | ||||
|     stream->priv = priv; | ||||
|     stream->prog = virObjectRef(prog); | ||||
|     stream->procedure = header->proc; | ||||
|     stream->serial = header->serial; | ||||
|     stream->filterID = -1; | ||||
|     stream->st = st; | ||||
|  | ||||
|     return stream; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * @stream: an unused client stream | ||||
|  * | ||||
|  * Frees the memory associated with this inactive client | ||||
|  * stream | ||||
|  */ | ||||
| int daemonFreeClientStream(virNetServerClientPtr client, | ||||
|                            daemonClientStream *stream) | ||||
| { | ||||
|     virNetMessagePtr msg; | ||||
|     int ret = 0; | ||||
|  | ||||
|     if (!stream) | ||||
|         return 0; | ||||
|  | ||||
|     stream->refs--; | ||||
|     if (stream->refs) | ||||
|         return 0; | ||||
|  | ||||
|     VIR_DEBUG("client=%p, proc=%d, serial=%d", | ||||
|               client, stream->procedure, stream->serial); | ||||
|  | ||||
|     virObjectUnref(stream->prog); | ||||
|  | ||||
|     msg = stream->rx; | ||||
|     while (msg) { | ||||
|         virNetMessagePtr tmp = msg->next; | ||||
|         if (client) { | ||||
|             /* Send a dummy reply to free up 'msg' & unblock client rx */ | ||||
|             virNetMessageClear(msg); | ||||
|             msg->header.type = VIR_NET_REPLY; | ||||
|             if (virNetServerClientSendMessage(client, msg) < 0) { | ||||
|                 virNetServerClientImmediateClose(client); | ||||
|                 virNetMessageFree(msg); | ||||
|                 ret = -1; | ||||
|             } | ||||
|         } else { | ||||
|             virNetMessageFree(msg); | ||||
|         } | ||||
|         msg = tmp; | ||||
|     } | ||||
|  | ||||
|     virObjectUnref(stream->st); | ||||
|     VIR_FREE(stream); | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * @client: a locked client to add the stream to | ||||
|  * @stream: a stream to add | ||||
|  */ | ||||
| int daemonAddClientStream(virNetServerClientPtr client, | ||||
|                           daemonClientStream *stream, | ||||
|                           bool transmit) | ||||
| { | ||||
|     VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p, transmit=%d", | ||||
|               client, stream->procedure, stream->serial, stream->st, transmit); | ||||
|     daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client); | ||||
|  | ||||
|     if (stream->filterID != -1) { | ||||
|         VIR_WARN("Filter already added to client %p", client); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if (virStreamEventAddCallback(stream->st, 0, | ||||
|                                   daemonStreamEvent, client, | ||||
|                                   virObjectFreeCallback) < 0) | ||||
|         return -1; | ||||
|  | ||||
|     virObjectRef(client); | ||||
|  | ||||
|     if ((stream->filterID = virNetServerClientAddFilter(client, | ||||
|                                                         daemonStreamFilter, | ||||
|                                                         stream)) < 0) { | ||||
|         virStreamEventRemoveCallback(stream->st); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     if (transmit) | ||||
|         stream->tx = 1; | ||||
|  | ||||
|     virMutexLock(&priv->lock); | ||||
|     stream->next = priv->streams; | ||||
|     priv->streams = stream; | ||||
|  | ||||
|     daemonStreamUpdateEvents(stream); | ||||
|  | ||||
|     virMutexUnlock(&priv->lock); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * @client: a locked client object | ||||
|  * @stream: an inactive, closed stream object | ||||
|  * | ||||
|  * Removes a stream from the list of active streams for the client | ||||
|  * | ||||
|  * Returns 0 if the stream was removd, -1 if it doesn't exist | ||||
|  */ | ||||
| int | ||||
| daemonRemoveClientStream(virNetServerClientPtr client, | ||||
|                          daemonClientStream *stream) | ||||
| { | ||||
|     VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p", | ||||
|               client, stream->procedure, stream->serial, stream->st); | ||||
|     daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client); | ||||
|     daemonClientStream *curr = priv->streams; | ||||
|     daemonClientStream *prev = NULL; | ||||
|  | ||||
|     if (stream->filterID != -1) { | ||||
|         virNetServerClientRemoveFilter(client, | ||||
|                                        stream->filterID); | ||||
|         stream->filterID = -1; | ||||
|     } | ||||
|  | ||||
|     if (!stream->closed) { | ||||
|         virStreamEventRemoveCallback(stream->st); | ||||
|         virStreamAbort(stream->st); | ||||
|     } | ||||
|  | ||||
|     while (curr) { | ||||
|         if (curr == stream) { | ||||
|             if (prev) | ||||
|                 prev->next = curr->next; | ||||
|             else | ||||
|                 priv->streams = curr->next; | ||||
|             return daemonFreeClientStream(client, stream); | ||||
|         } | ||||
|         prev = curr; | ||||
|         curr = curr->next; | ||||
|     } | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
|  | ||||
| void | ||||
| daemonRemoveAllClientStreams(daemonClientStream *stream) | ||||
| { | ||||
|     daemonClientStream *tmp; | ||||
|  | ||||
|     VIR_DEBUG("stream=%p", stream); | ||||
|  | ||||
|     while (stream) { | ||||
|         tmp = stream->next; | ||||
|  | ||||
|         if (!stream->closed) { | ||||
|             virStreamEventRemoveCallback(stream->st); | ||||
|             virStreamAbort(stream->st); | ||||
|         } | ||||
|  | ||||
|         daemonFreeClientStream(NULL, stream); | ||||
|  | ||||
|         VIR_DEBUG("next stream=%p", tmp); | ||||
|         stream = tmp; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Returns: | ||||
|  *   -1  if fatal error occurred | ||||
|  *    0  if message was fully processed | ||||
|  *    1  if message is still being processed | ||||
|  */ | ||||
| static int | ||||
| daemonStreamHandleWriteData(virNetServerClientPtr client, | ||||
|                             daemonClientStream *stream, | ||||
|                             virNetMessagePtr msg) | ||||
| { | ||||
|     int ret; | ||||
|  | ||||
|     VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d, len=%zu, offset=%zu", | ||||
|               client, stream, msg->header.proc, msg->header.serial, | ||||
|               msg->bufferLength, msg->bufferOffset); | ||||
|  | ||||
|     ret = virStreamSend(stream->st, | ||||
|                         msg->buffer + msg->bufferOffset, | ||||
|                         msg->bufferLength - msg->bufferOffset); | ||||
|  | ||||
|     if (ret > 0) { | ||||
|         msg->bufferOffset += ret; | ||||
|  | ||||
|         /* Partial write, so indicate we have more todo later */ | ||||
|         if (msg->bufferOffset < msg->bufferLength) | ||||
|             return 1; | ||||
|     } else if (ret == -2) { | ||||
|         /* Blocking, so indicate we have more todo later */ | ||||
|         return 1; | ||||
|     } else { | ||||
|         virNetMessageError rerr; | ||||
|  | ||||
|         memset(&rerr, 0, sizeof(rerr)); | ||||
|  | ||||
|         VIR_INFO("Stream send failed"); | ||||
|         stream->closed = 1; | ||||
|         return virNetServerProgramSendReplyError(stream->prog, | ||||
|                                                  client, | ||||
|                                                  msg, | ||||
|                                                  &rerr, | ||||
|                                                  &msg->header); | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Process a finish handshake from the client. | ||||
|  * | ||||
|  * Returns a VIR_NET_OK confirmation if successful, or a VIR_NET_ERROR | ||||
|  * if there was a stream error | ||||
|  * | ||||
|  * Returns 0 if successfully sent RPC reply, -1 upon fatal error | ||||
|  */ | ||||
| static int | ||||
| daemonStreamHandleFinish(virNetServerClientPtr client, | ||||
|                          daemonClientStream *stream, | ||||
|                          virNetMessagePtr msg) | ||||
| { | ||||
|     int ret; | ||||
|  | ||||
|     VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d", | ||||
|               client, stream, msg->header.proc, msg->header.serial); | ||||
|  | ||||
|     stream->closed = 1; | ||||
|     virStreamEventRemoveCallback(stream->st); | ||||
|     ret = virStreamFinish(stream->st); | ||||
|  | ||||
|     if (ret < 0) { | ||||
|         virNetMessageError rerr; | ||||
|         memset(&rerr, 0, sizeof(rerr)); | ||||
|         return virNetServerProgramSendReplyError(stream->prog, | ||||
|                                                  client, | ||||
|                                                  msg, | ||||
|                                                  &rerr, | ||||
|                                                  &msg->header); | ||||
|     } else { | ||||
|         /* Send zero-length confirm */ | ||||
|         return virNetServerProgramSendStreamData(stream->prog, | ||||
|                                                  client, | ||||
|                                                  msg, | ||||
|                                                  stream->procedure, | ||||
|                                                  stream->serial, | ||||
|                                                  NULL, 0); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Process an abort request from the client. | ||||
|  * | ||||
|  * Returns 0 if successfully aborted, -1 upon error | ||||
|  */ | ||||
| static int | ||||
| daemonStreamHandleAbort(virNetServerClientPtr client, | ||||
|                         daemonClientStream *stream, | ||||
|                         virNetMessagePtr msg) | ||||
| { | ||||
|     VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d", | ||||
|               client, stream, msg->header.proc, msg->header.serial); | ||||
|     virNetMessageError rerr; | ||||
|  | ||||
|     memset(&rerr, 0, sizeof(rerr)); | ||||
|  | ||||
|     stream->closed = 1; | ||||
|     virStreamEventRemoveCallback(stream->st); | ||||
|     virStreamAbort(stream->st); | ||||
|  | ||||
|     if (msg->header.status == VIR_NET_ERROR) { | ||||
|         virReportError(VIR_ERR_RPC, | ||||
|                        "%s", _("stream aborted at client request")); | ||||
|     } else { | ||||
|         VIR_WARN("unexpected stream status %d", msg->header.status); | ||||
|         virReportError(VIR_ERR_RPC, | ||||
|                        _("stream aborted with unexpected status %d"), | ||||
|                        msg->header.status); | ||||
|     } | ||||
|  | ||||
|     return virNetServerProgramSendReplyError(remoteProgram, | ||||
|                                              client, | ||||
|                                              msg, | ||||
|                                              &rerr, | ||||
|                                              &msg->header); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Called when the stream is signalled has being able to accept | ||||
|  * data writes. Will process all pending incoming messages | ||||
|  * until they're all gone, or I/O blocks | ||||
|  * | ||||
|  * Returns 0 on success, or -1 upon fatal error | ||||
|  */ | ||||
| static int | ||||
| daemonStreamHandleWrite(virNetServerClientPtr client, | ||||
|                         daemonClientStream *stream) | ||||
| { | ||||
|     VIR_DEBUG("client=%p, stream=%p", client, stream); | ||||
|  | ||||
|     while (stream->rx && !stream->closed) { | ||||
|         virNetMessagePtr msg = stream->rx; | ||||
|         int ret; | ||||
|  | ||||
|         switch (msg->header.status) { | ||||
|         case VIR_NET_OK: | ||||
|             ret = daemonStreamHandleFinish(client, stream, msg); | ||||
|             break; | ||||
|  | ||||
|         case VIR_NET_CONTINUE: | ||||
|             ret = daemonStreamHandleWriteData(client, stream, msg); | ||||
|             break; | ||||
|  | ||||
|         case VIR_NET_ERROR: | ||||
|         default: | ||||
|             ret = daemonStreamHandleAbort(client, stream, msg); | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         if (ret > 0) | ||||
|             break;  /* still processing data from msg */ | ||||
|  | ||||
|         virNetMessageQueueServe(&stream->rx); | ||||
|         if (ret < 0) { | ||||
|             virNetMessageFree(msg); | ||||
|             virNetServerClientImmediateClose(client); | ||||
|             return -1; | ||||
|         } | ||||
|  | ||||
|         /* 'CONTINUE' messages don't send a reply (unless error | ||||
|          * occurred), so to release the 'msg' object we need to | ||||
|          * send a fake zero-length reply. Nothing actually gets | ||||
|          * onto the wire, but this causes the client to reset | ||||
|          * its active request count / throttling | ||||
|          */ | ||||
|         if (msg->header.status == VIR_NET_CONTINUE) { | ||||
|             virNetMessageClear(msg); | ||||
|             msg->header.type = VIR_NET_REPLY; | ||||
|             if (virNetServerClientSendMessage(client, msg) < 0) { | ||||
|                 virNetMessageFree(msg); | ||||
|                 virNetServerClientImmediateClose(client); | ||||
|                 return -1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Invoked when a stream is signalled as having data | ||||
|  * available to read. This reads up to one message | ||||
|  * worth of data, and then queues that for transmission | ||||
|  * to the client. | ||||
|  * | ||||
|  * Returns 0 if data was queued for TX, or a error RPC | ||||
|  * was sent, or -1 on fatal error, indicating client should | ||||
|  * be killed | ||||
|  */ | ||||
| static int | ||||
| daemonStreamHandleRead(virNetServerClientPtr client, | ||||
|                        daemonClientStream *stream) | ||||
| { | ||||
|     char *buffer; | ||||
|     size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX; | ||||
|     int ret; | ||||
|  | ||||
|     VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d", | ||||
|               client, stream, stream->tx, stream->closed); | ||||
|  | ||||
|     /* We might have had an event pending before we shut | ||||
|      * down the stream, so if we're marked as closed, | ||||
|      * then do nothing | ||||
|      */ | ||||
|     if (stream->closed) | ||||
|         return 0; | ||||
|  | ||||
|     /* Shouldn't ever be called unless we're marked able to | ||||
|      * transmit, but doesn't hurt to check */ | ||||
|     if (!stream->tx) | ||||
|         return 0; | ||||
|  | ||||
|     if (VIR_ALLOC_N(buffer, bufferLen) < 0) | ||||
|         return -1; | ||||
|  | ||||
|     ret = virStreamRecv(stream->st, buffer, bufferLen); | ||||
|     if (ret == -2) { | ||||
|         /* Should never get this, since we're only called when we know | ||||
|          * we're readable, but hey things change... */ | ||||
|         ret = 0; | ||||
|     } else if (ret < 0) { | ||||
|         virNetMessagePtr msg; | ||||
|         virNetMessageError rerr; | ||||
|  | ||||
|         memset(&rerr, 0, sizeof(rerr)); | ||||
|  | ||||
|         if (!(msg = virNetMessageNew(false))) | ||||
|             ret = -1; | ||||
|         else | ||||
|             ret = virNetServerProgramSendStreamError(remoteProgram, | ||||
|                                                      client, | ||||
|                                                      msg, | ||||
|                                                      &rerr, | ||||
|                                                      stream->procedure, | ||||
|                                                      stream->serial); | ||||
|     } else { | ||||
|         virNetMessagePtr msg; | ||||
|         stream->tx = 0; | ||||
|         if (ret == 0) | ||||
|             stream->recvEOF = 1; | ||||
|         if (!(msg = virNetMessageNew(false))) | ||||
|             ret = -1; | ||||
|  | ||||
|         if (msg) { | ||||
|             msg->cb = daemonStreamMessageFinished; | ||||
|             msg->opaque = stream; | ||||
|             stream->refs++; | ||||
|             ret = virNetServerProgramSendStreamData(remoteProgram, | ||||
|                                                     client, | ||||
|                                                     msg, | ||||
|                                                     stream->procedure, | ||||
|                                                     stream->serial, | ||||
|                                                     buffer, ret); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     VIR_FREE(buffer); | ||||
|     return ret; | ||||
| } | ||||
							
								
								
									
										51
									
								
								daemon/stream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								daemon/stream.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /* | ||||
|  * stream.h: APIs for managing client streams | ||||
|  * | ||||
|  * Copyright (C) 2009 Red Hat, Inc. | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library.  If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Daniel P. Berrange <berrange@redhat.com> | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __LIBVIRTD_STREAM_H__ | ||||
| # define __LIBVIRTD_STREAM_H__ | ||||
|  | ||||
| # include "libvirtd.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| daemonClientStream * | ||||
| daemonCreateClientStream(virNetServerClientPtr client, | ||||
|                          virStreamPtr st, | ||||
|                          virNetServerProgramPtr prog, | ||||
|                          virNetMessageHeaderPtr hdr); | ||||
|  | ||||
| int daemonFreeClientStream(virNetServerClientPtr client, | ||||
|                            daemonClientStream *stream); | ||||
|  | ||||
| int daemonAddClientStream(virNetServerClientPtr client, | ||||
|                           daemonClientStream *stream, | ||||
|                           bool transmit); | ||||
|  | ||||
| int | ||||
| daemonRemoveClientStream(virNetServerClientPtr client, | ||||
|                          daemonClientStream *stream); | ||||
|  | ||||
| void | ||||
| daemonRemoveAllClientStreams(daemonClientStream *stream); | ||||
|  | ||||
| #endif /* __LIBVIRTD_STREAM_H__ */ | ||||
| @@ -35,13 +35,13 @@ module Test_libvirtd = | ||||
|              { "1" = "joe@EXAMPLE.COM" } | ||||
|              { "2" = "fred@EXAMPLE.COM" } | ||||
|         } | ||||
|         { "tls_priority" = "NORMAL" } | ||||
|         { "max_clients" = "5000" } | ||||
|         { "max_queued_clients" = "1000" } | ||||
|         { "max_anonymous_clients" = "20" } | ||||
|         { "min_workers" = "5" } | ||||
|         { "max_workers" = "20" } | ||||
|         { "prio_workers" = "5" } | ||||
|         { "max_requests" = "20" } | ||||
|         { "max_client_requests" = "5" } | ||||
|         { "admin_min_workers" = "1" } | ||||
|         { "admin_max_workers" = "5" } | ||||
| @@ -55,11 +55,9 @@ module Test_libvirtd = | ||||
|         { "audit_level" = "2" } | ||||
|         { "audit_logging" = "1" } | ||||
|         { "host_uuid" = "00000000-0000-0000-0000-000000000000" } | ||||
|         { "host_uuid_source" = "smbios" } | ||||
|         { "keepalive_interval" = "5" } | ||||
|         { "keepalive_count" = "5" } | ||||
|         { "keepalive_required" = "1" } | ||||
|         { "admin_keepalive_required" = "1" } | ||||
|         { "admin_keepalive_interval" = "5" } | ||||
|         { "admin_keepalive_count" = "5" } | ||||
|         { "ovs_timeout" = "5" } | ||||
|         { "admin_keepalive_required" = "1" } | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>404 page not found</h1> | ||||
| @@ -9,11 +9,16 @@ | ||||
|       page you were looking for. You might want to try | ||||
|     </p> | ||||
|     <ul> | ||||
|       <li>going back to the <a href="https://libvirt.org/">home page</a> to find | ||||
|       <li>going back to the <a href="http://libvirt.org/">home page</a> to find | ||||
|         a collection of links to interesting pages on this site</li> | ||||
|       <li>using the search box at the top right corner of the screen to | ||||
|         locate the content on this site or mailing list archives</li> | ||||
|     </ul> | ||||
|  | ||||
|     <p class="image"> | ||||
|       <img src="/libvirtLogo404.png" alt="libvirt Logo"/> | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
							
								
								
									
										316
									
								
								docs/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										316
									
								
								docs/Makefile.am
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| ## Process this file with automake to produce Makefile.in | ||||
|  | ||||
| ## Copyright (C) 2005-2016 Red Hat, Inc. | ||||
| ## Copyright (C) 2005-2015 Red Hat, Inc. | ||||
| ## | ||||
| ## This library is free software; you can redistribute it and/or | ||||
| ## modify it under the terms of the GNU Lesser General Public | ||||
| @@ -16,93 +16,74 @@ | ||||
| ## License along with this library.  If not, see | ||||
| ## <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| SUBDIRS= schemas | ||||
|  | ||||
| PERL = perl | ||||
|  | ||||
| # The directory containing the source code (if it contains documentation). | ||||
| DOC_SOURCE_DIR=../src | ||||
|  | ||||
| DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt | ||||
|  | ||||
| apihtml = \ | ||||
|   html/index.html \ | ||||
| apihtml =					\ | ||||
|   html/index.html				\ | ||||
|   $(apihtml_generated) | ||||
|  | ||||
| apihtml_generated = \ | ||||
|   html/libvirt-libvirt-common.html \ | ||||
|   html/libvirt-libvirt-domain.html \ | ||||
|   html/libvirt-libvirt-domain-snapshot.html \ | ||||
|   html/libvirt-libvirt-event.html \ | ||||
|   html/libvirt-libvirt-host.html \ | ||||
|   html/libvirt-libvirt-interface.html \ | ||||
|   html/libvirt-libvirt-network.html \ | ||||
|   html/libvirt-libvirt-nodedev.html \ | ||||
|   html/libvirt-libvirt-nwfilter.html \ | ||||
|   html/libvirt-libvirt-secret.html \ | ||||
|   html/libvirt-libvirt-storage.html \ | ||||
|   html/libvirt-libvirt-stream.html \ | ||||
|   html/libvirt-libvirt-domain.html		\ | ||||
|   html/libvirt-libvirt-domain-snapshot.html	\ | ||||
|   html/libvirt-libvirt-event.html		\ | ||||
|   html/libvirt-libvirt-host.html		\ | ||||
|   html/libvirt-libvirt-interface.html		\ | ||||
|   html/libvirt-libvirt-network.html		\ | ||||
|   html/libvirt-libvirt-nodedev.html		\ | ||||
|   html/libvirt-libvirt-nwfilter.html		\ | ||||
|   html/libvirt-libvirt-secret.html		\ | ||||
|   html/libvirt-libvirt-storage.html		\ | ||||
|   html/libvirt-libvirt-stream.html		\ | ||||
|   html/libvirt-virterror.html | ||||
|  | ||||
| apipng = \ | ||||
|   html/left.png \ | ||||
|   html/up.png \ | ||||
|   html/home.png \ | ||||
| apipng =	\ | ||||
|   html/left.png	\ | ||||
|   html/up.png	\ | ||||
|   html/home.png	\ | ||||
|   html/right.png | ||||
|  | ||||
| devhelphtml = \ | ||||
|   devhelp/libvirt.devhelp \ | ||||
|   devhelp/index.html \ | ||||
|   devhelp/general.html \ | ||||
| devhelphtml =			\ | ||||
|   devhelp/libvirt.devhelp	\ | ||||
|   devhelp/index.html		\ | ||||
|   devhelp/general.html		\ | ||||
|   devhelp/libvirt-virterror.html | ||||
|  | ||||
| css = \ | ||||
| css =         \ | ||||
|   generic.css \ | ||||
|   libvirt.css \ | ||||
|   mobile.css \ | ||||
|   main.css | ||||
|  | ||||
| fonts = \ | ||||
|   fonts/LICENSE.md \ | ||||
|   fonts/stylesheet.css \ | ||||
|   fonts/overpass-bold-italic.woff \ | ||||
|   fonts/overpass-bold.woff \ | ||||
|   fonts/overpass-italic.woff \ | ||||
|   fonts/overpass-light-italic.woff \ | ||||
|   fonts/overpass-light.woff \ | ||||
|   fonts/overpass-mono-bold.woff \ | ||||
|   fonts/overpass-mono-light.woff \ | ||||
|   fonts/overpass-mono-regular.woff \ | ||||
|   fonts/overpass-mono-semibold.woff \ | ||||
|   fonts/overpass-regular.woff | ||||
|  | ||||
| devhelppng = \ | ||||
|   devhelp/home.png \ | ||||
|   devhelp/left.png \ | ||||
|   devhelp/right.png \ | ||||
| devhelppng =		\ | ||||
|   devhelp/home.png	\ | ||||
|   devhelp/left.png	\ | ||||
|   devhelp/right.png	\ | ||||
|   devhelp/up.png | ||||
|  | ||||
| devhelpcss = devhelp/style.css | ||||
|  | ||||
| devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl | ||||
|  | ||||
| logofiles = \ | ||||
|   logos/logo-base.svg \ | ||||
|   logos/logo-square.svg \ | ||||
|   logos/logo-square-powered.svg \ | ||||
|   logos/logo-banner-dark.svg \ | ||||
|   logos/logo-banner-light.svg \ | ||||
|   logos/logo-square-96.png \ | ||||
|   logos/logo-square-128.png \ | ||||
|   logos/logo-square-192.png \ | ||||
|   logos/logo-square-256.png \ | ||||
|   logos/logo-square-powered-96.png \ | ||||
|   logos/logo-square-powered-128.png \ | ||||
|   logos/logo-square-powered-192.png \ | ||||
|   logos/logo-square-powered-256.png \ | ||||
|   logos/logo-banner-dark-256.png \ | ||||
|   logos/logo-banner-dark-800.png \ | ||||
|   logos/logo-banner-light-256.png \ | ||||
|   logos/logo-banner-light-800.png | ||||
|  | ||||
| png = \ | ||||
|   32favicon.png \ | ||||
|   footer_corner.png \ | ||||
|   footer_pattern.png \ | ||||
|   libvirt-header-bg.png \ | ||||
|   libvirt-header-logo.png \ | ||||
|   libvirtLogo.png \ | ||||
|   libvirt-net-logical.png \ | ||||
|   libvirt-net-physical.png \ | ||||
|   libvirt-daemon-arch.png \ | ||||
|   libvirt-driver-arch.png \ | ||||
|   libvirt-object-model.png \ | ||||
|   madeWith.png \ | ||||
|   et.png \ | ||||
|   migration-managed-direct.png \ | ||||
|   migration-managed-p2p.png \ | ||||
|   migration-native.png \ | ||||
| @@ -118,14 +99,15 @@ internals_html_in = \ | ||||
|   $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in)) | ||||
| internals_html = $(internals_html_in:%.html.in=%.html) | ||||
|  | ||||
| # Since we ship pre-built html in the tarball, we must also | ||||
| # ship the sources, even when those sources are themselves | ||||
| # generated. | ||||
| # Generate hvsupport.html and news.html first, since they take one extra step. | ||||
| dot_html_in = \ | ||||
|   hvsupport.html.in \ | ||||
|   news.html.in \ | ||||
|   $(notdir $(wildcard $(srcdir)/*.html.in)) | ||||
| # todo.html is special - it is shipped in the tarball, but we | ||||
| # have a dedicated 'todo' target to rebuild it from a proper | ||||
| # config file, all other users are able to build it locally. | ||||
| # For all other files, since we ship pre-built html in the | ||||
| # tarball, we must also ship the sources, even when those | ||||
| # sources are themselves generated. | ||||
| dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) \ | ||||
|   todo.html.in \ | ||||
|   hvsupport.html.in | ||||
| dot_html = $(dot_html_in:%.html.in=%.html) | ||||
|  | ||||
| dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in)) | ||||
| @@ -154,10 +136,11 @@ apidir = $(pkgdatadir)/api | ||||
| api_DATA = \ | ||||
|        libvirt-api.xml \ | ||||
|        libvirt-qemu-api.xml \ | ||||
|        libvirt-lxc-api.xml \ | ||||
|        libvirt-admin-api.xml | ||||
|        libvirt-lxc-api.xml | ||||
|  | ||||
| fig = \ | ||||
|   libvirt-net-logical.fig \ | ||||
|   libvirt-net-physical.fig \ | ||||
|   libvirt-daemon-arch.fig \ | ||||
|   libvirt-driver-arch.fig \ | ||||
|   libvirt-object-model.fig \ | ||||
| @@ -167,21 +150,17 @@ fig = \ | ||||
|   migration-tunnel.fig \ | ||||
|   migration-unmanaged-direct.fig | ||||
|  | ||||
| schemadir = $(pkgdatadir)/schemas | ||||
| schema_DATA = $(wildcard $(srcdir)/schemas/*.rng) | ||||
|  | ||||
| EXTRA_DIST= \ | ||||
| EXTRA_DIST=					\ | ||||
|   apibuild.py genaclperms.pl \ | ||||
|   site.xsl subsite.xsl newapi.xsl page.xsl \ | ||||
|   wrapstring.xsl \ | ||||
|   site.xsl newapi.xsl news.xsl page.xsl \ | ||||
|   hacking1.xsl hacking2.xsl wrapstring.xsl \ | ||||
|   $(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \ | ||||
|   $(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \ | ||||
|   $(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \ | ||||
|   $(logofiles) $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\ | ||||
|   $(internals_html_in) $(internals_html) $(fonts) \ | ||||
|   aclperms.htmlinc \ | ||||
|   hvsupport.pl \ | ||||
|   $(schema_DATA) | ||||
|   $(xml) $(qemu_xml) $(lxc_xml) $(fig) $(png) $(css) \ | ||||
|   $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\ | ||||
|   $(internals_html_in) $(internals_html) \ | ||||
|   sitemap.html.in aclperms.htmlinc \ | ||||
|   todo.pl hvsupport.pl todo.cfg-example | ||||
|  | ||||
| acl_generated = aclperms.htmlinc | ||||
|  | ||||
| @@ -197,13 +176,6 @@ MAINTAINERCLEANFILES = \ | ||||
|   $(addprefix $(srcdir)/,$(dot_php)) \ | ||||
|   $(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc | ||||
|  | ||||
| timestamp="$(shell if test -n "$$SOURCE_DATE_EPOCH"; \ | ||||
| 		   then \ | ||||
| 		     date -u --date="@$$SOURCE_DATE_EPOCH"; \ | ||||
| 		   else \ | ||||
| 		     date -u; \ | ||||
| 		   fi)" | ||||
|  | ||||
| all-am: web | ||||
|  | ||||
| api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml | ||||
| @@ -214,7 +186,25 @@ admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml | ||||
| web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \ | ||||
|   $(dot_php) | ||||
|  | ||||
| hvsupport.html: $(srcdir)/hvsupport.html.in | ||||
| todo.html.in: todo.pl | ||||
| 	if [ -f  todo.cfg ]; then \ | ||||
| 		echo "Generating $@"; \ | ||||
| 		$(PERL) $< > $@ \ | ||||
| 		|| { rm $@ && exit 1; }; \ | ||||
| 	else \ | ||||
| 		echo "Stubbing $@"; \ | ||||
| 		printf "%s\n" \ | ||||
| 		  "<html xmlns=\"http://www.w3.org/1999/xhtml\">" \ | ||||
| 		  "<body>" \ | ||||
| 		  "<h1>Todo list unavailable: no config file</h1>" \ | ||||
| 		  "</body></html>" > $@ ; \ | ||||
| 	fi | ||||
|  | ||||
| todo: | ||||
| 	rm -f todo.html.in | ||||
| 	$(MAKE) todo.html | ||||
|  | ||||
| hvsupport.html:: $(srcdir)/hvsupport.html.in | ||||
|  | ||||
| $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \ | ||||
| 		$(top_srcdir)/src/libvirt_public.syms \ | ||||
| @@ -223,75 +213,70 @@ $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \ | ||||
| 	$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \ | ||||
| 		|| { rm $@ && exit 1; } | ||||
|  | ||||
| # xsltproc seems to add the xmlns="" attribute to random output elements: | ||||
| # use sed to strip it out, as leaving it there triggers XML errors during | ||||
| # further transformation steps | ||||
| news.html.in: \ | ||||
| 	  $(srcdir)/news.xml \ | ||||
| 	  $(srcdir)/news-html.xsl | ||||
| 	$(AM_V_GEN)$(XSLTPROC) --nonet \ | ||||
| 	    $(srcdir)/news-html.xsl \ | ||||
| 	    $(srcdir)/news.xml \ | ||||
| 	  >$@-tmp \ | ||||
| 	    || { rm -f $@-tmp; exit 1; }; \ | ||||
| 	  sed 's/ xmlns=""//g' $@-tmp >$@ \ | ||||
| 	    || { rm -f $@-tmp; exit 1; }; \ | ||||
| 	  rm -f $@-tmp | ||||
| EXTRA_DIST += \ | ||||
| 	$(srcdir)/news.xml \ | ||||
| 	$(srcdir)/news.rng \ | ||||
| 	$(srcdir)/news-html.xsl | ||||
| MAINTAINERCLEANFILES += \ | ||||
| 	$(srcdir)/news.html.in | ||||
| .PHONY: todo | ||||
|  | ||||
| %.png: %.fig | ||||
| 	convert -rotate 90 $< $@ | ||||
|  | ||||
| %.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \ | ||||
| 		$(acl_generated) | ||||
| 	$(AM_V_GEN)name=`echo $@ | sed -e 's/.tmp//'`; \ | ||||
| 	  dir=`dirname $@` ; \ | ||||
| 	  if test "$$dir" = "."; \ | ||||
| 	  then \ | ||||
| 	    style=site.xsl; \ | ||||
| 	  else \ | ||||
| 	    $(MKDIR_P) $$dir; \ | ||||
| 	    style=subsite.xsl; \ | ||||
| 	  fi; \ | ||||
| 	  $(XSLTPROC) --stringparam pagename $$name \ | ||||
| 	    --stringparam timestamp $(timestamp) --nonet \ | ||||
| 	    $(top_srcdir)/docs/$$style $< > $@ \ | ||||
| 	    || { rm $@ && exit 1; } | ||||
| internals/%.html.tmp: internals/%.html.in subsite.xsl page.xsl sitemap.html.in | ||||
| 	@if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  echo "Generating $@"; \ | ||||
| 	  $(MKDIR_P) internals; \ | ||||
| 	  name=`echo $@ | sed -e 's/.tmp//'`; \ | ||||
| 	  $(XSLTPROC) --stringparam pagename $$name --nonet \ | ||||
| 	    $(top_srcdir)/docs/subsite.xsl $< > $@ \ | ||||
| 	    || { rm $@ && exit 1; }; fi | ||||
|  | ||||
| %.html.tmp: %.html.in site.xsl page.xsl sitemap.html.in $(acl_generated) | ||||
| 	@if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  echo "Generating $@"; \ | ||||
| 	  name=`echo $@ | sed -e 's/.tmp//'`; \ | ||||
| 	  $(XSLTPROC) --stringparam pagename $$name --nonet \ | ||||
| 	    $(top_srcdir)/docs/site.xsl $< > $@ \ | ||||
| 	    || { rm $@ && exit 1; }; fi | ||||
|  | ||||
| %.html: %.html.tmp | ||||
| 	$(AM_V_GEN)$(XMLLINT) --nonet --format $< > $(srcdir)/$@ \ | ||||
| 	  || { rm $(srcdir)/$@ && exit 1; } | ||||
| 	@if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \ | ||||
| 	  if $(XMLCATALOG) '$(XML_CATALOG_FILE)' \ | ||||
| 	    "-//W3C//DTD XHTML 1.0 Strict//EN" > /dev/null ; then \ | ||||
| 	  echo "Validating $@" ; \ | ||||
| 	  SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \ | ||||
| 	  $(XMLLINT) --catalogs --nonet --format --valid $< > $(srcdir)/$@ \ | ||||
| 	  || { rm $(srcdir)/$@ && exit 1; }; \ | ||||
| 	  else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi | ||||
|  | ||||
| %.php.tmp: %.php.in site.xsl page.xsl | ||||
| 	$(AM_V_GEN)$(XSLTPROC) --stringparam pagename $(@:.tmp=) \ | ||||
| 	    --stringparam timestamp $(timestamp) --nonet \ | ||||
| %.php.tmp: %.php.in site.xsl page.xsl sitemap.html.in | ||||
| 	@if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  echo "Generating $@"; \ | ||||
| 	  $(XSLTPROC) --stringparam pagename $(@:.tmp=) --nonet \ | ||||
| 	    $(top_srcdir)/docs/site.xsl $< > $@ \ | ||||
| 	    || { rm $@ && exit 1; } | ||||
| 	    || { rm $@ && exit 1; }; fi | ||||
|  | ||||
| %.php: %.php.tmp %.php.code.in | ||||
| 	$(AM_V_GEN)sed \ | ||||
| 	    -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \ | ||||
| 	@if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  echo "Scripting $@"; \ | ||||
| 	    sed -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \ | ||||
| 	    -e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \ | ||||
| 	    || { rm $(srcdir)/$@ && exit 1; } | ||||
| 	    || { rm $(srcdir)/$@ && exit 1; }; fi | ||||
|  | ||||
| $(apihtml_generated): html/index.html | ||||
|  | ||||
| html/index.html: libvirt-api.xml newapi.xsl page.xsl $(APIBUILD_STAMP) | ||||
| 	$(AM_V_GEN)$(XSLTPROC) --nonet -o $(srcdir)/ \ | ||||
| html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in | ||||
| 	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  $(XSLTPROC) --nonet -o $(srcdir)/ \ | ||||
| 	  --stringparam builddir '$(abs_top_builddir)' \ | ||||
| 	  --stringparam timestamp $(timestamp) \ | ||||
| 	  $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml && \ | ||||
| 	  $(XMLLINT) --nonet --noout $(srcdir)/html/*.html | ||||
| 	  $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi && \ | ||||
| 	if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \ | ||||
| 	  if $(XMLCATALOG) '$(XML_CATALOG_FILE)' "-//W3C//DTD XHTML 1.0 Strict//EN" \ | ||||
| 	    > /dev/null ; then \ | ||||
| 	  SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \ | ||||
| 	  $(XMLLINT) --catalogs --nonet --valid --noout $(srcdir)/html/*.html ; \ | ||||
| 	  else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi | ||||
|  | ||||
| $(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl) | ||||
| 	$(AM_V_GEN)$(XSLTPROC) --stringparam timestamp $(timestamp) \ | ||||
| 	  --nonet -o $(srcdir)/devhelp/ \ | ||||
| 	  $(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml | ||||
| 	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \ | ||||
| 	  $(XSLTPROC) --nonet -o $(srcdir)/devhelp/ \ | ||||
| 	  $(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml ; fi | ||||
|  | ||||
|  | ||||
| python_generated_files = \ | ||||
| @@ -316,8 +301,7 @@ EXTRA_DIST += $(APIBUILD_STAMP) | ||||
| $(python_generated_files): $(APIBUILD_STAMP) | ||||
|  | ||||
| $(APIBUILD_STAMP): $(srcdir)/apibuild.py \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt.h \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt-common.h.in \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt.h.in \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt-domain-snapshot.h \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt-domain.h \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt-event.h \ | ||||
| @@ -334,23 +318,13 @@ $(APIBUILD_STAMP): $(srcdir)/apibuild.py \ | ||||
| 		$(top_srcdir)/include/libvirt/libvirt-admin.h \ | ||||
| 		$(top_srcdir)/include/libvirt/virterror.h \ | ||||
| 		$(top_srcdir)/src/libvirt.c \ | ||||
| 		$(top_srcdir)/src/libvirt-domain-snapshot.c \ | ||||
| 		$(top_srcdir)/src/libvirt-domain.c \ | ||||
| 		$(top_srcdir)/src/libvirt-host.c \ | ||||
| 		$(top_srcdir)/src/libvirt-interface.c \ | ||||
| 		$(top_srcdir)/src/libvirt-network.c \ | ||||
| 		$(top_srcdir)/src/libvirt-nodedev.c \ | ||||
| 		$(top_srcdir)/src/libvirt-nwfilter.c \ | ||||
| 		$(top_srcdir)/src/libvirt-secret.c \ | ||||
| 		$(top_srcdir)/src/libvirt-storage.c \ | ||||
| 		$(top_srcdir)/src/libvirt-stream.c \ | ||||
| 		$(top_srcdir)/src/libvirt-lxc.c \ | ||||
| 		$(top_srcdir)/src/libvirt-qemu.c \ | ||||
| 		$(top_srcdir)/src/libvirt-admin.c \ | ||||
| 		$(top_srcdir)/src/util/virerror.c \ | ||||
| 		$(top_srcdir)/src/util/virevent.c \ | ||||
| 		$(top_srcdir)/src/util/virtypedparam.c | ||||
| 	$(AM_V_GEN)srcdir=$(srcdir) builddir=$(builddir) $(PYTHON) $(APIBUILD) | ||||
| 	$(AM_V_GEN)srcdir=$(srcdir) $(PYTHON) $(APIBUILD) | ||||
| 	touch $@ | ||||
|  | ||||
|  | ||||
| @@ -358,10 +332,11 @@ check-local: all | ||||
| dist-local: all | ||||
|  | ||||
| clean-local: | ||||
| 	rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html html/*.html | ||||
| 	rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html | ||||
|  | ||||
| maintainer-clean-local: clean-local | ||||
| 	rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml | ||||
| 	rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml \ | ||||
| 		todo.html.in | ||||
| 	rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml | ||||
| 	rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml | ||||
| 	rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml | ||||
| @@ -373,9 +348,6 @@ install-data-local: | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR) | ||||
| 	for f in $(css) $(dot_html) $(gif) $(png); do \ | ||||
| 	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR); done | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/logos | ||||
| 	for f in $(logofiles); do \ | ||||
| 	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/logos; done | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html | ||||
| 	for h in $(apihtml); do \ | ||||
| 	  $(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done | ||||
| @@ -388,23 +360,11 @@ install-data-local: | ||||
| 	for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \ | ||||
| 	    $(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \ | ||||
| 	done | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/fonts | ||||
| 	for f in $(fonts); do \ | ||||
| 	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/fonts; \ | ||||
| 	done | ||||
| 	$(INSTALL_DATA) $(srcdir)/libvirtLogo.png $(DESTDIR)$(pkgdatadir) | ||||
|  | ||||
| uninstall-local: | ||||
| 	for f in $(css) $(dot_html) $(gif) $(png) $(fonts); do \ | ||||
| 	  rm -f $(DESTDIR)$(HTML_DIR)/$$f; \ | ||||
| 	done | ||||
| 	for f in $(logofiles); do \ | ||||
| 	  rm -f $(DESTDIR)$(HTML_DIR)/$$f; \ | ||||
| 	done | ||||
| 	for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done | ||||
| 	for p in $(apipng); do rm -f $(DESTDIR)$(HTML_DIR)/$$p; done | ||||
| 	for f in $(internals_html); do \ | ||||
| 	  rm -f $(DESTDIR)$(HTML_DIR)/$$f; \ | ||||
| 	done | ||||
| 	for h in $(apihtml); do rm $(DESTDIR)$(HTML_DIR)/$$h; done | ||||
| 	for p in $(apipng); do rm $(DESTDIR)$(HTML_DIR)/$$p; done | ||||
| 	for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \ | ||||
| 	  rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \ | ||||
| 	  rm $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \ | ||||
| 	done | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Client access control</h1> | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="intro">Access control introduction</a></h2> | ||||
|     <h2><a name="intro">Access control introduction</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       In a default configuration, the libvirtd daemon has three levels | ||||
| @@ -42,7 +42,7 @@ | ||||
|       <code>getattr</code> permission. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="drivers">Access control drivers</a></h2> | ||||
|     <h2><a name="drivers">Access control drivers</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The access control framework is designed as a pluggable | ||||
| @@ -83,7 +83,7 @@ | ||||
|       the libvirtd daemon be restarted. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="perms">Objects and permissions</a></h2> | ||||
|     <h2><a name="perms">Objects and permissions</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Libvirt applies access control to all the main object | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Polkit access control</h1> | ||||
| @@ -14,7 +14,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="intro">Introduction</a></h2> | ||||
|     <h2><a name="intro">Introduction</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       A default install of libvirt will typically use | ||||
| @@ -27,7 +27,7 @@ | ||||
|       object. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="perms">Permission names</a></h2> | ||||
|     <h2><a name="perms">Permission names</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt <a href="acl.html#perms">object names and permission names</a> | ||||
| @@ -53,7 +53,7 @@ | ||||
|       permissions default to deny access. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="attrs">Object identity attributes</a></h2> | ||||
|     <h2><a name="attrs">Object identity attributes</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       To allow polkit authorization rules to be written to match | ||||
| @@ -63,7 +63,7 @@ | ||||
|       of object being checked | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="object_connect">virConnectPtr</a></h3> | ||||
|     <h3><a name="object_connect">virConnectPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -79,7 +79,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_domain">virDomainPtr</a></h3> | ||||
|     <h3><a name="object_domain">virDomainPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -103,7 +103,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_interface">virInterfacePtr</a></h3> | ||||
|     <h3><a name="object_interface">virInterfacePtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -127,7 +127,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_network">virNetworkPtr</a></h3> | ||||
|     <h3><a name="object_network">virNetworkPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -151,7 +151,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_node_device">virNodeDevicePtr</a></h3> | ||||
|     <h3><a name="object_node_device">virNodeDevicePtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -171,7 +171,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_nwfilter">virNWFilterPtr</a></h3> | ||||
|     <h3><a name="object_nwfilter">virNWFilterPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -195,7 +195,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_secret">virSecretPtr</a></h3> | ||||
|     <h3><a name="object_secret">virSecretPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -224,14 +224,10 @@ | ||||
|           <td>secret_usage_target</td> | ||||
|           <td>Name of the associated iSCSI target, if any</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>secret_usage_name</td> | ||||
|           <td>Name of the associated TLS secret, if any</td> | ||||
|         </tr> | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_storage_pool">virStoragePoolPtr</a></h3> | ||||
|     <h3><a name="object_storage_pool">virStoragePoolPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -255,7 +251,7 @@ | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h3><a id="object_storage_vol">virStorageVolPtr</a></h3> | ||||
|     <h3><a name="object_storage_vol">virStorageVolPtr</a></h3> | ||||
|     <table class="acl"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @@ -288,7 +284,7 @@ | ||||
|     </table> | ||||
|  | ||||
|  | ||||
|     <h2><a id="user">User identity attributes</a></h2> | ||||
|     <h2><a name="user">User identity attributes</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       At this point in time, the only attribute provided by | ||||
| @@ -307,7 +303,7 @@ | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a id="checks">Writing access control policies</a></h2> | ||||
|     <h2><a name="checks">Writing access control policies</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       If using versions of polkit prior to 0.106 then it is only | ||||
| @@ -334,9 +330,9 @@ | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| polkit.addRule(function(action, subject) { | ||||
|   ....logic to check 'action' and 'subject'... | ||||
| }); | ||||
|       polkit.addRule(function(action, subject) { | ||||
|         ....logic to check 'action' and 'subject'... | ||||
|       }); | ||||
|     </pre> | ||||
|  | ||||
|     <p> | ||||
| @@ -352,13 +348,7 @@ polkit.addRule(function(action, subject) { | ||||
|       <code>lookup</code> method. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|     See | ||||
|     <a href="https://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a> | ||||
|     for a more complex example. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="exconnect">Example: restricting ability to connect to drivers</a></h3> | ||||
|     <h3><a name="exconnect">Example: restricting ability to connect to drivers</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Consider a local user <code>berrange</code> | ||||
| @@ -386,7 +376,7 @@ polkit.addRule(function(action, subject) { | ||||
| }); | ||||
|     </pre> | ||||
|  | ||||
|     <h3><a id="exdomain">Example: restricting access to a single domain</a></h3> | ||||
|     <h3><a name="exdomain">Example: restricting access to a single domain</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Consider a local user <code>berrange</code> | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 13 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 16 KiB | 
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>The libvirt API concepts</h1> | ||||
| @@ -9,7 +9,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="Objects">Objects Exposed</a></h2> | ||||
|     <h2><a name="Objects">Objects Exposed</a></h2> | ||||
|     <p> As defined in the <a href="goals.html">goals section</a>, the libvirt | ||||
|     API is designed to expose all the resources needed to manage the | ||||
|     virtualization support of recent operating systems. The first object | ||||
| @@ -121,7 +121,7 @@ | ||||
|       set of nodes.</p></li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="Functions">Functions and Naming Conventions</a></h2> | ||||
|     <h2><a name="Functions">Functions and Naming Conventions</a></h2> | ||||
|     <p> The naming of the functions present in the library is usually | ||||
|       composed by a prefix describing the object associated to the function | ||||
|       and a verb describing the action on that object.</p> | ||||
| @@ -297,7 +297,7 @@ | ||||
|     <p> For more in-depth details of the storage related APIs see | ||||
|       <a href="storage.html">the storage management page</a>. | ||||
|     </p> | ||||
|     <h2><a id="Drivers">The libvirt Drivers</a></h2> | ||||
|     <h2><a name="Drivers">The libvirt Drivers</a></h2> | ||||
|     <p>Drivers are the basic building block for libvirt functionality | ||||
|     to support the capability to handle specific hypervisor driver calls. | ||||
|     Drivers are discovered and registered during connection processing as | ||||
| @@ -325,12 +325,12 @@ | ||||
|     the various functions and support found in each driver by the version | ||||
|     support was added into libvirt. | ||||
|     </p> | ||||
|     <h2><a id="Remote">Daemon and Remote Access</a></h2> | ||||
|     <h2><a name="Remote">Daemon and Remote Access</a></h2> | ||||
|     <p>Access to libvirt drivers is primarily handled by the libvirtd | ||||
|     daemon through the <a href="remote.html">remote</a> driver via an | ||||
|     <a href="internals/rpc.html">RPC</a>. Some hypervisors do support | ||||
|     client-side connections and responses, such as Test, OpenVZ, VMware, | ||||
|     Power VM (phyp), VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo. | ||||
|     Power VM (phyp), VirtualBox (vbox), ESX, Hyper-V, Xen, and Parallels. | ||||
|     The libvirtd daemon service is started on the host at system boot | ||||
|     time and can also be restarted at any time by a properly privileged | ||||
|     user, such as root. The libvirtd daemon uses the same libvirt API | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Implementing a new API in Libvirt</h1> | ||||
| @@ -44,7 +44,7 @@ | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       <a href="https://libvirt.org/downloads.html">https://libvirt.org/downloads.html</a> | ||||
|       <a href="http://libvirt.org/downloads.html">http://libvirt.org/downloads.html</a> | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
| @@ -273,7 +273,7 @@ | ||||
|       <li>unlocks the remote driver.</li> | ||||
|     </ol> | ||||
|  | ||||
|     <h3><a id="serverdispatch">Implement the server side dispatcher</a></h3> | ||||
|     <h3><a name="serverdispatch">Implement the server side dispatcher</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Implementing the server side of the remote function call is simply a | ||||
| @@ -300,7 +300,7 @@ | ||||
|  | ||||
|     <p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p> | ||||
|  | ||||
|     <h2><a id="internaluseapi">Use the new API internally</a></h2> | ||||
|     <h2><a name="internaluseapi">Use the new API internally</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Sometimes, a new API serves as a superset of existing API, by | ||||
| @@ -314,7 +314,7 @@ | ||||
|  | ||||
|     <p class="example">See <a href="api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch">0006-make-old-API-trivially-wrap-to-new-API.patch</a></p> | ||||
|  | ||||
|     <h2><a id="virshuseapi">Expose the new API in virsh</a></h2> | ||||
|     <h2><a name="virshuseapi">Expose the new API in virsh</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       All new API should be manageable from the virsh command line | ||||
| @@ -345,7 +345,7 @@ | ||||
|  | ||||
|     <p class="example">See <a href="api_extension/0007-add-virsh-support.patch">0007-add-virsh-support.patch</a></p> | ||||
|  | ||||
|     <h2><a id="driverimpl">Implement the driver methods</a></h2> | ||||
|     <h2><a name="driverimpl">Implement the driver methods</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       So, after all that, we get to the fun part.  All functionality in | ||||
| @@ -356,7 +356,7 @@ | ||||
|       adding. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="commonimpl">Implement common handling</a></h3> | ||||
|     <h3><a name="commonimpl">Implement common handling</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       If the new API is applicable to more than one driver, it may | ||||
| @@ -373,7 +373,7 @@ | ||||
|  | ||||
|     <p class="example">See <a href="api_extension/0008-support-new-xml.patch">0008-support-new-xml.patch</a></p> | ||||
|  | ||||
|     <h3><a id="drivercode">Implement driver handling</a></h3> | ||||
|     <h3><a name="drivercode">Implement driver handling</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The remaining patches should only touch one driver at a time. | ||||
|   | ||||
							
								
								
									
										124
									
								
								docs/apibuild.py
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								docs/apibuild.py
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| #!/usr/bin/env python2 | ||||
| #!/usr/bin/python -u | ||||
| # | ||||
| # This is the API builder, it parses the C sources and build the | ||||
| # API formal description in XML. | ||||
| @@ -21,7 +21,6 @@ debugsym=None | ||||
| # C parser analysis code | ||||
| # | ||||
| included_files = { | ||||
|   "libvirt-common.h": "header with general libvirt API definitions", | ||||
|   "libvirt-domain.h": "header with general libvirt API definitions", | ||||
|   "libvirt-domain-snapshot.h": "header with general libvirt API definitions", | ||||
|   "libvirt-event.h": "header with general libvirt API definitions", | ||||
| @@ -103,7 +102,6 @@ ignored_functions = { | ||||
|   "virDomainMigratePrepare3Params": "private function for migration", | ||||
|   "virDomainMigrateConfirm3Params": "private function for migration", | ||||
|   "virDomainMigratePrepareTunnel3Params": "private function for tunnelled migration", | ||||
|   "virErrorCopyNew": "private", | ||||
| } | ||||
|  | ||||
| ignored_macros = { | ||||
| @@ -112,12 +110,6 @@ ignored_macros = { | ||||
|   "_virMemoryParameter": "backward compatibility macro for virTypedParameter", | ||||
| } | ||||
|  | ||||
| # macros that should be completely skipped | ||||
| hidden_macros = { | ||||
|   "VIR_DEPRECATED": "internal macro to mark deprecated apis", | ||||
|   "VIR_EXPORT_VAR": "internal macro to mark exported vars", | ||||
| } | ||||
|  | ||||
| def escape(raw): | ||||
|     raw = string.replace(raw, '&', '&') | ||||
|     raw = string.replace(raw, '<', '<') | ||||
| @@ -240,11 +232,6 @@ class index: | ||||
|         self.references = {} | ||||
|         self.info = {} | ||||
|  | ||||
|     def warning(self, msg): | ||||
|         global warnings | ||||
|         warnings = warnings + 1 | ||||
|         print msg | ||||
|  | ||||
|     def add_ref(self, name, header, module, static, type, lineno, info=None, extra=None, conditionals = None): | ||||
|         if name[0:2] == '__': | ||||
|             return None | ||||
| @@ -1046,11 +1033,6 @@ class CParser: | ||||
|                     name = string.split(name, '(') [0] | ||||
|                 except: | ||||
|                     pass | ||||
|  | ||||
|                 # skip hidden macros | ||||
|                 if name in hidden_macros: | ||||
|                     return token | ||||
|  | ||||
|                 strValue = None | ||||
|                 if len(lst) == 1 and lst[0][0] == '"' and lst[0][-1] == '"': | ||||
|                     strValue = lst[0][1:-1] | ||||
| @@ -1365,9 +1347,9 @@ class CParser: | ||||
|     def parseEnumBlock(self, token): | ||||
|         self.enums = [] | ||||
|         name = None | ||||
|         self.comment = None | ||||
|         comment = "" | ||||
|         value = "-1" | ||||
|         commentsBeforeVal = self.comment is not None | ||||
|         while token is not None: | ||||
|             if token[0] == "sep" and token[1] == "{": | ||||
|                 token = self.token() | ||||
| @@ -1398,8 +1380,7 @@ class CParser: | ||||
|                     token = self.token() | ||||
|                     while token[0] != "sep" or (token[1] != ',' and | ||||
|                           token[1] != '}'): | ||||
|                         # We might be dealing with '1U << 12' here | ||||
|                         value = value + re.sub("^(\d+)U$","\\1", token[1]) | ||||
|                         value = value + token[1] | ||||
|                         token = self.token() | ||||
|                 else: | ||||
|                     try: | ||||
| @@ -1408,10 +1389,6 @@ class CParser: | ||||
|                         self.warning("Failed to compute value of enum %s" % (name)) | ||||
|                         value="" | ||||
|                 if token[0] == "sep" and token[1] == ",": | ||||
|                     if commentsBeforeVal: | ||||
|                         self.cleanupComment() | ||||
|                         self.enums.append((name, value, self.comment)) | ||||
|                         name = comment = self.comment = None | ||||
|                     token = self.token() | ||||
|             else: | ||||
|                 token = self.token() | ||||
| @@ -1656,8 +1633,6 @@ class CParser: | ||||
|             self.enums = [] | ||||
|             token = self.token() | ||||
|             if token is not None and token[0] == "sep" and token[1] == "{": | ||||
|                 # drop comments before the enum block | ||||
|                 self.comment = None | ||||
|                 token = self.token() | ||||
|                 token = self.parseEnumBlock(token) | ||||
|             else: | ||||
| @@ -2273,7 +2248,6 @@ class docBuilder: | ||||
|         if name == debugsym and not quiet: | ||||
|             print "=>", id | ||||
|  | ||||
|         # NB: this is consumed by a regex in 'getAPIFilenames' in hvsupport.pl | ||||
|         output.write("    <%s name='%s' file='%s' module='%s'>\n" % (id.type, | ||||
|                      name, self.modulename_file(id.header), | ||||
|                      self.modulename_file(id.module))) | ||||
| @@ -2592,64 +2566,52 @@ class docBuilder: | ||||
|         output.close() | ||||
|  | ||||
|  | ||||
| class app: | ||||
|     def warning(self, msg): | ||||
|         global warnings | ||||
|         warnings = warnings + 1 | ||||
|         print msg | ||||
|  | ||||
|     def rebuild(self, name): | ||||
|         if name not in ["libvirt", "libvirt-qemu", "libvirt-lxc", "libvirt-admin"]: | ||||
|             self.warning("rebuild() failed, unknown module %s" % name) | ||||
|             return None | ||||
|         builder = None | ||||
|         srcdir = os.path.abspath((os.environ["srcdir"])) | ||||
|         builddir = os.path.abspath((os.environ["builddir"])) | ||||
|         if srcdir == builddir: | ||||
|             builddir = None | ||||
|         if glob.glob(srcdir + "/../src/libvirt.c") != [] : | ||||
|             if not quiet: | ||||
|                 print "Rebuilding API description for %s" % name | ||||
|             dirs = [srcdir + "/../src", | ||||
|                     srcdir + "/../src/util", | ||||
|                     srcdir + "/../include/libvirt"] | ||||
|             if (builddir and | ||||
|                 not os.path.exists(srcdir + "/../include/libvirt/libvirt-common.h")): | ||||
|                 dirs.append(builddir + "/../include/libvirt") | ||||
|             builder = docBuilder(name, srcdir, dirs, []) | ||||
|         elif glob.glob("src/libvirt.c") != [] : | ||||
|             if not quiet: | ||||
|                 print "Rebuilding API description for %s" % name | ||||
|             builder = docBuilder(name, srcdir, | ||||
|                                  ["src", "src/util", "include/libvirt"], | ||||
|                                  []) | ||||
|         else: | ||||
|             self.warning("rebuild() failed, unable to guess the module") | ||||
|             return None | ||||
|         builder.scan() | ||||
|         builder.analyze() | ||||
|         builder.serialize() | ||||
|         return builder | ||||
|  | ||||
|     # | ||||
|     # for debugging the parser | ||||
|     # | ||||
|     def parse(self, filename): | ||||
|         parser = CParser(filename) | ||||
|         idx = parser.parse() | ||||
|         return idx | ||||
| def rebuild(name): | ||||
|     if name not in ["libvirt", "libvirt-qemu", "libvirt-lxc", "libvirt-admin"]: | ||||
|         self.warning("rebuild() failed, unknown module %s") % name | ||||
|         return None | ||||
|     builder = None | ||||
|     srcdir = os.environ["srcdir"] | ||||
|     if glob.glob(srcdir + "/../src/libvirt.c") != [] : | ||||
|         if not quiet: | ||||
|             print "Rebuilding API description for %s" % name | ||||
|         dirs = [srcdir + "/../src", | ||||
|                 srcdir + "/../src/util", | ||||
|                 srcdir + "/../include/libvirt"] | ||||
|         if glob.glob(srcdir + "/../include/libvirt/libvirt.h") == [] : | ||||
|             dirs.append("../include/libvirt") | ||||
|         builder = docBuilder(name, srcdir, dirs, []) | ||||
|     elif glob.glob("src/libvirt.c") != [] : | ||||
|         if not quiet: | ||||
|             print "Rebuilding API description for %s" % name | ||||
|         builder = docBuilder(name, srcdir, | ||||
|                              ["src", "src/util", "include/libvirt"], | ||||
|                              []) | ||||
|     else: | ||||
|         self.warning("rebuild() failed, unable to guess the module") | ||||
|         return None | ||||
|     builder.scan() | ||||
|     builder.analyze() | ||||
|     builder.serialize() | ||||
|     return builder | ||||
|  | ||||
| # | ||||
| # for debugging the parser | ||||
| # | ||||
| def parse(filename): | ||||
|     parser = CParser(filename) | ||||
|     idx = parser.parse() | ||||
|     return idx | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     app = app() | ||||
|     if len(sys.argv) > 1: | ||||
|         debug = 1 | ||||
|         app.parse(sys.argv[1]) | ||||
|         parse(sys.argv[1]) | ||||
|     else: | ||||
|         app.rebuild("libvirt") | ||||
|         app.rebuild("libvirt-qemu") | ||||
|         app.rebuild("libvirt-lxc") | ||||
|         app.rebuild("libvirt-admin") | ||||
|         rebuild("libvirt") | ||||
|         rebuild("libvirt-qemu") | ||||
|         rebuild("libvirt-lxc") | ||||
|         rebuild("libvirt-admin") | ||||
|     if warnings > 0: | ||||
|         sys.exit(2) | ||||
|     else: | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 10 KiB | 
| @@ -1,8 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Applications using libvirt</h1> | ||||
|     <h1>Applications using <strong>libvirt</strong></h1> | ||||
|  | ||||
|     <p> | ||||
|       This page provides an illustration of the wide variety of | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="add">Add an application</a></h2> | ||||
|     <h2><a name="add">Add an application</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       To add an application not listed on this page, send a message | ||||
| @@ -19,18 +19,15 @@ | ||||
|       be added here, or simply send a patch against the documentation | ||||
|       in the libvirt.git docs subdirectory. | ||||
|       If your application uses libvirt as its API, | ||||
|       the following graphics are available for your website to advertise | ||||
|       the following graphic is available for your website to advertise | ||||
|       support for libvirt: | ||||
|     </p> | ||||
|  | ||||
|     <p class="image"> | ||||
|       <img src="logos/logo-square-powered-96.png" alt="libvirt powered"/> | ||||
|       <img src="logos/logo-square-powered-128.png" alt="libvirt powered"/> | ||||
|       <img src="logos/logo-square-powered-192.png" alt="libvirt powered"/> | ||||
|       <img src="logos/logo-square-powered-256.png" alt="libvirt powered"/> | ||||
|       <img src="madeWith.png" alt="Made with libvirt"/> | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="clientserver">Client/Server applications</a></h2> | ||||
|     <h2><a name="clientserver">Client/Server applications</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://archipelproject.org">Archipel</a></dt> | ||||
| @@ -50,7 +47,7 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="command">Command line tools</a></h2> | ||||
|     <h2><a name="command">Command line tools</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://libguestfs.org">guestfish</a></dt> | ||||
| @@ -65,21 +62,21 @@ | ||||
|         management tasks on all libvirt managed domains, networks and | ||||
|         storage. This is part of the libvirt core distribution. | ||||
|       </dd> | ||||
|       <dt><a href="https://virt-manager.org/">virt-clone</a></dt> | ||||
|       <dt><a href="http://virt-manager.org/">virt-clone</a></dt> | ||||
|       <dd> | ||||
|         Allows the disk image(s) and configuration for an existing | ||||
|         virtual machine to be cloned to form a new virtual machine. | ||||
|         It automates copying of data across to new disk images, and | ||||
|         updates the UUID, MAC address, and name in the configuration. | ||||
|       </dd> | ||||
|       <dt><a href="https://people.redhat.com/rjones/virt-df/">virt-df</a></dt> | ||||
|       <dt><a href="http://et.redhat.com/~rjones/virt-df/">virt-df</a></dt> | ||||
|       <dd> | ||||
|         Examine the utilization of each filesystem in a virtual machine | ||||
|         from the comfort of the host machine. This tool peeks into the | ||||
|         guest disks and determines how much space is used. It can cope | ||||
|         with common Linux filesystems and LVM volumes. | ||||
|       </dd> | ||||
|       <dt><a href="https://virt-manager.org/">virt-image</a></dt> | ||||
|       <dt><a href="http://virt-manager.org/">virt-image</a></dt> | ||||
|       <dd> | ||||
|         Provides a way to deploy virtual appliances. It defines a | ||||
|         simplified portable XML format describing the pre-requisites | ||||
| @@ -87,26 +84,26 @@ | ||||
|         into the domain XML format for execution under any libvirt | ||||
|         hypervisor meeting the pre-requisites. | ||||
|       </dd> | ||||
|       <dt><a href="https://virt-manager.org/">virt-install</a></dt> | ||||
|       <dt><a href="http://virt-manager.org/">virt-install</a></dt> | ||||
|       <dd> | ||||
|         Provides a way to provision new virtual machines from a | ||||
|         OS distribution install tree. It supports provisioning from | ||||
|         local CD images, and the network over NFS, HTTP and FTP. | ||||
|       </dd> | ||||
|       <dt><a href="https://people.redhat.com/rjones/virt-top/">virt-top</a></dt> | ||||
|       <dt><a href="http://et.redhat.com/~rjones/virt-top/">virt-top</a></dt> | ||||
|       <dd> | ||||
|         Watch the CPU, memory, network and disk utilization of all | ||||
|         virtual machines running on a host. | ||||
|       </dd> | ||||
|       <dt> | ||||
|         <a href="https://people.redhat.com/~rjones/virt-what/">virt-what</a> | ||||
|         <a href="http://people.redhat.com/~rjones/virt-what/">virt-what</a> | ||||
|       </dt> | ||||
|       <dd> | ||||
|         virt-what is a shell script for detecting if the program is running | ||||
|         in a virtual machine.  It prints out a list of facts about the | ||||
|         virtual machine, derived from heuristics. | ||||
|       </dd> | ||||
|       <dt><a href="https://sourceware.org/systemtap/">stap</a></dt> | ||||
|       <dt><a href="http://sourceware.org/systemtap/">stap</a></dt> | ||||
|       <dd> | ||||
|         SystemTap is a tool used to gather rich information about a running | ||||
|         system through the use of scripts. Starting from v2.4, the front-end | ||||
| @@ -121,7 +118,7 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="configmgmt">Configuration Management</a></h2> | ||||
|     <h2><a name="configmgmt">Configuration Management</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://wiki.lcfg.org/bin/view/LCFG/LcfgLibvirt">LCFG</a></dt> | ||||
| @@ -139,10 +136,10 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="continuousintegration">Continuous Integration</a></h2> | ||||
|     <h2><a name="continuousintegration">Continuous Integration</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt> | ||||
|       <dt><a href="http://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt> | ||||
|       <dd> | ||||
|         BuildBot is a system to automate the compile/test cycle required | ||||
|         by most software projects.  CVS commits trigger new builds, run on | ||||
| @@ -152,7 +149,7 @@ | ||||
|     </dl> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt> | ||||
|       <dt><a href="http://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt> | ||||
|       <dd> | ||||
|         This plugin for Jenkins adds a way to control guest domains hosted | ||||
|         on Xen or QEMU/KVM.  You configure a Jenkins Slave, | ||||
| @@ -163,7 +160,7 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="conversion">Conversion</a></h2> | ||||
|     <h2><a name="conversion">Conversion</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt> | ||||
| @@ -194,37 +191,26 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="desktop">Desktop applications</a></h2> | ||||
|     <h2><a name="desktop">Desktop applications</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://virt-manager.org/">virt-manager</a></dt> | ||||
|       <dt><a href="http://virt-manager.org/">virt-manager</a></dt> | ||||
|       <dd> | ||||
|         A general purpose desktop management tool, able to manage | ||||
|         virtual machines across both local and remotely accessed | ||||
|         hypervisors. It is targeted at home and small office usage | ||||
|         up to managing 10-20 hosts and their VMs. | ||||
|       </dd> | ||||
|       <dt><a href="https://virt-manager.org/">virt-viewer</a></dt> | ||||
|       <dt><a href="http://virt-manager.org/">virt-viewer</a></dt> | ||||
|       <dd> | ||||
|         A lightweight tool for accessing the graphical console | ||||
|         associated with a virtual machine. It can securely connect | ||||
|         to remote consoles supporting the VNC protocol. Also provides | ||||
|         an optional mozilla browser plugin. | ||||
|       </dd> | ||||
|       <dt><a href="https://f1ash.github.io/qt-virt-manager">qt-virt-manager</a></dt> | ||||
|       <dd> | ||||
|         The Qt GUI for create and control VMs and another virtual entities | ||||
|         (aka networks, storages, interfaces, secrets, network filters). | ||||
|         Contains integrated LXC/SPICE/VNC viewer for accessing the graphical or | ||||
|         text console associated with a virtual machine or container. | ||||
|       </dd> | ||||
|       <dt><a href="https://f1ash.github.io/qt-virt-manager/#virtual-machines-viewer">qt-remote-viewer</a></dt> | ||||
|       <dd> | ||||
|         The Qt VNC/SPICE viewer for access to remote desktops or VMs. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="iaas">Infrastructure as a Service (IaaS)</a></h2> | ||||
|     <h2><a name="iaas">Infrastructure as a Service (IaaS)</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://cc1.ifj.edu.pl">Cracow Cloud One</a></dt> | ||||
| @@ -234,7 +220,17 @@ | ||||
|         it easy to benefit from private Cloud Computing technology. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="https://github.com/eucalyptus/eucalyptus">Eucalyptus</a></dt> | ||||
|       <dt><a href="http://www.emotivecloud.net">EMOTIVE Cloud</a></dt> | ||||
|       <dd>The EMOTIVE (Elastic Management Of Tasks In Virtualized | ||||
|         Environments) middleware allows executing tasks and providing | ||||
|         virtualized environments to the users with Xen, KVM or | ||||
|         VirtualBox hypervisor. EMOTIVE's main feature is VM management | ||||
|         with different scheduling policies. It can be also used as a | ||||
|         cloud provider and is very easy to extend thanks to its | ||||
|         modular Web Services architecture. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="http://www.eucalyptus.com">Eucalyptus</a></dt> | ||||
|       <dd> | ||||
|         Eucalyptus is an on-premise Infrastructure as a Service cloud | ||||
|         software platform that is open source and | ||||
| @@ -258,7 +254,7 @@ | ||||
|         management. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="https://www.openstack.org">OpenStack</a></dt> | ||||
|       <dt><a href="http://www.openstack.org">OpenStack</a></dt> | ||||
|       <dd> | ||||
|         OpenStack is a "cloud operating system" usable for both public | ||||
|         and private clouds.  Its various parts take care of compute, | ||||
| @@ -266,29 +262,9 @@ | ||||
|         using a dashboard.  Compute part uses libvirt to manage VM | ||||
|         life-cycle, monitoring and so on. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="https://github.com/gustavfranssonnyvell/cherrypop">Cherrypop</a></dt> | ||||
|       <dd> | ||||
|         A cloud software with no masters or central points. Nodes | ||||
|         autodetect other nodes and autodistribute virtual | ||||
|         machines and autodivide up the workload. Also there is no | ||||
|         minimum limit for hosts, well, one might be nice. It's | ||||
|         perfect for setting up low-end servers in a cloud or a | ||||
|         cloud where you want the most bang for the bucks. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="http://en.zstack.io/">ZStack</a></dt> | ||||
|       <dd> | ||||
|         ZStack is an open source IaaS software that aims to automate the | ||||
|         management of all resources (compute, storage, networking, etc.) in a | ||||
|         datacenter by using APIs, thus conforming to the principles of a | ||||
|         software-defined datacenter. The key strengths of ZStack in terms of | ||||
|         management are scalability, performance, and a fast, user-friendly | ||||
|         deployment. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="libraries">Libraries</a></h2> | ||||
|     <h2><a name="libraries">Libraries</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://libguestfs.org">libguestfs</a></dt> | ||||
| @@ -304,7 +280,7 @@ | ||||
|         Windows Registry in Windows guests. | ||||
|       </dd> | ||||
|  | ||||
|       <dt><a href="https://sandbox.libvirt.org">libvirt-sandbox</a></dt> | ||||
|       <dt><a href="http://sandbox.libvirt.org">libvirt-sandbox</a></dt> | ||||
|       <dd> | ||||
|         A library and command line tools for simplifying the creation of | ||||
|         application sandboxes using virtualization technology. It currently | ||||
| @@ -317,14 +293,14 @@ | ||||
|         Allows using simple ruby objects to manipulate | ||||
|         hypervisors, guests, storage, network etc.  It is | ||||
|         based on top of | ||||
|         the <a href="https://libvirt.org/ruby">native ruby bindings</a>. | ||||
|         the <a href="http://libvirt.org/ruby">native ruby bindings</a>. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="livecd">LiveCD / Appliances</a></h2> | ||||
|     <h2><a name="livecd">LiveCD / Appliances</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://libguestfs.org/virt-v2v/">virt-p2v</a></dt> | ||||
|       <dt><a href="http://et.redhat.com/~rjones/virt-p2v/">virt-p2v</a></dt> | ||||
|       <dd> | ||||
|         An older tool for converting a physical machine into a virtual | ||||
|         machine.  It is a LiveCD which is booted on the machine to be | ||||
| @@ -334,9 +310,9 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="monitoring">Monitoring</a></h2> | ||||
|     <h2><a name="monitoring">Monitoring</a></h2> | ||||
|     <dl> | ||||
|       <dt><a href="https://collectd.org/plugins/libvirt.shtml">collectd</a></dt> | ||||
|       <dt><a href="http://collectd.org/plugins/libvirt.shtml">collectd</a></dt> | ||||
|       <dd> | ||||
|         The libvirt-plugin is part of <a href="http://collectd.org/">collectd</a> | ||||
|         and gathers statistics about virtualized guests on a system. This | ||||
| @@ -345,19 +321,19 @@ | ||||
|         For a full description, please refer to the libvirt section in the | ||||
|         collectd.conf(5) manual page. | ||||
|       </dd> | ||||
|       <dt><a href="http://www.sflow.net/">Host sFlow</a></dt> | ||||
|       <dt><a href="http://host-sflow.sourceforge.net/">Host sFlow</a></dt> | ||||
|       <dd> | ||||
|         Host sFlow is a lightweight agent running on KVM hypervisors that | ||||
|         links to libvirt library and exports standardized cpu, memory, network | ||||
|         and disk metrics for all virtual machines. | ||||
|       </dd> | ||||
|       <dt><a href="https://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt> | ||||
|       <dt><a href="http://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt> | ||||
|       <dd> | ||||
|         The plugins provided by Guido Günther allow to monitor various things | ||||
|         The plugins provided by Guido Günther allow to monitor various things | ||||
|         like network and block I/O with | ||||
|         <a href="http://munin.projects.linpro.no/">Munin</a>. | ||||
|       </dd> | ||||
|       <dt><a href="http://people.redhat.com/rjones/nagios-virt/">Nagios-virt</a></dt> | ||||
|       <dt><a href="http://et.redhat.com/~rjones/nagios-virt/">Nagios-virt</a></dt> | ||||
|       <dd> | ||||
|         Nagios-virt is a configuration tool to add monitoring of your | ||||
|         virtualised domains to <a href="http://www.nagios.org/">Nagios</a>. | ||||
| @@ -365,15 +341,7 @@ | ||||
|         your Xen or QEMU/KVM guests, or to integrate with your existing Nagios | ||||
|         installation. | ||||
|       </dd> | ||||
|       <dt><a href="http://www.pcp.io/man/man1/pmdalibvirt.1.html">PCP</a></dt> | ||||
|       <dd> | ||||
|         The PCP libvirt PMDA (plugin) is part of the | ||||
|         <a href="http://pcp.io/">PCP</a> toolkit and provides | ||||
|         hypervisor and guest information and complete set of guest performance | ||||
|         metrics. It supports pCPU, vCPU, memory, block device, network interface, | ||||
|         and performance event metrics for each virtual guest. | ||||
|       </dd> | ||||
|       <dt><a href="https://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt> | ||||
|       <dt><a href="http://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt> | ||||
|       <dd> | ||||
|         The Zenoss libvirt Zenpack adds support for monitoring virtualization | ||||
|         servers.  It has been tested with KVM, QEMU, VMware ESX, and VMware | ||||
| @@ -381,10 +349,10 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="provisioning">Provisioning</a></h2> | ||||
|     <h2><a name="provisioning">Provisioning</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Tivoli+Provisioning+Manager">Tivoli Provisioning Manager</a></dt> | ||||
|       <dt><a href="http://www.ibm.com/software/tivoli/products/prov-mgr/">Tivoli Provisioning Manager</a></dt> | ||||
|       <dd> | ||||
|         Part of the IBM Tivoli family, Tivoli Provisioning Manager (TPM) is | ||||
|         an IT lifecycle automation product.  It | ||||
| @@ -394,7 +362,7 @@ | ||||
|     </dl> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://theforeman.org">Foreman</a></dt> | ||||
|       <dt><a href="http://theforeman.org">Foreman</a></dt> | ||||
|       <dd> | ||||
|       Foreman is an open source web based application aimed to be a | ||||
|       Single Address For All Machines Life Cycle Management. Foreman: | ||||
| @@ -415,10 +383,10 @@ | ||||
|     </dl> | ||||
|  | ||||
|  | ||||
|     <h2><a id="web">Web applications</a></h2> | ||||
|     <h2><a name="web">Web applications</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="http://www.abiquo.com/">AbiCloud</a></dt> | ||||
|       <dt><a href="http://community.abiquo.com/display/AbiCloud">AbiCloud</a></dt> | ||||
|       <dd> | ||||
|         AbiCloud is an open source cloud platform manager which allows to | ||||
|         easily deploy a private cloud in your datacenter. One of the key | ||||
| @@ -426,22 +394,14 @@ | ||||
|         infrastructure. You can deploy a new service just dragging and | ||||
|         dropping a VM. | ||||
|       </dd> | ||||
|       <dt><a href="https://kimchi-project.github.io/kimchi/">Kimchi</a></dt> | ||||
|       <dd> | ||||
|         Kimchi is an HTML5 based management tool for KVM. It is designed to | ||||
|         make it as easy as possible to get started with KVM and create your first guest. | ||||
|  | ||||
|         Kimchi manages KVM guests through libvirt. The management interface is accessed | ||||
|         over the web using a browser that supports HTML5. | ||||
|       </dd> | ||||
|       <dt><a href="https://ovirt.org/">oVirt</a></dt> | ||||
|       <dt><a href="http://ovirt.org/">oVirt</a></dt> | ||||
|       <dd> | ||||
|         oVirt provides the ability to manage large numbers of virtual | ||||
|         machines across an entire data center of hosts. It integrates | ||||
|         with FreeIPA for Kerberos authentication, and in the future, | ||||
|         certificate management. | ||||
|       </dd> | ||||
|       <dt><a href="https://ispsystem.com/en/software/vmmanager">VMmanager</a></dt> | ||||
|       <dt><a href="http://ispsystem.com/en/software/vmmanager">VMmanager</a></dt> | ||||
|       <dd> | ||||
|         VMmanager is a software solution for virtualization management | ||||
|         that can be used both for hosting virtual machines and | ||||
| @@ -450,7 +410,7 @@ | ||||
|         functions, such as live migration that allows for load | ||||
|         balancing between cluster nodes, monitoring CPU, memory. | ||||
|       </dd> | ||||
|       <dt><a href="https://mist.io/">mist.io</a></dt> | ||||
|       <dt><a href="http://mist.io/">mist.io</a></dt> | ||||
|       <dd> | ||||
|         Mist.io is an open source project and a service that can assist you in | ||||
|         managing your virtual machines on a unified way, providing a simple | ||||
| @@ -458,17 +418,9 @@ | ||||
|         providers, OpenStack based public/private clouds, Docker servers, bare | ||||
|         metal servers and now KVM hypervisors). | ||||
|       </dd> | ||||
|       <dt><a href="https://ravada.upc.edu/">Ravada</a></dt> | ||||
|       <dd> | ||||
|         Ravada is an open source tool for managing Virtual Desktop | ||||
|         Infrastructure (VDI). It is very easy to install and use. Following | ||||
|         the documentation, you'll be ready to deploy virtual machines in | ||||
|         minutes. The only requirements for the users are a Web browser and | ||||
|         a lightweight remote viewer. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="mobile">Mobile applications</a></h2> | ||||
|     <h2><a name="mobile">Mobile applications</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt> | ||||
| @@ -479,19 +431,5 @@ | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h2><a id="other">Other</a></h2> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><a href="https://cuckoosandbox.org/">Cuckoo Sandbox</a></dt> | ||||
|       <dd> | ||||
|         Cuckoo Sandbox is a malware analysis system.  You can throw | ||||
|         any suspicious file at it and in a matter of seconds Cuckoo | ||||
|         will provide you back some detailed results outlining what | ||||
|         such file did when executed inside an isolated environment. | ||||
|         And libvirt is one of the backends that can be used for the | ||||
|         isolated environment. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
							
								
								
									
										7
									
								
								docs/archdomain.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/archdomain.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Domain management architecture</h1> | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1 >libvirt architecture</h1> | ||||
| @@ -13,7 +13,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="Xen">Xen support</a></h2> | ||||
|     <h2><a name="Xen">Xen support</a></h2> | ||||
|  | ||||
|     <p>When running in a Xen environment, programs using libvirt have to execute | ||||
| in "Domain 0", which is the primary Linux OS loaded on the machine. That OS | ||||
| @@ -46,7 +46,7 @@ connect to initialize the library. It will then fork a libvirt_proxy | ||||
| program running as root and providing read_only access to the API, this is | ||||
| then only useful for reporting and monitoring.</p> | ||||
|  | ||||
|     <h2><a id="QEmu">QEmu and KVM support</a></h2> | ||||
|     <h2><a name="QEmu">QEmu and KVM support</a></h2> | ||||
|  | ||||
|     <p>The model for QEmu and KVM is completely similar, basically KVM is based | ||||
| on QEmu for the process controlling a new domain, only small details differs | ||||
| @@ -60,7 +60,7 @@ domain, by specifying the architecture and machine type targeted.</p> | ||||
|     <p>The code controlling the QEmu process is available in the | ||||
| <code>qemud/</code> directory.</p> | ||||
|  | ||||
|     <h2><a id="drivers">Driver based architecture</a></h2> | ||||
|     <h2><a name="drivers">Driver based architecture</a></h2> | ||||
|  | ||||
|     <p>As the previous section explains, libvirt can communicate using different | ||||
| channels with the current hypervisor, and should also be able to use | ||||
|   | ||||
							
								
								
									
										54
									
								
								docs/archnetwork.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								docs/archnetwork.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Network management architecture</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a name="architecture">Architecture illustration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The diagrams below illustrate some of the network configurations | ||||
|       enabled by the libvirt networking APIs | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li><strong>VLAN 1</strong>. This virtual network has connectivity | ||||
|         to <code>LAN 2</code> with traffic forwarded and NATed. | ||||
|       </li> | ||||
|       <li><strong>VLAN 2</strong>. This virtual network is completely | ||||
|         isolated from any physical LAN. | ||||
|       </li> | ||||
|       <li><strong>Guest A</strong>. The first network interface is bridged | ||||
|         to the physical <code>LAN 1</code>. The second interface is connected | ||||
|         to a virtual network <code>VLAN 1</code>. | ||||
|       </li> | ||||
|       <li><strong>Guest B</strong>. The first network interface is connected | ||||
|         to a virtual network <code>VLAN 1</code>, giving it limited NAT | ||||
|         based connectivity to LAN2. It has a second network interface | ||||
|         connected to <code>VLAN 2</code>. It acts a router allowing limited | ||||
|         traffic between the two VLANs, thus giving <code>Guest C</code> | ||||
|         connectivity to the physical <code>LAN 2</code>. | ||||
|         </li> | ||||
|       <li><strong>Guest C</strong>. The only network interface is connected | ||||
|         to a virtual network <code>VLAN 2</code>. It has no direct connectivity | ||||
|         to a physical LAN, relying on <code>Guest B</code> to route traffic | ||||
|         on its behalf. | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h3><a name="logical">Logical diagram</a></h3> | ||||
|  | ||||
|     <p class="image"> | ||||
|       <img src="libvirt-net-logical.png" alt="Logical network architecture"/> | ||||
|     </p> | ||||
|  | ||||
|     <h3><a name="physical">Physical diagram</a></h3> | ||||
|  | ||||
|     <p class="image"> | ||||
|       <img src="libvirt-net-physical.png" alt="Physical network architecture"/> | ||||
|     </p> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										7
									
								
								docs/archnode.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/archnode.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Node device management architecture</h1> | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										32
									
								
								docs/archstorage.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								docs/archstorage.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Storage management architecture</h1> | ||||
|  | ||||
|     <p> | ||||
|       The storage management APIs are based around 2 core concepts | ||||
|     </p> | ||||
|     <ol> | ||||
|       <li> | ||||
|         <strong>Volume</strong> - a single storage volume which can | ||||
|         be assigned to a guest, or used for creating further pools. A | ||||
|         volume is either a block device, a raw file, or a special format | ||||
|         file. | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>Pool</strong> - provides a means for taking a chunk | ||||
|         of storage and carving it up into volumes. A pool can be used to | ||||
|         manage things such as a physical disk, a NFS server, a iSCSI target, | ||||
|         a host adapter, an LVM group. | ||||
|       </li> | ||||
|     </ol> | ||||
|  | ||||
|     <p> | ||||
|       These two concepts are mapped through to two libvirt objects, a | ||||
|       <code>virStorageVolPtr</code> and a <code>virStoragePoolPtr</code>, | ||||
|       each with a collection of APIs for their management. | ||||
|     </p> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,12 +1,12 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Audit log</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="intro">Introduction</a></h2> | ||||
|     <h2><a name="intro">Introduction</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       A number of the libvirt virtualization drivers (QEMU/KVM and LXC) include | ||||
| @@ -17,7 +17,7 @@ | ||||
|       the logs will usually end up in <code>/var/log/audit/audit.log</code> | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="config">Configuration</a></h2> | ||||
|     <h2><a name="config">Configuration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt audit integration is enabled by default on any host which has | ||||
| @@ -48,7 +48,7 @@ | ||||
|       mentioned above. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="types">Message types</a></h2> | ||||
|     <h2><a name="types">Message types</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Libvirt defines three core audit message types each of which will | ||||
| @@ -57,13 +57,13 @@ | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>pid</code></dt> | ||||
|       <dt>pid</dt> | ||||
|       <dd>Process ID of the libvirtd daemon generating the audit record.</dd> | ||||
|       <dt><code>uid</code></dt> | ||||
|       <dt>uid</dt> | ||||
|       <dd>User ID of the libvirtd daemon process generating the audit record.</dd> | ||||
|       <dt><code>subj</code></dt> | ||||
|       <dt>subj</dt> | ||||
|       <dd>Security context of the libvirtd daemon process generating the audit record.</dd> | ||||
|       <dt><code>msg</code></dt> | ||||
|       <dt>msg</dt> | ||||
|       <dd>String containing a list of key=value pairs specific to the type of audit record being reported.</dd> | ||||
|     </dl> | ||||
|  | ||||
| @@ -72,25 +72,25 @@ | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>virt</code></dt> | ||||
|       <dt>virt</dt> | ||||
|       <dd>Type of virtualization driver used. One of <code>qemu</code> or <code>lxc</code></dd> | ||||
|       <dt><code>vm</code></dt> | ||||
|       <dt>vm</dt> | ||||
|       <dd>Host driver unique name of the guest</dd> | ||||
|       <dt><code>uuid</code></dt> | ||||
|       <dt>uuid</dt> | ||||
|       <dd>Globally unique identifier for the guest</dd> | ||||
|       <dt><code>exe</code></dt> | ||||
|       <dt>exe</dt> | ||||
|       <dd>Path of the libvirtd daemon</dd> | ||||
|       <dt><code>hostname</code></dt> | ||||
|       <dt>hostname</dt> | ||||
|       <dd>Currently unused</dd> | ||||
|       <dt><code>addr</code></dt> | ||||
|       <dt>addr</dt> | ||||
|       <dd>Currently unused</dd> | ||||
|       <dt><code>terminal</code></dt> | ||||
|       <dt>terminal</dt> | ||||
|       <dd>Currently unused</dd> | ||||
|       <dt><code>res</code></dt> | ||||
|       <dt>res</dt> | ||||
|       <dd>Result of the action, either <code>success</code> or <code>failed</code></dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h3><a id="typecontrol">VIRT_CONTROL</a></h3> | ||||
|     <h3><a name="typecontrol">VIRT_CONTROL</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Reports change in the lifecycle state of a virtual machine. The <code>msg</code> | ||||
| @@ -98,19 +98,19 @@ | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>op</code></dt> | ||||
|       <dt>op</dt> | ||||
|       <dd>Type of operation performed. One of <code>start</code>, <code>stop</code> or <code>init</code></dd> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the operation to happen</dd> | ||||
|       <dt><code>vm-pid</code></dt> | ||||
|       <dt>vm-pid</dt> | ||||
|       <dd>ID of the primary/leading process associated with the guest</dd> | ||||
|       <dt><code>init-pid</code></dt> | ||||
|       <dt>init-pid</dt> | ||||
|       <dd>ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd> | ||||
|       <dt><code>pid-ns</code></dt> | ||||
|       <dt>pid-ns</dt> | ||||
|       <dd>Namespace ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h3><a id="typemachine">VIRT_MACHINE_ID</a></h3> | ||||
|     <h3><a name="typemachine">VIRT_MACHINE_ID</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Reports the association of a security context with a guest. The <code>msg</code> | ||||
| @@ -118,15 +118,15 @@ | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>model</code></dt> | ||||
|       <dt>model</dt> | ||||
|       <dd>The security driver type. One of <code>selinux</code> or <code>apparmor</code></dd> | ||||
|       <dt><code>vm-ctx</code></dt> | ||||
|       <dt>vm-ctx</dt> | ||||
|       <dd>Security context for the guest process</dd> | ||||
|       <dt><code>img-ctx</code></dt> | ||||
|       <dt>img-ctx</dt> | ||||
|       <dd>Security context for the guest disk images and other assigned host resources</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h3><a id="typeresource">VIRT_RESOURCE</a></h3> | ||||
|     <h3><a name="typeresource">VIRT_RESOURCE</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Reports the usage of a host resource by a guest. The fields include will | ||||
| @@ -137,71 +137,71 @@ | ||||
|       be generated. | ||||
|     </p> | ||||
|  | ||||
|     <h4><a id="typeresourcevcpu">Virtual CPU</a></h4> | ||||
|     <h4><a name="typeresourcevcpu">Virtual CPU</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>vcpu</code></dd> | ||||
|       <dt><code>old-vcpu</code></dt> | ||||
|       <dt>old-vcpu</dt> | ||||
|       <dd>Original vCPU count, or 0</dd> | ||||
|       <dt><code>new-vcpu</code></dt> | ||||
|       <dt>new-vcpu</dt> | ||||
|       <dd>Updated vCPU count</dd> | ||||
|     </dl> | ||||
|  | ||||
|  | ||||
|     <h4><a id="typeresourcemem">Memory</a></h4> | ||||
|     <h4><a name="typeresourcemem">Memory</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>mem</code></dd> | ||||
|       <dt><code>old-mem</code></dt> | ||||
|       <dt>old-mem</dt> | ||||
|       <dd>Original memory size in bytes, or 0</dd> | ||||
|       <dt><code>new-mem</code></dt> | ||||
|       <dt>new-mem</dt> | ||||
|       <dd>Updated memory size in bytes</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcedisk">Disk</a></h4> | ||||
|     <h4><a name="typeresourcedisk">Disk</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>disk</code></dd> | ||||
|       <dt><code>old-disk</code></dt> | ||||
|       <dt>old-disk</dt> | ||||
|       <dd>Original host file or device path acting as the disk backing file</dd> | ||||
|       <dt><code>new-disk</code></dt> | ||||
|       <dt>new-disk</dt> | ||||
|       <dd>Updated host file or device path acting as the disk backing file</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcenic">Network interface</a></h4> | ||||
|     <h4><a name="typeresourcenic">Network interface</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>net</code></dd> | ||||
|       <dt><code>old-net</code></dt> | ||||
|       <dt>old-net</dt> | ||||
|       <dd>Original MAC address of the guest network interface</dd> | ||||
|       <dt><code>new-net</code></dt> | ||||
|       <dt>new-net</dt> | ||||
|       <dd>Updated MAC address of the guest network interface</dd> | ||||
|     </dl> | ||||
|  | ||||
| @@ -211,165 +211,146 @@ | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>net</code></dd> | ||||
|       <dt><code>net</code></dt> | ||||
|       <dt>net</dt> | ||||
|       <dd>MAC address of the host network interface</dd> | ||||
|       <dt><code>rdev</code></dt> | ||||
|       <dt>rdev</dt> | ||||
|       <dd>Name of the host network interface</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcefs">Filesystem</a></h4> | ||||
|     <h4><a name="typeresourcefs">Filesystem</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>fs</code></dd> | ||||
|       <dt><code>old-fs</code></dt> | ||||
|       <dt>old-fs</dt> | ||||
|       <dd>Original host directory, file or device path backing the filesystem </dd> | ||||
|       <dt><code>new-fs</code></dt> | ||||
|       <dt>new-fs</dt> | ||||
|       <dd>Updated host directory, file or device path backing the filesystem</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcehost">Host device</a></h4> | ||||
|     <h4><a name="typeresourcehost">Host device</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>hostdev</code> or <code>dev</code></dd> | ||||
|       <dt><code>dev</code></dt> | ||||
|       <dt>dev</dt> | ||||
|       <dd>The unique bus identifier of the USB, PCI or SCSI device, if <code>resrc=dev</code></dd> | ||||
|       <dt><code>disk</code></dt> | ||||
|       <dt>disk</dt> | ||||
|       <dd>The path of the block device assigned to the guest, if <code>resrc=hostdev</code></dd> | ||||
|       <dt><code>chardev</code></dt> | ||||
|       <dt>chardev</dt> | ||||
|       <dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcetpm">TPM</a></h4> | ||||
|     <h4><a name="typeresourcetpm">TPM</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>tpm</code></dd> | ||||
|       <dt><code>device</code></dt> | ||||
|       <dt>device</dt> | ||||
|       <dd>The path of the host TPM device assigned to the guest</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcerng">RNG</a></h4> | ||||
|     <h4><a name="typeresourcerng">RNG</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>rng</code></dd> | ||||
|       <dt><code>old-rng</code></dt> | ||||
|       <dt>old-rng</dt> | ||||
|       <dd>Original path of the host entropy source for the RNG</dd> | ||||
|       <dt><code>new-rng</code></dt> | ||||
|       <dt>new-rng</dt> | ||||
|       <dd>Updated path of the host entropy source for the RNG</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcechardev">console/serial/parallel/channel</a></h4> | ||||
|     <h4><a name="typeresourcechardev">console/serial/parallel/channel</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>chardev</code></dd> | ||||
|       <dt><code>old-chardev</code></dt> | ||||
|       <dt>old-chardev</dt> | ||||
|       <dd>Original path of the backing character device for given emulated device</dd> | ||||
|       <dt><code>new-chardev</code></dt> | ||||
|       <dt>new-chardev</dt> | ||||
|       <dd>Updated path of the backing character device for given emulated device</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcesmartcard">smartcard</a></h4> | ||||
|     <h4><a name="typeresourcesmartcard">smartcard</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>smartcard</code></dd> | ||||
|       <dt><code>old-smartcard</code></dt> | ||||
|       <dt>old-smartcard</dt> | ||||
|       <dd>Original path of the backing character device, certificate store or | ||||
|           "nss-smartcard-device" for host smartcard passthrough. | ||||
|       </dd> | ||||
|       <dt><code>new-smartcard</code></dt> | ||||
|       <dt>new-smartcard</dt> | ||||
|       <dd>Updated path of the backing character device, certificate store or | ||||
|           "nss-smartcard-device" for host smartcard passthrough. | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourceredir">Redirected device</a></h4> | ||||
|     <h4><a name="typeresourceredir">Redirected device</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>redir</code></dd> | ||||
|       <dt><code>bus</code></dt> | ||||
|       <dt>bus</dt> | ||||
|       <dd>The bus type, only <code>usb</code> allowed</dd> | ||||
|       <dt><code>device</code></dt> | ||||
|       <dt>device</dt> | ||||
|       <dd>The device type, only <code>USB redir</code> allowed</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h4><a id="typeresourcecgroup">Control group</a></h4> | ||||
|     <h4><a name="typeresourcecgroup">Control group</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dt>reason</dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dt>resrc</dt> | ||||
|       <dd>The type of resource assigned. Set to <code>cgroup</code></dd> | ||||
|       <dt><code>cgroup</code></dt> | ||||
|       <dt>cgroup</dt> | ||||
|       <dd>The name of the cgroup controller</dd> | ||||
|     </dl> | ||||
|  | ||||
|  | ||||
|     <h4><a id="typeresourceshmem">Shared memory</a></h4> | ||||
|     <p> | ||||
|       The <code>msg</code> field will include the following sub-fields | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>resrc</code></dt> | ||||
|       <dd>The type of resource assigned. Set to <code>shmem</code></dd> | ||||
|       <dt><code>reason</code></dt> | ||||
|       <dd>The reason which caused the resource to be assigned to happen</dd> | ||||
|       <dt><code>size</code></dt> | ||||
|       <dd>The size of the shared memory region</dd> | ||||
|       <dt><code>shmem</code></dt> | ||||
|       <dd>Name of the shared memory region</dd> | ||||
|       <dt><code>source</code></dt> | ||||
|       <dd>Path of the backing character device for given emulated device</dd> | ||||
|     </dl> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Connection authentication</h1> | ||||
| @@ -14,7 +14,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="Auth_client_config">Client configuration</a></h2> | ||||
|     <h2><a name="Auth_client_config">Client configuration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       When connecting to a remote hypervisor which requires authentication, | ||||
| @@ -76,11 +76,7 @@ password=letmein | ||||
|  | ||||
| [credentials-dev] | ||||
| username=joe | ||||
| password=hello | ||||
|  | ||||
| [credentials-defgrp] | ||||
| username=defuser | ||||
| password=defpw</pre> | ||||
| password=hello</pre> | ||||
|  | ||||
|     <p> | ||||
|       The second set of groups provide mappings of credentials to | ||||
| @@ -94,8 +90,7 @@ credentials=$CREDENTIALS</pre> | ||||
|  | ||||
|     <p> | ||||
|       For example, following the previous example, here is how to | ||||
|       map some machines. For convenience libvirt supports a default | ||||
|       mapping of credentials to machines: | ||||
|       list some machines | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| @@ -111,15 +106,8 @@ credentials=test | ||||
| [auth-libvirt-prod1.example.com] | ||||
| credentials=prod | ||||
|  | ||||
| [auth-libvirt-default] | ||||
| credentials=defgrp | ||||
|  | ||||
| [auth-esx-dev1.example.com] | ||||
| credentials=dev | ||||
|  | ||||
| [auth-esx-default] | ||||
| credentials=defgrp</pre> | ||||
|  | ||||
| credentials=dev</pre> | ||||
|  | ||||
|     <p> | ||||
|       The following service types are known to libvirt | ||||
| @@ -142,7 +130,7 @@ credentials=defgrp</pre> | ||||
|       to storage VNC or SPICE login credentials | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="ACL_server_config">Server configuration</a></h2> | ||||
|     <h2><a name="ACL_server_config">Server configuration</a></h2> | ||||
|     <p> | ||||
| The libvirt daemon allows the administrator to choose the authentication | ||||
| mechanisms used for client connections on each network socket independently. | ||||
| @@ -153,7 +141,7 @@ currently a choice of <code>none</code>, <code>polkit</code>, and <code>sasl</co | ||||
| The SASL scheme can be further configured to choose between a large | ||||
| number of different mechanisms. | ||||
| </p> | ||||
|     <h2><a id="ACL_server_unix_perms">UNIX socket permissions/group</a></h2> | ||||
|     <h2><a name="ACL_server_unix_perms">UNIX socket permissions/group</a></h2> | ||||
|     <p> | ||||
| If libvirt does not contain support for PolicyKit, then access control for | ||||
| the UNIX domain socket is done using traditional file user/group ownership | ||||
| @@ -170,10 +158,10 @@ parameter. For example, setting the former to mode <code>0770</code> and the | ||||
| latter <code>wheel</code> would let any user in the wheel group connect to | ||||
| the libvirt daemon. | ||||
| </p> | ||||
|     <h2><a id="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2> | ||||
|     <h2><a name="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2> | ||||
|     <p> | ||||
| If libvirt contains support for PolicyKit, then access control options are | ||||
| more advanced. The <code>auth_unix_rw</code> parameter will default to | ||||
| more advanced. The <code>unix_sock_auth</code> parameter will default to | ||||
| <code>polkit</code>, and the file permissions will default to <code>0777</code> | ||||
| even on the RW socket. Upon connecting to the socket, the client application | ||||
| will be required to identify itself with PolicyKit. The default policy for the | ||||
| @@ -204,72 +192,16 @@ ResultActive=yes</pre> | ||||
| Further examples of PolicyKit setup can be found on the | ||||
| <a href="http://wiki.libvirt.org/page/SSHPolicyKitSetup">wiki page</a>. | ||||
|     </p> | ||||
|     <h2><a id="ACL_server_sasl">SASL pluggable authentication</a></h2> | ||||
|  | ||||
|     <h2><a name="ACL_server_username">Username/password auth</a></h2> | ||||
|     <p> | ||||
| Libvirt integrates with the cyrus-sasl library to provide a pluggable authentication | ||||
| system using the SASL protocol. SASL can be used in combination with libvirtd's TLS | ||||
| or TCP socket listeners. When used with the TCP listener, the SASL mechanism is | ||||
| rqeuired to provide session encryption in addition to authentication. Only a very | ||||
| few SASL mechanisms are able to do this, and of those that can do it, only the | ||||
| GSSAPI plugin is considered acceptably secure by modern standards: | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt>GSSAPI</dt> | ||||
|       <dd><strong>This is the current default mechanism to use with libvirtd</strong>. | ||||
|         It uses the Kerberos v5 authentication protocol underneath, and assuming | ||||
|         the Kerberos client/server are configured with modern ciphers (AES), | ||||
|         it provides strong session encryption capabilities.</dd> | ||||
|  | ||||
|       <dt>DIGEST-MD5</dt> | ||||
|       <dd>This was previously set as the default mechanism to use with libvirtd. | ||||
|         It provides a simple username/password based authentication mechanism | ||||
|         that includes session encryption. | ||||
|         <a href="https://tools.ietf.org/html/rfc6331">RFC 6331</a>, however, | ||||
|         documents a number of serious security flaws with DIGEST-MD5 and as a | ||||
|         result marks it as <code>OBSOLETE</code>. Specific concerns are that | ||||
|         it is vulnerable to MITM attacks and the MD5 hash can be brute-forced | ||||
|         to reveal the password. A replacement is provided via the SCRAM mechanism, | ||||
|         however, note that this does not provide encryption, so the SCRAM | ||||
|         mechanism can only be used on the libvirtd TLS listener. | ||||
|       </dd> | ||||
|  | ||||
|       <dt>PASSDSS-3DES-1</dt> | ||||
|       <dd>This provides a simple username/password based authentication | ||||
|         mechanism that includes session encryption. The current cyrus-sasl | ||||
|         implementation does not provide a way to validate the server's | ||||
|         public key identity, thus it is susceptible to a MITM attacker | ||||
|         impersonating the server. It is also not enabled in many OS | ||||
|         distros when building SASL libraries.</dd> | ||||
|  | ||||
|       <dt>KERBEROS_V4</dt> | ||||
|       <dd>This uses the obsolete Kerberos v4 protocol to provide both authentication | ||||
|         and session encryption. Kerberos v4 protocol has been obsolete since the | ||||
|         early 1990's and has known security vulnerabilities so this will never be | ||||
|         used in practice.</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <p> | ||||
|       Other SASL mechanisms, not listed above, can only be used when the libvirtd | ||||
|       TLS or UNIX socket listeners. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="ACL_server_username">Username/password auth</a></h3> | ||||
|     <p> | ||||
| As noted above, the DIGEST-MD5 mechanism is considered obsolete and should | ||||
| not be used anymore. To provide a simple username/password auth scheme on | ||||
| the libvirt UNIX socket or TLS listeners, however, it is possible to use | ||||
| the SCRAM mechanism. The <code>auth_unix_ro</code>, <code>auth_unix_rw</code>, | ||||
| <code>auth_tls</code> config params in <code>libvirt.conf</code> can be used | ||||
| to turn on SASL auth in these listeners. | ||||
|     </p> | ||||
|     <p> | ||||
| Since the libvirt SASL config file defaults to using GSSAPI (Kerberos), a | ||||
| config change is rquired to enable plain password auth. This is done by | ||||
| editting <code>/etc/sasl2/libvirt.conf</code> to set the <code>mech_list</code> | ||||
| parameter to <code>scram-sha-1</code>. | ||||
|     </p> | ||||
| The plain TCP socket of the libvirt daemon defaults to using SASL for authentication. | ||||
| The SASL mechanism configured by default is DIGEST-MD5, which provides a basic | ||||
| username+password style authentication. It also provides for encryption of the data | ||||
| stream, so the security of the plain TCP socket is on a par with that of the TLS | ||||
| socket. If desired the UNIX socket and TLS socket can also have SASL enabled by | ||||
| setting the <code>auth_unix_ro</code>, <code>auth_unix_rw</code>, <code>auth_tls</code> | ||||
| config params in <code>libvirt.conf</code>. | ||||
| </p> | ||||
|     <p> | ||||
| Out of the box, no user accounts are defined, so no clients will be able to authenticate | ||||
| on the TCP socket. Adding users and setting their passwords is done with the <code>saslpasswd2</code> | ||||
| @@ -297,13 +229,17 @@ again: | ||||
|     <pre> | ||||
| # saslpasswd2 -a libvirt -d fred | ||||
| </pre> | ||||
|     <h3><a id="ACL_server_kerberos">GSSAPI/Kerberos auth</a></h3> | ||||
|     <h2><a name="ACL_server_kerberos">Kerberos auth</a></h2> | ||||
|     <p> | ||||
| The plain TCP listener of the libvirt daemon defaults to using SASL for authentication. | ||||
| The libvirt SASL config also defaults to GSSAPI, so there is no need to edit the | ||||
| SASL config when using GSSAPI. If the libvirtd TLS or UNIX listeners are used, | ||||
| then the Kerberos session encryption will be disabled since it is not required | ||||
| in these scenarios - only the plain TCP listener needs encryption | ||||
| The plain TCP socket of the libvirt daemon defaults to using SASL for authentication. | ||||
| The SASL mechanism configured by default is DIGEST-MD5, which provides a basic | ||||
| username+password style authentication. To enable Kerberos single-sign-on instead, | ||||
| the libvirt SASL configuration file must be changed. This is <code>/etc/sasl2/libvirt.conf</code>. | ||||
| The <code>mech_list</code> parameter must first be changed to <code>gssapi</code> | ||||
| instead of the default <code>digest-md5</code>, and keytab should be set to | ||||
| <code>/etc/libvirt/krb5.tab</code> . If SASL is enabled on the UNIX | ||||
| and/or TLS sockets, Kerberos will also be used for them. Like DIGEST-MD5, the Kerberos | ||||
| mechanism provides data encryption of the session. | ||||
| </p> | ||||
|     <p> | ||||
| Some operating systems do not install the SASL kerberos plugin by default. It | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1 >Bindings for other languages</h1> | ||||
| @@ -14,17 +14,13 @@ | ||||
|         <strong>C#</strong>: Arnaud Champion develops | ||||
|         <a href="csharp.html">C# bindings</a>. | ||||
|       </li> | ||||
|      <li> | ||||
|         <strong>Go</strong>: Daniel Berrange develops | ||||
|         <a href="https://godoc.org/github.com/libvirt/libvirt-go">Go bindings</a>. | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>Java</strong>: Daniel Veillard develops | ||||
|         <a href="java.html">Java bindings</a>. | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>OCaml</strong>: Richard Jones develops | ||||
|         <a href="https://libvirt.org/ocaml/">OCaml bindings</a>. | ||||
|         <a href="http://libvirt.org/ocaml/">OCaml bindings</a>. | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>Perl</strong>: Daniel Berrange develops | ||||
| @@ -33,7 +29,7 @@ | ||||
|       <li> | ||||
|         <p> | ||||
|           <strong>PHP</strong>: Radek Hladik started developing | ||||
|           <a href="https://libvirt.org/php">PHP bindings</a> in 2010. | ||||
|           <a href="http://libvirt.org/php">PHP bindings</a> in 2010. | ||||
|         </p> | ||||
|         <p> | ||||
|           In February 2011 the binding development has been moved to the libvirt.org website as | ||||
| @@ -43,13 +39,13 @@ | ||||
|           The project is now maintained by Michal Novotny and it's heavily based | ||||
|           on Radek's version. For more information, including | ||||
|           information on posting patches to libvirt-php, please refer | ||||
|           to the <a href="https://libvirt.org/php">PHP bindings</a> site. | ||||
|           to the <a href="http://libvirt.org/php">PHP bindings</a> site. | ||||
|         </p> | ||||
|       </li> | ||||
|       <li> | ||||
|         <p> | ||||
|           <strong>Python</strong>: Libvirt's python bindings are split to a | ||||
|           separate <a href="https://libvirt.org/git/?p=libvirt-python.git">package</a> | ||||
|           separate <a href="http://libvirt.org/git/?p=libvirt-python.git">package</a> | ||||
|           since version 1.2.0, older versions came with direct support for the | ||||
|           Python language. | ||||
|         </p> | ||||
| @@ -70,7 +66,7 @@ | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>Ruby</strong>: Chris Lalancette develops | ||||
|         <a href="https://libvirt.org/ruby/">Ruby bindings</a>. | ||||
|         <a href="http://libvirt.org/ruby/">Ruby bindings</a>. | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <browserconfig> | ||||
|     <msapplication> | ||||
|         <tile> | ||||
|             <square150x150logo src="/mstile-150x150.png"/> | ||||
|             <TileColor>#b91d47</TileColor> | ||||
|         </tile> | ||||
|     </msapplication> | ||||
| </browserconfig> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|  | ||||
| @@ -7,7 +7,7 @@ | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="security">Security Issues</a></h2> | ||||
|     <h2><a name="security">Security Issues</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       If you think that an issue with libvirt may have security | ||||
| @@ -19,7 +19,7 @@ | ||||
|       <a href="securityprocess.html">security process</a> instead. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="bugzilla">Bug Tracking</a></h2> | ||||
|     <h2><a name="bugzilla">Bug Tracking</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       If you are using libvirt binaries from a Linux distribution | ||||
| @@ -27,7 +27,7 @@ | ||||
|       first. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="general">General libvirt bug reports</a></h2> | ||||
|     <h2><a name="general">General libvirt bug reports</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a> | ||||
| @@ -69,7 +69,7 @@ | ||||
|       <li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Virtualization%20Tools&component=libvirt">New libvirt ticket</a></li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="distribution">Linux Distribution specific bug reports</a></h2> | ||||
|     <h2><a name="distribution">Linux Distribution specific bug reports</a></h2> | ||||
|     <ul> | ||||
|       <li> | ||||
|         If you are using binaries from <strong>Fedora</strong>, enter | ||||
| @@ -107,7 +107,7 @@ | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a id="quality">How to file high quality bug reports</a></h2> | ||||
|     <h2><a name="quality">How to file high quality bug reports</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       To increase the likelihood of your bug report being addressed it is | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Control Groups Resource Management</h1> | ||||
| @@ -11,7 +11,7 @@ | ||||
|       for applying resource management to their virtual machines and containers. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="requiredControllers">Required controllers</a></h2> | ||||
|     <h2><a name="requiredControllers">Required controllers</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The control groups filesystem supports multiple "controllers". By default | ||||
| @@ -42,7 +42,7 @@ | ||||
|       which use them will cease to operate. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="currentLayout">Current cgroups layout</a></h2> | ||||
|     <h2><a name="currentLayout">Current cgroups layout</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       As of libvirt 1.0.5 or later, the cgroups layout created by libvirt has been | ||||
| @@ -63,14 +63,14 @@ | ||||
|       in two, one describing systemd hosts and the other non-systemd hosts. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="currentLayoutSystemd">Systemd cgroups integration</a></h3> | ||||
|     <h3><a name="currentLayoutSystemd">Systemd cgroups integration</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       On hosts which use systemd, each consumer maps to a systemd scope unit, | ||||
|       while partitions map to a system slice unit. | ||||
|     </p> | ||||
|  | ||||
|     <h4><a id="systemdScope">Systemd scope naming</a></h4> | ||||
|     <h4><a name="systemdScope">Systemd scope naming</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The systemd convention is for the scope name of virtual machines / containers | ||||
| @@ -83,7 +83,7 @@ | ||||
|       The scope names map directly to the cgroup directory names. | ||||
|     </p> | ||||
|  | ||||
|     <h4><a id="systemdSlice">Systemd slice naming</a></h4> | ||||
|     <h4><a name="systemdSlice">Systemd slice naming</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       The systemd convention for slice naming is that a slice should include the | ||||
| @@ -96,7 +96,7 @@ | ||||
|       by libvirt will be associated with <code>machine.slice</code> by default. | ||||
|     </p> | ||||
|  | ||||
|     <h4><a id="systemdLayout">Systemd cgroup layout</a></h4> | ||||
|     <h4><a name="systemdLayout">Systemd cgroup layout</a></h4> | ||||
|  | ||||
|     <p> | ||||
|       Given this, a possible systemd cgroups layout involving 3 qemu guests, | ||||
| @@ -145,7 +145,7 @@ $ROOT | ||||
|           +- machine-lxc\x2dcontainer3.scope | ||||
|     </pre> | ||||
|  | ||||
|     <h3><a id="currentLayoutGeneric">Non-systemd cgroups layout</a></h3> | ||||
|     <h3><a name="currentLayoutGeneric">Non-systemd cgroups layout</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       On hosts which do not use systemd, each consumer has a corresponding cgroup | ||||
| @@ -206,7 +206,7 @@ $ROOT | ||||
|           +- container3.libvirt-lxc | ||||
|     </pre> | ||||
|  | ||||
|     <h2><a id="customPartiton">Using custom partitions</a></h2> | ||||
|     <h2><a name="customPartiton">Using custom partitions</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       If there is a need to apply resource constraints to groups of | ||||
| @@ -221,11 +221,11 @@ $ROOT | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| ... | ||||
| <resource> | ||||
|   <partition>/machine/production</partition> | ||||
| </resource> | ||||
| ... | ||||
|   ... | ||||
|   <resource> | ||||
|     <partition>/machine/production</partition> | ||||
|   </resource> | ||||
|   ... | ||||
|     </pre> | ||||
|  | ||||
|     <p> | ||||
| @@ -255,7 +255,7 @@ $ROOT | ||||
|       later in this document did not support customization per guest. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="createSystemd">Creating custom partitions (systemd)</a></h3> | ||||
|     <h3><a name="createSystemd">Creating custom partitions (systemd)</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Given the XML config above, the admin on a systemd based host would | ||||
| @@ -272,7 +272,7 @@ EOF | ||||
| # systemctl start machine-testing.slice | ||||
|     </pre> | ||||
|  | ||||
|     <h3><a id="createNonSystemd">Creating custom partitions (non-systemd)</a></h3> | ||||
|     <h3><a name="createNonSystemd">Creating custom partitions (non-systemd)</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Given the XML config above, the admin on a non-systemd based host | ||||
| @@ -291,7 +291,7 @@ EOF | ||||
|   done | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="resourceAPIs">Resource management APIs/commands</a></h2> | ||||
|     <h2><a name="resourceAPIs">Resource management APIs/commands</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Since libvirt aims to provide an API which is portable across | ||||
| @@ -354,7 +354,7 @@ swap_hard_limit: unlimited | ||||
|       network interfaces. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="legacyLayout">Legacy cgroups layout</a></h2> | ||||
|     <h2><a name="legacyLayout">Legacy cgroups layout</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Prior to libvirt 1.0.5, the cgroups layout created by libvirt was different | ||||
|   | ||||
| @@ -1,21 +1,21 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1><a id="installation">libvirt Installation</a></h1> | ||||
|     <h1><a name="installation">libvirt Installation</a></h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="compiling">Compiling a release tarball</a></h2> | ||||
|     <h2><a name="compiling">Compiling a release tarball</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       libvirt uses the standard configure/make/install steps: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ xz -c libvirt-x.x.x.tar.xz | tar xvf - | ||||
| $ cd libvirt-x.x.x | ||||
| $ ./configure</pre> | ||||
|       $ gunzip -c libvirt-x.x.x.tar.gz | tar xvf - | ||||
|       $ cd libvirt-x.x.x | ||||
|       $ ./configure</pre> | ||||
|  | ||||
|     <p> | ||||
|       The <i>configure</i> script can be given options to change its default | ||||
| @@ -28,7 +28,7 @@ $ ./configure</pre> | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ./configure <i>--help</i></pre> | ||||
|       $ ./configure <i>--help</i></pre> | ||||
|  | ||||
|     <p> | ||||
|       When you have determined which options you want to use (if any), | ||||
| @@ -49,16 +49,16 @@ $ ./configure <i>--help</i></pre> | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ./configure <i>[possible options]</i> | ||||
| $ make | ||||
| $ <b>sudo</b> <i>make install</i></pre> | ||||
|       $ ./configure <i>[possible options]</i> | ||||
|       $ make | ||||
|       $ <b>sudo</b> <i>make install</i></pre> | ||||
|  | ||||
|     <p> | ||||
|       At this point you <b>may</b> have to run ldconfig or a similar utility | ||||
|       to update your list of installed shared libs. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="building">Building from a GIT checkout</a></h2> | ||||
|     <h2><a name="building">Building from a GIT checkout</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt build process uses GNU autotools, so after obtaining a | ||||
| @@ -91,7 +91,7 @@ $ <b>sudo</b> <i>make install</i></pre> | ||||
|       drive or manual download, and run this any time libvirt.git | ||||
|       updates the commit stored in the .gnulib submodule:</p> | ||||
|     <pre> | ||||
| $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git | ||||
|       $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git | ||||
|     </pre> | ||||
|  | ||||
|     <p>To build & install libvirt to your home | ||||
| @@ -99,9 +99,9 @@ $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ./autogen.sh --prefix=$HOME/usr | ||||
| $ make | ||||
| $ <b>sudo</b> make install</pre> | ||||
|       $ ./autogen.sh --prefix=$HOME/usr | ||||
|       $ make | ||||
|       $ <b>sudo</b> make install</pre> | ||||
|  | ||||
|     <p> | ||||
|       Be aware though, that binaries built with a custom prefix will not | ||||
| @@ -111,8 +111,8 @@ $ <b>sudo</b> make install</pre> | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ./autogen.sh --system | ||||
| $ make | ||||
|       $ ./autogen.sh --system | ||||
|       $ make | ||||
|     </pre> | ||||
|  | ||||
|     <p> | ||||
| @@ -123,9 +123,9 @@ $ make | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ su - | ||||
| # service libvirtd stop  (or systemctl stop libvirtd.service) | ||||
| # /home/to/your/checkout/daemon/libvirtd | ||||
|       $ su - | ||||
|       # service libvirtd stop  (or systemctl stop libvirtd.service) | ||||
|       # /home/to/your/checkout/daemon/libvirtd | ||||
|     </pre> | ||||
|  | ||||
|     <p> | ||||
| @@ -134,7 +134,7 @@ $ su - | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ./run ./tools/virsh .... | ||||
|       $ ./run ./tools/virsh .... | ||||
|     </pre> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Contacting the project contributors</h1> | ||||
|     <h1>Contacting the development team</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="security">Security Issues</a></h2> | ||||
|     <h2><a name="security">Security Issues</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       If you think that an issue with libvirt may have security | ||||
| @@ -18,13 +18,13 @@ | ||||
|       <a href="securityprocess.html">security process</a> instead. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="email">Mailing lists</a></h2> | ||||
|     <h2><a name="email">Mailing lists</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       There are three mailing-lists: | ||||
|     </p> | ||||
|  | ||||
|     <dl class="mail"> | ||||
|     <dl> | ||||
|       <dt><a href="https://www.redhat.com/mailman/listinfo/libvir-list">libvir-list@redhat.com</a> (for development)</dt> | ||||
|       <dd> | ||||
|         Archives at <a href="https://www.redhat.com/archives/libvir-list">https://www.redhat.com/archives/libvir-list</a> | ||||
| @@ -95,7 +95,7 @@ | ||||
|       page. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="irc">IRC discussion</a></h2> | ||||
|     <h2><a name="irc">IRC discussion</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Some of the libvirt developers may be found on IRC on the <a href="http://oftc.net">OFTC IRC</a> | ||||
|   | ||||
| @@ -1,142 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Contributing to libvirt</h1> | ||||
|  | ||||
|     <p> | ||||
|       This page provides guidance on how to contribute to the | ||||
|       libvirt project | ||||
|     </p> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="skills">Contributions required</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt project is always looking for new contributors to | ||||
|       participate in ongoing activities. While code development is a | ||||
|       major part of the project, assistance is needed in many other | ||||
|       areas including documentation writing, bug triage, testing, | ||||
|       application integration, website / wiki content management, | ||||
|       translation, branding, social media and more. The only | ||||
|       requirement is an interest in virtualization and desire to | ||||
|       help. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       The following is a non-exhaustive list of areas in which | ||||
|       people can contribute to libvirt. If you have ideas for | ||||
|       other contributions feel free to follow them. | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li><strong>Software development</strong>. The core library / daemon (and | ||||
|         thus the bulk of coding) is written in C, but there are | ||||
|         language bindings written in Python, Perl, Java, Ruby, | ||||
|         Php, OCaml and Go. There are also higher level wrappers | ||||
|         mapping libvirt into other object frameworks, such GLib, | ||||
|         CIM and SNMP. For those interested in working on the core parts of | ||||
|         libvirt, the <a href="hacking.html">contributor guidelines</a> are | ||||
|         mandatory reading</li> | ||||
|       <li><strong>Translation</strong>. All the libvirt modules aim to support | ||||
|         translations where appropriate. All translation is | ||||
|         handling outside of the normal libvirt review process, | ||||
|         using the <a href="http://fedora.zanata.org">Fedora | ||||
|         instance</a> of the Zanata tool. Thus people wishing | ||||
|         to contribute to translation should join the Fedora | ||||
|         translation team</li> | ||||
|       <li><strong>Documentation</strong>. There are docbook guides on various | ||||
|         aspects of libvirt, particularly application development | ||||
|         guides for the C library and Python, and a virsh command | ||||
|         reference. There is thus scope for work by people who are | ||||
|         familiar with using or developing against libvirt, to | ||||
|         write further content for these guides. There is also a | ||||
|         need for people to review existing content for copy editing | ||||
|         and identifying gaps in the docs</li> | ||||
|       <li><strong>Website / wiki curation</strong>. The bulk of the website is | ||||
|         maintained in the primary GIT repository, while the wiki | ||||
|         site uses mediawiki. In both cases there is a need for | ||||
|         people to both write new content and curate existing | ||||
|         content to identify outdated information, improve its | ||||
|         organization and target gaps.</li> | ||||
|       <li><strong>Testing</strong>. There are a number of tests suites that can run | ||||
|         automated tests against libvirt. The coverage of the tests | ||||
|         is never complete, so there is a need for people to create | ||||
|         new test suites and / or provide environments to actually | ||||
|         run the tests in a variety of deployment scenarios.</li> | ||||
|       <li><strong>Code analysis</strong>. The libvirt project has access to the coverity | ||||
|         tool to run static analysis against the codebase, however, | ||||
|         there are other types of code analysis that can be useful. | ||||
|         In particular fuzzing of the inputs can be very effective | ||||
|         at identifying problematic edge cases.</li> | ||||
|       <li><strong>Security handling</strong>. Downstream (operating system) vendors | ||||
|         who distribute libvirt may wish to propose a person to | ||||
|         be part of the security handling team, to get early access | ||||
|         to information about forthcoming vulnerability fixes.</li> | ||||
|       <li><strong>Evangalism</strong>. Work done by the project is of no benefit | ||||
|         unless the (potential) user community knows that it | ||||
|         exists. Thus it is critically important to the health | ||||
|         and future growth of the project, that there are a people | ||||
|         who evangalise the work created by the project. This can | ||||
|         take many forms, writing blog posts (about usage of features, | ||||
|         personal user experiances, areas for future work, and more), | ||||
|         syndicating docs and blogs via social media, giving user | ||||
|         group and/or conference talks about libvirt.</li> | ||||
|       <li><strong>User assistance</strong>. Since documentation | ||||
|         is never perfect, there are inevitably cases where users | ||||
|         will struggle to attain a deployment goal they have, or | ||||
|         run into trouble with managing an existing deployment. | ||||
|         While some users may be able to contact a software vendor | ||||
|         to obtain support, it is common to rely on community help | ||||
|         forums such as <a href="contact.html#email">libvirt users | ||||
|           mailing list</a>, or sites such as | ||||
|         <a href="http://stackoverflow.com/questions/tagged/libvirt">stackoverflow.</a> | ||||
|         People who are familiar with libvirt and have ability & | ||||
|         desire to help other users are encouraged to participate in | ||||
|         these help forums.</li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="comms">Communication</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       For full details on contacting other project contributors | ||||
|       read the <a href="contact.html">contact</a> page. There | ||||
|       are two main channels that libvirt uses for communication | ||||
|       between contributors: | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="email">Mailing lists</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The project has a number of | ||||
|       <a href="contact.html#email">mailing lists</a> for | ||||
|       general communication between contributors. | ||||
|       In general any design discussions and review | ||||
|       of contributions will take place on the mailing | ||||
|       lists, so it is important for all contributors | ||||
|       to follow the traffic. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="irc">Instant messaging / chat</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Contributors to libvirt are encouraged to join the | ||||
|       <a href="contact.html#irc">IRC channel</a> used by | ||||
|       the project, where they can have live conversations | ||||
|       with others members. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="outreach">Student / outreach coding programs</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Since 2016, the libvirt project directly participates as an | ||||
|       organization in the <a href="http://wiki.libvirt.org/page/Google_Summer_of_Code_Ideas">Google Summer of Code program</a>. Prior to | ||||
|       this the project had a number of students in the program | ||||
|       via a joint application with the QEMU project. People are | ||||
|       encouraged to look at both the libvirt and QEMU programs | ||||
|       to identify potentially interesting projects to work on. | ||||
|     </p> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,12 +1,12 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>C# API bindings</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="description">Description</a></h2> | ||||
|     <h2><a name="description">Description</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The C# libvirt bindings are a class library.  They use a Microsoft | ||||
| @@ -19,7 +19,9 @@ | ||||
|       to libvirt. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="requirements">Requirements</a></h2> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a name="requirements">Requirements</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       These bindings depend upon the libvirt libraries being installed. | ||||
| @@ -29,8 +31,10 @@ | ||||
|       compiling libvirt for windows. | ||||
|     </p> | ||||
|  | ||||
|     <p> </p> | ||||
|  | ||||
| <!-- 2010-10-19 JC: Commented out until we have C# tarballs to download | ||||
|     <h2><a id="getting">Getting them</a></h2> | ||||
|     <h2><a name="getting">Getting them</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The latest versions of the libvirt C# bindings can be downloaded from: | ||||
| @@ -38,15 +42,15 @@ | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="ftp://libvirt.org/libvirt/csharp/">libvirt.org FTP server</a></li> | ||||
|       <li><a href="https://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li> | ||||
|       <li><a href="http://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li> | ||||
|     </ul> | ||||
| --> | ||||
|  | ||||
|     <h2><a id="git">GIT source repository</a></h2> | ||||
|     <h2><a name="git">GIT source repository</a></h2> | ||||
|     <p> | ||||
|       The C# bindings source code is maintained in a <a | ||||
|       href="http://git-scm.com/">git</a> repository available on | ||||
|       <a href="https://libvirt.org/git/">libvirt.org</a>: | ||||
|       <a href="http://libvirt.org/git/">libvirt.org</a>: | ||||
|     </p> | ||||
|  | ||||
| <pre> | ||||
| @@ -58,10 +62,12 @@ git clone git://libvirt.org/libvirt-csharp.git | ||||
|     </p> | ||||
|  | ||||
| <pre> | ||||
| <a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">https://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a> | ||||
| <a href="http://libvirt.org/git/?p=libvirt-csharp.git;a=summary">http://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a> | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="usage">Usage</a></h2> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a name="usage">Usage</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt C# bindings class library exposes the <b>Libvirt</b> | ||||
| @@ -110,15 +116,19 @@ git clone git://libvirt.org/libvirt-csharp.git | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="authors">Authors</a></h2> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a name="authors">Authors</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The C# bindings are the work of Arnaud Champion | ||||
|       <<a href="mailto:arnaud.champion AT devatom.fr">arnaud.champion AT devatom.fr</a>>, | ||||
|       based upon the previous work of Jaromír Červenka. | ||||
|       based upon the previous work of Jaromír Červenka. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="notes">Test Configuration</a></h2> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a name="notes">Test Configuration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Testing is performed using the following configurations: | ||||
| @@ -129,85 +139,87 @@ git clone git://libvirt.org/libvirt-csharp.git | ||||
|       <li>Ubuntu 10.10 amd64 / Mono 2.6.7 (compiled in 64 bits)</li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="type">Type Coverage</a></h2> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a name="type">Type Coverage</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Coverage of the libvirt types is: | ||||
|     </p> | ||||
|     <table class="top_table"> | ||||
|       <tr><th>Type</th><th>Name</th><th>Binding?</th><th>Tested?</th><th>Sample Code?</th><th>Works?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr> | ||||
|       <tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virConnectAuth</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>struct</td><td>virConnectCredential</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virConnectCredentialType</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virConnectFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virConnectFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainBlockStatsInfo</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventDefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventID</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventID</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventResumedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventStartedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventStoppedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventSuspendedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventUndefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainInfo</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>struct</td><td>virDomainInterfaceStatsStruct</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainJobType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainJobType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virEventHandleType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virNWFilter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virSchedParameter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virSecret</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virSecurityModel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virStream</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStreamEventType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virStreamFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>enum</td><td>virVcpuState</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virNWFilter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virSchedParameter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virSecret</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virSecurityModel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virStream</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStreamEventType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virStreamFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>enum</td><td>virVcpuState</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>struct</td><td>virError</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|     </table> | ||||
|  | ||||
|     <p></p> | ||||
|     <p> </p> | ||||
|  | ||||
|     <h2><a id="funccover">Function Coverage</a></h2> | ||||
|     <h2><a name="funccover">Function Coverage</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Coverage of the libvirt functions is: | ||||
| @@ -215,274 +227,274 @@ git clone git://libvirt.org/libvirt-csharp.git | ||||
|     <table class="top_table"> | ||||
|       <tr><th>Name</th><th>Binding?</th><th>Type?</th><th>Tested?</th><th>Sample Code?</th><th>Working?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr> | ||||
|       <tr><td>virConnectAuthCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectClose</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventRegister</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes, if the host handle the method</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes, if the host handle the method</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectListStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectNumOfStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectOpen</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen, virEventRegisterImpl, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectOpenAuth</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainBlockStats</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetName</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainInterfaceStats </td><td>No</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainLookupByID</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainManagedSave    </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainMigrate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainMigrateToURI   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainRef    </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSetMaxMemory   </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainManagedSave    </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainMigrate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainMigrateToURI   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainRef    </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSetMaxMemory   </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventHandleCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virEventRegisterImpl</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventTimeoutCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virFreeCallback</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceRef </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterRef  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretFree   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetUUIDString  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretSetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virSecretUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetConnect  </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>No</td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamAbort  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamFinish </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamFree   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamNew</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamRecv</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamSend</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamSendAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr> | ||||
|       <tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterRef  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretFree   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetUUIDString  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretSetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virSecretUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetConnect  </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>No</td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamAbort  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamFinish </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamFree   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamNew</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamRecv</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamSend</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamSendAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr> | ||||
|       <tr><td>virGetLastError</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virConnSetErrorFunc</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|       <tr><td>virErrorFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr> | ||||
|   | ||||
							
								
								
									
										50
									
								
								docs/deployment.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								docs/deployment.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Deployment</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a name="packages">Pre-packaged releases</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt API is now available in all major Linux distributions, | ||||
|       so the simplest deployment approach is to use your distributions' | ||||
|       package management software to install the <code>libvirt</code> | ||||
|       module. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a name="tarball">Self-built releases</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       libvirt uses GNU autotools for its build system, so deployment | ||||
|       follows the usual process of <code>configure; make ; make install</code> | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
|  | ||||
|       # ./configure --prefix=$HOME/usr | ||||
|       # make | ||||
|       # make install | ||||
|     </pre> | ||||
|  | ||||
|     <h2><a name="git">Built from GIT</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       When building from GIT it is necessary to generate the autotools | ||||
|       support files. This requires having <code>autoconf</code>, | ||||
|       <code>automake</code>, <code>libtool</code> and <code>intltool</code> | ||||
|       installed. The process can be automated with the <code>autogen.sh</code> | ||||
|       script. | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
|  | ||||
|       # ./autogen.sh --prefix=$HOME/usr | ||||
|       # make | ||||
|       # make install | ||||
|     </pre> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,42 +1,56 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>libvirt Application Development Guides</h1> | ||||
|     <h1>libvirt Application Development Guide</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt API is accessible from a number of programming languages. | ||||
|       At this time, there are application development guides available | ||||
|       which cover the C API and the Python API. Of the two, the Python guide | ||||
|       is currently the more comprehensive document. | ||||
|       The guide is both a learning tool for developing with libvirt and an | ||||
|       API reference document. It is a work in progress, composed by a | ||||
|       professional author from contributions written by members of the | ||||
|       libvirt team. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       Contributions to the guide are <b>VERY</b> welcome. If you'd like to get | ||||
|       your name on this and demonstrate your virtualisation prowess, a solid | ||||
|       contribution to the content here will do it. :) | ||||
|     </p> | ||||
|  | ||||
|     <h2><a name="online">Browsable online</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li> | ||||
|       <li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li> | ||||
|       <li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li> | ||||
|       <li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/html/"> | ||||
|         HTML format using multiple pages</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/html-single/"> | ||||
|         HTML format using one big page</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/pdf/Application_Development_Guide.pdf"> | ||||
|         PDF format</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/libvirt-0.7.5-Application_Development_Guide-en-US.epub"> | ||||
|         ePub format</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/txt/Application_Development_Guide.txt"> | ||||
|         Plain text format</a></li> | ||||
|       <li><a href="http://libvirt.org/guide/libvirt-Application_Development_Guide-0.7.5-web-en-US-1-9.el5.src.rpm"> | ||||
|         Source RPM format</a></li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2>Contributing content</h2> | ||||
|     <h2><a name="git">GIT source repository</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       These guides are written in DocBook and published with the | ||||
|       publican tool, which is also used for Fedora and Red Hat | ||||
|       documentation. The original content is provided in GIT and | ||||
|       any contributions to the guide are welcome. | ||||
|       The source is in a git repository: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| # C language | ||||
| $ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a> | ||||
|       git clone git://libvirt.org/libvirt-appdev-guide.git</pre> | ||||
|  | ||||
| # Python language | ||||
| $ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a> | ||||
|     <p> | ||||
|       Browsable here: | ||||
|     </p> | ||||
|  | ||||
| # Publican Style/Theme | ||||
| $ git clone <a href="https://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a> | ||||
|     </pre> | ||||
|     <pre> | ||||
|       <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary</a></pre> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -566,8 +566,8 @@ initially for the <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index. | ||||
| paravirtualization</a> but should be able to integrate other virtualization | ||||
| mechanisms if needed.</p> | ||||
| <p> If you get lost searching for some specific API use, try | ||||
| <a href="https://libvirt.org/search.php">the online search | ||||
| engine</a> hosted on <a href="https://libvirt.org/">libvirt.org</a> | ||||
| <a href="http://libvirt.org/search.php">the online search | ||||
| engine</a> hosted on <a href="http://libvirt.org/">libvirt.org</a> | ||||
| it indexes the project page, the APIs as well as the mailing-list archives. </p> | ||||
| 	</body> | ||||
|       </html> | ||||
|   | ||||
| @@ -1,169 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body class="docs"> | ||||
|     <div class="panel"> | ||||
|       <h2>Deployment / operation</h2> | ||||
|  | ||||
|       <dl> | ||||
|         <dt><a href="apps.html">Applications</a></dt> | ||||
|         <dd>Applications known to use libvirt</dd> | ||||
|  | ||||
|         <dt><a href="windows.html">Windows</a></dt> | ||||
|         <dd>Downloads for Windows</dd> | ||||
|  | ||||
|         <dt><a href="migration.html">Migration</a></dt> | ||||
|         <dd>Migrating guests between machines</dd> | ||||
|  | ||||
|         <dt><a href="remote.html">Remote access</a></dt> | ||||
|         <dd>Enable remote access over TCP</dd> | ||||
|  | ||||
|         <dt><a href="auth.html">Authentication</a></dt> | ||||
|         <dd>Configure authentication for the libvirt daemon</dd> | ||||
|  | ||||
|         <dt><a href="acl.html">Access control</a></dt> | ||||
|         <dd>Configure access control libvirt APIs with <a href="aclpolkit.html">polkit</a></dd> | ||||
|  | ||||
|         <dt><a href="logging.html">Logging</a></dt> | ||||
|         <dd>The library and the daemon logging support</dd> | ||||
|  | ||||
|         <dt><a href="auditlog.html">Audit log</a></dt> | ||||
|         <dd>Audit trail logs for host operations</dd> | ||||
|  | ||||
|         <dt><a href="firewall.html">Firewall</a></dt> | ||||
|         <dd>Firewall and network filter configuration</dd> | ||||
|  | ||||
|         <dt><a href="hooks.html">Hooks</a></dt> | ||||
|         <dd>Hooks for system specific management</dd> | ||||
|  | ||||
|         <dt><a href="nss.html">NSS module</a></dt> | ||||
|         <dd>Enable domain host name translation to IP addresses</dd> | ||||
|  | ||||
|         <dt><a href="http://wiki.libvirt.org/page/FAQ">FAQ</a></dt> | ||||
|         <dd>Frequently asked questions</dd> | ||||
|       </dl> | ||||
|  | ||||
|     </div> | ||||
|  | ||||
|     <div class="panel"> | ||||
|       <h2>Application development</h2> | ||||
|       <dl> | ||||
|         <dt><a href="devguide.html">Development Guide</a></dt> | ||||
|         <dd>A guide and reference for developing with libvirt</dd> | ||||
|  | ||||
|         <dt><a href="virshcmdref.html">Virsh Commands</a></dt> | ||||
|         <dd>Command reference for virsh</dd> | ||||
|  | ||||
|         <dt><a href="bindings.html">Language bindings</a></dt> | ||||
|         <dd>Bindings of the libvirt API for | ||||
|           <a href="csharp.html">c#</a>, | ||||
|           <a href="https://godoc.org/github.com/libvirt/libvirt-go">go</a>, | ||||
|           <a href="java.html">java</a>, | ||||
|           <a href="https://libvirt.org/ocaml/">ocaml</a>. | ||||
|           <a href="http://search.cpan.org/dist/Sys-Virt/">perl</a>, | ||||
|           <a href="python.html">python</a>, | ||||
|           <a href="php.html">php</a>, | ||||
|           <a href="https://libvirt.org/ruby/">ruby</a></dd> | ||||
|  | ||||
|  | ||||
|         <dt><a href="format.html">XML schemas</a></dt> | ||||
|         <dd>Description of the XML schemas for | ||||
|           <a href="formatdomain.html">domains</a>, | ||||
|           <a href="formatnetwork.html">networks</a>, | ||||
|           <a href="formatnwfilter.html">network filtering</a>, | ||||
|           <a href="formatstorage.html">storage</a>, | ||||
|           <a href="formatstorageencryption.html">storage encryption</a>, | ||||
|           <a href="formatcaps.html">capabilities</a>, | ||||
|           <a href="formatdomaincaps.html">domain capabilities</a>, | ||||
|           <a href="formatnode.html">node devices</a>, | ||||
|           <a href="formatsecret.html">secrets</a>, | ||||
|           <a href="formatsnapshot.html">snapshots</a></dd> | ||||
|  | ||||
|         <dt><a href="uri.html">URI format</a></dt> | ||||
|         <dd>The URI formats used for connecting to libvirt</dd> | ||||
|  | ||||
|         <dt><a href="locking.html">Disk locking</a></dt> | ||||
|         <dd>Ensuring exclusive guest access to disks with | ||||
|           <a href="locking-lockd.html">virtlockd</a> or | ||||
|           <a href="locking-sanlock.html">Sanlock</a></dd> | ||||
|  | ||||
|         <dt><a href="cgroups.html">CGroups</a></dt> | ||||
|         <dd>Control groups integration</dd> | ||||
|  | ||||
|         <dt><a href="html/index.html">API reference</a></dt> | ||||
|         <dd>Reference manual for the C public API, split in | ||||
|           <a href="html/libvirt-libvirt-common.html">common</a>, | ||||
|           <a href="html/libvirt-libvirt-domain.html">domain</a>, | ||||
|           <a href="html/libvirt-libvirt-domain-snapshot.html">domain snapshot</a>, | ||||
|           <a href="html/libvirt-virterror.html">error</a>, | ||||
|           <a href="html/libvirt-libvirt-event.html">event</a>, | ||||
|           <a href="html/libvirt-libvirt-host.html">host</a>, | ||||
|           <a href="html/libvirt-libvirt-interface.html">interface</a>, | ||||
|           <a href="html/libvirt-libvirt-network.html">network</a>, | ||||
|           <a href="html/libvirt-libvirt-nodedev.html">node device</a>, | ||||
|           <a href="html/libvirt-libvirt-nwfilter.html">network filter</a>, | ||||
|           <a href="html/libvirt-libvirt-secret.html">secret</a>, | ||||
|           <a href="html/libvirt-libvirt-storage.html">storage</a>, | ||||
|           <a href="html/libvirt-libvirt-stream.html">stream</a> | ||||
|         </dd> | ||||
|  | ||||
|         <dt><a href="drivers.html">Drivers</a></dt> | ||||
|         <dd>Hypervisor specific driver information</dd> | ||||
|  | ||||
|         <dt><a href="support.html">Support guarantees</a></dt> | ||||
|         <dd>Details of support status for various interfaces</dd> | ||||
|  | ||||
|         <dt><a href="hvsupport.html">Driver support</a></dt> | ||||
|         <dd>matrix of API support per hypervisor per release</dd> | ||||
|  | ||||
|         <dt><a href="secureusage.html">Secure usage</a></dt> | ||||
|         <dd>Secure usage of the libvirt APIs</dd> | ||||
|       </dl> | ||||
|     </div> | ||||
|  | ||||
|     <div class="panel"> | ||||
|       <h2>Project development</h2> | ||||
|       <dl> | ||||
|         <dt><a href="hacking.html">Contributor guidelines</a></dt> | ||||
|         <dd>General hacking guidelines for contributors</dd> | ||||
|  | ||||
|         <dt><a href="bugs.html">Bug reports</a></dt> | ||||
|         <dd>How and where to report bugs and request features</dd> | ||||
|  | ||||
|         <dt><a href="compiling.html">Compiling</a></dt> | ||||
|         <dd>How to compile libvirt</dd> | ||||
|  | ||||
|         <dt><a href="goals.html">Goals</a></dt> | ||||
|         <dd>Terminology and goals of libvirt API</dd> | ||||
|  | ||||
|         <dt><a href="api.html">API concepts</a></dt> | ||||
|         <dd>The libvirt API concepts</dd> | ||||
|  | ||||
|         <dt><a href="api_extension.html">API extensions</a></dt> | ||||
|         <dd>Adding new public libvirt APIs</dd> | ||||
|  | ||||
|         <dt><a href="internals/eventloop.html">Event loop and worker pool</a></dt> | ||||
|         <dd>Libvirt's event loop and worker pool mode</dd> | ||||
|  | ||||
|         <dt><a href="internals/command.html">Spawning commands</a></dt> | ||||
|         <dd>Spawning commands from libvirt driver code</dd> | ||||
|  | ||||
|         <dt><a href="internals/rpc.html">RPC protocol & APIs</a></dt> | ||||
|         <dd>RPC protocol information and API / dispatch guide</dd> | ||||
|  | ||||
|         <dt><a href="internals/locking.html">Lock managers</a></dt> | ||||
|         <dd>Use lock managers to protect disk content</dd> | ||||
|  | ||||
|         <dt><a href="internals/oomtesting.html">Out of memory testing</a></dt> | ||||
|         <dd>Simulating OOM conditions in the test suite</dd> | ||||
|  | ||||
|         <dt><a href="testsuites.html">Functional testing</a></dt> | ||||
|         <dd>Testing libvirt with <a href="testtck.html">TCK test suite</a> and | ||||
|          <a href="testapi.html">Libvirt-test-API</a></dd> | ||||
|       </dl> | ||||
|     </div> | ||||
|  | ||||
|     <br class="clear"/> | ||||
|  | ||||
|   <body> | ||||
|     <h1>Documentation</h1> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,424 +1,23 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Downloads</h1> | ||||
|  | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <h2><a id="releases">Project modules</a></h2> | ||||
|     <h2><a name="releases">Official Releases</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt project maintains a number of inter-related modules beyond | ||||
|       the core C library/daemon. | ||||
|     </p> | ||||
|  | ||||
|     <table class="top_table downloads"> | ||||
|       <thead> | ||||
|         <tr> | ||||
|           <th>Module</th> | ||||
|           <th>Releases</th> | ||||
|           <th>GIT Repo</th> | ||||
|           <th>GIT Mirrors</th> | ||||
|           <th>Resources</th> | ||||
|         </tr> | ||||
|       </thead> | ||||
|       <tbody> | ||||
|         <tr> | ||||
|           <td>libvirt</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt">github</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="html/index.html">api ref</a> | ||||
|             <a href="news.html">changes</a> | ||||
|           </td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <th colspan="7">Language bindings</th> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>C#</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/csharp/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/csharp/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-csharp">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-csharp">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Go</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/go/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/go/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-go.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-go">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-go">github</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://godoc.org/github.com/libvirt/libvirt-go">api ref</a> | ||||
|           </td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Java</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/java/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/java/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-java.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-java">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-java">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>OCaml</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/ocaml/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/ocaml/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-ocaml.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-ocaml">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-ocaml">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Perl (Sys::Virt)</td> | ||||
|           <td> | ||||
|             <a href="http://search.cpan.org/dist/Sys-Virt/">cpan</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-perl.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-perl">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-perl">github</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="http://search.cpan.org/dist/Sys-Virt/">api ref</a> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-perl.git;a=blob;f=Changes;hb=HEAD">changes</a> | ||||
|           </td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>PHP</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/php/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/php/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-php.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-php">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-php">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Python</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/python/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/python/">https</a> | ||||
|             <a href="https://pypi.python.org/pypi/libvirt-python">pypi</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-python.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-python">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-python">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Ruby</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/ruby/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/ruby/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=ruby-libvirt.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/ruby-libvirt">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/ruby-libvirt">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Rust</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/rust/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/rust/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-rust.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-rust">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-rust">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <th colspan="7">Integration modules</th> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>GLib / GConfig / GObject</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/glib/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/glib/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-glib.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-glib">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-glib">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Go XML</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/go/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/go/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-go-xml.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-go-xml">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-go-xml">github</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://godoc.org/github.com/libvirt/libvirt-go-xml">api ref</a> | ||||
|           </td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Console Proxy</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/consoleproxy/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/consoleproxy/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-console-proxy.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-console-proxy">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-console-proxy">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>CIM provider</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/CIM/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/CIM/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-cim.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-cim">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-cim">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>CIM utils</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/CIM/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/CIM/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libcmpiutil.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libcmpiutil">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libcmpiutil">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>SNMP</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/snmp/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/snmp/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-snmp.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-snmp">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-snmp">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Application Sandbox</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/sandbox/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/sandbox/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-sandbox.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-sandbox">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-sandbox">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <th colspan="7">Testing</th> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>TCK</td> | ||||
|           <td> | ||||
|             <a href="ftp://libvirt.org/libvirt/tck/">ftp</a> | ||||
|             <a href="https://libvirt.org/sources/tck/">https</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-tck.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-tck">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-tck">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Test API</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-test-API.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-test-API">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-test-API">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Jenkins Config</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-jenkins-ci.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-jenkins-ci">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-jenkins-ci">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>CIM Test</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=cimtest.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/cimtest">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/cimtest">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <th colspan="7">Documentation</th> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>Publican Brand</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-publican.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-publican">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-publican">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>App Development Guide</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-appdev-guide">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-appdev-guide">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>App Development Guide Python</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-appdev-guide-python">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-appdev-guide-python">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>virsh Command Reference</td> | ||||
|           <td></td> | ||||
|           <td> | ||||
|             <a href="https://libvirt.org/git/?p=libvirt-virshcmdref.git;a=summary">libvirt</a> | ||||
|           </td> | ||||
|           <td> | ||||
|             <a href="https://gitlab.com/libvirt/libvirt-virshcmdref">gitlab</a> | ||||
|             <a href="https://github.com/libvirt/libvirt-virshcmdref">github</a> | ||||
|           </td> | ||||
|           <td></td> | ||||
|         </tr> | ||||
|       </tbody> | ||||
|     </table> | ||||
|  | ||||
|     <h2>Primary download site</h2> | ||||
|  | ||||
|     <p> | ||||
|       Most modules have releases made available for download on the project | ||||
|       site, via FTP, HTTP or HTTPS. Some modules are instead made available | ||||
|       at alternative locations, for example, the Perl binding is made | ||||
|       available only on CPAN. | ||||
|       The latest versions of the libvirt C library can be downloaded from: | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="ftp://libvirt.org/libvirt/">libvirt.org FTP server</a></li> | ||||
|       <li><a href="https://libvirt.org/sources/">libvirt.org HTTP server</a></li> | ||||
|       <li><a href="https://libvirt.org/sources/">libvirt.org HTTPS server</a></li> | ||||
|       <li><a href="http://libvirt.org/sources/">libvirt.org HTTP server</a></li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="hourly">Hourly development snapshots</a></h2> | ||||
|     <h2><a name="hourly">Hourly development snapshots</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Once an hour, an automated snapshot is made from the git server | ||||
| @@ -429,77 +28,24 @@ | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.xz">libvirt.org FTP server</a></li> | ||||
|       <li><a href="https://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li> | ||||
|       <li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.gz">libvirt.org FTP server</a></li> | ||||
|       <li><a href="http://libvirt.org/sources/libvirt-git-snapshot.tar.gz">libvirt.org HTTP server</a></li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="schedule">Primary release schedule</a></h2> | ||||
|  | ||||
|     <h2><a name="maintenance">Maintenance releases</a></h2> | ||||
|     <p> | ||||
|       The core libvirt module follows a time based plan, with releases made | ||||
|       once a month on the 1st of each month give or take a few days. The only | ||||
|       exception is at the start of the year where there are two 6 weeks gaps | ||||
|       (first release in the middle of Jan, then skip the Feb release), giving | ||||
|       a total of 11 releases a year. The Python and Perl modules will aim to | ||||
|       release at the same time as the core libvirt module. Other modules have | ||||
|       independant ad-hoc releases with no fixed time schedle. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="numbering">Release numbering</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       Since libvirt 2.0.0, a time based version numbering rule | ||||
|       is applied to the core library releases. As such, the changes | ||||
|       in version number have do not have any implications with respect | ||||
|       to the scope of features or bugfixes included, the stability of | ||||
|       the code, or the API / ABI compatibility (libvirt API / ABI is | ||||
|       guaranteed stable forever). The rules applied for changing the | ||||
|       libvirt version number are: | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>major</code></dt> | ||||
|       <dd>incremented by 1 for the first release of the year (the | ||||
|         Jan 15th release)</dd> | ||||
|       <dt><code>minor</code></dt> | ||||
|       <dd>reset to 0 with every major increment, otherwise incremented by 1 | ||||
|         for each monthly release from git master</dd> | ||||
|       <dt><code>micro</code></dt> | ||||
|       <dd>always 0 for releases from git master, incremented by 1 | ||||
|         for each stable maintenance release</dd> | ||||
|     </dl> | ||||
|  | ||||
|     <p> | ||||
|       Prior to 2.0.0, the major/minor numbers were incremented | ||||
|       fairly arbitrarily, and maintenance releases appended a | ||||
|       fourth digit. The language bindings will aim to use the | ||||
|       same version number as the most recent core library API | ||||
|       they support. The other modules have their own distinct | ||||
|       release numbering sequence, though they generally aim | ||||
|       to follow the above rules for incrementing major/minor/micro | ||||
|       digits. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="maintenance">Maintenance releases</a></h2> | ||||
|     <p> | ||||
|       In the git repository are several stable maintenance branches | ||||
|       for the core library, matching the | ||||
|       pattern <code>v<i>major</i>.<i>minor</i>-maint</code>; | ||||
|       In the git repository are several stable maintenance branches, | ||||
|       matching the | ||||
|       pattern <code>v<i>major</i>.<i>minor</i>.<i>micro</i>-maint</code>; | ||||
|       these branches are forked off the corresponding | ||||
|       <code>v<i>major</i>.<i>minor</i>.0</code> formal | ||||
|       <code>v<i>major</i>.<i>minor</i>.<i>micro</i></code> formal | ||||
|       release, and may have further releases of the | ||||
|       form <code>v<i>major</i>.<i>minor</i>.<i>micro</i></code>. | ||||
|       form <code>v<i>major</i>.<i>minor</i>.<i>micro</i>.<i>rel</i></code>. | ||||
|       These maintenance branches should only contain bug fixes, and no | ||||
|       new features, backported from the master branch, and are | ||||
|       supported as long as at least one downstream distribution | ||||
|       expresses interest in a given branch.  These maintenance | ||||
|       branches are considered during CVE analysis. In contrast | ||||
|       to the primary releases which are made once a month, there | ||||
|       is no formal schedule for the maintenance releases, which | ||||
|       are made whenever there is a need to make available key | ||||
|       bugfixes to downstream consumers. The language bindings | ||||
|       and other modules generally do not provide stable branch | ||||
|       releases. | ||||
|       branches are considered during CVE analysis. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
| @@ -508,19 +54,25 @@ | ||||
|       wiki page</a>. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="git">GIT source repository</a></h2> | ||||
|     <h2><a name="git">GIT source repository</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       All modules maintained by the libvirt project have their primary | ||||
|       source available in the <a href="https://libvirt.org/git/">project GIT server</a>. | ||||
|       Each module can be cloned anonymously using: | ||||
|       Libvirt code source is now maintained in a <a href="http://git-scm.com/">git</a> | ||||
|       repository available on <a href="http://libvirt.org/git/">libvirt.org</a>: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| git clone git://libvirt.org/[module name].git</pre> | ||||
|       git clone git://libvirt.org/libvirt.git</pre> | ||||
|  | ||||
|     <p> | ||||
|       In addition to this primary repository, there are the following read-only git | ||||
|       It can also be browsed at: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
|       <a href="http://libvirt.org/git/?p=libvirt.git;a=summary">http://libvirt.org/git/?p=libvirt.git;a=summary</a></pre> | ||||
|  | ||||
|     <p> | ||||
|       In addition to this repository, there are the following read-only git | ||||
|       repositories which mirror the master one. Note that we currently do not | ||||
|       use the full set of features on these mirrors (e.g. pull requests on | ||||
|       GitHub, so please don't use them). All patch review and discussion only | ||||
| @@ -529,8 +81,58 @@ git clone git://libvirt.org/[module name].git</pre> | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| <a href="https://github.com/libvirt/">https://github.com/libvirt/</a> | ||||
| <a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/</a></pre> | ||||
|       <a href="https://github.com/libvirt/libvirt">https://github.com/libvirt/libvirt</a> | ||||
|       <a href="http://repo.or.cz/w/libvirt.git">http://repo.or.cz/w/libvirt.git</a> | ||||
|       <a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/libvirt</a></pre> | ||||
|  | ||||
|     <br /> | ||||
|  | ||||
|     <h1>libvirt Application Development Guide</h1> | ||||
|  | ||||
|     <p> | ||||
|       The guide is both a learning tool for developing with libvirt and an | ||||
|       API reference document. It is a work in progress, composed by a | ||||
|       professional author from contributions written by members of the | ||||
|       libvirt team. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       Contributions to the guide are <b>VERY</b> welcome. If you'd like to get | ||||
|       your name on this and demonstrate your virtualisation prowess, a solid | ||||
|       contribution to the content here will do it. :) | ||||
|     </p> | ||||
|  | ||||
|     <h2><a name="appdevpdf">Application Development Guide PDF</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       PDF download is available here: | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="http://libvirt.org/guide/pdf/Application_Development_Guide.pdf">libvirt App Dev Guide</a> (PDF)</li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a name="appdevgit">Application Development Guide source GIT repository</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The source is also in a git repository: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
|       git clone git://libvirt.org/libvirt-appdev-guide.git</pre> | ||||
|  | ||||
|     <p> | ||||
|       Browsable at: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
|       <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary</a></pre> | ||||
|  | ||||
|     <br /> | ||||
|  | ||||
|     <p> | ||||
|       Once you've have obtained the libvirt source code, you can compile it | ||||
|       using the <a href="compiling.html">instructions here</a>. | ||||
|     </p> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,14 +1,10 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Internal drivers</h1> | ||||
|  | ||||
|     <ul> | ||||
|       <li><a href="#hypervisor">Hypervisor drivers</a></li> | ||||
|       <li><a href="#storage">Storage drivers</a></li> | ||||
|       <li><a href="drvnodedev.html">Node device driver</a></li> | ||||
|     </ul> | ||||
|     <ul id="toc"></ul> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt public API delegates its implementation to one or | ||||
| @@ -18,7 +14,7 @@ | ||||
|       network and storage driver active. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="hypervisor">Hypervisor drivers</a></h2> | ||||
|     <h2><a name="hypervisor">Hypervisor drivers</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       The hypervisor drivers currently supported by libvirt are: | ||||
| @@ -36,11 +32,11 @@ | ||||
|       <li><strong><a href="drvxen.html">Xen</a></strong></li> | ||||
|       <li><strong><a href="drvhyperv.html">Microsoft Hyper-V</a></strong></li> | ||||
|       <li><strong><a href="drvphyp.html">IBM PowerVM (phyp)</a></strong></li> | ||||
|       <li><strong><a href="drvvirtuozzo.html">Virtuozzo</a></strong></li> | ||||
|       <li><strong><a href="drvparallels.html">Parallels</a></strong></li> | ||||
|       <li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="storage">Storage drivers</a></h2> | ||||
|     <h2><a name="storage">Storage drivers</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li><strong><a href="storage.html#StorageBackendDir">Directory backend</a></strong></li> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Bhyve driver</h1> | ||||
| @@ -13,25 +13,14 @@ of bhyve are supported. | ||||
|  | ||||
| In order to enable bhyve on your FreeBSD host, you'll need to load the <code>vmm</code> | ||||
| kernel module. Additionally, <code>if_tap</code> and <code>if_bridge</code> modules | ||||
| should be loaded for networking support. Also, <span class="since">since 3.2.0</span> the | ||||
| <code>virt-host-validate(1)</code> supports the bhyve host validation and could be | ||||
| used like this: | ||||
| should be loaded for networking support. | ||||
| </p> | ||||
|  | ||||
| <pre> | ||||
| $ virt-host-validate bhyve | ||||
|  BHYVE: Checking for vmm module                                              : PASS | ||||
|  BHYVE: Checking for if_tap module                                           : PASS | ||||
|  BHYVE: Checking for if_bridge module                                        : PASS | ||||
|  BHYVE: Checking for nmdm module                                             : PASS | ||||
| $ | ||||
| </pre> | ||||
|  | ||||
| <p> | ||||
| Additional information on bhyve could be obtained on <a href="http://bhyve.org/">bhyve.org</a>. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="uri">Connections to the Bhyve driver</a></h2> | ||||
| <h2><a name="uri">Connections to the Bhyve driver</a></h2> | ||||
| <p> | ||||
| The libvirt bhyve driver is a single-instance privileged driver. Some sample | ||||
| connection URIs are: | ||||
| @@ -43,7 +32,7 @@ bhyve+unix:///system                (local access) | ||||
| bhyve+ssh://root@example.com/system (remote access, SSH tunnelled) | ||||
| </pre> | ||||
|  | ||||
| <h2><a id="exconfig">Example guest domain XML configurations</a></h2> | ||||
| <h2><a name="exconfig">Example guest domain XML configurations</a></h2> | ||||
|  | ||||
| <h3>Example config</h3> | ||||
| <p> | ||||
| @@ -155,60 +144,9 @@ Note the addition of <bootloader>. | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <h3>Example config (Linux UEFI guest, VNC, tablet)</h3> | ||||
| <h2><a name="usage">Guest usage / management</a></h2> | ||||
|  | ||||
| <p>This is an example to boot into Fedora 25 installation:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type='bhyve'> | ||||
|     <name>fedora_uefi_vnc_tablet</name> | ||||
|     <memory unit='G'>4</memory> | ||||
|     <vcpu>2</vcpu> | ||||
|     <os> | ||||
|        <type>hvm</type> | ||||
|        <b><loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader></b> | ||||
|     </os> | ||||
|     <features> | ||||
|       <apic/> | ||||
|       <acpi/> | ||||
|     </features> | ||||
|     <clock offset='utc'/> | ||||
|     <on_poweroff>destroy</on_poweroff> | ||||
|     <on_reboot>restart</on_reboot> | ||||
|     <on_crash>destroy</on_crash> | ||||
|     <devices> | ||||
|       <disk type='file' device='cdrom'> | ||||
|         <driver name='file' type='raw'/> | ||||
|           <source file='/path/to/Fedora-Workstation-Live-x86_64-25-1.3.iso'/> | ||||
|         <target dev='hdc' bus='sata'/> | ||||
|         <readonly/> | ||||
|       </disk> | ||||
|       <disk type='file' device='disk'> | ||||
|         <driver name='file' type='raw'/> | ||||
|         <source file='/path/to/linux_uefi.img'/> | ||||
|         <target dev='hda' bus='sata'/> | ||||
|         </disk> | ||||
|       <interface type='bridge'> | ||||
|         <model type='virtio'/> | ||||
|         <source bridge="virbr0"/> | ||||
|       </interface> | ||||
|       <serial type="nmdm"> | ||||
|         <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/> | ||||
|       </serial> | ||||
|       <b><graphics type='vnc' port='5904'> | ||||
|         <listen type='address' address='127.0.0.1'/> | ||||
|       </graphics> | ||||
|       <controller type='usb' model='nec-xhci'/> | ||||
|       <input type='tablet' bus='usb'/></b> | ||||
|     </devices> | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <p>Please refer to the <a href="#uefi">UEFI</a> section for a more detailed explanation.</p> | ||||
|  | ||||
| <h2><a id="usage">Guest usage / management</a></h2> | ||||
|  | ||||
| <h3><a id="console">Connecting to a guest console</a></h3> | ||||
| <h3><a name="console">Connecting to a guest console</a></h3> | ||||
|  | ||||
| <p> | ||||
| Guest console connection is supported through the <code>nmdm</code> device. It could be enabled by adding | ||||
| @@ -216,13 +154,13 @@ the following to the domain XML (<span class="since">Since 1.2.4</span>): | ||||
| </p> | ||||
|  | ||||
| <pre> | ||||
| ... | ||||
| <devices> | ||||
|   <serial type="nmdm"> | ||||
|     <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/> | ||||
|   </serial> | ||||
| </devices> | ||||
| ...</pre> | ||||
|   ... | ||||
|   <devices> | ||||
|     <serial type="nmdm"> | ||||
|       <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/> | ||||
|     </serial> | ||||
|   </devices> | ||||
|   ...</pre> | ||||
|  | ||||
|  | ||||
| <p>Make sure to load the <code>nmdm</code> kernel module if you plan to use that.</p> | ||||
| @@ -253,7 +191,7 @@ device) is:</p> | ||||
|  | ||||
| <pre>cu -l /dev/nmdm0B</pre> | ||||
|  | ||||
| <h3><a id="xmltonative">Converting from domain XML to Bhyve args</a></h3> | ||||
| <h3><a name="xmltonative">Converting from domain XML to Bhyve args</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh domxml-to-native</code> command can preview the actual | ||||
| @@ -275,23 +213,23 @@ tweak them.</p> | ||||
| /usr/sbin/bhyve -c 2 -m 214 -A -I -H -P -s 0:0,hostbridge -s 3:0,virtio-net,tap0,mac=52:54:00:5d:74:e3 -s 2:0,virtio-blk,/home/user/vm1.img -s 1,lpc -l com1,/dev/nmdm0A vm1 | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="zfsvolume">Using ZFS volumes</a></h3> | ||||
| <h3><a name="zfsvolume">Using ZFS volumes</a></h3> | ||||
|  | ||||
| <p>It's possible to use ZFS volumes as disk devices <span class="since">since 1.2.8</span>. | ||||
| An example of domain XML device entry for that will look like:</p> | ||||
|  | ||||
| <pre> | ||||
| ... | ||||
| <disk type='volume' device='disk'> | ||||
|   <source pool='zfspool' volume='vol1'/> | ||||
|   <target dev='vdb' bus='virtio'/> | ||||
| </disk> | ||||
| ...</pre> | ||||
|   ... | ||||
|   <disk type='volume' device='disk'> | ||||
|     <source pool='zfspool' volume='vol1'/> | ||||
|     <target dev='vdb' bus='virtio'/> | ||||
|   </disk> | ||||
|   ...</pre> | ||||
|  | ||||
| <p>Please refer to the <a href="storage.html">Storage documentation</a> for more details on storage | ||||
| management.</p> | ||||
|  | ||||
| <h3><a id="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3> | ||||
| <h3><a name="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3> | ||||
|  | ||||
| <p>It's possible to boot non-FreeBSD guests by specifying an explicit | ||||
| bootloader, e.g. <code>grub-bhyve(1)</code>. Arguments to the bootloader may be | ||||
| @@ -303,134 +241,14 @@ the first disk in the domain (either <code>cdrom</code>- or | ||||
| attempt to boot from the first partition in the disk image.</p> | ||||
|  | ||||
| <pre> | ||||
| ... | ||||
| <bootloader>/usr/local/sbin/grub-bhyve</bootloader> | ||||
| <bootloader_args>...</bootloader_args> | ||||
| ... | ||||
|   ... | ||||
|     <bootloader>/usr/local/sbin/grub-bhyve</bootloader> | ||||
|     <bootloader_args>...</bootloader_args> | ||||
|   ... | ||||
| </pre> | ||||
|  | ||||
| <p>Caveat: <code>bootloader_args</code> does not support any quoting. | ||||
| Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p> | ||||
|  | ||||
| <h3><a id="uefi">Using UEFI bootrom, VNC, and USB tablet</a></h3> | ||||
|  | ||||
| <p><span class="since">Since 3.2.0</span>, in addition to <a href="#grubbhyve">grub-bhyve</a>, | ||||
| non-FreeBSD guests could be also booted using an UEFI boot ROM, provided both guest OS and | ||||
| installed <code>bhyve(1)</code> version support UEFI. To use that, <code>loader</code> | ||||
| should be specified in the <code>os</code> section:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type='bhyve'> | ||||
|     ... | ||||
|     <os> | ||||
|        <type>hvm</type> | ||||
|        <loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader> | ||||
|     </os> | ||||
|     ... | ||||
| </pre> | ||||
|  | ||||
| <p>This uses the UEFI firmware provided by | ||||
| the <a href="https://www.freshports.org/sysutils/bhyve-firmware/">sysutils/bhyve-firmware</a> | ||||
| FreeBSD port.</p> | ||||
|  | ||||
| <p>VNC and the tablet input device could be configured this way:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type='bhyve'> | ||||
|     <devices> | ||||
|       ... | ||||
|       <graphics type='vnc' port='5904'> | ||||
|         <listen type='address' address='127.0.0.1'/> | ||||
|       </graphics> | ||||
|       <controller type='usb' model='nec-xhci'/> | ||||
|       <input type='tablet' bus='usb'/> | ||||
|     </devices> | ||||
|     ... | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <p>This way, VNC will be accessible on <code>127.0.0.1:5904</code>.</p> | ||||
|  | ||||
| <p>Please note that the tablet device requires to have a USB controller | ||||
| of the <code>nec-xhci</code> model. Currently, only a single controller of this | ||||
| type and a single tablet are supported per domain.</p> | ||||
|  | ||||
| <p><span class="since">Since 3.5.0</span>, it's possible to configure how the video device is exposed | ||||
| to the guest using the <code>vgaconf</code> attribute:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type='bhyve'> | ||||
|     <devices> | ||||
|     ... | ||||
|       <graphics type='vnc' port='5904'> | ||||
|         <listen type='address' address='127.0.0.1'/> | ||||
|       </graphics> | ||||
|       <video> | ||||
|         <driver vgaconf='on'/> | ||||
|         <model type='gop' heads='1' primary='yes'/> | ||||
|       </video> | ||||
|       ... | ||||
|     </devices> | ||||
|     ... | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <p>If not specified, bhyve's default mode for <code>vgaconf</code> | ||||
| will be used. Please refer to the | ||||
| <a href="https://www.freebsd.org/cgi/man.cgi?query=bhyve&sektion=8&manpath=FreeBSD+12-current">bhyve(8)</a> | ||||
| manual page and the <a href="https://wiki.freebsd.org/bhyve">bhyve wiki</a> for more details on using | ||||
| the <code>vgaconf</code> option.</p> | ||||
|  | ||||
| <p><span class="since">Since 3.7.0</span>, it's possible to use <code>autoport</code> | ||||
| to let libvirt allocate VNC port automatically (instead of explicitly specifying | ||||
| it with the <code>port</code> attribute):</p> | ||||
|  | ||||
| <pre> | ||||
|     <graphics type='vnc' autoport='yes'> | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="clockconfig">Clock configuration</a></h3> | ||||
|  | ||||
| <p>Originally bhyve supported only localtime for RTC. Support for UTC time was introduced in | ||||
| <a href="http://svnweb.freebsd.org/changeset/base/284894">r284894</a> for <i>10-STABLE</i> and | ||||
| in <a href="http://svnweb.freebsd.org/changeset/base/279225">r279225</a> for <i>-CURRENT</i>. | ||||
| It's possible to use this in libvirt <span class="since">since 1.2.18</span>, just place the | ||||
| following to domain XML:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type="bhyve"> | ||||
|     ... | ||||
|     <clock offset='utc'/> | ||||
|     ... | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <p>Please note that if you run the older bhyve version that doesn't support UTC time, you'll | ||||
| fail to start a domain. As UTC is used as a default when you do not specify clock settings, | ||||
| you'll need to explicitly specify 'localtime' in this case:</p> | ||||
|  | ||||
| <pre> | ||||
| <domain type="bhyve"> | ||||
|     ... | ||||
|     <clock offset='localtime'/> | ||||
|     ... | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="e1000">e1000 NIC</a></h3> | ||||
|  | ||||
| <p>As of <a href="https://svnweb.freebsd.org/changeset/base/302504">r302504</a> bhyve | ||||
| supports Intel e1000 network adapter emulation. It's supported in libvirt | ||||
| <span class="since">since 3.1.0</span> and could be used as follows:</p> | ||||
|  | ||||
| <pre> | ||||
| ... | ||||
|     <interface type='bridge'> | ||||
|       <source bridge='virbr0'/> | ||||
|       <model type='<b>e1000</b>'/> | ||||
|     </interface> | ||||
| ... | ||||
| </pre> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>VMware ESX hypervisor driver</h1> | ||||
| @@ -11,7 +11,7 @@ | ||||
|         connect to a VMware vCenter 2.5/4.x/5.x (VPX). | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="project">Project Links</a></h2> | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li> | ||||
| @@ -20,7 +20,7 @@ | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="prereq">Deployment pre-requisites</a></h2> | ||||
|     <h2><a name="prereq">Deployment pre-requisites</a></h2> | ||||
|     <p> | ||||
|         None. Any out-of-the-box installation of VPX/ESX(i)/GSX should work. No | ||||
|         preparations are required on the server side, no libvirtd must be | ||||
| @@ -34,7 +34,7 @@ | ||||
|         VMware vSphere API</a>. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="uri">Connections to the VMware ESX driver</a></h2> | ||||
|     <h2><a name="uri">Connections to the VMware ESX driver</a></h2> | ||||
|     <p> | ||||
|         Some example remote connection URIs for the driver are: | ||||
|     </p> | ||||
| @@ -54,7 +54,7 @@ esx://example-esx.com/?no_verify=1     (ESX over HTTPS, but doesn't verify the s | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="uriformat">URI Format</a></h3> | ||||
|     <h3><a name="uriformat">URI Format</a></h3> | ||||
|     <p> | ||||
|         URIs have this general form (<code>[...]</code> marks an optional part). | ||||
|     </p> | ||||
| @@ -93,7 +93,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h4><a id="extraparams">Extra parameters</a></h4> | ||||
|     <h4><a name="extraparams">Extra parameters</a></h4> | ||||
|     <p> | ||||
|         Extra parameters can be added to a URI as part of the query string | ||||
|         (the part following <code>?</code>). A single parameter is formed by a | ||||
| @@ -188,7 +188,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com | ||||
|     </table> | ||||
|  | ||||
|  | ||||
|     <h3><a id="auth">Authentication</a></h3> | ||||
|     <h3><a name="auth">Authentication</a></h3> | ||||
|     <p> | ||||
|         In order to perform any useful operation the driver needs to log into | ||||
|         the ESX server. Therefore, only <code>virConnectOpenAuth</code> can be | ||||
| @@ -208,7 +208,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="certificates">Certificates for HTTPS</a></h3> | ||||
|     <h3><a name="certificates">Certificates for HTTPS</a></h3> | ||||
|     <p> | ||||
|         By default the ESX driver uses HTTPS to communicate with an ESX server. | ||||
|         Proper HTTPS communication requires correctly configured SSL | ||||
| @@ -244,7 +244,7 @@ error: internal error curl_easy_perform() returned an error: Peer certificate ca | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h3><a id="connproblems">Connection problems</a></h3> | ||||
|     <h3><a name="connproblems">Connection problems</a></h3> | ||||
|     <p> | ||||
|         There are also other causes for connection problems than the | ||||
|         <a href="#certificates">HTTPS certificate</a> related ones. | ||||
| @@ -303,7 +303,7 @@ error: invalid argument in libvirt was built without the 'esx' driver | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a id="questions">Questions blocking tasks</a></h2> | ||||
|     <h2><a name="questions">Questions blocking tasks</a></h2> | ||||
|     <p> | ||||
|         Some methods of the VI API start tasks, for example | ||||
|         <code>PowerOnVM_Task()</code>. Such tasks may be blocked by questions | ||||
| @@ -322,12 +322,12 @@ error: invalid argument in libvirt was built without the 'esx' driver | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a id="xmlspecial">Specialties in the domain XML config</a></h2> | ||||
|     <h2><a name="xmlspecial">Specialties in the domain XML config</a></h2> | ||||
|     <p> | ||||
|         There are several specialties in the domain XML config for ESX domains. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="restrictions">Restrictions</a></h3> | ||||
|     <h3><a name="restrictions">Restrictions</a></h3> | ||||
|     <p> | ||||
|         There are some restrictions for some values of the domain XML config. | ||||
|         The driver will complain if this restrictions are violated. | ||||
| @@ -347,7 +347,7 @@ error: invalid argument in libvirt was built without the 'esx' driver | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h3><a id="datastore">Datastore references</a></h3> | ||||
|     <h3><a name="datastore">Datastore references</a></h3> | ||||
|     <p> | ||||
|         Storage is managed in datastores. VMware uses a special path format to | ||||
|         reference files in a datastore. Basically, the datastore name is put | ||||
| @@ -366,7 +366,7 @@ error: invalid argument in libvirt was built without the 'esx' driver | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="macaddresses">MAC addresses</a></h3> | ||||
|     <h3><a name="macaddresses">MAC addresses</a></h3> | ||||
|     <p> | ||||
|         VMware has registered two MAC address prefixes for domains: | ||||
|         <code>00:0c:29</code> and <code>00:50:56</code>. These prefixes are | ||||
| @@ -427,7 +427,7 @@ ethernet0.checkMACAddress = "false" | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h3><a id="hardware">Available hardware</a></h3> | ||||
|     <h3><a name="hardware">Available hardware</a></h3> | ||||
|     <p> | ||||
|         VMware ESX supports different models of SCSI controllers and network | ||||
|         cards. | ||||
| @@ -467,14 +467,14 @@ ethernet0.checkMACAddress = "false" | ||||
|         Here a domain XML snippet: | ||||
|     </p> | ||||
| <pre> | ||||
| ... | ||||
| <disk type='file' device='disk'> | ||||
|   <source file='[local-storage] Fedora11/Fedora11.vmdk'/> | ||||
|   <target dev='sda' bus='scsi'/> | ||||
|   <address type='drive' controller='0' bus='0' unit='0'/> | ||||
| </disk> | ||||
| <controller type='scsi' index='0' model='<strong>lsilogic</strong>'/> | ||||
| ... | ||||
|     ... | ||||
|     <disk type='file' device='disk'> | ||||
|       <source file='[local-storage] Fedora11/Fedora11.vmdk'/> | ||||
|       <target dev='sda' bus='scsi'/> | ||||
|       <address type='drive' controller='0' bus='0' unit='0'/> | ||||
|     </disk> | ||||
|     <controller type='scsi' index='0' model='<strong>lsilogic</strong>'/> | ||||
|     ... | ||||
| </pre> | ||||
|     <p> | ||||
|         The controller element is supported <span class="since">since 0.8.2</span>. | ||||
| @@ -482,13 +482,13 @@ ethernet0.checkMACAddress = "false" | ||||
|         specify the SCSI controller model. This attribute usage is deprecated now. | ||||
|     </p> | ||||
| <pre> | ||||
| ... | ||||
| <disk type='file' device='disk'> | ||||
|   <driver name='<strong>lsilogic</strong>'/> | ||||
|   <source file='[local-storage] Fedora11/Fedora11.vmdk'/> | ||||
|   <target dev='sda' bus='scsi'/> | ||||
| </disk> | ||||
| ... | ||||
|     ... | ||||
|     <disk type='file' device='disk'> | ||||
|       <driver name='<strong>lsilogic</strong>'/> | ||||
|       <source file='[local-storage] Fedora11/Fedora11.vmdk'/> | ||||
|       <target dev='sda' bus='scsi'/> | ||||
|     </disk> | ||||
|     ... | ||||
| </pre> | ||||
|  | ||||
|  | ||||
| @@ -513,24 +513,24 @@ ethernet0.checkMACAddress = "false" | ||||
|         Here a domain XML snippet: | ||||
|     </p> | ||||
| <pre> | ||||
| ... | ||||
| <interface type='bridge'> | ||||
|   <mac address='00:50:56:25:48:c7'/> | ||||
|   <source bridge='VM Network'/> | ||||
|   <model type='<strong>e1000</strong>'/> | ||||
| </interface> | ||||
| ... | ||||
|     ... | ||||
|     <interface type='bridge'> | ||||
|       <mac address='00:50:56:25:48:c7'/> | ||||
|       <source bridge='VM Network'/> | ||||
|       <model type='<strong>e1000</strong>'/> | ||||
|     </interface> | ||||
|     ... | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h2><a id="importexport">Import and export of domain XML configs</a></h2> | ||||
|     <h2><a name="importexport">Import and export of domain XML configs</a></h2> | ||||
|     <p> | ||||
|         The ESX driver currently supports a native config format known as | ||||
|         <code>vmware-vmx</code> to handle VMware VMX configs. | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="xmlimport">Converting from VMware VMX config to domain XML config</a></h3> | ||||
|     <h3><a name="xmlimport">Converting from VMware VMX config to domain XML config</a></h3> | ||||
|     <p> | ||||
|         The <code>virsh domxml-from-native</code> provides a way to convert an | ||||
|         existing VMware VMX config into a domain XML config that can then be | ||||
| @@ -621,7 +621,7 @@ Enter root password for example.com: | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h3><a id="xmlexport">Converting from domain XML config to VMware VMX config</a></h3> | ||||
|     <h3><a name="xmlexport">Converting from domain XML config to VMware VMX config</a></h3> | ||||
|     <p> | ||||
|       The <code>virsh domxml-to-native</code> provides a way to convert a | ||||
|       domain XML config into a VMware VMX config. | ||||
| @@ -675,7 +675,7 @@ ethernet0.address = "00:50:56:25:48:C7" | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h2><a id="xmlconfig">Example domain XML configs</a></h2> | ||||
|     <h2><a name="xmlconfig">Example domain XML configs</a></h2> | ||||
|  | ||||
|     <h3>Fedora11 on x86_64</h3> | ||||
| <pre> | ||||
| @@ -704,7 +704,7 @@ ethernet0.address = "00:50:56:25:48:C7" | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h2><a id="migration">Migration</a></h2> | ||||
|     <h2><a name="migration">Migration</a></h2> | ||||
|     <p> | ||||
|         A migration cannot be initiated on an ESX server directly, a VMware | ||||
|         vCenter is necessary for this. The <code>vcenter</code> query | ||||
| @@ -749,7 +749,7 @@ Enter administrator password for example-vcenter.com: | ||||
| </pre> | ||||
|  | ||||
|  | ||||
|     <h2><a id="scheduler">Scheduler configuration</a></h2> | ||||
|     <h2><a name="scheduler">Scheduler configuration</a></h2> | ||||
|     <p> | ||||
|         The driver exposes the ESX CPU scheduler. The parameters listed below | ||||
|         are available to control the scheduler. | ||||
| @@ -780,7 +780,7 @@ Enter administrator password for example-vcenter.com: | ||||
|     </dl> | ||||
|  | ||||
|  | ||||
|     <h2><a id="tools">VMware tools</a></h2> | ||||
|     <h2><a name="tools">VMware tools</a></h2> | ||||
|     <p> | ||||
|         Some actions require installed VMware tools. If the VMware tools are | ||||
|         not installed in the guest and one of the actions below is to be | ||||
| @@ -796,7 +796,7 @@ Enter administrator password for example-vcenter.com: | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a id="links">Links</a></h2> | ||||
|     <h2><a name="links">Links</a></h2> | ||||
|     <ul> | ||||
|         <li> | ||||
|             <a href="http://www.vmware.com/support/developer/vc-sdk/"> | ||||
|   | ||||
| @@ -1,15 +1,15 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Microsoft Hyper-V hypervisor driver</h1> | ||||
|     <ul id="toc"></ul> | ||||
|     <p> | ||||
|         The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2 and newer. | ||||
|         The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2. | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a id="project">Project Links</a></h2> | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|     <ul> | ||||
|       <li> | ||||
|         The <a href="http://www.microsoft.com/hyper-v-server/">Microsoft Hyper-V</a> | ||||
| @@ -18,7 +18,7 @@ | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a id="uri">Connections to the Microsoft Hyper-V driver</a></h2> | ||||
|     <h2><a name="uri">Connections to the Microsoft Hyper-V driver</a></h2> | ||||
|     <p> | ||||
|         Some example remote connection URIs for the driver are: | ||||
|     </p> | ||||
| @@ -36,7 +36,7 @@ hyperv://example-hyperv.com/?transport=http  (over HTTP) | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="uriformat">URI Format</a></h3> | ||||
|     <h3><a name="uriformat">URI Format</a></h3> | ||||
|     <p> | ||||
|         URIs have this general form (<code>[...]</code> marks an optional part). | ||||
|     </p> | ||||
| @@ -49,7 +49,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters] | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h4><a id="extraparams">Extra parameters</a></h4> | ||||
|     <h4><a name="extraparams">Extra parameters</a></h4> | ||||
|     <p> | ||||
|         Extra parameters can be added to a URI as part of the query string | ||||
|         (the part following <code>?</code>). A single parameter is formed by a | ||||
| @@ -83,7 +83,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters] | ||||
|     </table> | ||||
|  | ||||
|  | ||||
|     <h3><a id="auth">Authentication</a></h3> | ||||
|     <h3><a name="auth">Authentication</a></h3> | ||||
|     <p> | ||||
|         In order to perform any useful operation the driver needs to log into | ||||
|         the Hyper-V server. Therefore, only <code>virConnectOpenAuth</code> can | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>LXC container driver</h1> | ||||
| @@ -18,7 +18,7 @@ particular sVirt for mandatory access control, auditing of operations, | ||||
| integration with control groups and many other features. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="cgroups">Control groups Requirements</a></h2> | ||||
| <h2><a name="cgroups">Control groups Requirements</a></h2> | ||||
|  | ||||
| <p> | ||||
| In order to control the resource usage of processes inside containers, the | ||||
| @@ -32,7 +32,7 @@ init service will be required. For further information, consult the general | ||||
| libvirt <a href="cgroups.html">cgroups documentation</a>. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="namespaces">Namespace requirements</a></h2> | ||||
| <h2><a name="namespaces">Namespace requirements</a></h2> | ||||
|  | ||||
| <p> | ||||
| In order to separate processes inside a container from those in the | ||||
| @@ -47,9 +47,9 @@ configured UID/GID mapping is a pre-requisite to making containers | ||||
| secure, in the absence of sVirt confinement.</strong> | ||||
| </p> | ||||
|  | ||||
| <h2><a id="init">Default container setup</a></h2> | ||||
| <h2><a name="init">Default container setup</a></h2> | ||||
|  | ||||
| <h3><a id="cliargs">Command line arguments</a></h3> | ||||
| <h3><a name="cliargs">Command line arguments</a></h3> | ||||
|  | ||||
| <p> | ||||
| When the container "init" process is started, it will typically | ||||
| @@ -62,15 +62,15 @@ would use the following XML | ||||
| </p> | ||||
|  | ||||
| <pre> | ||||
| <os> | ||||
|   <type arch='x86_64'>exe</type> | ||||
|   <init>/bin/systemd</init> | ||||
|   <initarg>--unit</initarg> | ||||
|   <initarg>emergency.service</initarg> | ||||
| </os> | ||||
|   <os> | ||||
|     <type arch='x86_64'>exe</type> | ||||
|     <init>/bin/systemd</init> | ||||
|     <initarg>--unit</initarg> | ||||
|     <initarg>emergency.service</initarg> | ||||
|   </os> | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="envvars">Environment variables</a></h3> | ||||
| <h3><a name="envvars">Environment variables</a></h3> | ||||
|  | ||||
| <p> | ||||
| When the container "init" process is started, it will be given several useful | ||||
| @@ -80,15 +80,15 @@ to be provided by all container technologies on Linux. | ||||
| </p> | ||||
|  | ||||
| <dl> | ||||
| <dt><code>container</code></dt> | ||||
| <dt>container</dt> | ||||
| <dd>The fixed string <code>libvirt-lxc</code> to identify libvirt as the creator</dd> | ||||
| <dt><code>container_uuid</code></dt> | ||||
| <dt>container_uuid</dt> | ||||
| <dd>The UUID assigned to the container by libvirt</dd> | ||||
| <dt><code>PATH</code></dt> | ||||
| <dt>PATH</dt> | ||||
| <dd>The fixed string <code>/bin:/usr/bin</code></dd> | ||||
| <dt><code>TERM</code></dt> | ||||
| <dt>TERM</dt> | ||||
| <dd>The fixed string <code>linux</code></dd> | ||||
| <dt><code>HOME</code></dt> | ||||
| <dt>HOME</dt> | ||||
| <dd>The fixed string <code>/</code></dd> | ||||
| </dl> | ||||
|  | ||||
| @@ -98,17 +98,17 @@ environment variables are also provided | ||||
| </p> | ||||
|  | ||||
| <dl> | ||||
| <dt><code>LIBVIRT_LXC_NAME</code></dt> | ||||
| <dt>LIBVIRT_LXC_NAME</dt> | ||||
| <dd>The name assigned to the container by libvirt</dd> | ||||
| <dt><code>LIBVIRT_LXC_UUID</code></dt> | ||||
| <dt>LIBVIRT_LXC_UUID</dt> | ||||
| <dd>The UUID assigned to the container by libvirt</dd> | ||||
| <dt><code>LIBVIRT_LXC_CMDLINE</code></dt> | ||||
| <dt>LIBVIRT_LXC_CMDLINE</dt> | ||||
| <dd>The unparsed command line arguments specified in the container configuration. | ||||
| Use of this is discouraged, in favour of passing arguments directly to the | ||||
| container init process via the <code>initarg</code> config element.</dd> | ||||
| </dl> | ||||
|  | ||||
| <h3><a id="fsmounts">Filesystem mounts</a></h3> | ||||
| <h3><a name="fsmounts">Filesystem mounts</a></h3> | ||||
|  | ||||
| <p> | ||||
| In the absence of any explicit configuration, the container will | ||||
| @@ -131,7 +131,7 @@ only expose the sub-tree associated with the container</li> | ||||
| </ul> | ||||
|  | ||||
|  | ||||
| <h3><a id="devnodes">Device nodes</a></h3> | ||||
| <h3><a name="devnodes">Device nodes</a></h3> | ||||
|  | ||||
| <p> | ||||
| The container init process will be started with <code>CAP_MKNOD</code> | ||||
| @@ -178,7 +178,7 @@ Further block or character devices will be made available to containers | ||||
| depending on their configuration. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="security">Security considerations</a></h2> | ||||
| <h2><a name="security">Security considerations</a></h2> | ||||
|  | ||||
| <p> | ||||
| The libvirt LXC driver is fairly flexible in how it can be configured, | ||||
| @@ -190,7 +190,7 @@ isolation between a container and the host must ensure that they are | ||||
| writing a suitable configuration. | ||||
| </p> | ||||
|  | ||||
| <h3><a id="securenetworking">Network isolation</a></h3> | ||||
| <h3><a name="securenetworking">Network isolation</a></h3> | ||||
|  | ||||
| <p> | ||||
| If the guest configuration does not list any network interfaces, | ||||
| @@ -205,7 +205,7 @@ namespace is not wanted, then applications should set the | ||||
| <code><features>....</features></code> element. | ||||
| </p> | ||||
|  | ||||
| <h3><a id="securefs">Filesystem isolation</a></h3> | ||||
| <h3><a name="securefs">Filesystem isolation</a></h3> | ||||
|  | ||||
| <p> | ||||
| If the guest configuration does not list any filesystems, then | ||||
| @@ -250,7 +250,7 @@ a bind mount to hide them. This is particularly important for the | ||||
| </p> | ||||
|  | ||||
|  | ||||
| <h3><a id="secureusers">User and group isolation</a></h3> | ||||
| <h3><a name="secureusers">User and group isolation</a></h3> | ||||
|  | ||||
| <p> | ||||
| If the guest configuration does not list any ID mapping, then the | ||||
| @@ -281,7 +281,7 @@ causes libvirt to activate the user namespace feature. | ||||
| </p> | ||||
|  | ||||
|  | ||||
| <h2><a id="activation">Systemd Socket Activation Integration</a></h2> | ||||
| <h2><a name="activation">Systemd Socket Activation Integration</a></h2> | ||||
|  | ||||
| <p> | ||||
| The libvirt LXC driver provides the ability to pass across pre-opened file | ||||
| @@ -477,7 +477,7 @@ configured to block read/write/mknod from all devices except those | ||||
| that a container is authorized to use. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="exconfig">Example configurations</a></h2> | ||||
| <h2><a name="exconfig">Example configurations</a></h2> | ||||
|  | ||||
| <h3>Example config version 1</h3> | ||||
| <p></p> | ||||
| @@ -542,7 +542,7 @@ debootstrap, whatever) under /opt/vm-1-root: | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <h2><a id="capabilities">Altering the available capabilities</a></h2> | ||||
| <h2><a name="capabilities">Altering the available capabilities</a></h2> | ||||
|  | ||||
| <p> | ||||
| By default the libvirt LXC driver drops some capabilities among which CAP_MKNOD. | ||||
| @@ -590,32 +590,7 @@ Note that allowing capabilities that are normally dropped by default can serious | ||||
| affect the security of the container and the host. | ||||
| </p> | ||||
|  | ||||
| <h2><a id="share">Inherit namespaces</a></h2> | ||||
|  | ||||
| <p> | ||||
| Libvirt allows you to inherit the namespace from container/process just like lxc tools | ||||
| or docker provides to share the network namespace. The following can be used to share | ||||
| required namespaces. If we want to share only one then the other namespaces can be ignored. | ||||
| The netns option is specific to sharenet. It can be used in cases we want to use existing network namespace | ||||
| rather than creating new network namespace for the container. In this case privnet option will be | ||||
| ignored. | ||||
| </p> | ||||
| <pre> | ||||
| <domain type='lxc' xmlns:lxc='http://libvirt.org/schemas/domain/lxc/1.0'> | ||||
| ... | ||||
| <lxc:namespace> | ||||
|   <lxc:sharenet type='netns' value='red'/> | ||||
|   <lxc:shareuts type='name' value='container1'/> | ||||
|   <lxc:shareipc type='pid' value='12345'/> | ||||
| </lxc:namespace> | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
| <p> | ||||
| The use of namespace passthrough requires libvirt >= 1.2.19 | ||||
| </p> | ||||
|  | ||||
| <h2><a id="usage">Container usage / management</a></h2> | ||||
| <h2><a name="usage">Container usage / management</a></h2> | ||||
|  | ||||
| <p> | ||||
| As with any libvirt virtualization driver, LXC containers can be | ||||
| @@ -629,7 +604,7 @@ and LXC. For further details about usage of virsh consult its | ||||
| manual page. | ||||
| </p> | ||||
|  | ||||
| <h3><a id="usageSave">Defining (saving) container configuration</a></h3> | ||||
| <h3><a name="usageSave">Defining (saving) container configuration</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh define</code> command takes an XML configuration | ||||
| @@ -640,7 +615,7 @@ document and loads it into libvirt, saving the configuration on disk | ||||
| # virsh -c lxc:/// define myguest.xml | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageView">Viewing container configuration</a></h3> | ||||
| <h3><a name="usageView">Viewing container configuration</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh dumpxml</code> command can be used to view the | ||||
| @@ -655,7 +630,7 @@ using the <code>--inactive</code> flag | ||||
| # virsh -c lxc:/// dumpxml myguest | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageStart">Starting containers</a></h3> | ||||
| <h3><a name="usageStart">Starting containers</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh start</code> command can be used to start a | ||||
| @@ -677,7 +652,7 @@ by libvirt, using the <code>virsh create</code> command. | ||||
| </pre> | ||||
|  | ||||
|  | ||||
| <h3><a id="usageStop">Stopping containers</a></h3> | ||||
| <h3><a name="usageStop">Stopping containers</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh shutdown</code> command can be used | ||||
| @@ -702,7 +677,7 @@ request, it can be forcibly stopped using the <code>virsh destroy</code> | ||||
| </pre> | ||||
|  | ||||
|  | ||||
| <h3><a id="usageReboot">Rebooting a container</a></h3> | ||||
| <h3><a name="usageReboot">Rebooting a container</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh reboot</code> command can be used | ||||
| @@ -717,7 +692,7 @@ to PID 1 inside the container. | ||||
| # virsh -c lxc:/// reboot myguest | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageDelete">Undefining (deleting) a container configuration</a></h3> | ||||
| <h3><a name="usageDelete">Undefining (deleting) a container configuration</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh undefine</code> command can be used to delete the | ||||
| @@ -729,7 +704,7 @@ running, this will turn it into a "transient" guest. | ||||
| # virsh -c lxc:/// undefine myguest | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageConnect">Connecting to a container console</a></h3> | ||||
| <h3><a name="usageConnect">Connecting to a container console</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh console</code> command can be used to connect | ||||
| @@ -752,7 +727,7 @@ as 'console0', 'console1', 'console2', etc. | ||||
| # virsh -c lxc:/// console myguest --devname console1 | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageEnter">Running commands in a container</a></h3> | ||||
| <h3><a name="usageEnter">Running commands in a container</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh lxc-enter-namespace</code> command can be used | ||||
| @@ -764,7 +739,7 @@ and then execute an arbitrary command. | ||||
| # virsh -c lxc:/// lxc-enter-namespace myguest -- /bin/ls -al /dev | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageTop">Monitoring container utilization</a></h3> | ||||
| <h3><a name="usageTop">Monitoring container utilization</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virt-top</code> command can be used to monitor the | ||||
| @@ -776,7 +751,7 @@ host | ||||
| # virt-top -c lxc:/// | ||||
| </pre> | ||||
|  | ||||
| <h3><a id="usageConvert">Converting LXC container configuration</a></h3> | ||||
| <h3><a name="usageConvert">Converting LXC container configuration</a></h3> | ||||
|  | ||||
| <p> | ||||
| The <code>virsh domxml-from-native</code> command can be used to convert | ||||
|   | ||||
| @@ -1,355 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Host device management</h1> | ||||
|  | ||||
|     <p> | ||||
|       Libvirt provides management of both physical and virtual host devices | ||||
|       (historically also referred to as node devices) like USB, PCI, SCSI, and | ||||
|       network devices. This also includes various virtualization capabilities | ||||
|       which the aforementioned devices provide for utilization, for example | ||||
|       SR-IOV, NPIV, MDEV, DRM, etc. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       The node device driver provides means to list and show details about host | ||||
|       devices (<code>virsh nodedev-list</code>, | ||||
|       <code>virsh nodedev-dumpxml</code>), which are generic and can be used | ||||
|       with all devices. It also provides means to create and destroy devices | ||||
|       (<code>virsh nodedev-create</code>, <code>virsh nodedev-destroy</code>) | ||||
|       which are meant to be used to create virtual devices, currently only | ||||
|       supported by NPIV | ||||
|       (<a href="http://wiki.libvirt.org/page/NPIV_in_libvirt">more info about NPIV)</a>). | ||||
|       Devices on the host system are arranged in a tree-like hierarchy, with | ||||
|       the root node being called <code>computer</code>. The node device driver | ||||
|       supports two backends to manage the devices, HAL and udev, with the former | ||||
|       being deprecated in favour of the latter. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       The generic format of a host device XML can be seen below. | ||||
|       To identify a device both within the host and the device tree hierarchy, | ||||
|       the following elements are used: | ||||
|     </p> | ||||
|       <dl> | ||||
|         <dt><code>name</code></dt> | ||||
|         <dd> | ||||
|           The device's name will be generated by libvirt using the subsystem, | ||||
|           like pci and the device's sysfs basename. | ||||
|         </dd> | ||||
|         <dt><code>path</code></dt> | ||||
|         <dd> | ||||
|           Fully qualified sysfs path to the device. | ||||
|         </dd> | ||||
|         <dt><code>parent</code></dt> | ||||
|         <dd> | ||||
|           This element identifies the parent node in the device hierarchy. The | ||||
|           value of the element will correspond with the device parent's | ||||
|           <code>name</code> element or <code>computer</code> if the device does | ||||
|           not have any parent. | ||||
|         </dd> | ||||
|         <dt><code>driver</code></dt> | ||||
|         <dd> | ||||
|           This elements reports the driver in use for this device. The presence | ||||
|           of this element in the output XML depends on whether the underlying | ||||
|           device manager (most likely udev) exposes information about the | ||||
|           driver. | ||||
|         </dd> | ||||
|         <dt><code>capability</code></dt> | ||||
|         <dd> | ||||
|           Describes the device in terms of feature support. The element has one | ||||
|           mandatory attribute <code>type</code> the value of which determines | ||||
|           the type of the device. Currently recognized values for the attribute | ||||
|           are: | ||||
|           <code>system</code>, | ||||
|           <code>pci</code>, | ||||
|           <code>usb</code>, | ||||
|           <code>usb_device</code>, | ||||
|           <code>net</code>, | ||||
|           <code>scsi</code>, | ||||
|           <code>scsi_host</code> (<span class="since">Since 0.4.7</span>), | ||||
|           <code>fc_host</code>, | ||||
|           <code>vports</code>, | ||||
|           <code>scsi_target</code> (<span class="since">Since 0.7.3</span>), | ||||
|           <code>storage</code> (<span class="since">Since 1.0.4</span>), | ||||
|           <code>scsi_generic</code> (<span class="since">Since 1.0.7</span>), | ||||
|           <code>drm</code> (<span class="since">Since 3.1.0</span>), and | ||||
|           <code>mdev</code> (<span class="since">Since 3.4.0</span>). | ||||
|           This element can be nested in which case it further specifies a | ||||
|           device's capability. Refer to specific device types to see more values | ||||
|           for the <code>type</code> attribute which are exclusive. | ||||
|         </dd> | ||||
|       </dl> | ||||
|  | ||||
|     <h2>Basic structure of a node device</h2> | ||||
|     <pre> | ||||
| <device> | ||||
|   <name>pci_0000_00_17_0</name> | ||||
|   <path>/sys/devices/pci0000:00/0000:00:17.0</path> | ||||
|   <parent>computer</parent> | ||||
|   <driver> | ||||
|     <name>ahci</name> | ||||
|   </driver> | ||||
|   <capability type='pci'> | ||||
| ... | ||||
|   </capability> | ||||
| </device></pre> | ||||
|  | ||||
|     <ul id="toc"/> | ||||
|  | ||||
|     <h2><a id="PCI">PCI host devices</a></h2> | ||||
|     <dl> | ||||
|       <dt><code>capability</code></dt> | ||||
|       <dd> | ||||
|         When used as top level element, the supported values for the | ||||
|         <code>type</code> attribute are <code>pci</code> and | ||||
|         <code>phys_function</code> (see <a href="#SRIOVCap">SR-IOV below</a>). | ||||
|       </dd> | ||||
|     </dl> | ||||
|     <pre> | ||||
| <device> | ||||
|   <name>pci_0000_04_00_1</name> | ||||
|   <path>/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.1</path> | ||||
|   <parent>pci_0000_00_06_0</parent> | ||||
|   <driver> | ||||
|     <name>igb</name> | ||||
|   </driver> | ||||
|   <capability type='pci'> | ||||
|     <domain>0</domain> | ||||
|     <bus>4</bus> | ||||
|     <slot>0</slot> | ||||
|     <function>1</function> | ||||
|     <product id='0x10c9'>82576 Gigabit Network Connection</product> | ||||
|     <vendor id='0x8086'>Intel Corporation</vendor> | ||||
|     <iommuGroup number='15'> | ||||
|       <address domain='0x0000' bus='0x04' slot='0x00' function='0x1'/> | ||||
|     </iommuGroup> | ||||
|     <numa node='0'/> | ||||
|     <pci-express> | ||||
|       <link validity='cap' port='1' speed='2.5' width='2'/> | ||||
|       <link validity='sta' speed='2.5' width='2'/> | ||||
|     </pci-express> | ||||
|   </capability> | ||||
| </device></pre> | ||||
|  | ||||
|     <p> | ||||
|       The XML format for a PCI device stays the same for any further | ||||
|       capabilities it supports, a single nested <code><capability></code> | ||||
|       element will be included for each capability the device supports. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="SRIOVCap">SR-IOV capability</a></h3> | ||||
|     <p> | ||||
|       Single root input/output virtualization (SR-IOV) allows sharing of the | ||||
|       PCIe resources by multiple virtual environments. That is achieved by | ||||
|       slicing up a single full-featured physical resource called physical | ||||
|       function (PF) into multiple devices called virtual functions (VFs) sharing | ||||
|       their configuration with the underlying PF. Despite the SR-IOV | ||||
|       specification, the amount of VFs that can be created on a PF varies among | ||||
|       manufacturers. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       Suppose the NIC <a href="#PCI">above</a> was also SR-IOV capable, it would | ||||
|       also include a nested | ||||
|       <code><capability></code> element enumerating all virtual | ||||
|       functions available on the physical device (physical port) like in the | ||||
|       example below. | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| <capability type='pci'> | ||||
| ... | ||||
|   <capability type='virt_functions' maxCount='7'> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x10' function='0x3'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x10' function='0x5'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x10' function='0x7'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x11' function='0x1'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x11' function='0x3'/> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x11' function='0x5'/> | ||||
|   </capability> | ||||
| ... | ||||
| </capability></pre> | ||||
|     <p> | ||||
|       A SR-IOV child device on the other hand, would then report its top level | ||||
|       capability type as a <code>phys_function</code> instead: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| <device> | ||||
| ... | ||||
|   <capability type='phys_function'> | ||||
|     <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> | ||||
|   </capability> | ||||
| ... | ||||
| <device></pre> | ||||
|  | ||||
|     <h3><a id="MDEVCap">MDEV capability</a></h3> | ||||
|     <p> | ||||
|       A PCI device capable of creating mediated devices will include a nested | ||||
|       capability <code>mdev_types</code> which enumerates all supported mdev | ||||
|       types on the physical device, along with the type attributes available | ||||
|       through sysfs: | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>type</code></dt> | ||||
|       <dd> | ||||
|         This element describes a mediated device type which acts as an | ||||
|         abstract template defining a resource allocation for instances of this | ||||
|         device type. The element has one attribute <code>id</code> which holds | ||||
|         an official vendor-supplied identifier for the type. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|  | ||||
|       <dt><code>name</code></dt> | ||||
|       <dd> | ||||
|         The <code>name</code> element holds a vendor-supplied code name for | ||||
|         the given mediated device type. This is an optional element. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|  | ||||
|       <dt><code>deviceAPI</code></dt> | ||||
|       <dd> | ||||
|         The value of this element describes how an instance of the given type | ||||
|         will be presented to the guest by the VFIO framework. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|  | ||||
|       <dt><code>availableInstances</code></dt> | ||||
|       <dd> | ||||
|         This element reports the current state of resource allocation. In other | ||||
|         words, how many instances of the given type can still be successfully | ||||
|         created on the physical device. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <p> | ||||
|       For a more info about mediated devices, refer to the | ||||
|       <a href="#MDEV">paragraph below</a>. | ||||
|     </p> | ||||
|  | ||||
| <pre> | ||||
| <device> | ||||
| ... | ||||
|   <driver> | ||||
|     <name>nvidia</name> | ||||
|   </driver> | ||||
|   <capability type='pci'> | ||||
| ... | ||||
|     <capability type='mdev_types'> | ||||
|       <type id='nvidia-11'> | ||||
|         <name>GRID M60-0B</name> | ||||
|         <deviceAPI>vfio-pci</deviceAPI> | ||||
|         <availableInstances>16</availableInstances> | ||||
|       </type> | ||||
|       <!-- Here would come the rest of the available mdev types --> | ||||
|     </capability> | ||||
| ... | ||||
|   </capability> | ||||
| </device></pre> | ||||
|  | ||||
|     <h2><a id="MDEV">Mediated devices (MDEVs)</a></h2> | ||||
|     <p> | ||||
|       Mediated devices (<span class="since">Since 3.2.0</span>) are software | ||||
|       devices defining resource allocation on the backing physical device which | ||||
|       in turn allows the parent physical device's resources to be divided into | ||||
|       several mediated devices, thus sharing the physical device's performance | ||||
|       among multiple guests. Unlike SR-IOV however, where a PCIe device appears | ||||
|       as multiple separate PCIe devices on the host's PCI bus, mediated devices | ||||
|       only appear on the mdev virtual bus. Therefore, no detach/reattach | ||||
|       procedure from/to the host driver procedure is involved even though | ||||
|       mediated devices are used in a direct device assignment manner. | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       The following sub-elements and attributes are exposed within the | ||||
|       <code>capability</code> element: | ||||
|     </p> | ||||
|  | ||||
|     <dl> | ||||
|       <dt><code>type</code></dt> | ||||
|       <dd> | ||||
|         This element describes a mediated device type which acts as an | ||||
|         abstract template defining a resource allocation for instances of this | ||||
|         device type. The element has one attribute <code>id</code> which holds | ||||
|         an official vendor-supplied identifier for the type. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|  | ||||
|       <dt><code>iommuGroup</code></dt> | ||||
|       <dd> | ||||
|         This element supports a single attribute <code>number</code> which holds | ||||
|         the IOMMU group number the mediated device belongs to. | ||||
|         <span class="since">Since 3.4.0</span> | ||||
|       </dd> | ||||
|     </dl> | ||||
|  | ||||
|     <h3>Example of a mediated device</h3> | ||||
|     <pre> | ||||
| <device> | ||||
|   <name>mdev_4b20d080_1b54_4048_85b3_a6a62d165c01</name> | ||||
|   <path>/sys/devices/pci0000:00/0000:00:02.0/4b20d080-1b54-4048-85b3-a6a62d165c01</path> | ||||
|   <parent>pci_0000_06_00_0</parent> | ||||
|   <driver> | ||||
|     <name>vfio_mdev</name> | ||||
|   </driver> | ||||
|   <capability type='mdev'> | ||||
|     <type id='nvidia-11'/> | ||||
|     <iommuGroup number='12'/> | ||||
|   <capability/> | ||||
| <device/></pre> | ||||
|  | ||||
|     <p> | ||||
|       The support of mediated device's framework in libvirt's node device driver | ||||
|       covers the following features: | ||||
|     </p> | ||||
|  | ||||
|     <ul> | ||||
|       <li> | ||||
|         list available mediated devices on the host | ||||
|         (<span class="since">Since 3.4.0</span>) | ||||
|       </li> | ||||
|       <li> | ||||
|         display device details | ||||
|         (<span class="since">Since 3.4.0</span>) | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <p> | ||||
|       Because mediated devices are instantiated from vendor specific templates, | ||||
|       simply called 'types', information describing these types is contained | ||||
|       within the parent device's capabilities | ||||
|       (see the example in <a href="#PCI">PCI host devices</a>). | ||||
|     </p> | ||||
|  | ||||
|     <p> | ||||
|       To see the supported mediated device types on a specific physical device | ||||
|       use the following: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ ls /sys/class/mdev_bus/<device>/mdev_supported_types</pre> | ||||
|  | ||||
|     <p> | ||||
|       To manually instantiate a mediated device, use one of the following as a | ||||
|       reference: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ uuidgen > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create | ||||
| ... | ||||
| $ echo <UUID> > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create</pre> | ||||
|  | ||||
|     <p> | ||||
|       Manual removal of a mediated device is then performed as follows: | ||||
|     </p> | ||||
|  | ||||
|     <pre> | ||||
| $ echo 1 > /sys/bus/mdev/devices/<uuid>/remove</pre> | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>OpenVZ container driver</h1> | ||||
| @@ -15,7 +15,7 @@ | ||||
|     undue trouble. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="project">Project Links</a></h2> | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li> | ||||
| @@ -24,7 +24,7 @@ | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="connections">Connections to OpenVZ driver</a></h2> | ||||
|     <h2><a name="connections">Connections to OpenVZ driver</a></h2> | ||||
|  | ||||
|     <p> | ||||
|     The libvirt OpenVZ driver is a single-instance privileged driver, | ||||
| @@ -40,7 +40,7 @@ openvz+tcp://example.com/system      (remote access, SASl/Kerberos) | ||||
| openvz+ssh://root@example.com/system (remote access, SSH tunnelled) | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="notes">Notes on bridged networking</a></h2> | ||||
|     <h2><a name="notes">Notes on bridged networking</a></h2> | ||||
|  | ||||
|     <p> | ||||
|     Bridged networking enables a guest domain (ie container) to have its | ||||
| @@ -49,7 +49,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled) | ||||
|     the host OS. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="host">Host network devices</a></h3> | ||||
|     <h3><a name="host">Host network devices</a></h3> | ||||
|  | ||||
|     <p> | ||||
|     One or more of the physical devices must be attached to a bridge. The | ||||
| @@ -60,7 +60,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled) | ||||
|     physical device "eth0", or a bonding device "bond0". | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="tools">OpenVZ tools configuration</a></h3> | ||||
|     <h3><a name="tools">OpenVZ tools configuration</a></h3> | ||||
|  | ||||
|     <p> | ||||
|     OpenVZ releases later than 3.0.23 ship with a standard network device | ||||
| @@ -85,7 +85,7 @@ EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr" | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a id="example">Example guest domain XML configuration</a></h2> | ||||
|     <h2><a name="example">Example guest domain XML configuration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|     The current libvirt OpenVZ driver has a restriction that the | ||||
|   | ||||
							
								
								
									
										70
									
								
								docs/drvparallels.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								docs/drvparallels.html.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>Parallels Cloud Server driver</h1> | ||||
|     <ul id="toc"></ul> | ||||
|     <p> | ||||
|         The libvirt Parallels driver can manage Parallels Cloud Server starting from version 6.0. | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|     <ul> | ||||
|       <li> | ||||
|         The <a href="http://www.parallels.com/products/server/baremetal/sp/">Parallels Cloud Server</a> Virtualization Solution. | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a name="uri">Connections to the Parallels Cloud Server driver</a></h2> | ||||
|     <p> | ||||
|         The libvirt Parallels driver is a single-instance privileged driver, with a driver name of 'parallels'. Some example connection URIs for the libvirt driver are: | ||||
|     </p> | ||||
| <pre> | ||||
| parallels:///system                     (local access) | ||||
| parallels+unix:///system                (local access) | ||||
| parallels://example.com/system          (remote access, TLS/x509) | ||||
| parallels+tcp://example.com/system      (remote access, SASl/Kerberos) | ||||
| parallels+ssh://root@example.com/system (remote access, SSH tunnelled) | ||||
| </pre> | ||||
|  | ||||
|     <h2><a name="example">Example guest domain XML configuration</a></h2> | ||||
|  | ||||
|     <p> | ||||
|     Parallels driver require at least one hard disk for new domains | ||||
|     at this time. It is used for defining directory, where VM should | ||||
|     be created. | ||||
|     </p> | ||||
|  | ||||
| <pre> | ||||
| <domain type='parallels'> | ||||
|   <name>demo</name> | ||||
|   <uuid>54cdecad-4492-4e31-a209-33cc21d64057</uuid> | ||||
|   <description>some description</description> | ||||
|   <memory unit='KiB'>1048576</memory> | ||||
|   <currentMemory unit='KiB'>1048576</currentMemory> | ||||
|   <vcpu placement='static'>2</vcpu> | ||||
|   <os> | ||||
|     <type arch='x86_64'>hvm</type> | ||||
|   </os> | ||||
|   <clock offset='utc'/> | ||||
|   <on_poweroff>destroy</on_poweroff> | ||||
|   <on_reboot>destroy</on_reboot> | ||||
|   <on_crash>destroy</on_crash> | ||||
|   <devices> | ||||
|     <disk type='file' device='disk'> | ||||
|       <source file='/storage/vol1'/> | ||||
|       <target dev='hda'/> | ||||
|     </disk> | ||||
|     <video> | ||||
|       <model type='vga' vram='33554432' heads='1'> | ||||
|         <acceleration accel3d='no' accel2d='no'/> | ||||
|       </model> | ||||
|     </video> | ||||
|   </devices> | ||||
| </domain> | ||||
|  | ||||
| </pre> | ||||
|  | ||||
| </body></html> | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>IBM PowerVM hypervisor driver (phyp)</h1> | ||||
| @@ -10,7 +10,7 @@ | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h2><a id="project">Project Links</a></h2> | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|     <ul> | ||||
|       <li> | ||||
|         The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM | ||||
| @@ -19,7 +19,7 @@ | ||||
|     </ul> | ||||
|  | ||||
|  | ||||
|     <h2><a id="uri">Connections to the PowerVM driver</a></h2> | ||||
|     <h2><a name="uri">Connections to the PowerVM driver</a></h2> | ||||
|     <p> | ||||
|         Some example remote connection URIs for the driver are: | ||||
|     </p> | ||||
| @@ -38,7 +38,7 @@ phyp://user@ivm/system (IVM connection) | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="uriformat">URI Format</a></h3> | ||||
|     <h3><a name="uriformat">URI Format</a></h3> | ||||
|     <p> | ||||
|         URIs have this general form (<code>[...]</code> marks an | ||||
|         optional part, <code>{...|...}</code> marks a mandatory choice). | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE html> | ||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| <html xmlns="http://www.w3.org/1999/xhtml"> | ||||
|   <body> | ||||
|     <h1>KVM/QEMU hypervisor driver</h1> | ||||
| @@ -8,22 +8,24 @@ | ||||
|  | ||||
|     <p> | ||||
|       The libvirt KVM/QEMU driver can manage any QEMU emulator from | ||||
|       version 0.12.0 or later. | ||||
|       version 0.8.1 or later. It can also manage Xenner, which | ||||
|       provides the same QEMU command line syntax and monitor | ||||
|       interaction. | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="project">Project Links</a></h2> | ||||
|     <h2><a name="project">Project Links</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li> | ||||
|         The <a href="https://www.linux-kvm.org/">KVM</a> Linux | ||||
|         The <a href="http://www.linux-kvm.org/">KVM</a> Linux | ||||
|         hypervisor | ||||
|       </li> | ||||
|       <li> | ||||
|         The <a href="https://wiki.qemu.org/Index.html">QEMU</a> emulator | ||||
|         The <a href="http://wiki.qemu.org/Index.html">QEMU</a> emulator | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="prereq">Deployment pre-requisites</a></h2> | ||||
|     <h2><a name="prereq">Deployment pre-requisites</a></h2> | ||||
|  | ||||
|     <ul> | ||||
|       <li> | ||||
| @@ -41,9 +43,15 @@ | ||||
|         node. If both are found, then KVM fullyvirtualized, hardware accelerated | ||||
|         guests will be available. | ||||
|       </li> | ||||
|       <li> | ||||
|         <strong>Xenner hypervisor</strong>: The driver will probe <code>/usr/bin</code> | ||||
|         for the presence of <code>xenner</code> and <code>/dev/kvm</code> device | ||||
|         node. If both are found, then Xen paravirtualized guests can be run using | ||||
|         the KVM hardware acceleration. | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h2><a id="uris">Connections to QEMU driver</a></h2> | ||||
|     <h2><a name="uris">Connections to QEMU driver</a></h2> | ||||
|  | ||||
|     <p> | ||||
|     The libvirt QEMU driver is a multi-instance driver, providing a single | ||||
| @@ -63,14 +71,14 @@ qemu+tcp://example.com/system        (remote access, SASl/Kerberos) | ||||
| qemu+ssh://root@example.com/system   (remote access, SSH tunnelled) | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="security">Driver security architecture</a></h2> | ||||
|     <h2><a name="security">Driver security architecture</a></h2> | ||||
|  | ||||
|     <p> | ||||
|       There are multiple layers to security in the QEMU driver, allowing for | ||||
|       flexibility in the use of QEMU based virtual machines. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="securitydriver">Driver instances</a></h3> | ||||
|     <h3><a name="securitydriver">Driver instances</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       As explained above there are two ways to access the QEMU driver | ||||
| @@ -94,7 +102,7 @@ qemu+ssh://root@example.com/system   (remote access, SSH tunnelled) | ||||
|       elevated privileges. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="securitydac">POSIX users/groups</a></h3> | ||||
|     <h3><a name="securitydac">POSIX users/groups</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       In the "session" instance, the POSIX users/groups model restricts QEMU | ||||
| @@ -187,7 +195,7 @@ chmod o+x /path/to/directory | ||||
|       </li> | ||||
|     </ul> | ||||
|  | ||||
|     <h3><a id="securitycap">Linux process capabilities</a></h3> | ||||
|     <h3><a name="securitycap">Linux process capabilities</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The libvirt QEMU driver has a build time option allowing it to use | ||||
| @@ -224,7 +232,7 @@ chmod o+x /path/to/directory | ||||
|       to changing the <code>/etc/libvirt/qemu.conf</code> settings. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="securityselinux">SELinux basic confinement</a></h3> | ||||
|     <h3><a name="securityselinux">SELinux basic confinement</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The basic SELinux protection for QEMU virtual machines is intended to | ||||
| @@ -255,7 +263,7 @@ chmod o+x /path/to/directory | ||||
|       SELinux boolean. | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="securitysvirt">SELinux sVirt confinement</a></h3> | ||||
|     <h3><a name="securitysvirt">SELinux sVirt confinement</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The SELinux sVirt protection for QEMU virtual machines builds to the | ||||
| @@ -305,7 +313,7 @@ chmod o+x /path/to/directory | ||||
|       file can be used to change the setting to <code>security_driver="none"</code> | ||||
|     </p> | ||||
|  | ||||
|     <h3><a id="securitysvirtaa">AppArmor sVirt confinement</a></h3> | ||||
|     <h3><a name="securitysvirtaa">AppArmor sVirt confinement</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       When using basic AppArmor protection for the libvirtd daemon and | ||||
| @@ -373,7 +381,7 @@ chmod o+x /path/to/directory | ||||
|     </p> | ||||
|  | ||||
|  | ||||
|     <h3><a id="securityacl">Cgroups device ACLs</a></h3> | ||||
|     <h3><a name="securityacl">Cgroups device ACLs</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       Recent Linux kernels have a capability known as "cgroups" which is used | ||||
| @@ -416,7 +424,7 @@ mount -t cgroup none /dev/cgroup -o devices | ||||
|       <code>/dev/cgroup/libvirt/qemu/$VMNAME/</code> | ||||
|     </p> | ||||
|  | ||||
|     <h2><a id="imex">Import and export of libvirt domain XML configs</a></h2> | ||||
|     <h2><a name="imex">Import and export of libvirt domain XML configs</a></h2> | ||||
|  | ||||
|     <p>The QEMU driver currently supports a single native | ||||
|       config format known as <code>qemu-argv</code>. The data for this format | ||||
| @@ -424,7 +432,7 @@ mount -t cgroup none /dev/cgroup -o devices | ||||
|       then the QEMu binary name, finally followed by the QEMU command line | ||||
|       arguments</p> | ||||
|  | ||||
|     <h3><a id="xmlimport">Converting from QEMU args to domain XML</a></h3> | ||||
|     <h3><a name="xmlimport">Converting from QEMU args to domain XML</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The <code>virsh domxml-from-native</code> provides a way to | ||||
| @@ -473,7 +481,7 @@ $ virsh domxml-from-native qemu-argv demo.args | ||||
|  | ||||
|     <p>NB, don't include the literal \ in the args, put everything on one line</p> | ||||
|  | ||||
|     <h3><a id="xmlexport">Converting from domain XML to QEMU args</a></h3> | ||||
|     <h3><a name="xmlexport">Converting from domain XML to QEMU args</a></h3> | ||||
|  | ||||
|     <p> | ||||
|       The <code>virsh domxml-to-native</code> provides a way to convert a | ||||
| @@ -515,7 +523,7 @@ $ virsh domxml-to-native qemu-argv demo.xml | ||||
|   -serial none -parallel none -usb | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="qemucommand">Pass-through of arbitrary qemu | ||||
|     <h2><a name="qemucommand">Pass-through of arbitrary qemu | ||||
|     commands</a></h2> | ||||
|  | ||||
|     <p>Libvirt provides an XML namespace and an optional | ||||
| @@ -582,7 +590,7 @@ $ virsh domxml-to-native qemu-argv demo.xml | ||||
| </domain> | ||||
| </pre> | ||||
|  | ||||
|     <h2><a id="xmlconfig">Example domain XML config</a></h2> | ||||
|     <h2><a name="xmlconfig">Example domain XML config</a></h2> | ||||
|  | ||||
|     <h3>QEMU emulated guest on x86_64</h3> | ||||
|  | ||||
| @@ -639,5 +647,9 @@ $ virsh domxml-to-native qemu-argv demo.xml | ||||
|   </devices> | ||||
| </domain></pre> | ||||
|  | ||||
|     <h3>Xen paravirtualized guests with hardware acceleration</h3> | ||||
|  | ||||
|  | ||||
|  | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user