From ac4f3c0f4ddad04f0be16513357b3f03d6e565ab Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Tue, 11 Dec 2018 16:26:51 -0800 Subject: [PATCH] macOS: Make Wireshark.app drag-installable. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create ChmodBPF installer and uninstaller packages using pkgbuild and productbuild. Place them in Wireshark.app/Resources/Extras. Add a path_helper installer and uninstaller which respectively add and remove /etc/*paths.d/Wireshark. Remove the PackageMaker and utility-launcher assets and build targets. Show a message in the main welcome screen if we don't have capture permissions. Add an link which launches the ChmodBPF installer. Add a "macOS Extras" item to About → Folders. Migrate "Read me first" from RTF to Asciidoctor, which lets us add links and looks like our other documentation. Rename dmg_set_style.scpt to arrange_dmg.applescript and make it plain text. Always run it in osx-dmg.sh. Bug: 6991 Bug: 12593 Bug: 11399 Ping-Bug: 16074 Change-Id: I7b6aa89aae2be522b4141b0d44e8142dec749e90 Reviewed-on: https://code.wireshark.org/review/31047 Petri-Dish: Gerald Combs Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu Reviewed-by: Gerald Combs --- CMakeLists.txt | 148 ++++++++-- docbook/release-notes.adoc | 1 + .../macosx/ChmodBPF/install-distribution.xml | 25 ++ .../install-scripts/postinstall} | 0 .../Wireshark/ChmodBPF}/ChmodBPF | 0 .../org.wireshark.ChmodBPF.plist | 0 .../ChmodBPF/uninstall-distribution.xml | 25 ++ .../ChmodBPF/uninstall-scripts/postinstall | 22 ++ packaging/macosx/Read_me_first.adoc | 72 +++++ packaging/macosx/Read_me_first.rtf.in | 120 -------- packaging/macosx/Scripts/cli-postinstall.sh | 27 -- packaging/macosx/Scripts/cli-preinstall.sh | 18 -- .../macosx/Scripts/wireshark-postinstall.sh | 40 --- .../macosx/Scripts/wireshark-preflight.sh | 16 - .../01wireshark-contents.xml | 1 - .../Wireshark_package.pmdoc/01wireshark.xml | 1 - .../02chmodbpf-contents.xml | 1 - .../Wireshark_package.pmdoc/02chmodbpf.xml | 1 - .../03utility-contents.xml | 1 - .../Wireshark_package.pmdoc/03utility.xml | 36 --- .../Wireshark_package.pmdoc/index.xml.in | 1 - packaging/macosx/arrange_dmg.applescript.in | 43 +++ packaging/macosx/dmg_background.png | Bin 46488 -> 1895 bytes packaging/macosx/dmg_background.svg | 165 +++-------- packaging/macosx/dmg_set_style.scpt | Bin 7968 -> 0 bytes packaging/macosx/osx-dmg.sh.in | 172 +++-------- .../path_helper/install-distribution.xml | 24 ++ .../path_helper/root/etc/manpaths.d/Wireshark | 1 + .../path_helper/root/etc/paths.d/Wireshark | 1 + .../path_helper/uninstall-distribution.xml | 24 ++ .../path_helper/uninstall-scripts/postinstall | 8 + packaging/macosx/root.ds_store | Bin 15364 -> 0 bytes packaging/macosx/util.ds_store | Bin 6148 -> 0 bytes packaging/macosx/util_background.png | Bin 47033 -> 0 bytes packaging/macosx/util_background.svg | 273 ------------------ packaging/macosx/utility-launcher/wireshark | 23 -- ui/qt/about_dialog.cpp | 7 + ui/qt/interface_frame.cpp | 161 +++++++---- ui/qt/interface_frame.h | 7 +- ui/qt/interface_frame.ui | 17 +- 40 files changed, 575 insertions(+), 907 deletions(-) create mode 100644 packaging/macosx/ChmodBPF/install-distribution.xml rename packaging/macosx/{Scripts/chmodbpf-postinstall.sh => ChmodBPF/install-scripts/postinstall} (100%) rename packaging/macosx/ChmodBPF/{ => root/Library/Application Support/Wireshark/ChmodBPF}/ChmodBPF (100%) rename packaging/macosx/ChmodBPF/{ => root/Library/LaunchDaemons}/org.wireshark.ChmodBPF.plist (100%) create mode 100644 packaging/macosx/ChmodBPF/uninstall-distribution.xml create mode 100755 packaging/macosx/ChmodBPF/uninstall-scripts/postinstall create mode 100644 packaging/macosx/Read_me_first.adoc delete mode 100644 packaging/macosx/Read_me_first.rtf.in delete mode 100755 packaging/macosx/Scripts/cli-postinstall.sh delete mode 100755 packaging/macosx/Scripts/cli-preinstall.sh delete mode 100755 packaging/macosx/Scripts/wireshark-postinstall.sh delete mode 100755 packaging/macosx/Scripts/wireshark-preflight.sh delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/01wireshark-contents.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/01wireshark.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/02chmodbpf-contents.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/02chmodbpf.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/03utility-contents.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/03utility.xml delete mode 100644 packaging/macosx/Wireshark_package.pmdoc/index.xml.in create mode 100644 packaging/macosx/arrange_dmg.applescript.in delete mode 100755 packaging/macosx/dmg_set_style.scpt create mode 100644 packaging/macosx/path_helper/install-distribution.xml create mode 100644 packaging/macosx/path_helper/root/etc/manpaths.d/Wireshark create mode 100644 packaging/macosx/path_helper/root/etc/paths.d/Wireshark create mode 100644 packaging/macosx/path_helper/uninstall-distribution.xml create mode 100755 packaging/macosx/path_helper/uninstall-scripts/postinstall delete mode 100644 packaging/macosx/root.ds_store delete mode 100644 packaging/macosx/util.ds_store delete mode 100644 packaging/macosx/util_background.png delete mode 100644 packaging/macosx/util_background.svg delete mode 100755 packaging/macosx/utility-launcher/wireshark diff --git a/CMakeLists.txt b/CMakeLists.txt index faa463d0c6..5ee6e53a7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1193,6 +1193,8 @@ endif() # Windows version updates ws_find_package(WINSPARKLE ENABLE_WINSPARKLE HAVE_SOFTWARE_UPDATE) +find_package( Asciidoctor 1.5 ) + find_package(POD REQUIRED) find_package(DOXYGEN) @@ -1552,10 +1554,9 @@ set(CFG_OUT_FILES image/wiretap.rc image/wireshark.exe.manifest packaging/macosx/Info.plist + packaging/macosx/arrange_dmg.applescript packaging/macosx/osx-app.sh packaging/macosx/osx-dmg.sh - packaging/macosx/Read_me_first.rtf - packaging/macosx/Wireshark_package.pmdoc/index.xml packaging/source/git-export-release.sh wireshark.pc ) @@ -2764,6 +2765,109 @@ if (MAXMINDDB_FOUND) endif() if(ENABLE_APPLICATION_BUNDLE) + set (install_chmodbpf_component_pkg "${CMAKE_BINARY_DIR}/install.ChmodBPF.pkg") + add_custom_command(OUTPUT "${install_chmodbpf_component_pkg}" + COMMAND pkgbuild + --identifier org.wireshark.ChmodBPF.pkg + --version 1.1 + --root "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/root" + --scripts "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/install-scripts" + ${install_chmodbpf_component_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/root/Library/Application Support/Wireshark/ChmodBPF/ChmodBPF" + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/root/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist" + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/install-scripts/postinstall" + ) + set (install_chmodbpf_pkg "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/Extras/Install ChmodBPF.pkg") + add_custom_command(OUTPUT "${install_chmodbpf_pkg}" + COMMAND productbuild + --identifier org.wireshark.install.ChmodBPF.product + --version 1.1 + --distribution "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/install-distribution.xml" + --package-path "${CMAKE_BINARY_DIR}" + ${install_chmodbpf_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/install-distribution.xml" + ${install_chmodbpf_component_pkg} + ) + + set (uninstall_chmodbpf_component_pkg "${CMAKE_BINARY_DIR}/uninstall.ChmodBPF.pkg") + add_custom_command(OUTPUT "${uninstall_chmodbpf_component_pkg}" + COMMAND pkgbuild + --identifier org.wireshark.uninstall.ChmodBPF.pkg + --version 1.1 + --nopayload + --scripts "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/uninstall-scripts" + ${uninstall_chmodbpf_component_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/uninstall-scripts/postinstall" + ) + set (uninstall_chmodbpf_pkg "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/Extras/Uninstall ChmodBPF.pkg") + add_custom_command(OUTPUT "${uninstall_chmodbpf_pkg}" + COMMAND productbuild + --identifier org.wireshark.uninstall.ChmodBPF.product + --version 1.1 + --distribution "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/uninstall-distribution.xml" + --package-path "${CMAKE_BINARY_DIR}" + ${uninstall_chmodbpf_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF/uninstall-distribution.xml" + ${uninstall_chmodbpf_component_pkg} + ) + + add_custom_target(chmodbpf DEPENDS ${install_chmodbpf_pkg} ${uninstall_chmodbpf_pkg}) + + set (install_path_helper_component_pkg "${CMAKE_BINARY_DIR}/install.path_helper.pkg") + add_custom_command(OUTPUT "${install_path_helper_component_pkg}" + COMMAND pkgbuild + --identifier org.wireshark.path_helper.pkg + --version 1.0 + --root "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/root/etc" + --install-location /private/etc + ${install_path_helper_component_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/root/etc/paths.d/Wireshark" + "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/root/etc/manpaths.d/Wireshark" + ) + set (install_path_helper_pkg "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/Extras/Add Wireshark to the system path.pkg") + add_custom_command(OUTPUT "${install_path_helper_pkg}" + COMMAND productbuild + --identifier org.wireshark.install.path_helper.product + --version 1.0 + --distribution "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/install-distribution.xml" + --package-path "${CMAKE_BINARY_DIR}" + ${install_path_helper_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/install-distribution.xml" + ${install_path_helper_component_pkg} + ) + + set (uninstall_path_helper_component_pkg "${CMAKE_BINARY_DIR}/uninstall.path_helper.pkg") + add_custom_command(OUTPUT "${uninstall_path_helper_component_pkg}" + COMMAND pkgbuild + --identifier org.wireshark.uninstall.path_helper.pkg + --version 1.0 + --nopayload + --scripts "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/uninstall-scripts" + ${uninstall_path_helper_component_pkg} + DEPENDS + "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/uninstall-scripts/postinstall" + ) + set (uninstall_path_helper_pkg "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/Extras/Remove Wireshark from the system path.pkg") + add_custom_command(OUTPUT "${uninstall_path_helper_pkg}" + COMMAND productbuild + --identifier org.wireshark.uninstall.path_helper.product + --version 1.0 + --distribution "${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/uninstall-distribution.xml" + --package-path "${CMAKE_BINARY_DIR}" + ${uninstall_path_helper_pkg} + DEPENDS + ${CMAKE_SOURCE_DIR}/packaging/macosx/path_helper/uninstall-distribution.xml + ${uninstall_path_helper_component_pkg} + ) + + add_custom_target(path_helper DEPENDS ${install_path_helper_pkg} ${uninstall_path_helper_pkg}) + add_custom_target(app_bundle) set_target_properties(app_bundle PROPERTIES FOLDER "Copy Tasks") add_custom_command(TARGET app_bundle @@ -2771,37 +2875,31 @@ if(ENABLE_APPLICATION_BUNDLE) COMMAND "${CMAKE_BINARY_DIR}/packaging/macosx/osx-app.sh" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/run" ) - add_dependencies(app_bundle ${PROGLIST}) + add_dependencies(app_bundle ${PROGLIST} chmodbpf path_helper) add_custom_target(dmg_package_prep DEPENDS app_bundle) - ADD_CUSTOM_COMMAND( - OUTPUT ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo - COMMAND ${CMAKE_COMMAND} -E echo APPLWshk > ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo - ) + if( ASCIIDOCTOR_FOUND ) + ADD_CUSTOM_COMMAND( + OUTPUT + packaging/macosx/Read_me_first.html + COMMAND ${ASCIIDOCTOR_EXECUTABLE} + --backend html + --out-file packaging/macosx/Read_me_first.html + --attribute include-dir=${CMAKE_SOURCE_DIR}/docbook + --attribute min-macos-version=${MIN_MACOS_VERSION} + ${CMAKE_CURRENT_SOURCE_DIR}/packaging/macosx/Read_me_first.adoc + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/packaging/macosx/Read_me_first.adoc + ) + add_custom_target(read_me_first_html DEPENDS packaging/macosx/Read_me_first.html ) + add_dependencies(dmg_package_prep read_me_first_html) + endif() ADD_CUSTOM_TARGET( dmg_package - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF - ${CMAKE_BINARY_DIR}/run/ChmodBPF - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_SOURCE_DIR}/packaging/macosx/Scripts - ${CMAKE_BINARY_DIR}/run/Scripts - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_SOURCE_DIR}/packaging/macosx/utility-launcher - ${CMAKE_BINARY_DIR}/run/utility-launcher COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/COPYING ${CMAKE_BINARY_DIR}/run/COPYING.txt - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_SOURCE_DIR}/packaging/macosx/Wireshark_package.pmdoc - ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_BINARY_DIR}/packaging/macosx/Wireshark_package.pmdoc/index.xml - ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc/index.xml - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_SOURCE_DIR}/packaging/macosx/dmg_background.png - ${CMAKE_BINARY_DIR}/run/dmg_background.png COMMAND bash -x ${CMAKE_BINARY_DIR}/packaging/macosx/osx-dmg.sh --source-directory ${CMAKE_SOURCE_DIR}/packaging/macosx # Unlike nsis_package_prep + nsis_package, we can add a direct diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc index 921d00252b..255b7a41d1 100644 --- a/docbook/release-notes.adoc +++ b/docbook/release-notes.adoc @@ -36,6 +36,7 @@ since version 3.1.0: * You can once again mark and unmark packets using the middle mouse button. This feature went missing around 2009 or so. +* On macOS, Wireshark can now be installed by dropping it onto the Applications folder. The following features are new (or have been significantly updated) since version 3.0.0: diff --git a/packaging/macosx/ChmodBPF/install-distribution.xml b/packaging/macosx/ChmodBPF/install-distribution.xml new file mode 100644 index 0000000000..87f1e5c505 --- /dev/null +++ b/packaging/macosx/ChmodBPF/install-distribution.xml @@ -0,0 +1,25 @@ + + + + ChmodBPF +
+

This package will install the ChmodBPF launch daemon, create the access_bpf group, and add you to that group.

]]>
+ + + + + + + + + + + + + install.ChmodBPF.pkg +
diff --git a/packaging/macosx/Scripts/chmodbpf-postinstall.sh b/packaging/macosx/ChmodBPF/install-scripts/postinstall similarity index 100% rename from packaging/macosx/Scripts/chmodbpf-postinstall.sh rename to packaging/macosx/ChmodBPF/install-scripts/postinstall diff --git a/packaging/macosx/ChmodBPF/ChmodBPF b/packaging/macosx/ChmodBPF/root/Library/Application Support/Wireshark/ChmodBPF/ChmodBPF similarity index 100% rename from packaging/macosx/ChmodBPF/ChmodBPF rename to packaging/macosx/ChmodBPF/root/Library/Application Support/Wireshark/ChmodBPF/ChmodBPF diff --git a/packaging/macosx/ChmodBPF/org.wireshark.ChmodBPF.plist b/packaging/macosx/ChmodBPF/root/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist similarity index 100% rename from packaging/macosx/ChmodBPF/org.wireshark.ChmodBPF.plist rename to packaging/macosx/ChmodBPF/root/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist diff --git a/packaging/macosx/ChmodBPF/uninstall-distribution.xml b/packaging/macosx/ChmodBPF/uninstall-distribution.xml new file mode 100644 index 0000000000..c89b7c1ec3 --- /dev/null +++ b/packaging/macosx/ChmodBPF/uninstall-distribution.xml @@ -0,0 +1,25 @@ + + + + Uninstall ChmodBPF +
+

This package will uninstall the ChmodBPF launch daemon and remove the access_bpf group.

]]>
+ + + + + + + + + + + + + uninstall.ChmodBPF.pkg +
diff --git a/packaging/macosx/ChmodBPF/uninstall-scripts/postinstall b/packaging/macosx/ChmodBPF/uninstall-scripts/postinstall new file mode 100755 index 0000000000..f9723c88b4 --- /dev/null +++ b/packaging/macosx/ChmodBPF/uninstall-scripts/postinstall @@ -0,0 +1,22 @@ +#!/bin/sh + +# +# Remove the following: +# - The ChmmodBPF launch daemon +# - The ChmmodBPF script +# - The access_bpf group +# + +CHMOD_BPF_PLIST="/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist" +BPF_GROUP="access_bpf" + +launchctl unload -F "$CHMOD_BPF_PLIST" + +dscl . -read /Groups/"$BPF_GROUP" > /dev/null 2>&1 && \ + dseditgroup -q -o delete "$BPF_GROUP" + +rm -rf "/Library/Application Support/Wireshark" + +rm -f "$CHMOD_BPF_PLIST" + +rm -rf /Library/StartupItems/ChmodBPF diff --git a/packaging/macosx/Read_me_first.adoc b/packaging/macosx/Read_me_first.adoc new file mode 100644 index 0000000000..b967cfe25b --- /dev/null +++ b/packaging/macosx/Read_me_first.adoc @@ -0,0 +1,72 @@ +// Required attributes: +// include-dir +// min-macos-version + +include::{include-dir}/attributes.adoc[] +:stylesheet: {include-dir}/ws.css + += Before You Begin + +This release of Wireshark requires macOS {min-macos-version} or later. +If you are running an earlier version of macOS you can install using another packaging system such as Homebrew or MacPorts. + +== Quick Setup + +To install Wireshark, drag the _Wireshark_ application bundle to the _Applications_ folder. + +In order to be able to capture packets, install the +link:Wireshark.app/Contents/Resources/Extras/Install%20ChmodBPF.pkg[Install ChmodBPF] +package. + +If you would like to add the path to +https://www.wireshark.org/docs/man-pages/wireshark.html[Wireshark], +https://www.wireshark.org/docs/man-pages/tshark.html[TShark], +https://www.wireshark.org/docs/man-pages/capinfos.html[capinfos], +https://www.wireshark.org/docs/man-pages/editcap.html[editcap], +and +https://www.wireshark.org/docs/man-pages/[other command line utilities] +to the system PATH, install the +link:Wireshark.app/Contents/Resources/Extras/Add%20Wireshark%20to%20the%20system%20path.pkg[Add Wireshark to the system path] +package. + +== Package Installation Details + +The ChmodBPF installer writes to the following locations: + +* _/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist_. A launch daemon that adjusts permissions on the system's packet capture devices (/dev/bpf*) when the system starts up. +* _/Library/Application Support/Wireshark/ChmodBPF_. A copy of the launch daemon property list, and the script that the launch daemon runs. + +The installer group named “access_bpf” is created. The user who opened the package is added to the group. + +The system path installer writes to the following locations: + +* _/etc/paths.d/Wireshark_. The folder name in this file is automatically added to PATH +* _/etc/manpaths.d/Wireshark_. The folder name in this file is used by the man command. + +It assumes that Wireshark is installed in _/Applications_. + +== Uninstalling + +To uninstall Wireshark, do the following: + +. Remove _/Applications/Wireshark.app_ +. Remove _/Library/Application Support/Wireshark_ + +You can uninstall ChmodBPF via the +link:Wireshark.app/Contents/Resources/Extras/Uninstall%20ChmodBPF.pkg[Uninstall ChmodBPF] +package, which is available on this disk or via menu:Wireshark[About Wireshark,Folders,macOS Extras]. +You can also uninstall it manually by doing the following: + +. Unload the “org.wireshark.ChmodBPF.plist” launchd job +. Remove _/Library/LaunchDaemons/org.wireshark.ChmodBPF.plist_ +. Remove the “access_bpf” group. + +You can uninstall the system path components via the +link:Wireshark.app/Contents/Resources/Extras/Remove%20Wireshark%20from%20the%20system%20path.pkg[Remove Wireshark from the system path] +package, which is available on this disk or via menu:Wireshark[About Wireshark,Folders,macOS Extras]. +You can also uninstall it manually by doing the following: + +. Remove _/etc/paths.d/Wireshark_ +. Remove _/etc/manpaths.d/Wireshark_ + +If you move Wireshark.app the script should automatically find it. If it doesn't you will have to set WIRESHARK_APP_DIR to the path to (and including) Wireshark.app. Automatic discovery might fail if you have multiple copies of Wireshark installed on your system or if Spotlight indexing isn't working properly. diff --git a/packaging/macosx/Read_me_first.rtf.in b/packaging/macosx/Read_me_first.rtf.in deleted file mode 100644 index d6d7885866..0000000000 --- a/packaging/macosx/Read_me_first.rtf.in +++ /dev/null @@ -1,120 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf600 -\cocoascreenfonts1{\fonttbl\f0\froman\fcharset0 TimesNewRomanPSMT;\f1\fswiss\fcharset0 Helvetica;\f2\fnil\fcharset0 Menlo-Regular; -} -{\colortbl;\red255\green255\blue255;\red38\green38\blue38;\red242\green242\blue242;} -{\*\expandedcolortbl;;\cssrgb\c20000\c20000\c20000;\cssrgb\c96078\c96078\c96078;} -{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid1\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid1} -{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} -{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} -{\list\listtemplateid4\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid301\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid4} -{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}} -\margl1440\margr1440\vieww13060\viewh12960\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b\fs28 \cf0 Before You Begin\ -\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f1\b0\fs24 \cf0 This release of Wireshark requires macOS @MIN_MACOS_VERSION@ or later. If you are running an earlier version of macOS you can install using another packaging system such as Homebrew or MacPorts. -\f0\b\fs28 \ -\ -Quick Setup\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\b0\fs24 \cf0 \ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls1\ilvl0 -\f1 \cf0 Simply double-click the Wireshark package. For details about the installation read below.\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b\fs28 \cf0 What changes does the installer make?\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\b0\fs24 \cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f1 \cf0 The installer writes to the following locations:\ -\ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls2\ilvl0\cf0 {\listtext \uc0\u8226 } -\i /Applications/Wireshark.app -\i0 . The main Wireshark application.\ -{\listtext \uc0\u8226 } -\i /Library/LaunchDaemons/org.wireshark.ChmodBPF.plist -\i0 . A launch daemon that adjusts permissions on the system's packet capture devices ( -\i /dev/bpf -\i0 *) when the system starts up.\ -{\listtext \uc0\u8226 } -\i /Library/Application Support/Wireshark/ChmodBPF -\i0 A copy of the launch daemon property list, and the script that the launch daemon runs.\ -{\listtext \uc0\u8226 } -\i /usr/local/bin -\i0 . A wrapper script and symbolic links which will let you run Wireshark and its associated utilities from the command line. You can access them directly or by adding /usr/local/bin to your PATH if it's not already in your PATH.\ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls3\ilvl0\cf0 {\listtext \uc0\u8226 } -\i /etc/paths.d/Wireshark -\i0 . The folder name in this file is automatically added to PATH\ -{\listtext \uc0\u8226 } -\i /etc/manpaths.d/Wireshark -\i0 . The folder name in this file is used by the man command.\ -\pard\tx560\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -Additionally a group named -\i access_bpf -\i0 is created. The user who opened the package is added to the group.\ -\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b\fs28 \cf0 How do I uninstall?\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\b0\fs24 \cf0 \ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls4\ilvl0 -\f1 \cf0 {\listtext 1. }Remove -\i /Applications/Wireshark.app -\i0 \ -{\listtext 2. }Remove -\i /Library/Application Support/Wireshark -\i0 \ -{\listtext 3. }Remove the wrapper scripts from -\i /usr/local/bin -\i0 \ -{\listtext 4. }Unload the -\i org.wireshark.ChmodBPF.plist -\i0 launchd job\ -{\listtext 5. }Remove -\i /Library/LaunchDaemons/org.wireshark.ChmodBPF.plist -\i0 \ -{\listtext 6. }Remove the -\i access_bpf -\i0 group.\ -{\listtext 7. }Remove -\i /etc/paths.d/Wireshark -\i0 \ -{\listtext 8. }Remove -\i /etc/manpaths.d/Wireshark -\i0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b\fs28 \cf0 \ -How does the wrapper script work? What if I move Wireshark.app?\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\b0\fs24 \cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f1 \cf0 The script should find the Wireshark application bundle and run the appropriate executable automatically. It looks for Wireshark.app in the following locations:\ -\ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls5\ilvl0\cf0 {\listtext \uc0\u8226 }The path set in the WIRESHARK_APP_DIR environment variable\ -{\listtext \uc0\u8226 }/Applications/Wireshark.app\ -{\listtext \uc0\u8226 }The first path returned by -\f2 mdfind "kMDItemCFBundleIdentifier == 'org.wireshark.Wireshark'" -\f1 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -If you move Wireshark.app the script should automatically find it. If it doesn't you will have to set WIRESHARK_APP_DIR to the path to (and including) Wireshark.app. Automatic discovery might fail if you have multiple copies of Wireshark installed on your system or if Spotlight indexing isn't working properly.} diff --git a/packaging/macosx/Scripts/cli-postinstall.sh b/packaging/macosx/Scripts/cli-postinstall.sh deleted file mode 100755 index 1ecc05a390..0000000000 --- a/packaging/macosx/Scripts/cli-postinstall.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -CLI_PATH="$2" -BINARIES=" - capinfos - captype - dftest - dumpcap - editcap - mergecap - mmdbresolve - randpkt - rawshark - reordercap - text2pcap - tshark -" - -cd "$CLI_PATH" - -chmod 755 wireshark -chown root:wheel wireshark - -for BIN in $BINARIES ; do - rm -f ./"$BIN" - ln -sn ./wireshark "$BIN" -done diff --git a/packaging/macosx/Scripts/cli-preinstall.sh b/packaging/macosx/Scripts/cli-preinstall.sh deleted file mode 100755 index a8d928cae0..0000000000 --- a/packaging/macosx/Scripts/cli-preinstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# Create any missing directories with mode 755, owned by root:wheel. -# Don't blindly clobber anything that's already there. -function build_path() -{ - echo "Checking $1" - if [ ! -d "$1" ] ; then - TRIMMED=`dirname "$1"` - if [ ! -d "$TRIMMED" ] ; then - build_path "$TRIMMED" - fi - install -v -o root -g wheel -m 0755 -d "$1" - fi - -} - -build_path "$2" diff --git a/packaging/macosx/Scripts/wireshark-postinstall.sh b/packaging/macosx/Scripts/wireshark-postinstall.sh deleted file mode 100755 index 6b3578a580..0000000000 --- a/packaging/macosx/Scripts/wireshark-postinstall.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# Setting PATH -# if /etc/paths.d/Wireshark already exists we overwrite it. -# -WSPATH="$2/Wireshark.app/Contents/MacOS" - -if [ ! -d /etc/paths.d ] -then - mkdir -m u=rwx,g=rx,o=rx /etc/paths.d -fi -echo $WSPATH > /etc/paths.d/Wireshark - -# Setting MANPATH -# if /etc/manpaths.d/Wireshark already exists we overwrite it. -# -WSMANPATH="$2/Wireshark.app/Contents/Resources/share/man" - -if [ ! -d /etc/manpaths.d ] -then - mkdir -m u=rwx,g=rx,o=rx /etc/manpaths.d -fi -echo $WSMANPATH > /etc/manpaths.d/Wireshark - -# -# If we still have the old XQuartz fixer, get rid of it; we don't use -# X11, and haven't used it since Wireshark 2.0, so we don't need it. -# -XQUARTZ_FIXER_PLIST="/Library/LaunchDaemons/org.wireshark.XQuartzFixer.plist" -if [ -e "$XQUARTZ_FIXER_PLIST" ] -then - launchctl unload "$XQUARTZ_FIXER_PLIST" - rm -rf "/Library/Application Support/Wireshark/XQuartzFixer" - rm -f "$XQUARTZ_FIXER_PLIST" -fi - -# -# And get rid of the *really* old XQuartz fixer while we're at it. -# -rm -rf /Library/StartupItems/XQuartzFixer diff --git a/packaging/macosx/Scripts/wireshark-preflight.sh b/packaging/macosx/Scripts/wireshark-preflight.sh deleted file mode 100755 index bee0b2e8e0..0000000000 --- a/packaging/macosx/Scripts/wireshark-preflight.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# -# If we're upgrading, remove the old Wireshark.app before installing -# the new one so that we don't try to load old, incompatible libraries, -# plugins, codes, or other code. -# - -OLD_APP="$2/Wireshark.app" - -# This is the wrong way to go about ensuring that our installation is -# deterministic. -# https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=16050 -#if [ -d "$OLD_APP" ] ; then -# rm -rf "$OLD_APP" -#fi diff --git a/packaging/macosx/Wireshark_package.pmdoc/01wireshark-contents.xml b/packaging/macosx/Wireshark_package.pmdoc/01wireshark-contents.xml deleted file mode 100644 index bc1e5a791f..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/01wireshark-contents.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packaging/macosx/Wireshark_package.pmdoc/01wireshark.xml b/packaging/macosx/Wireshark_package.pmdoc/01wireshark.xml deleted file mode 100644 index 149eed4693..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/01wireshark.xml +++ /dev/null @@ -1 +0,0 @@ -org.wireshark.Wireshark.pkg0.0.0.0Wireshark.app/ApplicationsallowRevertscripts.scriptsDirectoryPath.isAbsoluteTypescripts.scriptsDirectoryPath.isRelativeTypeinstallToscripts.postinstall.pathinstallFrom.isRelativeTypeincludeRootscripts.postinstall.isRelativeTypeversionparentscripts.scriptsDirectoryPath.pathidentifierrelocatablerequireAuthorizationextraFilespostInstallScripts/wireshark-preflight.shScripts/wireshark-postinstall.shScripts diff --git a/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf-contents.xml b/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf-contents.xml deleted file mode 100644 index bc1e5a791f..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf-contents.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf.xml b/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf.xml deleted file mode 100644 index 449030b0aa..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/02chmodbpf.xml +++ /dev/null @@ -1 +0,0 @@ -org.wireshark.ChmodBPF.pkg1.0ChmodBPF/Library/Application Support/WiresharkinstallToscripts.postinstall.pathincludeRootinstallFrom.isRelativeTypeversionparentscripts.scriptsDirectoryPath.pathrequireAuthorizationidentifierextraFilesinstallTo.pathpostInstallScripts/chmodbpf-postinstall.shScripts diff --git a/packaging/macosx/Wireshark_package.pmdoc/03utility-contents.xml b/packaging/macosx/Wireshark_package.pmdoc/03utility-contents.xml deleted file mode 100644 index 12280192bf..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/03utility-contents.xml +++ /dev/null @@ -1 +0,0 @@ -groupowner diff --git a/packaging/macosx/Wireshark_package.pmdoc/03utility.xml b/packaging/macosx/Wireshark_package.pmdoc/03utility.xml deleted file mode 100644 index c1779adcee..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/03utility.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - org.wireshark.cli.pkg - 1.0 - - - - utility-launcher - /usr/local/bin - - - - - installTo - relocatable - scripts.scriptsDirectoryPath.isRelativeType - identifier - parent - installTo.path - installFrom.isRelativeType - scripts.postinstall.isRelativeType - - - Scripts/cli-preinstall.sh - Scripts/cli-postinstall.sh - Scripts - - - 03utility-contents.xml - /CVS$ - /\.svn$ - /\.cvsignore$ - /\.cvspass$ - /\.DS_Store$ - - diff --git a/packaging/macosx/Wireshark_package.pmdoc/index.xml.in b/packaging/macosx/Wireshark_package.pmdoc/index.xml.in deleted file mode 100644 index b45f91d6e6..0000000000 --- a/packaging/macosx/Wireshark_package.pmdoc/index.xml.in +++ /dev/null @@ -1 +0,0 @@ -WiresharkWireshark.pkgorg.wiresharkWireshark and associated command line utilities.COPYING.txtFailureThis package requires macOS @MIN_MACOS_VERSION@ or later. If you cannot upgrade you might try installing using MacPorts or Fink.01wireshark.xml02chmodbpf.xml03utility.xmldescriptionproperties.titleproperties.anywhereDomainproperties.userDomainproperties.customizeOptionextraFilespostinstallActions.actionsproperties.systemDomain diff --git a/packaging/macosx/arrange_dmg.applescript.in b/packaging/macosx/arrange_dmg.applescript.in new file mode 100644 index 0000000000..89d745f892 --- /dev/null +++ b/packaging/macosx/arrange_dmg.applescript.in @@ -0,0 +1,43 @@ +(* +This AppleScript customizes the appearance of the +disk image in which Wireshark is bundled on macOS + + Author: + Jean-Olivier Irisson + +Modified by: + Gerald Combs + + Copyright 2006 + Licensed under GNU General Public License +*) + + +tell application "Finder" + tell disk "Wireshark @VERSION@" + open + tell container window + set current view to icon view + set toolbar visible to false + set statusbar visible to false + set the bounds to {600, 200, 950, 725} + end tell + set iv_opts to the icon view options of container window + set background picture of iv_opts to POSIX file "/Volumes/Wireshark @VERSION@/.assets/dmg_background.png" + tell iv_opts + set icon size to 72 + set arrangement to not arranged + end tell + set position of application file "Wireshark.app" to {80, 64} + set position of alias file "Applications" to {240, 64} + set position of file "Read me first.html" to {160, 170} + set position of alias file "Install ChmodBPF.pkg" to {80, 276} + set position of alias file "Uninstall ChmodBPF.pkg" to {250, 276} + set position of alias file "Add Wireshark to the system path.pkg" to {80, 382} + set position of alias file "Remove Wireshark from the system path.pkg" to {250, 382} + update without registering applications + end tell + + --give the finder some time to write the .DS_Store file + delay 7 +end tell diff --git a/packaging/macosx/dmg_background.png b/packaging/macosx/dmg_background.png index bf5a44a7d0c4036b5cfd0d204e352295d3e176bd..134326f031ed210a193bde211ca5c74e2a75269c 100644 GIT binary patch literal 1895 zcmeHH=~EL26ptM|0IkyzgC;7r){$xm9t1o<)P~3BCunCYuf&>DU%7UUIVnRG1B3HWsBE|)c8XMaGpwo~2&AfT%yldvYGeH6Sm)Kxz zP$<+AA8+D86lxyMLi|MwEEWfs)V&sF#ogyaUSz?^MMr~yKIi;p^8ga zSd1%Eyyz(*oMS2ch-4Ou&*$S~64+cIB9VpXBuAA@xnoeM1tUJhz2xJilLHUWl~Yzj z)6VmKYrH`6Ji*n2M1Kq+IxjnkyAZZD&kjK}ZfZ|!+CE-!iaNX_uCFV|h>Ua7LQ^RMyh)L~_x4%G~q;q&mX z*0MTqhU^?zz>`dKPaez0XnHOjYVa$wc%G7Kz8|V(=g)dAr|G&>+d3O;OCzR^d47nl#8-GuJVkb{DPaJFQsa?esI)QYz1iPsbP}eM%(YZDP ziql3hrgKfc%h{nn*E0k*B1oD$>q2_S0tQ;zcYZM_<>{d5#rc0SS7Ct{6%fq2=!eDr zu@JNFbxZIB8Hn4}^1WU`8d?=zfEZ%K0hh8O9)tI>$?!Sr<_ma%~wle*e^zvtj zf5&y>)tNW*}gQ9R!bs14Q?}_meu@2GI$OXD%nKprLKccdc5-hm3MCGa1h|inX|f z;8FrLZ^M}T@5Kk{p?Pv)p`nlzb9l#ilZQ}hD2DFGX&e>3D?XUD+C)#uTD>$ za+RY(zv+aqp=W@aQ*vrk z`ydPmo571s&8DGjafZ4I+n9$>R+xej7n=!t(YyR3w&Ymq z6^~85YZf{97c}hnD$~h+MiuLbQw*mJQ%|Sy$?+XEFjFY_tk54tM$unLg@?T(lB8?c zE##K_3%zjMYt!XAyWtTj>~~;Wz~3YD6iLU8gNiTK-B{t1X7)9)fvPKCD(b7@#R|Gc27c%=+LKc(aa=COxW$Y5C1>@+YP*Ln|3(h WZg>oBUHoh=vyWE*v2Ndy?7sj~=Lf<7 literal 46488 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 + + inkscape:export-filename="/tmp/dmg_background.png" + inkscape:export-xdpi="72" + inkscape:export-ydpi="72"> - - - - - - - - - - + + inkscape:window-x="0" + inkscape:window-y="877" + showgrid="false" + inkscape:window-maximized="0" + inkscape:pagecheckerboard="true" /> @@ -191,13 +154,15 @@ image/svg+xml + + id="layer1" + transform="translate(0,150)"> - - - - WIRESHARK - - - - - ® - - - + >>> diff --git a/packaging/macosx/dmg_set_style.scpt b/packaging/macosx/dmg_set_style.scpt deleted file mode 100755 index a5e17b776a14455af255f5a5a5b6ffda1415ffad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7968 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 diff --git a/packaging/macosx/osx-dmg.sh.in b/packaging/macosx/osx-dmg.sh.in index e13d99eb91..39db2f256b 100755 --- a/packaging/macosx/osx-dmg.sh.in +++ b/packaging/macosx/osx-dmg.sh.in @@ -34,55 +34,20 @@ # to be commited to the repository when this is done. # -# Defaults -set_ds_store=false -ds_store_root="root.ds_store" -app_bundle="Wireshark.app" -rw_name="RWwireshark.dmg" -volume_name="Wireshark" -src_dir="." -tmp_dir="/tmp/dmg-$$" -auto_open_opt= -packagemaker=$( type -p packagemaker || type -p PackageMaker ) - -if [ -z "$packagemaker" ] ; then - if [ -f /Applications/Xcode.app/Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker ] - then - # - # Xcode 4 and later, with the "Auxiliary Tools for Xcode" - # download from developer.apple.com. (There are no such - # downloads for Mavericks or later, but PackageMaker from - # the Late July 2012 download for Mountain Lion appears to - # work on Yosemite.) - # - packagemaker=/Applications/Xcode.app//Contents/Applications/PackageMaker.app/Contents/MacOS/PackageMaker - elif [ -f /Applications/Xcode.app/Developer/Tools/packagemaker ] - then - packagemaker=/Applications/Xcode.app/Developer/Tools/packagemaker - elif [ -f /Applications/Xcode.app/Developer/usr/bin/packagemaker ] - then - packagemaker=/Applications/Xcode.app/Developer/usr/bin/packagemaker - elif [ -f /Developer/Tools/packagemaker ] - then - packagemaker=/Developer/Tools/packagemaker - elif [ -f /Developer/usr/bin/packagemaker ] - then - packagemaker=/Developer/usr/bin/packagemaker - elif [ -f /usr/bin/packagemaker ] - then - packagemaker=/usr/bin/packagemaker - elif [ -f /usr/local/bin/packagemaker ] - then - packagemaker=/usr/local/bin/packagemaker - fi -fi - -if [ -z "$packagemaker" ] -then - echo "$0: couldn't find PackageMaker" 1>&2 +# Set during configuration +version="@VERSION@" +if [ -z "$version" ] ; then + echo "VERSION not set" exit 1 fi +# Defaults +app_bundle="Wireshark.app" +rw_name="RWwireshark $version.dmg" +volume_name="Wireshark $version" +src_dir="." +tmp_dir="/tmp/dmg-$$" + # Help message #---------------------------------------------------------- help() @@ -96,14 +61,15 @@ USAGE OPTIONS -h,--help Display this help message. - -s - Set a new apperance (do not actually create a bundle). -b,--app-bundle Set the path to the Wireshark.app that should be copied in the dmg. -S,--source-directory If this is an out-of-tree build, set this to the path to the packaging/macosx source directory. + +Icons are positioned and the background image is set in +arrange_dmg.applescript. " } @@ -114,8 +80,6 @@ do -h|--help) help exit 0 ;; - -s) - set_ds_store=true ;; -b|--app-bundle) app_bundle="$2" shift 1 ;; @@ -129,7 +93,6 @@ do shift 1 done - # Safety checks if [ ! -e "$app_bundle" ]; then echo "Cannot find application bundle: $app_bundle" @@ -151,46 +114,7 @@ case $( file "$ws_bin" ) in exit 1 ;; esac - -# Set the version -version="@VERSION@" -if [ -z "$version" ] ; then - echo "VERSION not set" - exit 1 -fi - -echo -e "\\nCREATE WIRESHARK PACKAGE\\n" -pkg_title="$volume_name $version $architecture" -pkg_file="$pkg_title.pkg" -rm -rf "$pkg_file" -$packagemaker --doc "Wireshark_package.pmdoc" \ - --title "$pkg_title" \ - --id "org.wireshark.pkg.Wireshark" \ - --version "$version" \ - --target @MIN_MACOS_VERSION@ \ - --verbose || exit 1 - -if [ -n "$CODE_SIGN_IDENTITY" ] ; then - pkg_file_unsigned="$pkg_title UNSIGNED.pkg" - - echo -e "Signing $pkg_file" - mv "$pkg_file" "$pkg_file_unsigned" || exit 1 - productsign \ - --sign "Developer ID Installer: $CODE_SIGN_IDENTITY" \ - --timestamp \ - "$pkg_file_unsigned" "$pkg_file" || exit 1 - # TN2206, "Checking Gatekeeper Conformance" - spctl --assess --type install "$pkg_file" || exit 1 - pkgutil --check-signature "$pkg_file" || exit 1 - shasum "$pkg_file" - shasum -a 256 "$pkg_file" - rm -rf "$pkg_file_unsigned" -else - echo "Code signing not performed (no identity)" -fi - -# To do: Notarize our package. -# https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow?language=objc +pkg_title="$volume_name $architecture" echo -e "\\nCREATE WIRESHARK DISK IMAGE\\n" img_name="$pkg_title.dmg" @@ -200,20 +124,19 @@ rm -rf "$tmp_dir" mkdir "$tmp_dir" || exit 1 echo -e "Copying files to temp directory" -# Copy the installer package -cp "$pkg_file" "$tmp_dir"/ || exit 1 -# Copy the readme -cp "../packaging/macosx/Read_me_first.rtf" "$tmp_dir/Read me first.rtf" || exit 1 +# Copy the application bundle +cp -r "$app_bundle" "$tmp_dir"/ || exit 1 +ln -sn "/Applications" "$tmp_dir"/ -# If the appearance settings are not to be modified we just copy them -if [ ${set_ds_store} = "false" ]; then - # Copy the .DS_Store file which contains information about - # window size, appearance, etc. Most of this can be set - # with Apple script but involves user intervention so we - # just keep a copy of the correct settings and use that instead. - cp "$src_dir/$ds_store_root" "$tmp_dir/.DS_Store" || exit 1 - auto_open_opt=-noautoopen -fi +# Copy the readme +cp "../packaging/macosx/Read_me_first.html" "$tmp_dir/Read me first.html" || exit 1 + +# Copy the background image +mkdir "$tmp_dir/.assets" || exit 1 +cp "$src_dir/dmg_background.png" "$tmp_dir/.assets/" || exit 1 + +# Create top-level package symlinks +ln -sn "$app_bundle/Contents/Resources/Extras/"*.pkg "$tmp_dir/" # Create a new RW image from the temp directory. echo -e "Creating a temporary disk image" @@ -225,47 +148,20 @@ rm -rf "$tmp_dir" # Mount the created image. #MOUNT_DIR="/Volumes/$volume_name" -DEV_NAME=$( /usr/bin/hdiutil attach -readwrite -noverify $auto_open_opt "$rw_name" | grep -E '^/dev/' | sed 1q | awk '{print $1}' ) +DEV_NAME=$( /usr/bin/hdiutil attach -readwrite -noverify -noautoopen "$rw_name" | grep -E '^/dev/' | sed 1q | awk '{print $1}' ) + +# Set icon positions and background image +# Work around 'Finder got an error: Can’t get disk "Wireshark 3.1.1". (-1728)' +sleep 5 +osascript ../packaging/macosx/arrange_dmg.applescript || exit 1 # Have the disk image window open automatically when mounted. -bless -openfolder /Volumes/$volume_name +bless -openfolder "/Volumes/$volume_name" # `hdiutil detach` sometimes fails with "Resource busy", possibly due to Spotlight. # Give it a chance to finish up here and pass `-force` to hdiutil below. sleep 5 -# In case the apperance has to be modified, mount the image and apply the base settings to it via Applescript -if [ ${set_ds_store} = "true" ]; then - /usr/bin/osascript dmg_set_style.scpt - - open "/Volumes/$volume_name" - # BUG: one needs to move and close the window manually for the - # changes in appearance to be retained... - echo " - ************************************** - * Please move the disk image window * - * to the center of the screen * - * then close it and press enter * - ************************************** - " - read -r -e _ - - # .DS_Store files aren't written till the disk is unmounted, or finder is restarted. - hdiutil detach "$DEV_NAME" -force - auto_open_opt=-noautoopen - DEV_NAME=$( /usr/bin/hdiutil attach -readwrite -noverify $auto_open_opt "$rw_name" | grep -E '^/dev/' | sed 1q | awk '{print $1}' ) - echo - cp /Volumes/$volume_name/.DS_Store ./$ds_store_root - SetFile -a v ./$ds_store_root - echo "New $ds_store_root written. Re-run $0 without the -s option to use them" - - # Unmount the disk image. - hdiutil detach "$DEV_NAME" -force - rm -f "$rw_name" - - exit 0 -fi - # Unmount the disk image. hdiutil detach "$DEV_NAME" diff --git a/packaging/macosx/path_helper/install-distribution.xml b/packaging/macosx/path_helper/install-distribution.xml new file mode 100644 index 0000000000..103d271efc --- /dev/null +++ b/packaging/macosx/path_helper/install-distribution.xml @@ -0,0 +1,24 @@ + + + + Add Wireshark to the system PATH +
+

This package will add Wireshark and its associated utilities to the system PATH and MANPATH. Wireshark must be installed in /Applications.

]]>
+ + + + + + + + + + + + install.path_helper.pkg +
diff --git a/packaging/macosx/path_helper/root/etc/manpaths.d/Wireshark b/packaging/macosx/path_helper/root/etc/manpaths.d/Wireshark new file mode 100644 index 0000000000..205dad7ece --- /dev/null +++ b/packaging/macosx/path_helper/root/etc/manpaths.d/Wireshark @@ -0,0 +1 @@ +/Applications/Wireshark.app/Contents/Resources/share/man diff --git a/packaging/macosx/path_helper/root/etc/paths.d/Wireshark b/packaging/macosx/path_helper/root/etc/paths.d/Wireshark new file mode 100644 index 0000000000..554937616c --- /dev/null +++ b/packaging/macosx/path_helper/root/etc/paths.d/Wireshark @@ -0,0 +1 @@ +/Applications/Wireshark.app/Contents/MacOS diff --git a/packaging/macosx/path_helper/uninstall-distribution.xml b/packaging/macosx/path_helper/uninstall-distribution.xml new file mode 100644 index 0000000000..69f6f5722f --- /dev/null +++ b/packaging/macosx/path_helper/uninstall-distribution.xml @@ -0,0 +1,24 @@ + + + + Add Wireshark to the system PATH +
+

This package will remove Wireshark and its associated utilities from the system PATH and MANPATH.

]]>
+ + + + + + + + + + + + uninstall.path_helper.pkg +
diff --git a/packaging/macosx/path_helper/uninstall-scripts/postinstall b/packaging/macosx/path_helper/uninstall-scripts/postinstall new file mode 100755 index 0000000000..f596c783d0 --- /dev/null +++ b/packaging/macosx/path_helper/uninstall-scripts/postinstall @@ -0,0 +1,8 @@ +#!/bin/sh + +# +# Remove the Wireshark paths.d and manpaths.d entries. +# + +rm -f /private/etc/paths.d/Wireshark +rm -f /private/etc/manpaths.d/Wireshark diff --git a/packaging/macosx/root.ds_store b/packaging/macosx/root.ds_store deleted file mode 100644 index 5f5264b8fcc279c65d284f5e6140fc9100142bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15364 zcmeHM&2Q936o1~NB~d;I;ZszqT&W+CkZh=O@&T5xEkPA3q6(2Xv1>bCD_(nLJG(tD zTsgsk3xYGp_D`S(ZXBvsz4X7RRQ1^Y-i+6AvW}qARs!{nekMwz=s5#vz@Cy0T8p>bd}BgaIs^ehKoAfF1OY+d-9P}p z*<9upw3J#95CjB)5&`B16A#N~AxBy&>OiHA0FbljRt4=9Za|uaY!-5)B}PyTZ3?MP zjpB%5Xmj+NgFhgE!7kIsv`igplS{i4 zP)Z5yVHG{Hs1F&?aXLlwv`rz#e9EW`-4wd3^pRb0Y#(w=Cu!BblSF$xKeNkF=#=pj zXM`I0E#7RqVVoyf*W7Gzccr|1_FxSN1Bkz#9KXFi9Iu7t^>~l`yK?#NLtZh@AEcg_ z?P`SQ%|lK;?6ut_`(9)F^4T9RFh0hXaW?22M}y}+ExrDn7J_w}dvu+SUHKi^+^Qzy zY-N6$If0+HBhP9113yaoJwMK!G7+bbZPO0IIB@j5&fzSV$prehf&Fj-eG4npQ>$|x zyZEMBzYyz{WBquIOxmOt*65lF#MXh>l|bw=5W5V-)`8fE1HoDvHqmKhxx{;uACyJ9 ziapY&2+_HSAcss4Lv|xd-12KD;|u71&6pQV=dTWBLx2+OpjYfq)0Xhh@$)ERI66o0}5a_un5-5n3&f+WOXYk@F9wg-t(F;kUV`Qwu!2nYg#fFK|UOdEk2 z?a<`=|F4ez|9{%kia$X>5O{|WFlJldwKfotaYRr!{^49tbPo>~)*ET5Oi-~3_p9r8 zyzseet?0YRk_*P0g&b+A%+asRA(c5Ko3p;Y&7b<80doGwMXb6omGl4pRp&IXQ{Tt) szxw8+5(ESRK|l}?1Ox#=KoAfF1OY)n5D)|e0YN|z5CjB)_aA|O0L)F>Pyhe` diff --git a/packaging/macosx/util.ds_store b/packaging/macosx/util.ds_store deleted file mode 100644 index 8b11e111b323bcea28f8d7f2cec633510f09f16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr=55Ukc57W9y#$GLg-50*^~1Uv}&0gVYLBw0~&-yigwwECgAagQP*-7sC9 znXZ|gg3L?NS0LB0+Hbv23z_fdC=qQqpiDGlC(BK-g`KG-anCLHd>9<#y;2vAF z`11YBO}pfn3iH7B`ew!mIAwmz{4H*=Bd6esIXkR%-v_)|kGH@JIZyO^JYr5IdX(1P9-{3qQnrVv%f@M9oRWK9TLTd#L6GVi`eR%zgRk?c1)iNqyl{f zwDzTq_5Q!)UuLk#x0H0LKq~NG6_C+%F>ScJxLd#NQ}5cscEhHod7TC{#=S=Xf9N@K eW`jOnG-h5M*g5Jf+HZ7XJ_JmVbg95EDDV!pQ8&T> diff --git a/packaging/macosx/util_background.png b/packaging/macosx/util_background.png deleted file mode 100644 index a20c01a931e15fd79c4231c27e18922b719a1543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47033 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 diff --git a/packaging/macosx/util_background.svg b/packaging/macosx/util_background.svg deleted file mode 100644 index 702568fd4c..0000000000 --- a/packaging/macosx/util_background.svg +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - WIRESHARK - - - - - ® - - - - - diff --git a/packaging/macosx/utility-launcher/wireshark b/packaging/macosx/utility-launcher/wireshark deleted file mode 100755 index 90ca4a152d..0000000000 --- a/packaging/macosx/utility-launcher/wireshark +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# -# Wireshark CLI utility launcher - -if [ -z "$WIRESHARK_APP_DIR" ] ; then - WIRESHARK_APP_DIR="/Applications/Wireshark.app" -fi - -if [ ! -d "$WIRESHARK_APP_DIR" ] ; then - WIRESHARK_APP_DIR=`mdfind "kMDItemCFBundleIdentifier == 'org.wireshark.Wireshark'" | head -n 1` -fi - -if [ ! -d "$WIRESHARK_APP_DIR" ] ; then - echo "Wireshark doesn't appear to be located at $WIRESHARK_APP_DIR." - echo "Please set WIRESHARK_APP_DIR to its proper location and try again." - exit 1 -fi - -APP_NAME=`basename "$0"` -if [ "$APP_NAME" = "wireshark" ] ; then - APP_NAME=Wireshark -fi -exec "$WIRESHARK_APP_DIR/Contents/MacOS/$APP_NAME" "$@" diff --git a/ui/qt/about_dialog.cpp b/ui/qt/about_dialog.cpp index c7134ff6a7..7cb00132e1 100644 --- a/ui/qt/about_dialog.cpp +++ b/ui/qt/about_dialog.cpp @@ -253,6 +253,13 @@ FolderListModel::FolderListModel(QObject * parent): foreach(QString path, smiPaths) appendRow( QStringList() << tr("MIB/PIB path") << path.trimmed() << tr("SMI MIB/PIB search path")); #endif + +#ifdef Q_OS_MAC + /* Mac Extras */ + QString extras_path = wsApp->applicationDirPath() + "/../Resources/Extras"; + appendRow( QStringList() << tr("macOS Extras") << QDir::cleanPath(extras_path) << tr("Extra macOS packages")); + +#endif } QStringList FolderListModel::headerColumns() const diff --git a/ui/qt/interface_frame.cpp b/ui/qt/interface_frame.cpp index 1fe7ca3458..dae64bf025 100644 --- a/ui/qt/interface_frame.cpp +++ b/ui/qt/interface_frame.cpp @@ -12,14 +12,20 @@ #include #include "caputils/capture_ifinfo.h" -#include "ui/qt/interface_frame.h" -#include +#include "ui/qt/interface_frame.h" +#include + +#include #include -#include "wireshark_application.h" + +#include + #include "extcap.h" +#include + #include #include #include @@ -37,9 +43,9 @@ const int stat_update_interval_ = 1000; // ms InterfaceFrame::InterfaceFrame(QWidget * parent) : QFrame(parent), ui(new Ui::InterfaceFrame) - , proxyModel(Q_NULLPTR) - , sourceModel(Q_NULLPTR) - , infoModel(this) + , proxy_model_(Q_NULLPTR) + , source_model_(Q_NULLPTR) + , info_model_(this) #ifdef HAVE_LIBPCAP ,stat_timer_(NULL) #endif // HAVE_LIBPCAP @@ -53,7 +59,19 @@ InterfaceFrame::InterfaceFrame(QWidget * parent) "QTreeView {" " border: 0;" "}" - )); + "QLabel {" + " border-radius: 0.5em;" + " padding: 0.33em;" + " margin-bottom: 0.25em;" + // We might want to transition this to normal colors this after a timeout. + " color: #%1;" + " background-color: #%2;" + "}" + ) + .arg(ws_css_warn_text, 6, 16, QChar('0')) + .arg(ws_css_warn_background, 6, 16, QChar('0'))); + + ui->warningLabel->hide(); #ifdef Q_OS_MAC ui->interfaceTree->setAttribute(Qt::WA_MacShowFocusRect, false); @@ -75,16 +93,16 @@ InterfaceFrame::InterfaceFrame(QWidget * parent) columns.append(IFTREE_COL_EXTCAP); columns.append(IFTREE_COL_DISPLAY_NAME); columns.append(IFTREE_COL_STATS); - proxyModel.setColumns(columns); - proxyModel.setStoreOnChange(true); - proxyModel.setSourceModel(&sourceModel); + proxy_model_.setColumns(columns); + proxy_model_.setStoreOnChange(true); + proxy_model_.setSourceModel(&source_model_); - infoModel.setSourceModel(&proxyModel); - infoModel.setColumn(columns.indexOf(IFTREE_COL_STATS)); - - ui->interfaceTree->setModel(&infoModel); + info_model_.setSourceModel(&proxy_model_); + info_model_.setColumn(columns.indexOf(IFTREE_COL_STATS)); - ui->interfaceTree->setItemDelegateForColumn(proxyModel.mapSourceToColumn(IFTREE_COL_STATS), new SparkLineDelegate(this)); + ui->interfaceTree->setModel(&info_model_); + + ui->interfaceTree->setItemDelegateForColumn(proxy_model_.mapSourceToColumn(IFTREE_COL_STATS), new SparkLineDelegate(this)); ui->interfaceTree->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->interfaceTree, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint))); @@ -104,7 +122,7 @@ InterfaceFrame::~InterfaceFrame() QMenu * InterfaceFrame::getSelectionMenu() { QMenu * contextMenu = new QMenu(this); - QList typesDisplayed = proxyModel.typesDisplayed(); + QList typesDisplayed = proxy_model_.typesDisplayed(); QMap::const_iterator it = ifTypeDescription.constBegin(); while(it != ifTypeDescription.constEnd()) @@ -116,7 +134,7 @@ QMenu * InterfaceFrame::getSelectionMenu() QAction *endp_action = new QAction(it.value(), this); endp_action->setData(QVariant::fromValue(ifType)); endp_action->setCheckable(true); - endp_action->setChecked(proxyModel.isInterfaceTypeShown(ifType)); + endp_action->setChecked(proxy_model_.isInterfaceTypeShown(ifType)); connect(endp_action, SIGNAL(triggered()), this, SLOT(triggeredIfTypeButton())); contextMenu->addAction(endp_action); } @@ -124,11 +142,11 @@ QMenu * InterfaceFrame::getSelectionMenu() } #ifdef HAVE_PCAP_REMOTE - if ( proxyModel.remoteInterfacesExist() ) + if ( proxy_model_.remoteInterfacesExist() ) { QAction * toggleRemoteAction = new QAction(tr("Remote interfaces"), this); toggleRemoteAction->setCheckable(true); - toggleRemoteAction->setChecked(! proxyModel.remoteDisplay()); + toggleRemoteAction->setChecked(! proxy_model_.remoteDisplay()); connect(toggleRemoteAction, SIGNAL(triggered()), this, SLOT(toggleRemoteInterfaces())); contextMenu->addAction(toggleRemoteAction); } @@ -139,7 +157,7 @@ QMenu * InterfaceFrame::getSelectionMenu() contextMenu->addSeparator(); QAction * toggleHideAction = new QAction(tr("Show hidden interfaces"), this); toggleHideAction->setCheckable(true); - toggleHideAction->setChecked(! proxyModel->filterHidden()); + toggleHideAction->setChecked(! proxy_model_->filterHidden()); connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHiddenInterfaces())); contextMenu->addAction(toggleHideAction); #endif @@ -149,12 +167,12 @@ QMenu * InterfaceFrame::getSelectionMenu() int InterfaceFrame::interfacesHidden() { - return proxyModel.interfacesHidden(); + return proxy_model_.interfacesHidden(); } int InterfaceFrame::interfacesPresent() { - return sourceModel.rowCount() - proxyModel.interfacesHidden(); + return source_model_.rowCount() - proxy_model_.interfacesHidden(); } void InterfaceFrame::ensureSelectedInterface() @@ -162,8 +180,8 @@ void InterfaceFrame::ensureSelectedInterface() #ifdef HAVE_LIBPCAP if (interfacesPresent() < 1) return; - if (sourceModel.selectedDevices().count() < 1) { - QModelIndex first_idx = infoModel.mapFromSource(proxyModel.index(0, 0)); + if (source_model_.selectedDevices().count() < 1) { + QModelIndex first_idx = info_model_.mapFromSource(proxy_model_.index(0, 0)); ui->interfaceTree->setCurrentIndex(first_idx); } @@ -175,7 +193,7 @@ void InterfaceFrame::hideEvent(QHideEvent *) { #ifdef HAVE_LIBPCAP if (stat_timer_) stat_timer_->stop(); - sourceModel.stopStatistic(); + source_model_.stopStatistic(); #endif // HAVE_LIBPCAP } @@ -192,7 +210,7 @@ void InterfaceFrame::actionButton_toggled(bool checked) QVariant ifType = sender()->property(BTN_IFTYPE_PROPERTY); if ( ifType.isValid() ) { - proxyModel.setInterfaceTypeVisible(ifType.toInt(), checked); + proxy_model_.setInterfaceTypeVisible(ifType.toInt(), checked); } resetInterfaceTreeDisplay(); @@ -204,7 +222,7 @@ void InterfaceFrame::triggeredIfTypeButton() if ( sender ) { int ifType = sender->data().value(); - proxyModel.toggleTypeVisibility(ifType); + proxy_model_.toggleTypeVisibility(ifType); resetInterfaceTreeDisplay(); emit typeSelectionChanged(); @@ -213,9 +231,9 @@ void InterfaceFrame::triggeredIfTypeButton() void InterfaceFrame::interfaceListChanged() { - infoModel.clearInfos(); + info_model_.clearInfos(); if ( prefs.capture_no_extcap ) - infoModel.appendInfo(tr("External capture interfaces disabled.")); + info_model_.appendInfo(tr("External capture interfaces disabled.")); resetInterfaceTreeDisplay(); // Ensure that device selection is consistent with the displayed selection. @@ -233,7 +251,7 @@ void InterfaceFrame::interfaceListChanged() void InterfaceFrame::toggleHiddenInterfaces() { - proxyModel.toggleFilterHidden(); + proxy_model_.toggleFilterHidden(); emit typeSelectionChanged(); } @@ -241,38 +259,61 @@ void InterfaceFrame::toggleHiddenInterfaces() #ifdef HAVE_PCAP_REMOTE void InterfaceFrame::toggleRemoteInterfaces() { - proxyModel.toggleRemoteDisplay(); + proxy_model_.toggleRemoteDisplay(); emit typeSelectionChanged(); } #endif +#include void InterfaceFrame::resetInterfaceTreeDisplay() { - if ( proxyModel.rowCount() == 0 ) + ui->warningLabel->setText(tr("No interfaces found")); + ui->warningLabel->hide(); + + if ( proxy_model_.rowCount() == 0 ) { - ui->interfaceTree->setHidden(true); - ui->lblNoInterfaces->setHidden(false); - ui->lblNoInterfaces->setText( proxyModel.interfaceError() ); - if ( prefs.capture_no_interface_load ) - ui->lblNoInterfaces->setText( "Interfaces not loaded (due to preference). Go to Capture -> Refresh Interfaces to load." ); + ui->interfaceTree->hide(); + ui->warningLabel->show(); + ui->warningLabel->setText(proxy_model_.interfaceError()); + if ( prefs.capture_no_interface_load ) { + ui->warningLabel->setText(tr("Interfaces not loaded (due to preference). Go to Capture " UTF8_RIGHTWARDS_ARROW " Refresh Interfaces to load.")); + } + } + else if (!haveCapturePermissions()) + { +#ifdef Q_OS_MAC + QString install_chmodbpf_path = wsApp->applicationDirPath() + "/../Resources/Extras/Install ChmodBPF.pkg"; + ui->warningLabel->setText(tr("You don't have permission to capture. You can install ChmodBPF to fix this.").arg(install_chmodbpf_path)); + ui->warningLabel->show(); +#endif } else { - ui->interfaceTree->setHidden(false); - ui->lblNoInterfaces->setHidden(true); - ui->interfaceTree->resizeColumnToContents(proxyModel.mapSourceToColumn(IFTREE_COL_EXTCAP)); - ui->interfaceTree->resizeColumnToContents(proxyModel.mapSourceToColumn(IFTREE_COL_DISPLAY_NAME)); - ui->interfaceTree->resizeColumnToContents(proxyModel.mapSourceToColumn(IFTREE_COL_STATS)); + ui->interfaceTree->show(); + ui->warningLabel->hide(); + ui->interfaceTree->resizeColumnToContents(proxy_model_.mapSourceToColumn(IFTREE_COL_EXTCAP)); + ui->interfaceTree->resizeColumnToContents(proxy_model_.mapSourceToColumn(IFTREE_COL_DISPLAY_NAME)); + ui->interfaceTree->resizeColumnToContents(proxy_model_.mapSourceToColumn(IFTREE_COL_STATS)); } } +bool InterfaceFrame::haveCapturePermissions() const +{ +#ifdef Q_OS_MAC + QFileInfo bpf0_fi = QFileInfo("/dev/bpf0"); + return bpf0_fi.isReadable() && bpf0_fi.isWritable(); +#else + return true; +#endif +} + void InterfaceFrame::updateSelectedInterfaces() { - if ( sourceModel.rowCount() == 0 ) + if ( source_model_.rowCount() == 0 ) return; #ifdef HAVE_LIBPCAP - QItemSelection sourceSelection = sourceModel.selectedDevices(); - QItemSelection mySelection = infoModel.mapSelectionFromSource(proxyModel.mapSelectionFromSource(sourceSelection)); + QItemSelection sourceSelection = source_model_.selectedDevices(); + QItemSelection mySelection = info_model_.mapSelectionFromSource(proxy_model_.mapSelectionFromSource(sourceSelection)); ui->interfaceTree->selectionModel()->clearSelection(); ui->interfaceTree->selectionModel()->select(mySelection, QItemSelectionModel::SelectCurrent ); @@ -283,30 +324,30 @@ void InterfaceFrame::interfaceTreeSelectionChanged(const QItemSelection & select { if (selected.count() == 0 && deselected.count() == 0) return; - if ( sourceModel.rowCount() == 0 ) + if ( source_model_.rowCount() == 0 ) return; #ifdef HAVE_LIBPCAP /* Take all selected interfaces, not just the newly ones */ QItemSelection allSelected = ui->interfaceTree->selectionModel()->selection(); - QItemSelection sourceSelection = proxyModel.mapSelectionToSource(infoModel.mapSelectionToSource(allSelected)); + QItemSelection sourceSelection = proxy_model_.mapSelectionToSource(info_model_.mapSelectionToSource(allSelected)); - if ( sourceModel.updateSelectedDevices(sourceSelection) ) + if ( source_model_.updateSelectedDevices(sourceSelection) ) emit itemSelectionChanged(); #endif } void InterfaceFrame::on_interfaceTree_doubleClicked(const QModelIndex &index) { - QModelIndex realIndex = proxyModel.mapToSource(infoModel.mapToSource(index)); + QModelIndex realIndex = proxy_model_.mapToSource(info_model_.mapToSource(index)); if ( ! realIndex.isValid() ) return; #ifdef HAVE_LIBPCAP - QString device_name = sourceModel.getColumnContent(realIndex.row(), IFTREE_COL_NAME).toString(); - QString extcap_string = sourceModel.getColumnContent(realIndex.row(), IFTREE_COL_EXTCAP_PATH).toString(); + QString device_name = source_model_.getColumnContent(realIndex.row(), IFTREE_COL_NAME).toString(); + QString extcap_string = source_model_.getColumnContent(realIndex.row(), IFTREE_COL_EXTCAP_PATH).toString(); /* We trust the string here. If this interface is really extcap, the string is * being checked immediatly before the dialog is being generated */ @@ -328,13 +369,13 @@ void InterfaceFrame::on_interfaceTree_clicked(const QModelIndex &index) { if ( index.column() == 0 ) { - QModelIndex realIndex = proxyModel.mapToSource(infoModel.mapToSource(index)); + QModelIndex realIndex = proxy_model_.mapToSource(info_model_.mapToSource(index)); if ( ! realIndex.isValid() ) return; - QString device_name = sourceModel.getColumnContent(realIndex.row(), IFTREE_COL_NAME).toString(); - QString extcap_string = sourceModel.getColumnContent(realIndex.row(), IFTREE_COL_EXTCAP_PATH).toString(); + QString device_name = source_model_.getColumnContent(realIndex.row(), IFTREE_COL_NAME).toString(); + QString extcap_string = source_model_.getColumnContent(realIndex.row(), IFTREE_COL_EXTCAP_PATH).toString(); /* We trust the string here. If this interface is really extcap, the string is * being checked immediatly before the dialog is being generated */ @@ -353,18 +394,18 @@ void InterfaceFrame::on_interfaceTree_clicked(const QModelIndex &index) void InterfaceFrame::updateStatistics(void) { - if ( sourceModel.rowCount() == 0 ) + if ( source_model_.rowCount() == 0 ) return; #ifdef HAVE_LIBPCAP - for( int idx = 0; idx < proxyModel.rowCount(); idx++ ) + for( int idx = 0; idx < proxy_model_.rowCount(); idx++ ) { - QModelIndex selectIndex = infoModel.mapFromSource(proxyModel.mapFromSource(sourceModel.index(idx, 0))); + QModelIndex selectIndex = info_model_.mapFromSource(proxy_model_.mapFromSource(source_model_.index(idx, 0))); /* Proxy model has not masked out the interface */ if ( selectIndex.isValid() ) - sourceModel.updateStatistic(idx); + source_model_.updateStatistic(idx); } #endif @@ -373,12 +414,12 @@ void InterfaceFrame::updateStatistics(void) /* Proxy Method so we do not need to expose the source model */ void InterfaceFrame::getPoints(int idx, PointList * pts) { - sourceModel.getPoints(idx, pts); + source_model_.getPoints(idx, pts); } void InterfaceFrame::showRunOnFile(void) { - ui->lblNoInterfaces->setText("Interfaces not loaded on startup (run on capture file). Go to Capture -> Refresh Interfaces to load."); + ui->warningLabel->setText("Interfaces not loaded on startup (run on capture file). Go to Capture -> Refresh Interfaces to load."); } void InterfaceFrame::showContextMenu(QPoint pos) diff --git a/ui/qt/interface_frame.h b/ui/qt/interface_frame.h index cb0cb3cbac..1cdc0efad9 100644 --- a/ui/qt/interface_frame.h +++ b/ui/qt/interface_frame.h @@ -68,12 +68,13 @@ protected: private: void resetInterfaceTreeDisplay(); + bool haveCapturePermissions() const; Ui::InterfaceFrame *ui; - InterfaceSortFilterModel proxyModel; - InterfaceTreeModel sourceModel; - InfoProxyModel infoModel; + InterfaceSortFilterModel proxy_model_; + InterfaceTreeModel source_model_; + InfoProxyModel info_model_; QMap ifTypeDescription; diff --git a/ui/qt/interface_frame.ui b/ui/qt/interface_frame.ui index cc90f086d4..568e787701 100644 --- a/ui/qt/interface_frame.ui +++ b/ui/qt/interface_frame.ui @@ -6,8 +6,8 @@ 0 0 - 676 - 350 + 256 + 209 @@ -39,7 +39,7 @@ 0 - + 0 @@ -47,11 +47,20 @@ - No interfaces found + + + + Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse +