Git Product home page Git Product logo

Comments (8)

lkiesow avatar lkiesow commented on September 26, 2024

Hi @nyok92, to be honest, I never tried running pyCA on Ubuntu, and using the Debian repository indeed causes some problems and we should take a look at that.

For now, here is an installation method which works on Ubuntu 20.04:

apt update
apt install git python3 python3-venv libcurl4-openssl-dev libssl-dev gcc python3-dev ffmpeg
git clone https://github.com/opencast/pyCA.git
cd pyCA/
python3 -m venv venv
. ./venv/bin/activate
pip install -r requirements.txt 

# Start pyCA
./start.sh 

# Start UI
./start.sh ui

This should already be sufficient for testing pyCA.
You can run the pyCA services separately to make them more resilient. That's also what the repository is doing. But this will give you a fully functional capture agent and is a lot easier to test.

from pyca.

shaardie avatar shaardie commented on September 26, 2024

The underlying problem is that Ubuntu seems to have dropped the Python 2 binary for gunicorn and made the package gunicorn (and also the binary) the Python 3 version. See on Ubuntu:

$ apt-cache search gunicorn
gunicorn - Event-based HTTP/WSGI server
gunicorn-examples - Event-based HTTP/WSGI server (examples)
python3-gunicorn - Event-based HTTP/WSGI server (Python 3 libraries)

$ apt-cache show gunicorn
Package: gunicorn
Architecture: all
Version: 20.0.4-3
Priority: optional
Section: universe/python
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Chris Lamb <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 33
Provides: httpd-wsgi3
Depends: python3-gunicorn (= 20.0.4-3), python3:any
Suggests: python3-pastedeploy, python3-setproctitle, python3-tornado
Breaks: gunicorn3 (<< 19.9.0-1)
Filename: pool/universe/g/gunicorn/gunicorn_20.0.4-3_all.deb
Size: 11760
MD5sum: af1db6ffdd669b7a88695e65fadc3988
SHA1: 3a2d4c56197f6ff4522f274abec4ce1e494c739d
SHA256: 8bf1ea4eeb33585c9d076455050c7a611ccca28f766a6760e74500647af91b0f
Homepage: https://gunicorn.org/
Description: Event-based HTTP/WSGI server
Description-md5: 2ff72d8c5c219c7f7f89448c09a76c6c

Debian does have both and therefor names the Python 3 package and binary for Gunicorn gunicorn3, see:

$ apt-cache search gunicorn
gunicorn - Event-based HTTP/WSGI server (Python 2 version)
gunicorn-examples - Event-based HTTP/WSGI server (examples)
gunicorn3 - Event-based HTTP/WSGI server (Python 3 version)
python-gunicorn - Event-based HTTP/WSGI server (Python 2 libraries)
python3-gunicorn - Event-based HTTP/WSGI server (Python 3 libraries)

$ apt-cache show gunicorn
Package: gunicorn
Version: 19.9.0-1
Installed-Size: 37
Maintainer: Chris Lamb <[email protected]>
Architecture: all
Provides: httpd-wsgi
Depends: python-gunicorn (= 19.9.0-1), python-pkg-resources, python-setuptools, python:any
Suggests: gunicorn-examples (= 19.9.0-1), python-gevent, python-pastedeploy, python-setproctitle, python-tornado
Description: Event-based HTTP/WSGI server (Python 2 version)
Description-md5: 787ef38c95705afb05a8c411753d128c
Homepage: http://gunicorn.org/
Section: httpd
Priority: optional
Filename: pool/main/g/gunicorn/gunicorn_19.9.0-1_all.deb
Size: 18120
MD5sum: 514b26302445ba1cbe9ed8b08625b15a
SHA256: 73f70cfb7389f070fb8d2f8dac605829418ec31a1dc60818c02a4c11a49ef0d8

$ apt-cache show gunicorn3
Package: gunicorn3
Source: gunicorn
Version: 19.9.0-1
Installed-Size: 33
Maintainer: Chris Lamb <[email protected]>
Architecture: all
Depends: python3-gunicorn (= 19.9.0-1), python3:any
Suggests: gunicorn-examples (= 19.9.0-1), python3-pastedeploy, python3-setproctitle, python3-tornado
Description: Event-based HTTP/WSGI server (Python 3 version)
Description-md5: 7ad8685995d2844d45d14f1f87394b11
Homepage: http://gunicorn.org/
Section: httpd
Priority: optional
Filename: pool/main/g/gunicorn/gunicorn3_19.9.0-1_all.deb
Size: 17636
MD5sum: 9c25d30c69b5c212d63ce4431fade8ec
SHA256: cf56ceeb66e6f5e550a1fbd18383a25881ce59abfc11a35dffbd677a0b7e37d9

Maybe a solution would be to skip the Gunicorn binary, depend on python3-gunicorn and run Gunicorn directly from Python, like

python3 -m gunicorn.app.wsgiapp pyca.ui:app

This is described in https://docs.gunicorn.org/en/stable/custom.html#direct-usage-of-existing-wsgi-apps

from pyca.

nyok92 avatar nyok92 commented on September 26, 2024

Hi,
Thanks for the advices.
I tried with this cmd: python3 -m gunicorn.app.wsgiapp pyca.ui:app
But Pyca failed to launch correctly:

[2020-06-12 13:37:47 +0200] [2245] [INFO] Starting gunicorn 20.0.4
[2020-06-12 13:37:47 +0200] [2245] [INFO] Listening at: http://127.0.0.1:8000 (2245)
[2020-06-12 13:37:47 +0200] [2245] [INFO] Using worker: sync
[2020-06-12 13:37:47 +0200] [2247] [INFO] Booting worker with pid: 2247
[2020-06-12 13:37:47 +0200] [2247] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/usr/lib/python3/dist-packages/gunicorn/workers/base.py", line 119, in init_process
self.load_wsgi()
File "/usr/lib/python3/dist-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/lib/python3/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/lib/python3/dist-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/usr/lib/python3/dist-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/lib/python3/dist-packages/gunicorn/util.py", line 383, in import_app
mod = importlib.import_module(module)
File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 961, in _find_and_load_unlocked
File "", line 219, in _call_with_frames_removed
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'pyca'
[2020-06-12 13:37:47 +0200] [2247] [INFO] Worker exiting (pid: 2247)
[2020-06-12 13:37:47 +0200] [2245] [INFO] Shutting down: Master
[2020-06-12 13:37:47 +0200] [2245] [INFO] Reason: Worker failed to boot.

from pyca.

shaardie avatar shaardie commented on September 26, 2024

@nyok92 This seems like another error. It does not find the pyca module. This could have several reasons. The solution is most likely to properly install pyca or to run the command directly in the git repository.

Nonetheless we will try to provide a Debian package which is also usable under Ubuntu. Until then, you could probably best stick to @lkiesow suggestion.

from pyca.

nyok92 avatar nyok92 commented on September 26, 2024

Thanks @shaardie
I can't install the deb repo opencast-pyca because it depends of guicorn3 but thi isn't installable on ubuntu20.04
I tried to run the previous cmd in the git repo, but with no more success ( the same logs appears)

Then, with @lkiesow suggestion, i can't pass the pip install -r requirements.txt (see logs)

Thanks for your support both
Maybe i could wait until the next debian package :)

Installatioh logs
(venv) galicaster@galicaster-mobile:~/pyCA$ pip install -r requirements.txt
Collecting pycurl>=7.19.5
  Using cached pycurl-7.43.0.5.tar.gz (216 kB)
Collecting python-dateutil>=2.4.0
  Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting configobj>=5.0.0
  Using cached configobj-5.0.6.tar.gz (33 kB)
Collecting sqlalchemy>=0.9.8
  Using cached SQLAlchemy-1.3.17-cp38-cp38-manylinux2010_x86_64.whl (1.3 MB)
Collecting sdnotify>=0.3.2
  Using cached sdnotify-0.3.2.tar.gz (2.5 kB)
Collecting flask
  Using cached Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting six>=1.5
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting Werkzeug>=0.15
  Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting click>=5.1
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Jinja2>=2.10.1
  Using cached Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Collecting itsdangerous>=0.24
  Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting MarkupSafe>=0.23
  Using cached MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl (32 kB)
Building wheels for collected packages: pycurl, configobj, sdnotify
  Building wheel for pycurl (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-f9_yn5nm
       cwd: /tmp/pip-install-m4pjlibv/pycurl/
  Complete output (8 lines):
  Using curl-config (libcurl 7.68.0)
  Using SSL library: OpenSSL/LibreSSL/BoringSSL
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for pycurl
  Running setup.py clean for pycurl
  Building wheel for configobj (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/configobj/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/configobj/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-4zssfj8_
       cwd: /tmp/pip-install-m4pjlibv/configobj/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for configobj
  Running setup.py clean for configobj
  Building wheel for sdnotify (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/sdnotify/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/sdnotify/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-b23u3iza
       cwd: /tmp/pip-install-m4pjlibv/sdnotify/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for sdnotify
  Running setup.py clean for sdnotify
Failed to build pycurl configobj sdnotify
Installing collected packages: pycurl, six, python-dateutil, configobj, sqlalchemy, sdnotify, Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
    Running setup.py install for pycurl ... error
    ERROR: Command errored out with exit status 1:
     command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-dq_0m2j3/install-record.txt --single-version-externally-managed --compile --install-headers /home/galicaster/pyCA/venv/include/site/python3.8/pycurl
         cwd: /tmp/pip-install-m4pjlibv/pycurl/
    Complete output (31 lines):
    Using curl-config (libcurl 7.68.0)
    Using SSL library: OpenSSL/LibreSSL/BoringSSL
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.8
    creating build/lib.linux-x86_64-3.8/curl
    copying python/curl/__init__.py -> build/lib.linux-x86_64-3.8/curl
    running build_ext
    building 'pycurl' extension
    creating build/temp.linux-x86_64-3.8
    creating build/temp.linux-x86_64-3.8/src
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/docstrings.c -o build/temp.linux-x86_64-3.8/src/docstrings.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easy.c -o build/temp.linux-x86_64-3.8/src/easy.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easycb.c -o build/temp.linux-x86_64-3.8/src/easycb.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyinfo.c -o build/temp.linux-x86_64-3.8/src/easyinfo.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyopt.c -o build/temp.linux-x86_64-3.8/src/easyopt.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyperform.c -o build/temp.linux-x86_64-3.8/src/easyperform.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/module.c -o build/temp.linux-x86_64-3.8/src/module.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/multi.c -o build/temp.linux-x86_64-3.8/src/multi.o
    x86_64-linux-gnu-(venv) galicaster@galicaster-mobile:~/pyCA$ pip install -r requirements.txt
Collecting pycurl>=7.19.5
  Using cached pycurl-7.43.0.5.tar.gz (216 kB)
Collecting python-dateutil>=2.4.0
  Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting configobj>=5.0.0
  Using cached configobj-5.0.6.tar.gz (33 kB)
Collecting sqlalchemy>=0.9.8
  Using cached SQLAlchemy-1.3.17-cp38-cp38-manylinux2010_x86_64.whl (1.3 MB)
Collecting sdnotify>=0.3.2
  Using cached sdnotify-0.3.2.tar.gz (2.5 kB)
Collecting flask
  Using cached Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting six>=1.5
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting Werkzeug>=0.15
  Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting click>=5.1
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Jinja2>=2.10.1
  Using cached Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Collecting itsdangerous>=0.24
  Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting MarkupSafe>=0.23
  Using cached MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl (32 kB)
Building wheels for collected packages: pycurl, configobj, sdnotify
  Building wheel for pycurl (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-f9_yn5nm
       cwd: /tmp/pip-install-m4pjlibv/pycurl/
  Complete output (8 lines):
  Using curl-config (libcurl 7.68.0)
  Using SSL library: OpenSSL/LibreSSL/BoringSSL
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for pycurl
  Running setup.py clean for pycurl
  Building wheel for configobj (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/configobj/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/configobj/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-4zssfj8_
       cwd: /tmp/pip-install-m4pjlibv/configobj/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for configobj
  Running setup.py clean for configobj
  Building wheel for sdnotify (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/sdnotify/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/sdnotify/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-b23u3iza
       cwd: /tmp/pip-install-m4pjlibv/sdnotify/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help
 
  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for sdnotify
  Running setup.py clean for sdnotify
Failed to build pycurl configobj sdnotify
Installing collected packages: pycurl, six, python-dateutil, configobj, sqlalchemy, sdnotify, Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
    Running setup.py install for pycurl ... error
    ERROR: Command errored out with exit status 1:
     command: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-dq_0m2j3/install-record.txt --single-version-externally-managed --compile --install-headers /home/galicaster/pyCA/venv/include/site/python3.8/pycurl
         cwd: /tmp/pip-install-m4pjlibv/pycurl/
    Complete output (31 lines):
    Using curl-config (libcurl 7.68.0)
    Using SSL library: OpenSSL/LibreSSL/BoringSSL
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.8
    creating build/lib.linux-x86_64-3.8/curl
    copying python/curl/__init__.py -> build/lib.linux-x86_64-3.8/curl
    running build_ext
    building 'pycurl' extension
    creating build/temp.linux-x86_64-3.8
    creating build/temp.linux-x86_64-3.8/src
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/docstrings.c -o build/temp.linux-x86_64-3.8/src/docstrings.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easy.c -o build/temp.linux-x86_64-3.8/src/easy.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easycb.c -o build/temp.linux-x86_64-3.8/src/easycb.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyinfo.c -o build/temp.linux-x86_64-3.8/src/easyinfo.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyopt.c -o build/temp.linux-x86_64-3.8/src/easyopt.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/easyperform.c -o build/temp.linux-x86_64-3.8/src/easyperform.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/module.c -o build/temp.linux-x86_64-3.8/src/module.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/multi.c -o build/temp.linux-x86_64-3.8/src/multi.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/oscompat.c -o build/temp.linux-x86_64-3.8/src/oscompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/pythoncompat.c -o build/temp.linux-x86_64-3.8/src/pythoncompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/share.c -o build/temp.linux-x86_64-3.8/src/share.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/stringcompat.c -o build/temp.linux-x86_64-3.8/src/stringcompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/threadsupport.c -o build/temp.linux-x86_64-3.8/src/threadsupport.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/util.c -o build/temp.linux-x86_64-3.8/src/util.o
    x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.8/src/docstrings.o build/temp.linux-x86_64-3.8/src/easy.o build/temp.linux-x86_64-3.8/src/easycb.o build/temp.linux-x86_64-3.8/src/easyinfo.o build/temp.linux-x86_64-3.8/src/easyopt.o build/temp.linux-x86_64-3.8/src/easyperform.o build/temp.linux-x86_64-3.8/src/module.o build/temp.linux-x86_64-3.8/src/multi.o build/temp.linux-x86_64-3.8/src/oscompat.o build/temp.linux-x86_64-3.8/src/pythoncompat.o build/temp.linux-x86_64-3.8/src/share.o build/temp.linux-x86_64-3.8/src/stringcompat.o build/temp.linux-x86_64-3.8/src/threadsupport.o build/temp.linux-x86_64-3.8/src/util.o -lssl -lcrypto -lcurl -o build/lib.linux-x86_64-3.8/pycurl.cpython-38-x86_64-linux-gnu.so
    running install_lib
    creating /home/galicaster/pyCA/venv/lib/python3.8/site-packages/curl
    error: could not create '/home/galicaster/pyCA/venv/lib/python3.8/site-packages/curl': Permission denied
    ----------------------------------------
ERROR: Command errored out with exit status 1: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-dq_0m2j3/install-record.txt --single-version-externally-managed --compile --install-headers /home/galicaster/pyCA/venv/include/site/python3.8/pycurl Check the logs for full command output.
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/oscompat.c -o build/temp.linux-x86_64-3.8/src/oscompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/pythoncompat.c -o build/temp.linux-x86_64-3.8/src/pythoncompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/share.c -o build/temp.linux-x86_64-3.8/src/share.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/stringcompat.c -o build/temp.linux-x86_64-3.8/src/stringcompat.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/threadsupport.c -o build/temp.linux-x86_64-3.8/src/threadsupport.o
    x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPYCURL_VERSION="7.43.0.5" -DHAVE_CURL_SSL=1 -DHAVE_CURL_OPENSSL=1 -DHAVE_CURL_SSL=1 -I/home/galicaster/pyCA/venv/include -I/usr/include/python3.8 -c src/util.c -o build/temp.linux-x86_64-3.8/src/util.o
    x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.8/src/docstrings.o build/temp.linux-x86_64-3.8/src/easy.o build/temp.linux-x86_64-3.8/src/easycb.o build/temp.linux-x86_64-3.8/src/easyinfo.o build/temp.linux-x86_64-3.8/src/easyopt.o build/temp.linux-x86_64-3.8/src/easyperform.o build/temp.linux-x86_64-3.8/src/module.o build/temp.linux-x86_64-3.8/src/multi.o build/temp.linux-x86_64-3.8/src/oscompat.o build/temp.linux-x86_64-3.8/src/pythoncompat.o build/temp.linux-x86_64-3.8/src/share.o build/temp.linux-x86_64-3.8/src/stringcompat.o build/temp.linux-x86_64-3.8/src/threadsupport.o build/temp.linux-x86_64-3.8/src/util.o -lssl -lcrypto -lcurl -o build/lib.linux-x86_64-3.8/pycurl.cpython-38-x86_64-linux-gnu.so
    running install_lib
    creating /home/galicaster/pyCA/venv/lib/python3.8/site-packages/curl
    error: could not create '/home/galicaster/pyCA/venv/lib/python3.8/site-packages/curl': Permission denied
    ----------------------------------------
ERROR: Command errored out with exit status 1: /home/galicaster/pyCA/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"'; __file__='"'"'/tmp/pip-install-m4pjlibv/pycurl/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-dq_0m2j3/install-record.txt --single-version-externally-managed --compile --install-headers /home/galicaster/pyCA/venv/include/site/python3.8/pycurl Check the logs for full command output.

EDIT: Some formatting done by @lkiesow for readability

from pyca.

lkiesow avatar lkiesow commented on September 26, 2024
error: could not create '/home/galicaster/pyCA/venv/lib/python3.8/site-packages/curl': Permission denied

That sounds like you ran some of the commands with root privileges so that are aren't allowed to write to this as a normal user any longer.

Maybe i could wait until the next debian package :)

Sure. That way, you don't need to deal with this :D
We will likely bring out a new version shortly anyway.

from pyca.

lkiesow avatar lkiesow commented on September 26, 2024

python3 -m gunicorn.app.wsgiapp pyca.ui:app

@shaardie, do we want to use this in the Systemd units as well?

ExecStart=/usr/bin/gunicorn --config=/etc/pyca/gunicorn.conf.py pyca.ui:app

…would then become

ExecStart=/usr/bin/python3 -m gunicorn.app.wsgiapp --config=/etc/pyca/gunicorn.conf.py pyca.ui:app

from pyca.

shaardie avatar shaardie commented on September 26, 2024

Yes, that's the idea. We can do this here, instead of the packaging, so our software will get more usable across different OS's.

from pyca.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.