diff --git a/.gitignore b/.gitignore index c32c619..737f4e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/open-vm-tools-10.3.10-12406962.tar.gz +SOURCES/open-vm-tools-11.0.5-15389592.tar.gz diff --git a/.open-vm-tools.metadata b/.open-vm-tools.metadata index 55389fd..5b37bd9 100644 --- a/.open-vm-tools.metadata +++ b/.open-vm-tools.metadata @@ -1 +1 @@ -4f5fcf3f098aaddd3da24caa772575505e286ed7 SOURCES/open-vm-tools-10.3.10-12406962.tar.gz +502484f4a112954932a7ee32d234e0c85793fcac SOURCES/open-vm-tools-11.0.5-15389592.tar.gz diff --git a/SOURCES/0002-Fix-RELRO-flag.patch b/SOURCES/0002-Fix-RELRO-flag.patch index 429f493..37267a7 100644 --- a/SOURCES/0002-Fix-RELRO-flag.patch +++ b/SOURCES/0002-Fix-RELRO-flag.patch @@ -1,4 +1,4 @@ -From 7c204ac55d3e4e86b7ebaf3e83b18da565e2a384 Mon Sep 17 00:00:00 2001 +From 4ed0af7c73cb597e734223f95846651bfe9c237c Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Fri, 1 Mar 2019 09:46:11 +0100 Subject: Fix RELRO flag @@ -31,11 +31,11 @@ Signed-off-by: Miroslav Rezanina open-vm-tools/vgauth/lib/Makefile.am | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) -diff --git a/configure.ac b/configure.ac -index fe671ce..eaff8c9 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1523,7 +1523,7 @@ VMTOOLS_LIBS="$BUILDDIR/libvmtools/libvmtools.la $GLIB2_LIBS" +diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac +index 9aa95ab..f1cc721 100644 +--- a/open-vm-tools/configure.ac ++++ b/open-vm-tools/configure.ac +@@ -1459,7 +1459,7 @@ VMTOOLS_LIBS="$BUILDDIR/libvmtools/libvmtools.la $GLIB2_LIBS" VMTOOLS_CPPFLAGS="-DVMTOOLS_USE_GLIB $GLIB2_CPPFLAGS" PLUGIN_CPPFLAGS="$VMTOOLS_CPPFLAGS $PLUGIN_CPPFLAGS" @@ -44,10 +44,10 @@ index fe671ce..eaff8c9 100644 # Installation directories for core services plugins. TEST_PLUGIN_INSTALLDIR=$datadir/open-vm-tools/tests -diff --git a/libDeployPkg/Makefile.am b/libDeployPkg/Makefile.am -index b4d5c9d..f4e8f8b 100644 ---- a/libDeployPkg/Makefile.am -+++ b/libDeployPkg/Makefile.am +diff --git a/open-vm-tools/libDeployPkg/Makefile.am b/open-vm-tools/libDeployPkg/Makefile.am +index a3bcb5e..31ff270 100644 +--- a/open-vm-tools/libDeployPkg/Makefile.am ++++ b/open-vm-tools/libDeployPkg/Makefile.am @@ -39,7 +39,7 @@ libDeployPkg_la_SOURCES += linuxDeploymentUtilities.h libDeployPkg_la_LDFLAGS = # We require GCC, so we're fine passing compiler-specific flags. @@ -57,10 +57,10 @@ index b4d5c9d..f4e8f8b 100644 libDeployPkg_includedir = $(includedir)/libDeployPkg -diff --git a/libguestlib/Makefile.am b/libguestlib/Makefile.am +diff --git a/open-vm-tools/libguestlib/Makefile.am b/open-vm-tools/libguestlib/Makefile.am index 5181409..a21a3ff 100644 ---- a/libguestlib/Makefile.am -+++ b/libguestlib/Makefile.am +--- a/open-vm-tools/libguestlib/Makefile.am ++++ b/open-vm-tools/libguestlib/Makefile.am @@ -32,7 +32,7 @@ libguestlib_la_SOURCES += vmGuestLib.c libguestlib_la_LDFLAGS = # We require GCC, so we're fine passing compiler-specific flags. @@ -70,10 +70,10 @@ index 5181409..a21a3ff 100644 libguestlib_includedir = $(includedir)/vmGuestLib -diff --git a/libhgfs/Makefile.am b/libhgfs/Makefile.am +diff --git a/open-vm-tools/libhgfs/Makefile.am b/open-vm-tools/libhgfs/Makefile.am index 7609145..50573ee 100644 ---- a/libhgfs/Makefile.am -+++ b/libhgfs/Makefile.am +--- a/open-vm-tools/libhgfs/Makefile.am ++++ b/open-vm-tools/libhgfs/Makefile.am @@ -41,5 +41,5 @@ libhgfs_la_LDFLAGS = libhgfs_la_LDFLAGS += -Wl,-z,defs # Needed for OS's that don't link shared libraries against libc by @@ -81,21 +81,21 @@ index 7609145..50573ee 100644 -libhgfs_la_LDFLAGS += -Wl,-lc +libhgfs_la_LDFLAGS += -Wl,-lc -Wl,-z,relro,-z,now -diff --git a/libvmtools/Makefile.am b/libvmtools/Makefile.am -index 1971942..6a4ca74 100644 ---- a/libvmtools/Makefile.am -+++ b/libvmtools/Makefile.am -@@ -91,5 +91,5 @@ libvmtools_la_LDFLAGS = +diff --git a/open-vm-tools/libvmtools/Makefile.am b/open-vm-tools/libvmtools/Makefile.am +index 347b8c7..d58c6e6 100644 +--- a/open-vm-tools/libvmtools/Makefile.am ++++ b/open-vm-tools/libvmtools/Makefile.am +@@ -86,5 +86,5 @@ libvmtools_la_LDFLAGS = libvmtools_la_LDFLAGS += -Wl,-z,defs # Needed for OS's that don't link shared libraries against libc by #default, e.g. FreeBSD -libvmtools_la_LDFLAGS += -Wl,-lc +libvmtools_la_LDFLAGS += -Wl,-lc -Wl,-z,relro,-z,now -diff --git a/vgauth/lib/Makefile.am b/vgauth/lib/Makefile.am +diff --git a/open-vm-tools/vgauth/lib/Makefile.am b/open-vm-tools/vgauth/lib/Makefile.am index bce97aa..6c0c265 100644 ---- a/vgauth/lib/Makefile.am -+++ b/vgauth/lib/Makefile.am +--- a/open-vm-tools/vgauth/lib/Makefile.am ++++ b/open-vm-tools/vgauth/lib/Makefile.am @@ -59,7 +59,7 @@ libvgauth_la_LDFLAGS = libvgauth_la_LDFLAGS += -Wl,-z,defs # Needed for OS's that don't link shared libraries against libc by diff --git a/SOURCES/open-vm-tools.conf b/SOURCES/open-vm-tools.conf new file mode 100644 index 0000000..a517c48 --- /dev/null +++ b/SOURCES/open-vm-tools.conf @@ -0,0 +1 @@ +fuse diff --git a/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch b/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch new file mode 100644 index 0000000..7c3ec8e --- /dev/null +++ b/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch @@ -0,0 +1,43 @@ +From 318cdd2c16e7ea424fa98b765828e6758b09a216 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 7 Apr 2020 12:01:25 +0200 +Subject: [PATCH 1/2] Fix a trivial memory leak in namespacetool.c. + +RH-Author: Cathy Avery +Message-id: <20200403112905.23123-2-cavery@redhat.com> +Patchwork-id: 94537 +O-Subject: [RHEL-7.9 open-vm-tools PATCH 1/2] Fix a trivial memory leak in namespacetool.c. +Bugzilla: 1818109 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Mohammed Gamal + +commit 8dbd6e991315bb1b0a18c369c4d2bb165ef1f184 +Author: Oliver Kurth +Date: Tue, 17 Mar 2020 14:36:55 -0700 + + Fix a trivial memory leak in namespacetool.c. + + Fix a memory leak reported by a customer based on their Coverity + scans of open-vm-tools. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/namespacetool/namespacetool.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/open-vm-tools/namespacetool/namespacetool.c b/open-vm-tools/namespacetool/namespacetool.c +index 171e352..bfd003d 100644 +--- a/open-vm-tools/namespacetool/namespacetool.c ++++ b/open-vm-tools/namespacetool/namespacetool.c +@@ -233,6 +233,7 @@ GetValueFromStdin(gchar **data, gsize *length) + *length = 0; + } + g_free(gErr); ++ g_io_channel_unref(iochannel); + return retVal; + } + +-- +1.8.3.1 + diff --git a/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch b/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch new file mode 100644 index 0000000..3d7b6f5 --- /dev/null +++ b/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch @@ -0,0 +1,39 @@ +From 9469e609572d721ec9c8eb065a1e8e9dde3de6b2 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 7 Apr 2020 12:01:27 +0200 +Subject: [PATCH 2/2] Update copyright to reflect previous change. + +RH-Author: Cathy Avery +Message-id: <20200403112905.23123-3-cavery@redhat.com> +Patchwork-id: 94536 +O-Subject: [RHEL-7.9 open-vm-tools PATCH 2/2] Update copyright to reflect previous change. +Bugzilla: 1818109 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Mohammed Gamal + +commit 95bb9273cccfd38e0f3299828a0a6cf5a8c30efb +Author: Oliver Kurth +Date: Tue, 17 Mar 2020 14:36:55 -0700 + + Update copyright to reflect previous change. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/namespacetool/namespacetool.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/open-vm-tools/namespacetool/namespacetool.c b/open-vm-tools/namespacetool/namespacetool.c +index bfd003d..fc38f06 100644 +--- a/open-vm-tools/namespacetool/namespacetool.c ++++ b/open-vm-tools/namespacetool/namespacetool.c +@@ -1,5 +1,5 @@ + /********************************************************* +- * Copyright (C) 2016-2019 VMware, Inc. All rights reserved. ++ * Copyright (C) 2016-2020 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published +-- +1.8.3.1 + diff --git a/SOURCES/ovt-add-appinfo-plugin.patch b/SOURCES/ovt-add-appinfo-plugin.patch new file mode 100644 index 0000000..f777666 --- /dev/null +++ b/SOURCES/ovt-add-appinfo-plugin.patch @@ -0,0 +1,1607 @@ +From 21437d973ef7389533b3cf67183aca73b3dad3ad Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Fri, 27 Mar 2020 13:33:32 +0100 +Subject: add appinfo plugin + +Message-id: <20200327133332.7366-1-cavery@redhat.com> +Patchwork-id: 94454 +O-Subject: [RHEL7.9 open-vm-tools PATCH] add appinfo plugin +Bugzilla: 1809753 +RH-Acked-by: Eduardo Otubo +RH-Acked-by: Vitaly Kuznetsov + +commit f1f0b812e7fb9ccf405fcfd48ddb4d65e8532eef +Author: Oliver Kurth +Date: Wed Feb 5 17:21:52 2020 -0800 + + add appinfo plugin + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/configure.ac | 3 +- + open-vm-tools/lib/include/appInfo.h | 41 ++ + open-vm-tools/services/plugins/Makefile.am | 5 +- + open-vm-tools/services/plugins/appInfo/COPYING | 502 ++++++++++++++++++ + open-vm-tools/services/plugins/appInfo/Makefile.am | 37 ++ + open-vm-tools/services/plugins/appInfo/appInfo.c | 572 +++++++++++++++++++++ + .../services/plugins/appInfo/appInfoInt.h | 64 +++ + .../services/plugins/appInfo/appInfoPosix.c | 124 +++++ + .../services/plugins/appInfo/appInfoUtil.c | 143 ++++++ + 9 files changed, 1489 insertions(+), 2 deletions(-) + create mode 100644 open-vm-tools/lib/include/appInfo.h + create mode 100644 open-vm-tools/services/plugins/appInfo/COPYING + create mode 100644 open-vm-tools/services/plugins/appInfo/Makefile.am + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfo.c + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoInt.h + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoPosix.c + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoUtil.c + +diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac +index f1cc721..009fe87 100644 +--- a/open-vm-tools/configure.ac ++++ b/open-vm-tools/configure.ac +@@ -1,5 +1,5 @@ + ################################################################################ +-### Copyright (C) 2007-2019 VMware, Inc. All rights reserved. ++### Copyright (C) 2007-2020 VMware, Inc. All rights reserved. + ### + ### Configure script for building the VMware OSS Tools. + ### +@@ -1579,6 +1579,7 @@ AC_CONFIG_FILES([ \ + services/Makefile \ + services/vmtoolsd/Makefile \ + services/plugins/Makefile \ ++ services/plugins/appInfo/Makefile \ + services/plugins/desktopEvents/Makefile \ + services/plugins/dndcp/Makefile \ + services/plugins/guestInfo/Makefile \ +diff --git a/open-vm-tools/lib/include/appInfo.h b/open-vm-tools/lib/include/appInfo.h +new file mode 100644 +index 0000000..122d08e +--- /dev/null ++++ b/open-vm-tools/lib/include/appInfo.h +@@ -0,0 +1,41 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program 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 version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++#ifndef _APPINFO_H_ ++#define _APPINFO_H_ ++ ++/** ++ * @file appInfo.h ++ * ++ * Declares few constants for the appInfo plugin. ++ */ ++ ++/** ++ * The guest Variable name for the application information. ++ */ ++#define APP_INFO_GUESTVAR_KEY "appInfo" ++ ++#define APP_INFO_VERSION_1 1 ++#define APP_INFO_KEY_VERSION "version" ++#define APP_INFO_KEY_UPDATE_COUNTER "updateCounter" ++#define APP_INFO_KEY_PUBLISHTIME "publishTime" ++#define APP_INFO_KEY_APPS "applications" ++#define APP_INFO_KEY_APP_NAME "a" ++#define APP_INFO_KEY_APP_VERSION "v" ++ ++#endif /* _APPINFO_H_ */ +diff --git a/open-vm-tools/services/plugins/Makefile.am b/open-vm-tools/services/plugins/Makefile.am +index 7ab22ee..e010ab1 100644 +--- a/open-vm-tools/services/plugins/Makefile.am ++++ b/open-vm-tools/services/plugins/Makefile.am +@@ -1,5 +1,5 @@ + ################################################################################ +-### Copyright (C) 2009-2019 VMware, Inc. All rights reserved. ++### Copyright (C) 2009-2020 VMware, Inc. All rights reserved. + ### + ### This program is free software; you can redistribute it and/or modify + ### it under the terms of version 2 of the GNU General Public License as +@@ -16,6 +16,9 @@ + ################################################################################ + + SUBDIRS = ++if LINUX ++SUBDIRS += appInfo ++endif + if HAVE_X11 + SUBDIRS += desktopEvents + endif +diff --git a/open-vm-tools/services/plugins/appInfo/COPYING b/open-vm-tools/services/plugins/appInfo/COPYING +new file mode 100644 +index 0000000..9c6a6cc +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/COPYING +@@ -0,0 +1,502 @@ ++ GNU LESSER GENERAL PUBLIC LICENSE ++ Version 2.1, February 1999 ++ ++ Copyright (C) 1991, 1999 Free Software Foundation, Inc. ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++[This is the first released version of the Lesser GPL. It also counts ++ as the successor of the GNU Library Public License, version 2, hence ++ the version number 2.1.] ++ ++ Preamble ++ ++ The licenses for most software are designed to take away your ++freedom to share and change it. By contrast, the GNU General Public ++Licenses are intended to guarantee your freedom to share and change ++free software--to make sure the software is free for all its users. ++ ++ This license, the Lesser General Public License, applies to some ++specially designated software packages--typically libraries--of the ++Free Software Foundation and other authors who decide to use it. You ++can use it too, but we suggest you first think carefully about whether ++this license or the ordinary General Public License is the better ++strategy to use in any particular case, based on the explanations below. ++ ++ When we speak of free software, we are referring to freedom of use, ++not price. Our General Public Licenses are designed to make sure that ++you have the freedom to distribute copies of free software (and charge ++for this service if you wish); that you receive source code or can get ++it if you want it; that you can change the software and use pieces of ++it in new free programs; and that you are informed that you can do ++these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++distributors to deny you these rights or to ask you to surrender these ++rights. These restrictions translate to certain responsibilities for ++you if you distribute copies of the library or if you modify it. ++ ++ For example, if you distribute copies of the library, whether gratis ++or for a fee, you must give the recipients all the rights that we gave ++you. You must make sure that they, too, receive or can get the source ++code. If you link other code with the library, you must provide ++complete object files to the recipients, so that they can relink them ++with the library after making changes to the library and recompiling ++it. And you must show them these terms so they know their rights. ++ ++ We protect your rights with a two-step method: (1) we copyright the ++library, and (2) we offer you this license, which gives you legal ++permission to copy, distribute and/or modify the library. ++ ++ To protect each distributor, we want to make it very clear that ++there is no warranty for the free library. Also, if the library is ++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 ++restrictive license from a patent holder. Therefore, we insist that ++any patent license obtained for a version of the library must be ++consistent with the full freedom of use specified in this license. ++ ++ Most GNU software, including some libraries, is covered by the ++ordinary GNU General Public License. This license, the GNU Lesser ++General Public License, applies to certain designated libraries, and ++is quite different from the ordinary General Public License. We use ++this license for certain libraries in order to permit linking those ++libraries into non-free programs. ++ ++ When a program is linked with a library, whether statically or using ++a shared library, the combination of the two is legally speaking a ++combined work, a derivative of the original library. The ordinary ++General Public License therefore permits such linking only if the ++entire combination fits its criteria of freedom. The Lesser General ++Public License permits more lax criteria for linking other code with ++the library. ++ ++ We call this license the "Lesser" General Public License because it ++does Less to protect the user's freedom than the ordinary General ++Public License. It also provides other free software developers Less ++of an advantage over competing non-free programs. These disadvantages ++are the reason we use the ordinary General Public License for many ++libraries. However, the Lesser license provides advantages in certain ++special circumstances. ++ ++ For example, on rare occasions, there may be a special need to ++encourage the widest possible use of a certain library, so that it becomes ++a de-facto standard. To achieve this, non-free programs must be ++allowed to use the library. A more frequent case is that a free ++library does the same job as widely used non-free libraries. In this ++case, there is little to gain by limiting the free library to free ++software only, so we use the Lesser General Public License. ++ ++ In other cases, permission to use a particular library in non-free ++programs enables a greater number of people to use a large body of ++free software. For example, permission to use the GNU C Library in ++non-free programs enables many more people to use the whole GNU ++operating system, as well as its variant, the GNU/Linux operating ++system. ++ ++ Although the Lesser General Public License is Less protective of the ++users' freedom, it does ensure that the user of a program that is ++linked with the Library has the freedom and the wherewithal to run ++that program using a modified version of the Library. ++ ++ The precise terms and conditions for copying, distribution and ++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 ++ ++ 0. This License Agreement applies to any software library or other ++program which contains a notice placed by the copyright holder or ++other authorized party saying it may be distributed under the terms of ++this Lesser General Public License (also called "this License"). ++Each licensee is addressed as "you". ++ ++ A "library" means a collection of software functions and/or data ++prepared so as to be conveniently linked with application programs ++(which use some of those functions and data) to form executables. ++ ++ The "Library", below, refers to any such software library or work ++which has been distributed under these terms. A "work based on the ++Library" means either the Library or any derivative work under ++copyright law: that is to say, a work containing the Library or a ++portion of it, either verbatim or with modifications and/or translated ++straightforwardly into another language. (Hereinafter, translation is ++included without limitation in the term "modification".) ++ ++ "Source code" for a work means the preferred form of the work for ++making modifications to it. For a library, complete source code means ++all the source code for all modules it contains, plus any associated ++interface definition files, plus the scripts used to control compilation ++and installation of the library. ++ ++ Activities other than copying, distribution and modification are not ++covered by this License; they are outside its scope. The act of ++running a program using the Library is not restricted, and output from ++such a program is covered only if its contents constitute a work based ++on the Library (independent of the use of the Library in a tool for ++writing it). Whether that is true depends on what the Library does ++and what the program that uses the Library does. ++ ++ 1. You may copy and distribute verbatim copies of the Library's ++complete source code as you receive it, in any medium, provided that ++you conspicuously and appropriately publish on each copy an ++appropriate copyright notice and disclaimer of warranty; keep intact ++all the notices that refer to this License and to the absence of any ++warranty; and distribute a copy of this License along with the ++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 ++above, provided that you also meet all of these conditions: ++ ++ a) The modified work must itself be a software library. ++ ++ b) You must cause the files modified to carry prominent notices ++ stating that you changed the files and the date of any change. ++ ++ c) You must cause the whole of the work to be licensed at no ++ charge to all third parties under the terms of this License. ++ ++ d) If a facility in the modified Library refers to a function or a ++ table of data to be supplied by an application program that uses ++ the facility, other than as an argument passed when the facility ++ is invoked, then you must make a good faith effort to ensure that, ++ in the event an application does not supply such function or ++ table, the facility still operates, and performs whatever part of ++ its purpose remains meaningful. ++ ++ (For example, a function in a library to compute square roots has ++ a purpose that is entirely well-defined independent of the ++ application. Therefore, Subsection 2d requires that any ++ application-supplied function or table used by this function must ++ be optional: if the application does not supply it, the square ++ root function must still compute square roots.) ++ ++These requirements apply to the modified work as a whole. If ++identifiable sections of that work are not derived from the Library, ++and can be reasonably considered independent and separate works in ++themselves, then this License, and its terms, do not apply to those ++sections when you distribute them as separate works. But when you ++distribute the same sections as part of a whole which is a work based ++on the Library, the distribution of the whole must be on the terms of ++this License, whose permissions for other licensees extend to the ++entire whole, and thus to each and every part regardless of who wrote ++it. ++ ++Thus, it is not the intent of this section to claim rights or contest ++your rights to work written entirely by you; rather, the intent is to ++exercise the right to control the distribution of derivative or ++collective works based on the Library. ++ ++In addition, mere aggregation of another work not based on the Library ++with the Library (or with a work based on the Library) on a volume of ++a storage or distribution medium does not bring the other work under ++the scope of this License. ++ ++ 3. You may opt to apply the terms of the ordinary GNU General Public ++License instead of this License to a given copy of the Library. To do ++this, you must alter all the notices that refer to this License, so ++that they refer to the ordinary GNU General Public License, version 2, ++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. ++ ++ This option is useful when you wish to copy part of the code of ++the Library into a program that is not a library. ++ ++ 4. You may copy and distribute the Library (or a portion or ++derivative of it, under Section 2) in object code or executable form ++under the terms of Sections 1 and 2 above provided that you accompany ++it with the complete corresponding machine-readable source code, which ++must be distributed under the terms of Sections 1 and 2 above on a ++medium customarily used for software interchange. ++ ++ If distribution of object code is made by offering access to copy ++from a designated place, then offering equivalent access to copy the ++source code from the same place satisfies the requirement to ++distribute the source code, even though third parties are not ++compelled to copy the source along with the object code. ++ ++ 5. A program that contains no derivative of any portion of the ++Library, but is designed to work with the Library by being compiled or ++linked with it, is called a "work that uses the Library". Such a ++work, in isolation, is not a derivative work of the Library, and ++therefore falls outside the scope of this License. ++ ++ However, linking a "work that uses the Library" with the Library ++creates an executable that is a derivative of the Library (because it ++contains portions of the Library), rather than a "work that uses the ++library". The executable is therefore covered by this License. ++Section 6 states terms for distribution of such executables. ++ ++ When a "work that uses the Library" uses material from a header file ++that is part of the Library, the object code for the work may be a ++derivative work of the Library even though the source code is not. ++Whether this is true is especially significant if the work can be ++linked without the Library, or if the work is itself a library. The ++threshold for this to be true is not precisely defined by law. ++ ++ If such an object file uses only numerical parameters, data ++structure layouts and accessors, and small macros and small inline ++functions (ten lines or less in length), then the use of the object ++file is unrestricted, regardless of whether it is legally a derivative ++work. (Executables containing this object code plus portions of the ++Library will still fall under Section 6.) ++ ++ Otherwise, if the work is a derivative of the Library, you may ++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 ++under terms of your choice, provided that the terms permit ++modification of the work for the customer's own use and reverse ++engineering for debugging such modifications. ++ ++ You must give prominent notice with each copy of the work that the ++Library is used in it and that the Library and its use are covered by ++this License. You must supply a copy of this License. If the work ++during execution displays copyright notices, you must include the ++copyright notice for the Library among them, as well as a reference ++directing the user to the copy of this License. Also, you must do one ++of these things: ++ ++ a) Accompany the work with the complete corresponding ++ machine-readable source code for the Library including whatever ++ changes were used in the work (which must be distributed under ++ Sections 1 and 2 above); and, if the work is an executable linked ++ with the Library, with the complete machine-readable "work that ++ uses the Library", as object code and/or source code, so that the ++ user can modify the Library and then relink to produce a modified ++ executable containing the modified Library. (It is understood ++ that the user who changes the contents of definitions files in the ++ Library will not necessarily be able to recompile the application ++ to use the modified definitions.) ++ ++ b) Use a suitable shared library mechanism for linking with the ++ Library. A suitable mechanism is one that (1) uses at run time a ++ copy of the library already present on the user's computer system, ++ rather than copying library functions into the executable, and (2) ++ will operate properly with a modified version of the library, if ++ the user installs one, as long as the modified version is ++ interface-compatible with the version that the work was made with. ++ ++ c) Accompany the work with a written offer, valid for at ++ least three years, to give the same user the materials ++ specified in Subsection 6a, above, for a charge no more ++ than the cost of performing this distribution. ++ ++ d) If distribution of the work is made by offering access to copy ++ from a designated place, offer equivalent access to copy the above ++ specified materials from the same place. ++ ++ e) Verify that the user has already received a copy of these ++ materials or that you have already sent this user a copy. ++ ++ For an executable, the required form of the "work that uses the ++Library" must include any data and utility programs needed for ++reproducing the executable from it. However, as a special exception, ++the materials to be distributed need not include anything that is ++normally distributed (in either source or binary form) with the major ++components (compiler, kernel, and so on) of the operating system on ++which the executable runs, unless that component itself accompanies ++the executable. ++ ++ It may happen that this requirement contradicts the license ++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 ++library, provided that the separate distribution of the work based on ++the Library and of the other library facilities is otherwise ++permitted, and provided that you do these two things: ++ ++ a) Accompany the combined library with a copy of the same work ++ based on the Library, uncombined with any other library ++ facilities. This must be distributed under the terms of the ++ Sections above. ++ ++ b) Give prominent notice with the combined library of the fact ++ that part of it is a work based on the Library, and explaining ++ where to find the accompanying uncombined form of the same work. ++ ++ 8. You may not copy, modify, sublicense, link with, or distribute ++the Library except as expressly provided under this License. Any ++attempt otherwise to copy, modify, sublicense, link with, or ++distribute the Library is void, and will automatically terminate your ++rights under this License. However, parties who have received copies, ++or rights, from you under this License will not have their licenses ++terminated so long as such parties remain in full compliance. ++ ++ 9. You are not required to accept this License, since you have not ++signed it. However, nothing else grants you permission to modify or ++distribute the Library or its derivative works. These actions are ++prohibited by law if you do not accept this License. Therefore, by ++modifying or distributing the Library (or any work based on the ++Library), you indicate your acceptance of this License to do so, and ++all its terms and conditions for copying, distributing or modifying ++the Library or works based on it. ++ ++ 10. Each time you redistribute the Library (or any work based on the ++Library), the recipient automatically receives a license from the ++original licensor to copy, distribute, link with or modify the Library ++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 ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot ++distribute so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you ++may not distribute the Library at all. For example, if a patent ++license would not permit royalty-free redistribution of the Library by ++all those who receive copies directly or indirectly through you, then ++the only way you could satisfy both it and this License would be to ++refrain entirely from distribution of the Library. ++ ++If any portion of this section is held invalid or unenforceable under any ++particular circumstance, the balance of the section is intended to apply, ++and the section as a whole is intended to apply in other circumstances. ++ ++It is not the purpose of this section to induce you to infringe any ++patents or other property right claims or to contest validity of any ++such claims; this section has the sole purpose of protecting the ++integrity of the free software distribution system which is ++implemented by public license practices. Many people have made ++generous contributions to the wide range of software distributed ++through that system in reliance on consistent application of that ++system; it is up to the author/donor to decide if he or she is willing ++to distribute software through any other system and a licensee cannot ++impose that choice. ++ ++This section is intended to make thoroughly clear what is believed to ++be a consequence of the rest of this License. ++ ++ 12. If the distribution and/or use of the Library is restricted in ++certain countries either by patents or by copyrighted interfaces, the ++original copyright holder who places the Library under this License may add ++an explicit geographical distribution limitation excluding those countries, ++so that distribution is permitted only in or among countries not thus ++excluded. In such case, this License incorporates the limitation as if ++written in the body of this License. ++ ++ 13. The Free Software Foundation may publish revised and/or new ++versions of the Lesser General Public License from time to time. ++Such new versions will be similar in spirit to the present version, ++but may differ in detail to address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Library ++specifies a version number of this License which applies to it and ++"any later version", you have the option of following the terms and ++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 ++copyrighted by the Free Software Foundation, write to the Free ++Software Foundation; we sometimes make exceptions for this. Our ++decision will be guided by the two goals of preserving the free status ++of all derivatives of our free software and of promoting the sharing ++and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO ++WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. ++EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR ++OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY ++KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE ++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE ++LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME ++THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN ++WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY ++AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU ++FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR ++CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE ++LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING ++RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A ++FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF ++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 ++possible use to the public, we recommend making it free software that ++everyone can redistribute and change. You can do so by permitting ++redistribution under these terms (or, alternatively, under the terms of the ++ordinary General Public License). ++ ++ To apply these terms, attach the following notices to the library. It is ++safest to attach them to the start of each source file to most effectively ++convey the exclusion of warranty; and each file should have at least the ++"copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ 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, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a "copyright disclaimer" for the library, if ++necessary. Here is a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the ++ library `Frob' (a library for tweaking knobs) written by James Random Hacker. ++ ++ , 1 April 1990 ++ Ty Coon, President of Vice ++ ++That's all there is to it! +diff --git a/open-vm-tools/services/plugins/appInfo/Makefile.am b/open-vm-tools/services/plugins/appInfo/Makefile.am +new file mode 100644 +index 0000000..fd1e466 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/Makefile.am +@@ -0,0 +1,37 @@ ++################################################################################ ++### Copyright (C) 2020 VMware, Inc. All rights reserved. ++### ++### This program is free software; you can redistribute it and/or modify ++### it under the terms of version 2 of the GNU General Public License as ++### published by the Free Software Foundation. ++### ++### This program is distributed in the hope that it will be useful, ++### but WITHOUT ANY WARRANTY; without even the implied warranty of ++### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++### GNU General Public License for more details. ++### ++### You should have received a copy of the GNU General Public License ++### along with this program; if not, write to the Free Software ++### Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++################################################################################ ++ ++SUBDIRS = ++ ++plugindir = @VMSVC_PLUGIN_INSTALLDIR@ ++plugin_LTLIBRARIES = libappInfo.la ++ ++libappInfo_la_CPPFLAGS = ++libappInfo_la_CPPFLAGS += @PLUGIN_CPPFLAGS@ ++ ++libappInfo_la_LDFLAGS = ++libappInfo_la_LDFLAGS += @PLUGIN_LDFLAGS@ ++ ++libappInfo_la_LIBADD = ++libappInfo_la_LIBADD += @VMTOOLS_LIBS@ ++libappInfo_la_LIBADD += @GOBJECT_LIBS@ ++ ++libappInfo_la_SOURCES = ++libappInfo_la_SOURCES += appInfo.c ++libappInfo_la_SOURCES += appInfoInt.h ++libappInfo_la_SOURCES += appInfoUtil.c ++libappInfo_la_SOURCES += appInfoPosix.c +diff --git a/open-vm-tools/services/plugins/appInfo/appInfo.c b/open-vm-tools/services/plugins/appInfo/appInfo.c +new file mode 100644 +index 0000000..b0db092 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfo.c +@@ -0,0 +1,572 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program 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 version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfo.c -- ++ * ++ * Captures the information about running applications inside the guest ++ * and publishes it to a guest variable. ++ */ ++ ++ ++#include ++#include ++#include ++ ++#include "appInfo.h" ++#include "appInfoInt.h" ++#include "vmware.h" ++#include "conf.h" ++#include "dynbuf.h" ++#include "escape.h" ++#include "str.h" ++#include "util.h" ++#include "vm_atomic.h" ++#include "vmcheck.h" ++#include "vmware/tools/log.h" ++#include "vmware/tools/threadPool.h" ++#include "vmware/tools/utils.h" ++ ++#if !defined(__APPLE__) ++#include "vm_version.h" ++#include "embed_version.h" ++#include "vmtoolsd_version.h" ++VM_EMBED_VERSION(VMTOOLSD_VERSION_STRING); ++#endif ++ ++#if defined(_WIN32) ++#include "codeset.h" ++#endif ++ ++/** ++ * Maximum size of the packet size that appInfo plugin should send ++ * to the VMX. Currently, this is set to 62 KB. ++ */ ++#define MAX_APP_INFO_SIZE (62 * 1024) ++ ++/** ++ * Default poll interval for appInfo is 30m ++ */ ++#define APP_INFO_POLL_INTERVAL (30 * 60) ++ ++/** ++ * Default value for CONFNAME_APPINFO_DISABLED setting in ++ * tools configuration file. ++ * ++ * FALSE will enable the plugin. TRUE will disable the plugin. ++ */ ++#define APP_INFO_CONF_DEFAULT_DISABLED_VALUE FALSE ++ ++/** ++ * Defines the current poll interval (in seconds). ++ * ++ * This value is controlled by the appinfo.poll-interval config file option. ++ */ ++int appInfoPollInterval = 0; ++ ++/** ++ * AppInfo gather loop timeout source. ++ */ ++static GSource *appInfoTimeoutSource = NULL; ++ ++ ++/* ++ ***************************************************************************** ++ * EscapeJSONString -- ++ * ++ * Escapes a string to be included in JSON content. ++ * ++ * @param[in] str The string to be escaped. ++ * ++ * @retval Pointer to a heap-allocated memory. This holds the escaped content ++ * of the string passed by the caller. ++ * ++ ***************************************************************************** ++ */ ++ ++static char * ++EscapeJSONString(const char *str) // IN ++{ ++ /* ++ * Escape '"' and '\' characters in the JSON string. ++ */ ++ ++ static const int bytesToEscape[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // " ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // '\' ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ }; ++ ++ return Escape_DoString("\\u00", bytesToEscape, str, strlen(str), ++ NULL); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * SetGuestInfo -- ++ * ++ * Sends a simple key-value update request to the VMX. ++ * ++ * @param[in] ctx Application context. ++ * @param[in] key Key sent to the VMX ++ * @param[in] value GuestInfo data sent to the VMX ++ * ++ * @retval TRUE RPCI succeeded. ++ * @retval FALSE RPCI failed. ++ * ++ ***************************************************************************** ++ */ ++ ++static Bool ++SetGuestInfo(ToolsAppCtx *ctx, // IN: ++ const char *guestVariableName, // IN: ++ const char *value) // IN: ++{ ++ Bool status; ++ char *reply = NULL; ++ gchar *msg; ++ size_t replyLen; ++ ++ ASSERT(guestVariableName); ++ ASSERT(value); ++ ++ msg = g_strdup_printf("info-set guestinfo.%s %s", ++ guestVariableName, ++ value); ++ ++ status = RpcChannel_Send(ctx->rpc, ++ msg, ++ strlen(msg) + 1, ++ &reply, ++ &replyLen); ++ g_free(msg); ++ ++ if (!status) { ++ g_warning("Error sending RPC message: %s\n", reply ? reply : "NULL"); ++ vm_free(reply); ++ return FALSE; ++ } else { ++ g_info("Successfully sent the app information.\n"); ++ } ++ ++ status = (*reply == '\0'); ++ vm_free(reply); ++ return status; ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoGatherTask -- ++ * ++ * Collects all the desired application related information and updates VMX. ++ * ++ * @param[in] data The application context. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoGatherTask(ToolsAppCtx *ctx, ++ void *data) ++{ ++ DynBuf dynBuffer; ++ char tmpBuf[1024]; ++ int len; ++ gchar *tstamp = NULL; ++ char *escapedCmd = NULL; ++ char *escapedVersion = NULL; ++ GSList *appList = NULL; ++ GSList *appNode; ++ static Atomic_uint64 updateCounter = {0}; ++ uint64 counter = (uint64) Atomic_ReadInc64(&updateCounter) + 1; ++ ++ static char headerFmt[] = "{\n" ++ "\"" APP_INFO_KEY_VERSION "\":\"%d\", \n" ++ "\"" APP_INFO_KEY_UPDATE_COUNTER "\":\"%"FMT64"d\", \n" ++ "\"" APP_INFO_KEY_PUBLISHTIME "\":\"%s\", \n" ++ "\"" APP_INFO_KEY_APPS "\":["; ++ static char jsonPerAppFmt[] = ++ "%s\n" // , for all the elements after the first one ++ "{" ++ "\"" APP_INFO_KEY_APP_NAME "\":\"%s\"" ++ "," ++ "\"" APP_INFO_KEY_APP_VERSION "\":\"%s\"" ++ "}"; ++ static char jsonSuffix[] = "]}"; ++ ++ DynBuf_Init(&dynBuffer); ++ ++ tstamp = VMTools_GetTimeAsString(); ++ ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, headerFmt, ++ APP_INFO_VERSION_1, ++ counter, ++ tstamp != NULL ? tstamp : ""); ++ ++ if (len < 0) { ++ g_warning("Insufficient space for the header.\n"); ++ goto abort; ++ } ++ ++ DynBuf_Append(&dynBuffer, tmpBuf, len); ++ ++ appList = AppInfo_SortAppList(AppInfo_GetAppList()); ++ ++ for (appNode = appList; appNode != NULL; appNode = appNode->next) { ++ size_t currentBufferSize = DynBuf_GetSize(&dynBuffer); ++ AppInfo *appInfo = (AppInfo *) appNode->data; ++ ++ if (appInfo->appName == NULL || ++ appInfo->version == NULL) { ++ goto next_entry; ++ } ++ ++ escapedCmd = EscapeJSONString(appInfo->appName); ++ ++ if (NULL == escapedCmd) { ++ g_warning("Failed to escape the content of cmdName\n"); ++ goto abort; ++ } ++ ++ escapedVersion = EscapeJSONString(appInfo->version); ++ if (NULL == escapedVersion) { ++ g_warning("Failed to escape the content of version information.\n"); ++ goto abort; ++ } ++ ++ if (appNode == appList) { ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, jsonPerAppFmt, ++ "", escapedCmd, escapedVersion); ++ } else { ++ /* ++ * If this is not the first element, then add ',' at the beginning. ++ */ ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, jsonPerAppFmt, ++ ",", escapedCmd, escapedVersion); ++ } ++ ++ if (len < 0) { ++ g_warning("Insufficient space for the application information.\n"); ++ goto next_entry; ++ } ++ ++ if (currentBufferSize + len + sizeof jsonSuffix > MAX_APP_INFO_SIZE) { ++ g_warning("Exceeded the max info packet size." ++ " Truncating the rest of the applications.\n"); ++ break; ++ } ++ ++ DynBuf_Append(&dynBuffer, tmpBuf, len); ++ ++next_entry: ++ free(escapedCmd); ++ escapedCmd = NULL; ++ free(escapedVersion); ++ escapedVersion = NULL; ++ } ++ ++ DynBuf_Append(&dynBuffer, jsonSuffix, sizeof jsonSuffix - 1); ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, DynBuf_GetString(&dynBuffer)); ++ ++abort: ++ free(escapedCmd); ++ free(escapedVersion); ++ AppInfo_DestroyAppList(appList); ++ g_free(tstamp); ++ DynBuf_Destroy(&dynBuffer); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoGather -- ++ * ++ * Creates a new thread that collects all the desired application related ++ * information and udates the VMX. ++ * ++ * @param[in] data The application context. ++ * ++ * @return TRUE to indicate that the timer should be rescheduled. ++ * ++ ***************************************************************************** ++ */ ++ ++static gboolean ++AppInfoGather(gpointer data) ++{ ++ ToolsAppCtx *ctx = data; ++ if (!ToolsCorePool_SubmitTask(ctx, AppInfoGatherTask, NULL, NULL)) { ++ g_warning("%s: failed to start information gather thread\n", ++ __FUNCTION__); ++ } ++ ++ return TRUE; ++} ++ ++ ++/* ++ ***************************************************************************** ++ * TweakGatherLoop -- ++ * ++ * @brief Start, stop, reconfigure a GuestInfoGather poll loop. ++ * ++ * This function is responsible for creating, manipulating, and resetting a ++ * AppDiscoveryGather loop timeout source. ++ * ++ * @param[in] ctx The app context. ++ * @param[in] enable Whether to enable the gather loop. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++TweakGatherLoop(ToolsAppCtx *ctx, ++ gboolean enable) ++{ ++ gint pollInterval = 0; ++ ++ if (enable) { ++ pollInterval = APP_INFO_POLL_INTERVAL * 1000; ++ ++ /* ++ * Check the config registry for custom poll interval, ++ * converting from seconds to milliseconds. ++ */ ++ if (g_key_file_has_key(ctx->config, CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, NULL)) { ++ GError *gError = NULL; ++ ++ pollInterval = g_key_file_get_integer(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, ++ &gError); ++ pollInterval *= 1000; ++ ++ if (pollInterval < 0 || gError) { ++ g_warning("Invalid %s.%s value. Using default %us.\n", ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, ++ APP_INFO_POLL_INTERVAL); ++ pollInterval = APP_INFO_POLL_INTERVAL * 1000; ++ } ++ ++ g_clear_error(&gError); ++ } ++ } ++ ++ if (appInfoTimeoutSource != NULL) { ++ /* ++ * If the interval hasn't changed, let's not interfere with the existing ++ * timeout source. ++ */ ++ if (pollInterval == appInfoPollInterval) { ++ ASSERT(pollInterval); ++ return; ++ } ++ ++ /* ++ * Destroy the existing timeout source since the interval has changed. ++ */ ++ ++ g_source_destroy(appInfoTimeoutSource); ++ appInfoTimeoutSource = NULL; ++ } ++ ++ /* ++ * All checks have passed. Create a new timeout source and attach it. ++ */ ++ appInfoPollInterval = pollInterval; ++ ++ if (appInfoPollInterval) { ++ g_info("New value for %s is %us.\n", ++ CONFNAME_APPINFO_POLLINTERVAL, ++ appInfoPollInterval / 1000); ++ ++ appInfoTimeoutSource = g_timeout_source_new(appInfoPollInterval); ++ VMTOOLSAPP_ATTACH_SOURCE(ctx, appInfoTimeoutSource, ++ AppInfoGather, ctx, NULL); ++ g_source_unref(appInfoTimeoutSource); ++ } else { ++ g_info("Poll loop for %s disabled.\n", CONFNAME_APPINFO_POLLINTERVAL); ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, ""); ++ } ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoServerConfReload -- ++ * ++ * @brief Reconfigures the poll loop interval upon config file reload. ++ * ++ * @param[in] src The source object. ++ * @param[in] ctx The application context. ++ * @param[in] data Unused. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoServerConfReload(gpointer src, ++ ToolsAppCtx *ctx, ++ gpointer data) ++{ ++ gboolean disabled = ++ VMTools_ConfigGetBoolean(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_DISABLED, ++ APP_INFO_CONF_DEFAULT_DISABLED_VALUE); ++ TweakGatherLoop(ctx, !disabled); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoServerShutdown -- ++ * ++ * Cleanup internal data on shutdown. ++ * ++ * @param[in] src The source object. ++ * @param[in] ctx Unused. ++ * @param[in] data Unused. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoServerShutdown(gpointer src, ++ ToolsAppCtx *ctx, ++ gpointer data) ++{ ++ if (appInfoTimeoutSource != NULL) { ++ g_source_destroy(appInfoTimeoutSource); ++ appInfoTimeoutSource = NULL; ++ } ++ ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, ""); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * ToolsOnLoad -- ++ * ++ * Plugin entry point. Initializes internal plugin state. ++ * ++ * @param[in] ctx The app context. ++ * ++ * @return The registration data. ++ * ++ ***************************************************************************** ++ */ ++ ++TOOLS_MODULE_EXPORT ToolsPluginData * ++ToolsOnLoad(ToolsAppCtx *ctx) ++{ ++ static ToolsPluginData regData = { ++ "appInfo", ++ NULL, ++ NULL ++ }; ++ ++ uint32 vmxVersion = 0; ++ uint32 vmxType = VMX_TYPE_UNSET; ++ ++ /* ++ * Return NULL to disable the plugin if not running in a VMware VM. ++ */ ++ if (!ctx->isVMware) { ++ g_info("Not running in a VMware VM.\n"); ++ return NULL; ++ } ++ ++ /* ++ * Return NULL to disable the plugin if VM is not running on ESX host. ++ */ ++ if (!VmCheck_GetVersion(&vmxVersion, &vmxType) || ++ vmxType != VMX_TYPE_SCALABLE_SERVER) { ++ g_info("VM is not running on ESX host.\n"); ++ return NULL; ++ } ++ ++ /* ++ * Return NULL to disable the plugin if not running in vmsvc daemon. ++ */ ++ if (!TOOLS_IS_MAIN_SERVICE(ctx)) { ++ g_info("Not running in vmsvc daemon: container name='%s'.\n", ++ ctx->name); ++ return NULL; ++ } ++ ++ /* ++ * This plugin is useless without an RpcChannel. If we don't have one, ++ * just bail. ++ */ ++ if (ctx->rpc != NULL) { ++ ToolsPluginSignalCb sigs[] = { ++ { TOOLS_CORE_SIG_CONF_RELOAD, AppInfoServerConfReload, NULL }, ++ { TOOLS_CORE_SIG_SHUTDOWN, AppInfoServerShutdown, NULL } ++ }; ++ ToolsAppReg regs[] = { ++ { TOOLS_APP_SIGNALS, ++ VMTools_WrapArray(sigs, sizeof *sigs, ARRAYSIZE(sigs)) ++ } ++ }; ++ ++ gboolean disabled = FALSE; ++ ++ regData.regs = VMTools_WrapArray(regs, ++ sizeof *regs, ++ ARRAYSIZE(regs)); ++ ++ /* ++ * Set up the AppInfo gather loop. ++ */ ++ disabled = ++ VMTools_ConfigGetBoolean(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_DISABLED, ++ APP_INFO_CONF_DEFAULT_DISABLED_VALUE); ++ TweakGatherLoop(ctx, !disabled); ++ ++ return ®Data; ++ } ++ ++ return NULL; ++} ++ ++ ++/* ++ * END Tools Core Services goodies. ++ ***************************************************************************** ++ */ +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoInt.h b/open-vm-tools/services/plugins/appInfo/appInfoInt.h +new file mode 100644 +index 0000000..1897926 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoInt.h +@@ -0,0 +1,64 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program 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 version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++#ifndef _APPINFOINT_H_ ++#define _APPINFOINT_H_ ++ ++/** ++ * @file appInfoInt.h ++ * ++ * Header file with few functions that are internal to appInfo plugin. ++ */ ++ ++#define G_LOG_DOMAIN "appInfo" ++#include "vm_basic_types.h" ++#include ++#include "vmware/tools/plugin.h" ++ ++#if defined(_WIN32) ++ ++#include ++typedef DWORD AppInfo_Pid; ++ ++#else /* POSIX */ ++ ++#include ++typedef pid_t AppInfo_Pid; ++ ++#endif ++ ++/* ++ * Application information structure. ++ * This holds basic information we return per process ++ * when listing process information inside the guest. ++ */ ++ ++typedef struct AppInfo { ++ AppInfo_Pid procId; ++ char *appName; // UTF-8 ++ char *version; ++#if defined(_WIN32) ++ size_t memoryUsed; ++#endif ++} AppInfo; ++ ++GSList *AppInfo_GetAppList(void); ++GSList *AppInfo_SortAppList(GSList *appList); ++ ++void AppInfo_DestroyAppList(GSList *appList); ++#endif /* _APPINFOINT_H_ */ +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoPosix.c b/open-vm-tools/services/plugins/appInfo/appInfoPosix.c +new file mode 100644 +index 0000000..d7b05be +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoPosix.c +@@ -0,0 +1,124 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program 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 version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfoPosix.c -- ++ * ++ * Functions to capture the information about running applications inside ++ * a Linux guest. ++ * ++ */ ++ ++#ifndef __linux__ ++# error This file should not be compiled. ++#endif ++ ++ ++#include ++#include ++#include ++ ++#include "appInfoInt.h" ++#include "procMgr.h" ++#include "vmware.h" ++#include "str.h" ++#include "util.h" ++ ++ ++/* ++ *---------------------------------------------------------------------- ++ * AppInfoGetAppInfo -- ++ * ++ * Retrieves the application information for a specified process. ++ * ++ * @param[in] procInfo Information about a process. ++ * ++ * @retval The application information. The caller must free the memory ++ * allocated for the application information. ++ * NULL if any error happens. ++ * ++ *---------------------------------------------------------------------- ++ */ ++ ++AppInfo * ++AppInfoGetAppInfo(ProcMgrProcInfo *procInfo) // IN ++{ ++ AppInfo *appInfo = NULL; ++ ++ if (procInfo == NULL) { ++ return appInfo; ++ } ++ ++ if (procInfo->procCmdName == NULL) { ++ return appInfo; ++ } ++ ++ appInfo = Util_SafeMalloc(sizeof (*appInfo) * 1); ++ appInfo->procId = procInfo->procId; ++ appInfo->appName = Util_SafeStrdup(procInfo->procCmdName); ++ appInfo->version = Util_SafeStrdup(""); ++ ++ return appInfo; ++} ++ ++ ++/* ++ *---------------------------------------------------------------------- ++ * AppInfo_GetAppList -- ++ * ++ * Generates the application information list. ++ * ++ * @retval Pointer to the newly allocated application list. The caller must ++ * free the memory using AppInfoDestroyAppList function. ++ * NULL if any error occurs. ++ * ++ *---------------------------------------------------------------------- ++ */ ++ ++GSList * ++AppInfo_GetAppList(void) { ++ GSList *appList = NULL; ++ int i; ++ ProcMgrProcInfoArray *procList = NULL; ++ size_t procCount; ++ ++#if defined(_WIN32) ++ procList = ProcMgr_ListProcessesEx(); ++#else ++ procList = ProcMgr_ListProcesses(); ++#endif ++ ++ if (procList == NULL) { ++ g_warning("Failed to get the list of processes.\n"); ++ return appList; ++ } ++ ++ procCount = ProcMgrProcInfoArray_Count(procList); ++ for (i = 0; i < procCount; i++) { ++ AppInfo *appInfo; ++ ProcMgrProcInfo *procInfo = ProcMgrProcInfoArray_AddressOf(procList, i); ++ appInfo = AppInfoGetAppInfo(procInfo); ++ if (NULL != appInfo) { ++ appList = g_slist_prepend(appList, appInfo); ++ } ++ } ++ ++ ProcMgr_FreeProcList(procList); ++ ++ return appList; ++} +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoUtil.c b/open-vm-tools/services/plugins/appInfo/appInfoUtil.c +new file mode 100644 +index 0000000..f0327ec +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoUtil.c +@@ -0,0 +1,143 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program 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 version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfoUtil.c -- ++ * ++ * Utility functions for the application list information. ++ */ ++ ++ ++#include ++#include ++#include "appInfoInt.h" ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoDestroyAppData -- ++ * ++ * Free function for application data. This function is called by the glib ++ * for each element in the application list while freeing. ++ * ++ * @param[in] data Pointer to the application data. ++ * ++ * @retval NONE ++ * ++ ****************************************************************************** ++ */ ++ ++void ++AppInfoDestroyAppData(gpointer data) { ++ AppInfo *appInfo = (AppInfo *) data; ++ ++ if (appInfo == NULL) { ++ return; ++ } ++ ++ free(appInfo->appName); ++ free(appInfo->version); ++ free(appInfo); ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoDestroyAppList -- ++ * ++ * Frees the entire memory allocated for the application list. ++ * ++ * @param[in] appList Pointer to the application list. ++ * ++ * @retval NONE ++ * ++ ****************************************************************************** ++ */ ++ ++void ++AppInfo_DestroyAppList(GSList *appList) { ++ if (appList == NULL) { ++ return; ++ } ++ ++ g_slist_free_full(appList, AppInfoDestroyAppData); ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoCompareApps -- ++ * ++ * Compare function used by glib while sorting the application list. ++ * For windows guests, the memory used by the application is used for comparing. ++ * For linux guests, no comparison is done and hence 0 is returned. ++ * ++ * @param[in] a Pointer to the first application that should be compared. ++ * @param[in] b Pointer to the second application that should be compared. ++ * ++ * @retval -1 if a should be kept before b in the sorted list. ++ * 0 if both the elements are same. ++ * 1 if b should be kept before a in the sorted list. ++ * ++ ****************************************************************************** ++ */ ++ ++static gint ++AppInfoCompareApps(gconstpointer a, ++ gconstpointer b) { ++#if defined(_WIN32) ++ if (a != NULL && b != NULL) { ++ size_t aMemory = ((AppInfo *) a)->memoryUsed; ++ size_t bMemory = ((AppInfo *) b)->memoryUsed; ++ if (aMemory < bMemory) { ++ return 1; ++ } else if (aMemory == bMemory) { ++ return 0; ++ } else { ++ return -1; ++ } ++ } ++ return 0; ++#else ++ return 0; ++#endif ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfo_SortAppList -- ++ * ++ * Sorts the provided list of applications. ++ * ++ * @param[in] appList List of applications that need to be sorted. ++ * ++ * @retval The sorted list of applications. ++ * ++ ****************************************************************************** ++ */ ++ ++GSList * ++AppInfo_SortAppList(GSList *appList) // IN/OUT ++{ ++ if (appList == NULL) { ++ return appList; ++ } ++ ++ return g_slist_sort(appList, AppInfoCompareApps); ++} +-- +1.8.3.1 + diff --git "a/SOURCES/run-vmblock\\x2dfuse.mount" "b/SOURCES/run-vmblock\\x2dfuse.mount" new file mode 100644 index 0000000..d7be7c2 --- /dev/null +++ "b/SOURCES/run-vmblock\\x2dfuse.mount" @@ -0,0 +1,17 @@ +[Unit] +Description=VMware vmblock Fuse Mount +Documentation=https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/vmblock-fuse/design.txt +DefaultDependencies=no +Before=umount.target vmtoolsd.service +ConditionVirtualization=vmware +After=sys-fs-fuse-connections.mount +Wants=vmtoolsd.service + +[Mount] +What=vmware-vmblock-fuse +Where=/run/vmblock-fuse +Type=fuse +Options=subtype=vmware-vmblock,default_permissions,allow_other + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/vmtoolsd-init.service b/SOURCES/vmtoolsd-init.service deleted file mode 100644 index 08dd10d..0000000 --- a/SOURCES/vmtoolsd-init.service +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=One-time configuration for vmtoolsd -ConditionVirtualization=vmware -ConditionPathExists=|!/etc/vmware-tools/GuestProxyData/server/cert.pem -ConditionPathExists=|!/etc/vmware-tools/GuestProxyData/server/key.pem -PartOf=vmtoolsd.service - -[Service] -Type=oneshot -RemainAfterExit=no -ExecStart=/usr/bin/vmware-guestproxycerttool -g - -[Install] -RequiredBy=vmtoolsd.service diff --git a/SOURCES/vmtoolsd.service b/SOURCES/vmtoolsd.service index 051bc32..773040d 100644 --- a/SOURCES/vmtoolsd.service +++ b/SOURCES/vmtoolsd.service @@ -2,19 +2,15 @@ Description=Service for virtual machines hosted on VMware Documentation=http://github.com/vmware/open-vm-tools ConditionVirtualization=vmware -Requires=vmtoolsd-init.service Requires=vgauthd.service -After=vmtoolsd-init.service After=vgauthd.service DefaultDependencies=no Before=cloud-init-local.service - [Service] ExecStart=/usr/bin/vmtoolsd TimeoutStopSec=5 [Install] WantedBy=multi-user.target -Also=vmtoolsd-init.service Also=vgauthd.service diff --git a/SPECS/open-vm-tools.spec b/SPECS/open-vm-tools.spec index 3da96c9..510fe30 100644 --- a/SPECS/open-vm-tools.spec +++ b/SPECS/open-vm-tools.spec @@ -19,27 +19,35 @@ ################################################################################ %global _hardened_build 1 -%global majorversion 10.3 -%global minorversion 10 -%global toolsbuild 12406962 +%global majorversion 11.0 +%global minorversion 5 +%global toolsbuild 15389592 %global toolsversion %{majorversion}.%{minorversion} %global toolsdaemon vmtoolsd %global vgauthdaemon vgauthd Name: open-vm-tools Version: %{toolsversion} -Release: 1%{?dist} +Release: 3%{?dist} Summary: Open Virtual Machine Tools for virtual machines hosted on VMware Group: Applications/System License: GPLv2 URL: https://github.com/vmware/%{name} Source0: https://github.com/vmware/%{name}/releases/download/stable-%{version}/%{name}-%{version}-%{toolsbuild}.tar.gz -Source1: %{toolsdaemon}-init.service -Source2: %{toolsdaemon}.service -Source3: %{vgauthdaemon}.service +Source1: %{toolsdaemon}.service +Source2: %{vgauthdaemon}.service +Source3: run-vmblock\x2dfuse.mount +Source4: open-vm-tools.conf + ExclusiveArch: x86_64 Patch0002: 0002-Fix-RELRO-flag.patch +# For bz#1809753 - [ESXi][RHEL7.9]open-vm-tools add appinfo plugin patch +Patch3: ovt-add-appinfo-plugin.patch +# For bz#1818109 - [ESXi][RHEL7.9]open-vm-tools coverity scan issue +Patch4: ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch +# For bz#1818109 - [ESXi][RHEL7.9]open-vm-tools coverity scan issue +Patch5: ovt-Update-copyright-to-reflect-previous-change.patch BuildRequires: autoconf BuildRequires: automake @@ -67,13 +75,7 @@ BuildRequires: libXtst-devel BuildRequires: openssl-devel BuildRequires: pam-devel BuildRequires: procps-devel -%if 0%{?fedora} >= 28 -BuildRequires: rpcgen -%endif BuildRequires: systemd -%if 0%{?fedora} >= 28 -BuildRequires: libtirpc-devel -%endif BuildRequires: xmlsec1-openssl-devel Requires: coreutils @@ -90,6 +92,9 @@ Requires: which # xmlsec1-openssl needs to be added explicitly Requires: xmlsec1-openssl +# For proper install/uninstall +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig # open-vm-tools >= 10.0.0 do not require open-vm-tools-deploypkg # provided by VMware. That functionality is now available as part # of open-vm-tools package itself. @@ -133,35 +138,28 @@ useful for verifying the functioning of %{name} in VMware virtual machines. %prep -%setup -q -n %{name}-%{version}-%{toolsbuild} - -%patch0002 -p1 +%autosetup -p2 -n %{name}-%{version}-%{toolsbuild} %build # Required for regenerating configure script when # configure.ac get modified -autoreconf -i -autoconf +autoreconf -vif -%if 0%{?fedora} >= 28 -%global usetirpc with-tirpc -%else %global usetirpc without-tirpc -%endif %configure \ --without-kernel-modules \ --enable-xmlsec1 \ --enable-resolutionkms \ - --%{usetirpc} \ + --without-tirpc \ --disable-static sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool -make %{?_smp_mflags} +%make_build %install export DONT_STRIP=1 -make install DESTDIR=%{buildroot} +%make_install # Remove exec bit from config files chmod a-x %{buildroot}%{_sysconfdir}/pam.d/* @@ -189,9 +187,10 @@ rm -fr %{buildroot}%{_sbindir} %{buildroot}/sbin/mount.vmhgfs mv %{buildroot}%{_sysconfdir}/vmware-tools/vm-support %{buildroot}%{_bindir} # Systemd unit files -install -p -m 644 -D %{SOURCE1} %{buildroot}%{_unitdir}/%{toolsdaemon}-init.service -install -p -m 644 -D %{SOURCE2} %{buildroot}%{_unitdir}/%{toolsdaemon}.service -install -p -m 644 -D %{SOURCE3} %{buildroot}%{_unitdir}/%{vgauthdaemon}.service +install -p -m 644 -D %{SOURCE1} %{buildroot}%{_unitdir}/%{toolsdaemon}.service +install -p -m 644 -D %{SOURCE2} %{buildroot}%{_unitdir}/%{vgauthdaemon}.service +install -p -m 644 -D '%{SOURCE3}' %{buildroot}%{_unitdir}/run-vmblock\\x2dfuse.mount +install -p -m 644 -D %{SOURCE4} %{buildroot}/usr/lib/modules-load.d/open-vm-tools.conf # 'make check' in open-vm-tools rebuilds docs and ends up regenerating @@ -199,12 +198,7 @@ install -p -m 644 -D %{SOURCE3} %{buildroot}%{_unitdir}/%{vgauthdaemon}.service # upstream %post -if [ -f %{_bindir}/vmware-guestproxycerttool ]; then - mkdir -p %{_sysconfdir}/vmware-tools/GuestProxyData/server - mkdir -p -m 0700 %{_sysconfdir}/vmware-tools/GuestProxyData/trusted - %{_bindir}/vmware-guestproxycerttool -g &> /dev/null || /bin/true -fi - +/sbin/ldconfig # Setup mount point for Shared Folders # NOTE: Use systemd-detect-virt to detect VMware platform because # vmware-checkvm might misbehave on non-VMware platforms. @@ -217,13 +211,25 @@ if [ -f %{_bindir}/vmware-checkvm -a \ mkdir -p /mnt/hgfs fi -/sbin/ldconfig -%systemd_post %{toolsdaemon}-init.service +if [ "$1" = "2" ]; then + # Cleanup GuestProxy certs, relevant for upgrades only + if [ -f %{_bindir}/vmware-guestproxycerttool ]; then + %{_bindir}/vmware-guestproxycerttool -e &> /dev/null || /bin/true + fi + if [ -d /etc/vmware-tools/GuestProxyData ]; then + rm -rf /etc/vmware-tools/GuestProxyData &> /dev/null || /bin/true + fi + + # Cleanup vmtoolsd-init.service in case of upgrades + %{_bindir}/systemctl disable %{toolsdaemon}-init.service &> /dev/null || /bin/true +fi %systemd_post %{vgauthdaemon}.service %systemd_post %{toolsdaemon}.service +%post desktop +%systemd_post run-vmblock\x2dfuse.mount + %preun -%systemd_preun %{toolsdaemon}-init.service %systemd_preun %{toolsdaemon}.service %systemd_preun %{vgauthdaemon}.service @@ -245,22 +251,18 @@ if [ "$1" = "0" -a \ fi fi +%preun desktop +%systemd_preun run-vmblock\x2dfuse.mount + %postun /sbin/ldconfig -%systemd_postun_with_restart %{toolsdaemon}-init.service %systemd_postun_with_restart %{toolsdaemon}.service %systemd_postun_with_restart %{vgauthdaemon}.service -# Cleanup GuestProxy certs if open-vm-tools is being uninstalled -if [ "$1" = "0" ]; then - rm -rf %{_sysconfdir}/vmware-tools/GuestProxyData &> /dev/null || /bin/true -fi - -%post devel -p /sbin/ldconfig -%postun devel -p /sbin/ldconfig +%postun desktop +%systemd_postun run-vmblock\x2dfuse.mount %files -%{!?_licensedir:%global license %%doc} %license COPYING %doc AUTHORS ChangeLog NEWS README %config(noreplace) %{_sysconfdir}/pam.d/* @@ -268,6 +270,8 @@ fi %dir %{_sysconfdir}/vmware-tools/vgauth %dir %{_sysconfdir}/vmware-tools/vgauth/schemas %config(noreplace) %{_sysconfdir}/vmware-tools/*.conf +# Don't expect users to modify example tools.conf file +%config %{_sysconfdir}/vmware-tools/tools.conf.example # Don't expect users to modify VGAuth schema files %config %{_sysconfdir}/vmware-tools/vgauth/schemas/* %{_sysconfdir}/vmware-tools/*-vm-default @@ -278,7 +282,6 @@ fi %{_bindir}/vmhgfs-fuse %{_bindir}/vmtoolsd %{_bindir}/vmware-checkvm -%{_bindir}/vmware-guestproxycerttool %{_bindir}/vmware-hgfsclient %{_bindir}/vmware-namespace-cmd %{_bindir}/vmware-rpctool @@ -298,9 +301,10 @@ fi %{_libdir}/%{name}/plugins/vmsvc/*.so %{_datadir}/%{name}/ %{_udevrulesdir}/99-vmware-scsi-udev.rules -%{_unitdir}/%{toolsdaemon}-init.service %{_unitdir}/%{toolsdaemon}.service %{_unitdir}/%{vgauthdaemon}.service +%{_unitdir}/run-vmblock\x2dfuse.mount +/usr/lib/modules-load.d/open-vm-tools.conf %files desktop %{_sysconfdir}/xdg/autostart/*.desktop @@ -324,6 +328,32 @@ fi %{_bindir}/vmware-vgauth-smoketest %changelog +* Tue Apr 07 2020 Miroslav Rezanina - 11.0.5-3.el7 +- ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch [bz#1818109] +- ovt-Update-copyright-to-reflect-previous-change.patch [bz#1818109] +- Resolves: bz#1818109 + ([ESXi][RHEL7.9]open-vm-tools coverity scan issue) + +* Thu Apr 02 2020 Miroslav Rezanina - 11.0.5-2.el7 +- ovt-Fix-ldconfig-call.patch [bz#1815549] +- ovt-add-appinfo-plugin.patch [bz#1809753] +- Resolves: bz#1809753 + ([ESXi][RHEL7.9]open-vm-tools add appinfo plugin patch) +- Resolves: bz#1815549 + ([ESXi][RHEL7.9]open-vm-tools reports line 1: ?ldconfig: command not found during system installation) + +* Tue Mar 17 2020 Miroslav Rezanina - 11.0.5-1 +- Rebase to 11.0.5 [bz#1806675] +- Resolves: bz#1806675 + ([ESXi][RHEL7.9]Rebase open-vm-tools to 11.0.5 for RHEL 7.9) + +* Mon Nov 04 2019 Miroslav Rezanina - 10.3.10-2 +- ovt-Fix-memory-leaks-in-vix-tools-plugin.patch [bz#1760625] +- ovt-End-VGAuth-impersonation-in-the-case-of-error.patch [bz#1760625] +- ovt-Fix-leaks-in-ListAliases-and-ListMappedAliases-9bc72.patch [bz#1760625] +- Resolves: bz#1760625 + ([ESXi][RHEL7.8]Need to backport some severe memory leak fixes from upstream) + * Thu Aug 22 2019 Miroslav Rezanina - 10.3.10-1 - Rebase to 10.3.10 [bz#1725187] - Resolves: bz#1725187