Giter Club home page Giter Club logo

shadowsocks-manager's Introduction

License GitHub last commit GitHub issues GitHub pull requests GitHub tag

GitHub Actions - CI Unit test GitHub Actions - CI TestPyPI GitHub Actions - CI PyPI PyPI Package Version codecov CodeFactor

GitHub Actions - CI Docker Build and Push Docker Image Version

shadowsocks-manager

A web-based Shadowsocks management tool.

Features:

  • Central user management
  • Heartbeat on Shadowsocks ports(users)
  • Shadowsocks multi-user API
  • Shadowsocks node cluster
  • Statistic for network traffic usage
  • Scheduled jobs
  • dns-lexicon API
  • Auto-creating DNS records
  • Production deployment ready
  • How's the Shadowsocks supported:
    • libev edition:
      • Full functional.
    • python edition:
      • Lacks the collection of traffic statistics.
      • Lacks the ability to test user port creation status.

Code in Python, base on Django, Django REST framework, Celery, and SQLite.

The development status can be found at: project home.

Screenshots

Shadowsocks Node List: Home › Shadowsocks › Shadowsocks Nodes

Add Shadowsocks Node: Home › Shadowsocks › Shadowsocks Nodes

Add Shadowsocks Account: Home › Shadowsocks › Shadowsocks Accounts

1. Requirements

2. Install

This project is a part of an entire VPN solution, which includes the Shadowsocks server and Shadowsocks manager. The Shadowsocks server serves the traffic, the Shadowsocks manager serves the users and the traffic statistics. The solution is designed to be deployed in the AWS cloud. If you are looking for such a solution, you can refer to the repo aws-cfn-vpn. With aws-cfn-vpn, you can deploy the entire solution with a few commands.

2.1. Dependencies

Assume you have installed the Docker on your host.

2.2. Manual installation

# create a docker network
docker network create ssm-network

# run memcached, used by django cache
docker run -d --network ssm-network --name ssm-memcached memcached

# run rabbitmq, used by celery
docker run -d --network ssm-network --name ssm-rabbitmq rabbitmq

# create a directory to store the data, it will be mounted to the shadowsocks-manager container
mkdir -p ~/ssm-volume

# run the shadowsocks-manager with HTTPS and DNS API enabled
# please replace the options with your own settings
docker run -d -p 80:80 -p 443:443 -v ~/ssm-volume:/var/local/ssm \
    --network ssm-network --name ssm alexzhangs/shadowsocks-manager \
    -e SSM_SECRET_KEY=yourkey -e SSM_DEBUG=False \
    -e SSM_MEMCACHED_HOST=ssm-memcached -e SSM_RABBITMQ_HOST=ssm-rabbitmq \
    -u admin -p yourpassword -M [email protected] \
    -d admin.ss.example.com -a 127.0.0.1 -S
    -E PROVIDER=namecom,LEXICON_PROVIDER_NAME=namecom,LEXICON_NAMECOM_AUTH_USERNAME=your_username,LEXICON_NAMECOM_AUTH_TOKEN=your_token

2.3. Install with script

git clone https://github.com/alexzhangs/shadowsocks-manager
bash shadowsocks-manager/install.sh -u admin -p yourpassword -M [email protected] \
    -d admin.ss.example.com -a 127.0.0.1 -S \
    -E PROVIDER=namecom,LEXICON_PROVIDER_NAME=namecom,LEXICON_NAMECOM_AUTH_USERNAME=your_username,LEXICON_NAMECOM_AUTH_TOKEN=your_token

2.4. Verify the installation

If all go smoothly, the shadowsocks-manager services should have been all started. Open the web admin console in a web browser, and log on with the admin user.

Use (depends on your settings):

https://admin.ss.example.com/admin

or:

https://localhost/admin

or fall back to HTTP:

http://localhost/admin

If goes well, then congratulations! The installation has succeeded.

By default, the following entries are added to Django's ALLOWED_HOSTS setting:

  • localhost
  • 127.0.0.1
  • admin.ss.example.com (whatever provided with -d option)

Use -e SSM_ALLOWED_SITES_DEFAULTS_PLUS=$ip_address to add the additional IP address (such as the private IP address of your server) to the ALLOWED_HOSTS setting.

Use -e SSM_ALLOWED_SITES_DYNAMIC_PUBLIC_IP=True to allow the dynamic public IP address to be added to the ALLOWED_HOSTS setting.

For more options, refer to the help message of the scripts:

bash shadowsocks-manager/install.sh -h
bash shadowsocks-manager/docker/docker-entrypoint.sh -h
bash shadowsocks-manager/bin/ssm-setup.sh -h

3. Using shadowsocks-manager

  1. Shadowsocks server

    First, you need to have a Shadowsocks server with the multi-user API enabled.

    Install it with docker on the same docker network with shadowsocks-manager.

    # run shadowsocks-libev
    MGR_PORT=6001
    SS_PORTS=8381-8385
    ENCRYPT=aes-256-gcm
    docker run -d -p $SS_PORTS:$SS_PORTS/UDP -p $SS_PORTS:$SS_PORTS \
        --network ssm-network --name ssm-ss-libev shadowsocks/shadowsocks-libev:edge \
        ss-manager --manager-address 0.0.0.0:$MGR_PORT \
        --executable /usr/local/bin/ss-server -m $ENCRYPT -s 0.0.0.0 -u
    
    # Use below command to get the private IP address of the shadowsocks-libev container for later configuration.
    docker inspect ssm-ss-libev | grep IPAddress
  2. Add Shadowsocks server to shadowsocks-manager

    Add the Shadowsocks server as a Node of shadowsocks-manager from web admin console: Home › Shadowsocks › Shadowsocks Nodes.

    For the field Private IP, use the IP address abtained from the previous step. For the field Interface for the Shadowsocks manager, choose Private.

  3. Create users(ports) and assign Shadowsocks Node

    Create users from web admin console: Home › Shadowsocks › Shadowsocks Accounts and assign the existing nodes to them.

    After a few seconds, the created user ports should be available to your Shadowsocks client.

4. Sendmail (Optional)

sendmail is used to send account notification Email, it should be configured on the same server with shadowsocks-manager.

About how to configure sendmail client to use AWS SES as SMTP server on AWS EC2 instance, refer to repo aws-ec2-ses.

On macOS, refer to repo macos-aws-ses.

NOTE: This dependency needs the manual setup anyway, it is not handled by any installation script.

5. Differences from the alternation: shadowsocks/shadowsocks-manager

This repo Do's:

  • Serve as a nonprofit business model.
  • Have central user management for multi nodes.
  • Collect traffic statistic that can be viewed by account, node, and period.
  • Show the existence and accessibility of ports in the admin.
  • Handle the DNS records if using Name.com as nameserver.

This repo Don'ts:

  • Handle self-serviced user registration.
  • Handle bill or payment.
  • Need to run an additional agent on each Shadowsocks server.

6. Some differences between the Shadowsocks Python edition (2.8.2) and libev edition

Version status for the Shadowsocks Python edition:

Although the Shadowsocks Python edition supports the multi-user API, but it doesn't fit this project, here's why:

  • The python edition code and doc seem to be out of maintenance due to some reason. If you really need this you probably need to fork it and make your own.
  • They are having different service process names and CLI interfaces which introduces the complexity of installation.
  • The Python edition lacks the list commands. A pull request was opened years ago but never merged.
  • The Python edition's stat command has a very different way to use, I didn't figure the usage syntax out by looking into the code.
  • The Python edition's ping command returns a simple string pong rather than a list of ports.
  • The Python edition's ping command has to be sent as the syntax: ping:{} in order to work if tested with nc. It caused by the tailing newline: ping\n.

So either you get some change on your own or stick with the libev edition.

7. Known Issues

  1. The Shadowsocks Python edition's ssserver won't start on macOS. The error message is like:

    $ ssserver -k passw0rd
    WARNING: /Users/***/.pyenv/versions/3.12.0/envs/ssm-3.12/bin/python3.12 is loading libcrypto in an unsafe way
    Abort trap: 6
    

    Solution: Link the homebrew openssl library to the system library.

    sudo ln -s /opt/homebrew/opt/openssl/lib/libcrypto.dylib /usr/local/lib/
    sudo ln -s /opt/homebrew/opt/openssl/lib/libssl.dylib /usr/local/lib/
  2. Install the project by source with pip under Python 2.7 get error:

    python --version
    Python 2.7.18
    
    pip install .
    

    Error message:

    ...
    Collecting pyyaml
    Downloading PyYAML-5.4.1.tar.gz (175 kB)
        |████████████████████████████████| 175 kB 392 kB/s 
    Installing build dependencies ... done
    Getting requirements to build wheel ... error
    ERROR: Command errored out with exit status 1:
    ...
        raise AttributeError, attr
    AttributeError: cython_sources
    ...
    

    Solution:

    pip install setuptools wheel
    pip install --no-build-isolation .
  3. Install the project with pip under python 2.7 get error:

    python --version
    Python 2.7.18
    
    pip install .
    

    Error message:

    ...
    Building wheels for collected packages: cryptography
        Building wheel for cryptography (PEP 517) ... error
        ERROR: Command errored out with exit status 1:
    
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:18674:10: error: call to undeclared function 'ERR_GET_FUNC'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            return ERR_GET_FUNC(x0);
            ^
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:18690:14: error: call to undeclared function 'ERR_GET_FUNC'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            { result = ERR_GET_FUNC(x0); }
                    ^
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:23389:10: error: call to undeclared function 'FIPS_mode'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            return FIPS_mode();
                ^
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:23400:14: error: call to undeclared function 'FIPS_mode'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            { result = FIPS_mode(); }
                    ^
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:23415:10: error: call to undeclared function 'FIPS_mode_set'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            return FIPS_mode_set(x0);
            ^
        build/temp.macosx-14.2-arm64-2.7/_openssl.c:23431:14: error: call to undeclared function 'FIPS_mode_set'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            { result = FIPS_mode_set(x0); }
    ...
    ERROR: Failed building wheel for cryptography
    

    Solution:

    brew install [email protected]
  4. Domain record is not synced into DNS provider as expected.

    There might be a conflict record in the DNS provider. For example, a record with the same name but different type, such as CNAME. The sync process will be limited to the records with same type and name, it won't touched any other records.

    Solution:

    1. Remove the conflict record from the DNS provider by yourself.
    2. Run the sync process again.

8. Development

The development of this project requires Python 3.x.

However, the installation of the project is compatible with both Python 2.7 and 3.x. To keep the compatibility is difficult, but it's kept due to the historical reason. The following files are kept only for installing the source distribution of the PyPI package under Python 2.7:

  • setup.py
  • setup.cfg

8.1. Development Environment Setup

  1. Install Docker Desktop
  1. Install pyenv (macOS)

    brew install pyenv pyenv-virtualenv
  2. Bootstrap the tox environment

    pyenv install 3.12
    pyenv virtualenv 3.12 tox
    pyenv activate tox
    pip install -r tox.txt
    export VIRTUALENV_DISCOVERY=pyenv
    tox list -q

    To test the project with Python 2.7, need:

    pyenv virtualenv 3.12 tox-27
    pyenv activate tox-27
    pip install -r tox-27.txt
    export VIRTUALENV_DISCOVERY=pyenv
    tox list -q
  3. Install the Python versions that the project should test against

    pyenv install 2.7 3.7 3.8 3.9 3.10 3.11
  4. Clone the project code

    git clone https://github.com/alexzhangs/shadowsocks-manager
    cd shadowsocks-manager
  5. Start the development environment

    tox run -qe dev
  6. Run the unit tests against all the supported Python versions

    tox run -qe py37,py38,py39,py310,py311,py312
  7. Combine the coverage data and generate the report

    tox run -qe cov
  8. Upload the coverage report to codecov

    Make sure the CODECOV_TOKEN is exported in the environment before uploading.

    export CODECOV_TOKEN=codecov_token
    tox run -qe codecov
  9. Build the PyPI package

    # build source and binary distribution, equivalent to `python setup.py sdist bdist_wheel`
    # universal wheel is enabled in the pyproject.toml to make the wheel compatible with both Python 2 and 3
    tox run -qe pypi
  10. Run the Github workflows ci-unittest locally

    brew install act gh
    act --list
    
    export GITHUB_PAT_PUB_RO=github_pat
    export CODECOV_TOKEN=codecov_token
    export PRIVATE_IP=$(ipconfig getifaddr en0 2>/dev/null || hostname -i | cut -d " " -f1 2>/dev/null)
    
    tox run -qe act-ci-unittest
    
    # multiple Python versions
    tox run -qe act-ci-unittest -- --matrix python-version:3.7 --matrix python-version:3.8
  11. Build the Docker images and run the containers

    # optional environment variables:
    export DOCKER_BUILD_ARGS_PROXY='--build-arg https_proxy=http://host.docker.internal:1086'
    export SSM_DEV_BAR_OPTIONS='-p -P'
    export SSM_DEV_DOCKER_RUN_CMD_OPTIONS='-d admin.ss.example.com -t A -a 127.0.0.1 -S -E PROVIDER=namecom,LEXICON_PROVIDER_NAME=namecom,LEXICON_NAMECOM_AUTH_USERNAME=your_username,LEXICON_NAMECOM_AUTH_TOKEN=your_token'
    
    tox run -qe bar
  12. Run a full test locally, including all the above steps:

    Make sure all the environment variables are set before running the full test.

    tox run -q
  13. Upload the PyPI package

    Set the ~/.pypirc file with the API token from the TestPyPI and PyPI before uploading.

    pip install twine
    
    # upload the package to TestPyPI
    python -m twine upload --repository testpypi dist/*
    
    # upload the package to PyPI
    python -m twine upload dist/*
  14. Test the PyPI package

    # install the package from TestPyPI
    # --no-deps is used to skip installing dependencies for the TestPyPI environment
    pip install -i https://test.pypi.org/simple/ --no-deps shadowsocks-manager
    
    # install the package from PyPI
    # --no-binary is used to force building the package from the source
    # --use-pep517 is used together to make sure the PEP 517 is tested
    pip install --no-binary shadowsocks-manager --use-pep517 shadowsocks-manager

8.2. CI/CD

Github Actions is currently used for the CI/CD. Travis CI is removed due to the limitation of the free plan.

The CI/CD workflows are defined in the .github/workflows directory.

  • ci-unittest.yml: Run the unit tests.
  • ci-testpypi.yml: Build and upload the package to TestPyPI.
  • ci-pypi.yml: Build and upload the package to PyPI. It can be triggered by the tag: ci-pypi or ci-pypi-(major|minor|patch|suffx).
  • ci-docker.yml: Build and push the docker image to Docker Hub. It can be triggered by the Github release.

9. Troubleshooting

  1. Docker

    # containers
    docker ps -a
    
    # network
    docker network ls
    
    # logs
    docker logs <container_id>
    
  2. Check the logs (inside container)

    # supervisor (debian)
    cat /var/log/supervisor/supervisord.log 
    
    # supervisor (alpine)
    cat /var/log/supervisord.log
    
    # uWSGI
    cat /var/log/ssm-uwsgi.log
    
    # Celery
    cat /var/log/ssm-cerlery*
    
  3. Check the services (inside container)

    # nginx
    nginx -s {stop|quit|reopen|reload}
    
    # supervisor
    supervisorctl reload
    supervisorctl start all
    
    # uWSGI
    supervisorctl start ssm-uwsgi
    
    # Celery
    supervisorctl start ssm-celery-worker
    supervisorctl start ssm-celery-beat
    
    # acme.sh
    acme.sh --list
    crontab -l
    ls -l /root/.acme.sh
    
    # volume data
    ls -la /var/local/ssm
    
    # setup done files
    ls -la /var/local/ssm/.*done
    ls -la /root/.*done
    
  4. Check the listening ports and processes (Linux)

    # TCP
    netstat -tanp
    
    # UDP
    netstat -uanp
    
  5. Check the listening ports (MacOS)

    # TCP
    netstat -anp tcp
    
    # UDP
    netstat -anp udp
    
    # find the process by port
    lsof -i :80 -P
    

10. Security Considerations

  1. Never run the shadowsocks-manager service with the Django 'DEBUG' mode enabled in production or even for evaluation. Especially when the default password is used, the debug mode will expose your env in the error page. This option should be enabled only for the development on the local machine.

    • The 'DEBUG' mode is disabled by default in the docker image.
    • The 'DEBUG' mode is enabled by default in the pypi package, it should be disabled if not for development.
  2. Never run the shadowsocks-manager service with the default password on the network other than the localhost.

  3. Never run the shadowsocks-manager service without HTTPS enabled on the network other than the localhost. Otherwise, the password will be sent in plain text over public or private networks.

  4. Never run the shadowsocks-manager service and the ss-manager service across the untrusted network without the firewall enabled, such as Internet, untrusted private network, etc.

    The ss-manager service does not support authentication. Anyone who can access the service port can control the Shadowsocks server, including creating, deleting, and listing user ports and passwords.

    To secure the ss-manager service, you can consider the following methods:

    • Use VPC, VPN, or a private network to isolate the ss-manager service from the public network.
    • Use VPC peering connection or DC gateway to connect the shadowsocks-manager service and the ss-manager service if they are in different VPCs.
    • Ensure that the network traffic between the shadowsocks-manager service and the ss-manager service cannot be sniffed by untrusted parties.
    • Use firewall rules to limit access to the ss-manager service port only from the shadowsocks-manager service.

    Please note that the running infrastructure and deploying architecture may vary, so it's important to pay extra attention to this issue.

shadowsocks-manager's People

Contributors

alexzhangs avatar dependabot[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

shadowsocks-manager's Issues

can't install

[root@do-1v-2g-2t-sfo2-01 shadowsocks-manager]# pip install -r requirements.txt
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting backports.weakref (from -r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/88/ec/f598b633c3d5ffe267aaada57d961c94fdfa183c5c3ebda2b6d151943db6/backports.weakref-1.0.post1-py2.py3-none-any.whl
Collecting celery==4.3.0 (from -r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/5c/a1/a3dd9d8bfa09156ec2cba37f90accf35c0f4ecc3980d96cb4fb99e56504b/celery-4.3.0-py2.py3-none-any.whl
Collecting Django==1.11.20 (from -r requirements.txt (line 3))
  Using cached https://files.pythonhosted.org/packages/8e/1f/20bbc601c442d02cc8d9b25a399a18ef573077e3350acdf5da3743ff7da1/Django-1.11.20-py2.py3-none-any.whl
Collecting django-cache-lock==0.2.1 (from -r requirements.txt (line 4))
  Using cached https://files.pythonhosted.org/packages/b7/e4/baa986fb268430d313d4f780c906ebfe2a6eaac30236955edb993833445d/django_cache_lock-0.2.1-py2.py3-none-any.whl
Collecting django-celery-beat==1.5.0 (from -r requirements.txt (line 5))
  Using cached https://files.pythonhosted.org/packages/88/13/2dbab42ea826efab897d8638304d499078e0093e73c9b5fa19259e48ea94/django_celery_beat-1.5.0-py2.py3-none-any.whl
Collecting django-celery-results==1.1.1 (from -r requirements.txt (line 6))
  Using cached https://files.pythonhosted.org/packages/1d/3f/a82aa9fb1f2e35a72a710134a7bf9d9b1dc45dea9f6c2c16d06bb6363554/django_celery_results-1.1.1-py2.py3-none-any.whl
Collecting django-enumfield==1.5 (from -r requirements.txt (line 7))
  Using cached https://files.pythonhosted.org/packages/ff/47/7d4c29c841e32e047dc22526f17259fd280ec1dbb5f609c7d29155f1ffe9/django-enumfield-1.5.tar.gz
Collecting django-import-export==1.2.0 (from -r requirements.txt (line 8))
  Using cached https://files.pythonhosted.org/packages/62/7a/ddd9aef718243504e7715bda9bb5a100cfc353be37dc819d9914a7073cba/django_import_export-1.2.0-py2.py3-none-any.whl
Collecting djangorestframework==3.9.2 (from -r requirements.txt (line 9))
  Using cached https://files.pythonhosted.org/packages/cc/6d/5f225f18d7978d8753c1861368efc62470947003c7f9f9a5cc425fc0689b/djangorestframework-3.9.2-py2.py3-none-any.whl
Collecting python-memcached==1.59 (from -r requirements.txt (line 10))
  Using cached https://files.pythonhosted.org/packages/f5/90/19d3908048f70c120ec66a39e61b92c253e834e6e895cd104ce5e46cbe53/python_memcached-1.59-py2.py3-none-any.whl
Collecting pytz==2019.1 (from -r requirements.txt (line 11))
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Collecting requests==2.22.0 (from -r requirements.txt (line 12))
  Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting vine>=1.3.0 (from celery==4.3.0->-r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/7f/60/82c03047396126c8331ceb64da1dc52d4f1317209f32e8fe286d0c07365a/vine-1.3.0-py2.py3-none-any.whl
Collecting billiard<4.0,>=3.6.0 (from celery==4.3.0->-r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/68/1d/2aea8fbb0b1e1260a8a2e77352de2983d36d7ac01207cf14c2b9c6cc860e/billiard-3.6.1.0.tar.gz
Collecting kombu<5.0,>=4.4.0 (from celery==4.3.0->-r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/bb/22/58104fd214fb32008f2f4d64a1918c81e353f23e7beee9605674f9ecd6b2/kombu-4.6.4-py2.py3-none-any.whl
Requirement already satisfied: six>=1.0.0 in /usr/lib/python2.7/site-packages (from django-cache-lock==0.2.1->-r requirements.txt (line 4)) (1.9.0)
Collecting django-timezone-field>=2.0 (from django-celery-beat==1.5.0->-r requirements.txt (line 5))
  Using cached https://files.pythonhosted.org/packages/1a/c0/6aa03df6a901123b9eeb7fbc8ea64f9e8f9f4a1a10ab91313ac2b1d46c0e/django_timezone_field-3.0-py2.py3-none-any.whl
Collecting python-crontab>=2.3.4 (from django-celery-beat==1.5.0->-r requirements.txt (line 5))
  Using cached https://files.pythonhosted.org/packages/01/3f/e81716ba2592e7006c174251f70486b7e1d06abea80fe0c25a07d6527f5b/python-crontab-2.3.9.tar.gz
Collecting tablib (from django-import-export==1.2.0->-r requirements.txt (line 8))
  Using cached https://files.pythonhosted.org/packages/77/bf/c58a0aaf9e94c002955ae64f1bfd044dc5f34b3e9b278de152402560d060/tablib-0.13.0.tar.gz
Collecting diff-match-patch (from django-import-export==1.2.0->-r requirements.txt (line 8))
  Using cached https://files.pythonhosted.org/packages/f0/2a/5ba07def0e9107d935aba62cf632afbd0f7c723a98af47ccbcab753d2452/diff-match-patch-20181111.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python2 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-zj0lvn/diff-match-patch/setup.py'"'"'; __file__='"'"'/tmp/pip-install-zj0lvn/diff-match-patch/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
         cwd: /tmp/pip-install-zj0lvn/diff-match-patch/
    Complete output (13 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-zj0lvn/diff-match-patch/setup.py", line 37, in <module>
        install_requires=[],
      File "/usr/lib64/python2.7/distutils/core.py", line 112, in setup
        _setup_distribution = dist = klass(attrs)
      File "/usr/lib/python2.7/site-packages/setuptools/dist.py", line 265, in __init__
        self.fetch_build_eggs(attrs.pop('setup_requires'))
      File "/usr/lib/python2.7/site-packages/setuptools/dist.py", line 289, in fetch_build_eggs
        parse_requirements(requires), installer=self.fetch_build_egg
      File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 630, in resolve
        raise VersionConflict(dist,req) # XXX put more info here
    pkg_resources.VersionConflict: (setuptools 0.9.8 (/usr/lib/python2.7/site-packages), Requirement.parse('setuptools>=38.6.0'))
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

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.