Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pgadmin4 for openSUSE:Factory checked in at 2023-10-30 22:10:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pgadmin4 (Old) and /work/SRC/openSUSE:Factory/.pgadmin4.new.17445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pgadmin4" Mon Oct 30 22:10:11 2023 rev:23 rq:1121161 version:7.8 Changes: -------- --- /work/SRC/openSUSE:Factory/pgadmin4/pgadmin4.changes 2023-08-28 17:14:16.858637868 +0200 +++ /work/SRC/openSUSE:Factory/.pgadmin4.new.17445/pgadmin4.changes 2023-10-30 22:10:24.119368055 +0100 @@ -1,0 +2,127 @@ +Mon Oct 30 11:23:57 UTC 2023 - Antonio Larrosa <alarr...@suse.com> + +- Add obsoletes: pgadmin4-web + +------------------------------------------------------------------- +Wed Oct 25 06:26:07 UTC 2023 - Antonio Larrosa <alarr...@suse.com> + +- Add a vendor.tar.xz source package with node modules that have to + be downloaded in the developer workstation since otherwise they + won't be able to get downloaded in the build service. +- Add an update-vendor.sh script that updates (actually, recreates) + the vendor.tar.xz package. This should be run manually with each + package update. +- Remove obsoleted file pgadmin4.qt.conf.in which hasn't been used + at all for some time. +- Add patch to set the environment variable EVENTLET_NO_GREENDNS + which fixes pgadmin4 to build successfully with eventlet 0.33.3, + httpcore 0.17.1 and httpx 0.24.0: + * fix-eventlet-select_epoll.patch +- Merged pgadmin4-web subpackage into the main pgadmin4 package + which now installs the pgAdmin4 server. +- Create new pgadmin4-desktop subpackage that includes a very small + python script I wrote that starts the pgadmin4 server in runtime + mode (as a regular user) and provides a system tray icon so users + can open new windows and quit the server with a UI since the + alternative (using the official pgAdmin4 runtime application + would require providing a full node.js modules tree and using + NW.js for the ui). +- Fix .desktop file which was now moved to the pgadmin4-desktop + subpackage. The "Encoding" key is deprecated so it has been + removed, only one main category is now used in the Categories + key and the path to the icon was fixed. +- Remove pgadmin4.qt.conf.in which is not used anymore + +------------------------------------------------------------------- +Wed Oct 25 06:24:15 UTC 2023 - Antonio Larrosa <alarr...@suse.com> + +- Update to 7.8 + * Supported Database Servers + - PostgreSQL: 12, 13, 14, 15, and 16 + - EDB Advanced Server: 12, 13, 14 and 15 + * Bundled PostgreSQL Utilities + - psql, pg_dump, pg_dumpall, pg_restore: 16.0 + * New features + - Add support for foreign table's new functionality for PG 11 + and above. + - Allow setting custom username for shared servers, with + default as username of server being shared. + - Add 'GENERATED ALWAYS AS..' option while creating column + constraints for Foreign Table. + - GUI representation of the system's activity using the + 'system_stats' extension. + - Added 'load_balance_hosts' connection string parameter + for PG 16 and above. + * Housekeeping + - Use PG16 as the default PostgreSQL version. + * Bug fixes + - Fixed an issue in ERD tool where the downloaded images + have a few links cut. + - Fixed an issue where user was not able to assign new/old + columns as primary key once column with primary key is + deleted. + - Add support for setting prepare threshold in server + connection. + - Fixed an issue where the wrong message "Current database + has been moved or renamed" is displayed when debugging any + function. + - Fixed an issue where Processes tab displays wrong server + name in some scenario. + - Fix an issue where global/native keyboard shortcuts are + not working when any cell of data output grid has focus. + - Fixed query history slowness issue by storing query only for + those having certain threshold max length. + - Fix an issue where foreign table column name becomes "none" + if the user changes any column data type. + - Pin the cryptography version to fix PyO3 modules + initialisation error. + - Ensure that the backup works properly for PG 16 on the latest + docker image. + - Fixed an issue where the user is unable to select objects on + the backup dialog due to tree flickering. + - Fixed an issue where non-super PostgreSQL users are not able + to terminate their own connections from dashboard. + - Fix an issue where scale in columns is not allowed to have + value as 0 or below. + - Fix an issue in graphical explain plan where query tool + crashes when the plan has parallel workers details and sort + node is clicked for details. + - Fix an issue where user login is not working if + username/email contains single quote in server mode. + +- Update to 7.7 + * Supported Database Servers + - PostgreSQL: 11, 12, 13, 14 and 15 + - EDB Advanced Server: 11, 12, 13, 14 and 15 + * Bundled PostgreSQL Utilities + - psql, pg_dump, pg_dumpall, pg_restore: 15.4 + * New features + - Added support to select/deselect objects in the Backup + dialog. + - Added all the new options of the 'WITH' clause in the + subscription dialog. + - Added USING method while creating the table. + - Added compression method option while creating a column. + - Added Strategy, Locale Provider, ICU Locale, ICU Rules, + and OID options while creating a database. + - Added USING method while creating the materialized view. + - Add support for additional ID token claim checks for + OAuth 2 authentication. + * Housekeeping + - Added the âdata typeâ column in the properties tab of + the Columns collection node. + * Bug fixes + - Fix an issue where user is not able to change the + password when SMTP is not configured. + - Ensure user is redirected to login page after failed login. + - Ensure that Materialized view size fields in "Statistics" + should be human-readable. + - Fix an issue where changing the password shows success but + the new password is not working. + - Fix an issue where login form doesn't appear if internal + auth source is removed. + - Fix a security related issue where an authenticated user can + run remote command using validate binary path API + (CVE-2023-5002, boo#1215603). + +------------------------------------------------------------------- Old: ---- pgadmin4-7.6.tar.gz pgadmin4-7.6.tar.gz.asc pgadmin4.desktop.in pgadmin4.qt.conf.in New: ---- fix-eventlet-select_epoll.patch pgadmin4-7.8.tar.gz pgadmin4-7.8.tar.gz.asc pgadmin4-desktop pgadmin4.desktop update-vendor.sh vendor.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pgadmin4.spec ++++++ --- /var/tmp/diff_new_pack.rr35xK/_old 2023-10-30 22:10:26.683462649 +0100 +++ /var/tmp/diff_new_pack.rr35xK/_new 2023-10-30 22:10:26.683462649 +0100 @@ -22,7 +22,9 @@ %global python3_azure_mgmt_rdbms_min_version 10.1 %global python3_azure_mgmt_resource_min_version 23.0 %global python3_azure_mgmt_subscription_min_version 3.1 +%global python3_bcrypt_min_version 4.0 %global python3_boto3_min_version 1.26 +%global python3_botocore_min_version 1.31 %global python3_flask_babel_min_version 3.1.0 %global python3_flask_compress_min_version 1.4.0 %global python3_flask_gravatar_min_version 0.5.0 @@ -48,7 +50,6 @@ %global python3_python_dateutil_min_version 2.8.0 %global python3_pytz_min_version 2023.0 %global python3_qrcode_min_version 7.0 -%global python3_speaklater_min_version 1.3 %global python3_sqlalchemy_min_version 2.0 %global python3_sqlparse_min_version 0.3.0 %global python3_sshtunnel_min_version 0.1.5 @@ -57,34 +58,39 @@ %global python3_wtforms_min_version 3.0 %global pgadmin4instdir %{_libdir}/pgadmin4-%{version} -%global pgadmin4homedir /var/lib/pgadmin +%global pgadmin4homedir %{_localstatedir}/lib/pgadmin %global user_group_name pgadmin Name: pgadmin4 -Version: 7.6 +Version: 7.8 Release: 0 Summary: Management tool for PostgreSQL License: PostgreSQL Group: Productivity/Databases/Tools URL: http://www.pgadmin.org Source0: https://download.postgresql.org/pub/pgadmin/%{name}/v%{version}/source/%{name}-%{version}.tar.gz -Source10: https://download.postgresql.org/pub/pgadmin/%{name}/v%{version}/source/%{name}-%{version}.tar.gz.asc -# https://www.pgadmin.org/download/pgadmin-4-source-code/ -Source11: %{name}.keyring Source1: %{name}.conf.in Source2: %{name}.service.in Source3: %{name}.tmpfiles.d -Source4: %{name}.desktop.in -Source6: %{name}.qt.conf.in +Source4: %{name}.desktop Source7: %{name}.uwsgi.in Source8: README.SUSE Source9: README.SUSE.uwsgi.in +Source10: https://download.postgresql.org/pub/pgadmin/%{name}/v%{version}/source/%{name}-%{version}.tar.gz.asc +# https://www.pgadmin.org/download/pgadmin-4-source-code/ +Source11: %{name}.keyring +Source12: vendor.tar.xz +Source13: %{name}-desktop +Source99: update-vendor.sh Patch0: use-os-makedirs.patch Patch1: fix-python3-crypto-call.patch Patch2: support-new-azure-mgmt-rdbms.patch Patch3: support-new-werkzeug.patch Patch4: support-new-flask.patch +Patch5: fix-eventlet-select_epoll.patch BuildRequires: fdupes +BuildRequires: hicolor-icon-theme +BuildRequires: optipng BuildRequires: python-rpm-macros BuildRequires: python3-Authlib >= %{python3_authlib_min_version} BuildRequires: python3-Flask >= %{python3_flask_min_version} @@ -99,7 +105,6 @@ BuildRequires: python3-Flask-Security-Too >= %{python3_flask_security_too_min_version} BuildRequires: python3-Flask-SocketIO >= %{python3_flask_socketio_min_version} BuildRequires: python3-Flask-WTF >= %{python3_flask_wtf_min_version} -BuildRequires: python3-Pillow >= %{python3_pillow_min_version} BuildRequires: python3-SQLAlchemy >= %{python3_sqlalchemy_min_version} BuildRequires: python3-WTForms >= %{python3_wtforms_min_version} BuildRequires: python3-Werkzeug >= %{python3_werkzeug_min_version} @@ -107,7 +112,9 @@ BuildRequires: python3-azure-mgmt-rdbms >= %{python3_azure_mgmt_rdbms_min_version} BuildRequires: python3-azure-mgmt-resource >= %{python3_azure_mgmt_resource_min_version} BuildRequires: python3-azure-mgmt-subscription >= %{python3_azure_mgmt_subscription_min_version} +BuildRequires: python3-bcrypt >= %{python3_bcrypt_min_version} BuildRequires: python3-boto3 >= %{python3_boto3_min_version} +BuildRequires: python3-botocore >= %{python3_botocore_min_version} BuildRequires: python3-cryptography BuildRequires: python3-eventlet BuildRequires: python3-google-api-python-client >= %{python3_google_api_python_client_min_version} @@ -123,8 +130,6 @@ BuildRequires: python3-python-dateutil >= %{python3_python_dateutil_min_version} BuildRequires: python3-pytz >= %{python3_pytz_min_version} BuildRequires: python3-qrcode >= %{python3_qrcode_min_version} -BuildRequires: python3-selenium -BuildRequires: python3-speaklater >= %{python3_speaklater_min_version} BuildRequires: python3-sqlparse >= %{python3_sqlparse_min_version} BuildRequires: python3-sshtunnel >= %{python3_sshtunnel_min_version} BuildRequires: python3-testscenarios @@ -132,26 +137,8 @@ BuildRequires: python3-user-agents >= %{python3_user_agents_min_version} BuildRequires: python3-wheel BuildRequires: systemd-rpm-macros -Requires: %{name}-web = %{version} +BuildRequires: yarn Requires: python3 >= 3.7 -BuildArch: noarch -%{?systemd_requires} - -%description -pgAdmin 4 is a rewrite of the pgAdmin3 management tool for the -PostgreSQL database. It is written as a web application in Python, -using jQuery and Bootstrap for the client side processing and UI. On -the server side, Flask is being utilised. - -This variant is a Qt-based runtime application intended to allow the -standalone use on a workstation - it is essentially a browser and -Python interpretor in one package which will be capable of hosting -the Python application and presenting it to the user as a desktop -application. - -%package web -Summary: Web package for pgAdmin4 -Group: Productivity/Databases/Tools Requires: python3-Authlib >= %{python3_authlib_min_version} Requires: python3-Flask >= %{python3_flask_min_version} Requires: python3-Flask-Babel >= %{python3_flask_babel_min_version} @@ -165,7 +152,6 @@ Requires: python3-Flask-Security-Too >= %{python3_flask_security_too_min_version} Requires: python3-Flask-SocketIO >= %{python3_flask_socketio_min_version} Requires: python3-Flask-WTF >= %{python3_flask_wtf_min_version} -Requires: python3-Pillow >= %{python3_pillow_min_version} Requires: python3-SQLAlchemy >= %{python3_sqlalchemy_min_version} Requires: python3-WTForms >= %{python3_wtforms_min_version} Requires: python3-Werkzeug >= %{python3_werkzeug_min_version} @@ -173,7 +159,9 @@ Requires: python3-azure-mgmt-rdbms >= %{python3_azure_mgmt_rdbms_min_version} Requires: python3-azure-mgmt-resource >= %{python3_azure_mgmt_resource_min_version} Requires: python3-azure-mgmt-subscription >= %{python3_azure_mgmt_subscription_min_version} +Requires: python3-bcrypt >= %{python3_bcrypt_min_version} Requires: python3-boto3 >= %{python3_boto3_min_version} +Requires: python3-botocore >= %{python3_botocore_min_version} Requires: python3-cryptography Requires: python3-eventlet Requires: python3-google-api-python-client >= %{python3_google_api_python_client_min_version} @@ -188,17 +176,22 @@ Requires: python3-python-dateutil >= %{python3_python_dateutil_min_version} Requires: python3-pytz >= %{python3_pytz_min_version} Requires: python3-qrcode >= %{python3_qrcode_min_version} -Requires: python3-speaklater >= %{python3_speaklater_min_version} Requires: python3-sqlparse >= %{python3_sqlparse_min_version} Requires: python3-sshtunnel >= %{python3_sshtunnel_min_version} Requires: python3-urllib3 < 2 Requires: python3-user-agents >= %{python3_user_agents_min_version} -Recommends: python3-mod_wsgi +Suggests: python3-mod_wsgi Suggests: %{name}-doc +Recommends: %{name}-desktop +Obsoletes: %{name}-web < %{version} +%{?systemd_requires} +BuildArch: noarch -%description web +%description pgAdmin 4 is a rewrite of the pgAdmin3 management tool for the -PostgreSQL database. +PostgreSQL database. It is written as a web application in Python, +using jQuery and Bootstrap for the client side processing and UI. On +the server side, Flask is being utilised. This package contains the required files to run pgAdmin4 as a web application @@ -215,7 +208,7 @@ %package web-uwsgi Summary: Pgamdin4 - uwsgi configuration Group: Productivity/Networking/Web/Utilities -Requires: pgadmin4-web +Requires: pgadmin4 Requires: uwsgi %description web-uwsgi @@ -223,23 +216,62 @@ This package holds the uwsgi configuration. +%package desktop +Summary: Desktop application for pgAdmin4 +Group: Documentation/HTML +Requires: %{name} +Requires: python3-PyQt6 + +%description desktop +pgAdmin 4 is a rewrite of the pgAdmin3 management tool for the +PostgreSQL database. + +This package provides a small python script that can be used +to start pgAdmin4 as a regular user and provides a simple ui +as a system tray icon to open more windows or quit. + +Note that his script is not related to the official pgAdmin4 +runtime application and is NOT supported by the pgAdmin project +but only provided for convenience. + %prep %autosetup -p1 sed -e 's@PYTHONSITELIB@%{python3_sitelib}@g' <%{SOURCE1} > %{name}.conf sed -e 's@PYTHONDIR@%{_bindir}/python3@g' -e 's@PYTHONSITELIB@%{python3_sitelib}@g' < %{SOURCE2} > %{name}.service sed -e 's@PYTHONDIR@%{_bindir}/python3@g' -e 's@PYTHONSITELIB@%{python3_sitelib}@g' < %{SOURCE4} > %{name}.desktop -sed -e 's@PYTHONSITELIB64@%{python3_sitearch}@g' -e 's@PYTHONSITELIB@%{python3_sitelib}@g' <%{SOURCE6} > %{name}.qt.conf sed -e 's@PYTHONSITELIB@%{python3_sitelib}@g' <%{SOURCE7} > %{name}.uwsgi sed -e 's@PYTHONSITELIB@%{python3_sitelib}@g' <%{SOURCE9} > README.SUSE.uwsgi +# speaklater isn't really used +sed -i -e 's/^speaklater.*//' requirements.txt + cp %{SOURCE8} . cp %{SOURCE9} . + # rpmlint chmod -x docs/en_US/theme/pgadmin4/static/style.css chmod -x docs/en_US/theme/pgadmin4/theme.conf +# This package is run using the interpreter so it doesn't need the executable bit set +chmod -x web/pgadmin/misc/bgprocess/process_executor.py +chmod -x web/pgadmin/static/fonts/*.ttf + +# Uncompress the vendor sources +tar xvfJ %{SOURCE12} +# Use the system optipng, not the one built when creating the vendor package in the developer workstation +ln -s %{_bindir}/optipng web/node_modules/optipng-bin/vendor/optipng + +# Do not use env as script interpreter +find web/node_modules -type f -executable -exec sed -i -e '1{s,^#! */usr/bin/env \(node\|python3|bash\),#!%{_bindir}/\1,}' "{}" \; +find web/pgacloud -type f -executable -exec sed -i -e '1{s,^#! */usr/bin/env \(node\|python3\),#!%{_bindir}/\1,}' "{}" \; + +rm web/regression/.gitignore %build +make bundle +rm -Rf web/node_modules web/yarn.lock + +export EVENTLET_NO_GREENDNS='yes' mkdir -p pip-build/pgadmin4 cp -a web/* pip-build/pgadmin4 echo recursive-include pgadmin4 \* > pip-build/MANIFEST.in @@ -278,11 +310,6 @@ install -d -m 0755 %{buildroot}%{_sysconfdir}/pgadmin/ echo "# SERVER_MODE = True" > %{buildroot}%{_sysconfdir}/pgadmin/config_system.py -# Install QT conf file -# This directory will/may change in future releases. -install -d "%{buildroot}%{_sysconfdir}/xdg/pgadmin/" -install -m 0644 -p %{name}.qt.conf %{buildroot}%{_sysconfdir}/xdg/pgadmin/pgadmin4.conf - # Install unit file/init script # This is only for systemd supported distros: install -d %{buildroot}%{_unitdir} @@ -295,32 +322,42 @@ chmod -x %{buildroot}%{_docdir}/%{name}-docs/en_US/images/* mkdir -p %{buildroot}%{_sbindir} ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rcpgadmin4 -%fdupes %{buildroot}%{_prefix} install -d -m 0755 %{buildroot}%{pgadmin4homedir} install -d -m 0755 %{buildroot}%{pgadmin4homedir}/storage install -d -m 0700 %{buildroot}%{pgadmin4homedir}/sessions +install -d -m 0755 %{buildroot}%{_localstatedir}/log/pgadmin install -d -m 0755 %{buildroot}%{_sysconfdir}/uwsgi/vassals install -m 0644 %{name}.uwsgi %{buildroot}%{_sysconfdir}/uwsgi/vassals/pgadmin4.ini -##%check +install -d -m 0755 %{buildroot}%{_datadir}/icons/hicolor/256x256/apps +install -m 0644 web/pgadmin/static/img/logo-256.png %{buildroot}%{_datadir}/icons/hicolor/256x256/apps/pgadmin4.png + +install -d -m 0755 %{buildroot}%{python3_sitelib}/%{name}/assets +install -m 0644 ./runtime/assets/welcome_logo.svg %{buildroot}%{python3_sitelib}/%{name}/assets/welcome_logo.svg + +install -m 0755 %{SOURCE13} %{buildroot}%{_bindir} + +%fdupes %{buildroot}%{python3_sitelib} + +##%% check ## Requires Postgres running -##PYTHONPATH=%{buildroot}%{python3_sitelib} python3 -B web/regression/runtests.py --exclude feature_tests +##PYTHONPATH=%%{buildroot}%%{python3_sitelib} python3 -B web/regression/runtests.py --exclude feature_tests -%pre web +%pre /usr/sbin/groupadd -r %{user_group_name} &>/dev/null || : /usr/sbin/useradd -g %{user_group_name} -s /bin/false -r -c "%{name}" -d %{pgadmin4homedir} %{user_group_name} &>/dev/null || : %service_add_pre %{name}.service -%post web +%post %service_add_post %{name}.service %tmpfiles_create %{_tmpfilesdir}/%{name}.conf -%preun web +%preun %service_del_preun %{name}.service -%postun web +%postun chown -R %{user_group_name}:%{user_group_name} %{pgadmin4homedir} %service_del_postun %{name}.service @@ -329,12 +366,7 @@ %doc README.md README.SUSE %license LICENSE %{_bindir}/pgadmin4 -%{_datadir}/applications/%{name}.desktop -%dir %{_sysconfdir}/xdg/pgadmin -%config %{_sysconfdir}/xdg/pgadmin/pgadmin4.conf -%files web -%defattr(-,root,root,-) %dir %{_sysconfdir}/apache2 %dir %{_sysconfdir}/apache2/conf.d %config(noreplace) %{_sysconfdir}/apache2/conf.d/%{name}.conf @@ -355,6 +387,7 @@ %dir %{pgadmin4homedir} %dir %{pgadmin4homedir}/storage %attr(700,%{user_group_name},%{user_group_name}) %dir %{pgadmin4homedir}/sessions +%dir %{_localstatedir}/log/pgadmin %files doc %defattr(-,root,root,-) @@ -368,3 +401,9 @@ %dir %{_sysconfdir}/uwsgi/vassals %config (noreplace) %{_sysconfdir}/uwsgi/vassals/pgadmin4.ini +%files desktop +%defattr(-,root,root,-) +%{_bindir}/pgadmin4-desktop +%{_datadir}/applications/%{name}.desktop +%{_datadir}/icons/hicolor/256x256/apps/pgadmin4.png + ++++++ README.SUSE.uwsgi.in ++++++ --- /var/tmp/diff_new_pack.rr35xK/_old 2023-10-30 22:10:26.735464567 +0100 +++ /var/tmp/diff_new_pack.rr35xK/_new 2023-10-30 22:10:26.739464715 +0100 @@ -1,13 +1,13 @@ To configure pgadmin with Apache and uwsgi, just add the follwing lines to a vhost: ProxyPass /pgadmin unix:/run/uwsgi/uwsgi-pgadmin.sock|uwsgi://localhost/ - <Directory PYTHONSITELIB/pgadmin4-web/> + <Directory PYTHONSITELIB/pgadmin4/> Require all granted </Directory> Note that you have to run once `pgadmin4` from the command line to set the master password by executing: - /usr/bin/python3 PYTHONSITELIB/pgadmin4-web/pgAdmin4.py + /usr/bin/python3 PYTHONSITELIB/pgadmin4/pgAdmin4.py ++++++ fix-eventlet-select_epoll.patch ++++++ pgAdmin4 fails to build with eventlet 0.33.3, httpcore 0.17.1 and httpx 0.24.0 with the error: [ 12s] + python3 ../pkg/pip/setup_pip.py bdist_wheel [ 13s] Traceback (most recent call last): [ 13s] File "/home/abuild/rpmbuild/BUILD/pgadmin4-7.6/pip-build/../pkg/pip/setup_pip.py", line 56, in <module> [ 13s] import config [ 13s] File "/home/abuild/rpmbuild/BUILD/pgadmin4-7.6/pip-build/../web/config.py", line 32, in <module> [ 13s] from pgadmin.utils import env, IS_WIN, fs_short_path [ 13s] File "/home/abuild/rpmbuild/BUILD/pgadmin4-7.6/web/pgadmin/__init__.py", line 25, in <module> [ 13s] from flask_socketio import SocketIO [ 13s] File "/usr/lib/python3.11/site-packages/flask_socketio/__init__.py", line 9, in <module> [ 13s] from socketio import socketio_manage # noqa: F401 [ 13s] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [ 13s] File "/usr/lib/python3.11/site-packages/socketio/__init__.py", line 9, in <module> [ 13s] from .zmq_manager import ZmqManager [ 13s] File "/usr/lib/python3.11/site-packages/socketio/zmq_manager.py", line 5, in <module> [ 13s] import eventlet.green.zmq as zmq [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/__init__.py", line 17, in <module> [ 13s] from eventlet import convenience [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/convenience.py", line 7, in <module> [ 13s] from eventlet.green import socket [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/green/socket.py", line 21, in <module> [ 13s] from eventlet.support import greendns [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/support/greendns.py", line 79, in <module> [ 13s] setattr(dns, pkg, import_patched('dns.' + pkg)) [ 13s] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/support/greendns.py", line 61, in import_patched [ 13s] return patcher.import_patched(module_name, **modules) [ 13s] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/patcher.py", line 132, in import_patched [ 13s] return inject( [ 13s] ^^^^^^^ [ 13s] File "/usr/lib/python3.11/site-packages/eventlet/patcher.py", line 109, in inject [ 13s] module = __import__(module_name, {}, {}, module_name.split('.')[:-1]) [ 13s] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [ 13s] File "/usr/lib/python3.11/site-packages/dns/asyncquery.py", line 38, in <module> [ 13s] from dns.query import ( [ 13s] File "/usr/lib/python3.11/site-packages/dns/query.py", line 63, in <module> [ 13s] import httpcore [ 13s] File "/usr/lib/python3.11/site-packages/httpcore/__init__.py", line 1, in <module> [ 13s] from ._api import request, stream [ 13s] File "/usr/lib/python3.11/site-packages/httpcore/_api.py", line 5, in <module> [ 13s] from ._sync.connection_pool import ConnectionPool [ 13s] File "/usr/lib/python3.11/site-packages/httpcore/_sync/__init__.py", line 1, in <module> [ 13s] from .connection import HTTPConnection [ 13s] File "/usr/lib/python3.11/site-packages/httpcore/_sync/connection.py", line 12, in <module> [ 13s] from .._synchronization import Lock [ 13s] File "/usr/lib/python3.11/site-packages/httpcore/_synchronization.py", line 13, in <module> [ 13s] import trio [ 13s] File "/usr/lib/python3.11/site-packages/trio/__init__.py", line 18, in <module> [ 13s] from ._core import ( [ 13s] File "/usr/lib/python3.11/site-packages/trio/_core/__init__.py", line 27, in <module> [ 13s] from ._run import ( [ 13s] File "/usr/lib/python3.11/site-packages/trio/_core/_run.py", line 2452, in <module> [ 13s] from ._io_epoll import EpollIOManager as TheIOManager [ 13s] File "/usr/lib/python3.11/site-packages/trio/_core/_io_epoll.py", line 188, in <module> [ 13s] class EpollIOManager: [ 13s] File "/usr/lib/python3.11/site-packages/trio/_core/_io_epoll.py", line 189, in EpollIOManager [ 13s] _epoll = attr.ib(factory=select.epoll) [ 13s] ^^^^^^^^^^^^ [ 13s] AttributeError: module 'eventlet.green.select' has no attribute 'epoll' [ 13s] error: Bad exit status from /var/tmp/rpm-tmp.ElnKCg (%build) Setting the environment variable EVENTLET_NO_GREENDNS works around this while the upstream issue is fixed: https://github.com/eventlet/eventlet/issues/805 Index: pgadmin4-7.8/web/pgAdmin4.py =================================================================== --- pgadmin4-7.8.orig/web/pgAdmin4.py +++ pgadmin4-7.8/web/pgAdmin4.py @@ -20,6 +20,7 @@ if sys.version_info < (3, 4): 'or later.') import builtins import os +os.environ['EVENTLET_NO_GREENDNS'] = 'yes' # We need to include the root directory in sys.path to ensure that we can # find everything we need when running in the standalone runtime. ++++++ pgadmin4-7.6.tar.gz -> pgadmin4-7.8.tar.gz ++++++ /work/SRC/openSUSE:Factory/pgadmin4/pgadmin4-7.6.tar.gz /work/SRC/openSUSE:Factory/.pgadmin4.new.17445/pgadmin4-7.8.tar.gz differ: char 18, line 1 ++++++ pgadmin4-desktop ++++++ #!/usr/bin/python3 # # This is a small script that tries to replace pgadmin4-runtime as # a desktop version of pgadmin4. # pgadmin4-runtime uses NW.js (which is based on Chromium and Node.js) which # makes it hard to package in a standard way. # pgadmin4-desktop tries to be a simple replacement which just runs pgadmin4 # in runtime mode but uses Qt6 for the GUI in order to show an icon in the # system tray and provide two options: open a new browser window with pgAdmin # and quit the application. # # This script is released under the PostgreSQL License. # (C) 2023 Antonio Larrosa <alarr...@suse.com> import subprocess import os import os.path import uuid import socket import time import sys import fcntl from threading import Thread, Timer from PyQt6.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QSplashScreen from PyQt6.QtGui import QIcon, QAction, QPixmap, QImage, QPalette, QPainter from PyQt6.QtCore import QTimer, Qt class PGAdminDesktop(QApplication): def __init__(self): super().__init__(sys.argv) self.environ = os.environ self.pgadmin_process = None self.url = None self.setQuitOnLastWindowClosed(False) self.aboutToQuit.connect(self.cleanup) self.create_ui() pixmap = self.load_splash_pixmap() if pixmap: self.splash = QSplashScreen(pixmap) self.splash.showMessage("Starting pgAdmin.", Qt.AlignmentFlag.AlignBottom) self.splash.show() else: self.splash = None self.run_pgadmin_server() QTimer.singleShot(500, self.open_pgadmin) def load_splash_pixmap(self): paths = [path + '/pgadmin4/assets/welcome_logo.svg' for path in sys.path] paths = [path for path in paths if os.path.exists(path)] if not paths: return None return QPixmap(paths[0]) def run_pgadmin_server(self): if 'PGADMIN_INT_KEY' not in self.environ: self.environ['PGADMIN_INT_KEY'] = str(uuid.uuid4()) if 'PGADMIN_INT_PORT' not in self.environ: self.environ['PGADMIN_INT_PORT'] = '5051' self.environ['PGADMIN_SERVER_MODE'] = 'OFF' self.pgadmin_process = subprocess.Popen(['pgadmin4'], env=self.environ, shell=True) def create_ui(self): icon = QIcon.fromTheme("pgadmin4") self.tray = QSystemTrayIcon() self.tray.setIcon(icon) self.tray.setVisible(True) menu = QMenu() self.title = QAction("pgAdmin") self.title.setEnabled(False) menu.addAction(self.title) menu.addSeparator() self.openPGAdminAction = QAction("New Window") menu.addAction(self.openPGAdminAction) self.openPGAdminAction.triggered.connect(self.open_pgadmin) self.quitAction = QAction("Quit") menu.addAction(self.quitAction) self.quitAction.triggered.connect(self.quit) self.tray.setContextMenu(menu) def open_pgadmin_task(self): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) result = sock.connect_ex(('127.0.0.1', int(self.environ['PGADMIN_INT_PORT']))) c = 0 while result != 0 and c < 15: time.sleep(1) result = sock.connect_ex(('127.0.0.1', int(self.environ['PGADMIN_INT_PORT']))) c += 1 dots = "." * (c % 3 + 1) self.openPGAdminAction.setText("Opening pgAdmin" + dots) if self.splash and not self.splash.isHidden(): self.splash.showMessage("Starting pgAdmin" + dots, Qt.AlignmentFlag.AlignBottom) if result == 0: if self.splash: self.splash.hide() port = self.environ['PGADMIN_INT_PORT'] key = self.environ['PGADMIN_INT_KEY'] subprocess.run(["xdg-open", f"http://127.0.0.1:{port}/?key={key}"]) else: error_msg = 'Timeout waiting for pgAdmin to start. Exiting...' print(error_msg) self.splash.showMessage(error_msg, Qt.AlignmentFlag.AlignBottom) QTimer.singleShot(10000, self.quit) self.openPGAdminAction.setText("New Window") self.openPGAdminAction.setEnabled(True) def open_pgadmin(self): self.open_pgadmin_thread = Thread(target=self.open_pgadmin_task) self.openPGAdminAction.setText("Opening pgAdmin...") self.openPGAdminAction.setEnabled(False) self.open_pgadmin_thread.start() def cleanup(self): self.pgadmin_process.kill() if __name__ == '__main__': app = PGAdminDesktop() sys.exit(app.exec()) ++++++ pgadmin4.conf.in ++++++ --- /var/tmp/diff_new_pack.rr35xK/_old 2023-10-30 22:10:26.847468699 +0100 +++ /var/tmp/diff_new_pack.rr35xK/_new 2023-10-30 22:10:26.847468699 +0100 @@ -7,9 +7,9 @@ <IfDefine PGADMIN> WSGIDaemonProcess pgadmin processes=1 threads=25 -WSGIScriptAlias /pgadmin4 PYTHONSITELIB/pgadmin4-web/pgAdmin4.wsgi +WSGIScriptAlias /pgadmin4 PYTHONSITELIB/pgadmin4/pgAdmin4.wsgi -<Directory PYTHONSITELIB/pgadmin4-web/> +<Directory PYTHONSITELIB/pgadmin4/> WSGIProcessGroup pgadmin WSGIApplicationGroup %{GLOBAL} <IfModule mod_authz_core.c> ++++++ pgadmin4.desktop ++++++ [Desktop Entry] Name=pgAdmin 4 Exec=/usr/bin/pgadmin4-desktop Icon=pgadmin4 Type=Application Categories=Development;Database;GUIDesigner; MimeType=text/html Comment=Management tool for PostgreSQL Keywords=database;db;sql;query;administration;development; ++++++ pgadmin4.service.in ++++++ --- /var/tmp/diff_new_pack.rr35xK/_old 2023-10-30 22:10:26.891470322 +0100 +++ /var/tmp/diff_new_pack.rr35xK/_new 2023-10-30 22:10:26.895470470 +0100 @@ -18,7 +18,7 @@ User=pgadmin Group=pgadmin -ExecStart=PYTHONDIR PYTHONSITELIB/pgadmin4-web/pgAdmin4.py +ExecStart=PYTHONDIR PYTHONSITELIB/pgadmin4/pgAdmin4.py ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT ++++++ pgadmin4.uwsgi.in ++++++ --- /var/tmp/diff_new_pack.rr35xK/_old 2023-10-30 22:10:26.923471503 +0100 +++ /var/tmp/diff_new_pack.rr35xK/_new 2023-10-30 22:10:26.927471651 +0100 @@ -13,6 +13,6 @@ chown-socket = wwwrun:www plugin = python3 -chdir = PYTHONSITELIB/pgadmin4-web/ +chdir = PYTHONSITELIB/pgadmin4/ mount = /=pgAdmin4:app ++++++ update-vendor.sh ++++++ #!/bin/bash # # This script updates the vendor source package. # It should be run in the developer system in each pgadmin version update # # -- Antonio Larrosa <alarr...@suse.com> # version=`grep ^Version: *.spec | sed -e "s/^Version: *//"` if [ -d pgadmin4-$version ]; then echo "The directory pgadmin4-$version already exists. Please remove it in order to recreate it from scratch by running" echo "rm -Rf pgadmin4-$version" exit 1 fi quilt setup pgadmin4.spec pushd pgadmin4-$version quilt push -a # Build everything as documented by upstream make install-node ## We can run make bundle in %build so let's keep the things we do outside obs at a minimum #make bundle # Remove binary files that are not needed and shouldn't be packaged in a noarch package rm web/node_modules/ttf2woff2/build/Release/addon.node rm web/node_modules/ttf2woff2/build/Release/obj.target/addon.node rm web/node_modules/ttf2woff2/build/node_gyp_bins/python3 rm web/node_modules/mozjpeg/vendor/cjpeg rm web/node_modules/optipng-bin/vendor/optipng # Remove trash files rm web/node_modules/console-control-strings/README.md~ rm web/node_modules/form-data/README.md.bak # Remove development files rm -Rf web/node_modules/ttf2woff2/build/Release/obj.target/addon/csrc rm web/node_modules/nan/*.h rm web/node_modules/ttf2woff2/csrc/*/*.h # Fix files unnecessarily having the executable bit set find web/node_modules -type f \( -iname *.md -o -iname LICEN[CS]E -o -iname *.html -o -iname *.json -o -iname *.css -o -iname *.ttf -o -iname *.png \) -exec chmod -x "{}" \; tar cvfJ ../vendor.tar.xz web/node_modules web/pgadmin/misc/themes/pgadmin.themes.json web/pgadmin/static/js/generated/ web/yarn.lock popd