Browse Source

new version

revert-24-test_rpcbind_to_assetname
patchkez 7 years ago
parent
commit
c6f9d542af
No known key found for this signature in database GPG Key ID: 4595A869E6E9F5A7
  1. 7
      .gitignore
  2. 85
      README.md
  3. 0
      dokomodo/__init__.py
  4. 110
      dokomodo/cli.py
  5. 11
      dokomodo/templates/assetchains.j2
  6. 46
      dokomodo/templates/docker-compose-template.conf.j2
  7. 19
      dokomodo/yaml/config.ini
  8. 109
      dokomodo/yaml/data.yaml
  9. 8
      requirements.txt
  10. 16
      setup.py

7
.gitignore

@ -0,0 +1,7 @@
*.swp
assetchains
komodotools_venv/
docker-compose_assets_development.yml
docker-compose_assets_production.yml
__pycache__
dokomodo.egg-info

85
README.md

@ -1 +1,84 @@
Toolbox for managing Komodo and Iguana nodes
# DOkomodo - swiss army knife for Notary Nodes
Current komodo/iguana management scripts are not ideal and this is idea how to replace
existing komodo/iguana scripts with universal framework. Python [Click](http://click.pocoo.org)
framework was used which is ideal for creating CLI applications. Main idea of Click is that your
functions will become excutable as commands.
Features of DOkomodo:
- single data file in yaml format (easy to edit), sections for prod and dev environments - all data
like list of assetchains and their ports will come here.
- repeating functions like e.g. loading list of assetchains do not have to be written again and again
- data file loaded only once and data accessed via instance attributes
- configuration in config.ini file allows you to say for which coins mining is enabled, you can disable
minining completely or you can enable mining on randomly selected assetchains
- currently only 2 commands available
## Installation steps
### Enable python3 virtualenv
Virtualenv is directory which contains all python packages you need for your project.
Install virtualenv on Centos (as root user):
```
# yum install python34 python-pip
```
Install virtualenv on Ubuntu (as root):
```
# apt-get install python-pip
```
Now install virtualenv package:
```
# pip install -U virtualenv
```
Create our virtualenv
```
cd ~/venv_projects
virtualenv -p python3 komodotools_venv
```
This is how we activate our virtualenvironment. You can deactivate it with `deactivate` command:
```
source ~/venv_projects/komodotools_venv/bin/activate
```
### Clone this repository
Make sure you have activated your virtualenv before this step.
```
cd ~/git_projects/
git clone <this_repo>.git && cd komodotools
pip install -Ur requirements.txt
pip install --editable .
```
requirements.txt file contains list of all python packages we need for this project. All python packages will be installed into virtualenv folder you created. They won't collide with your system python packages.
## How-to use it
Once your virtualenv is activated, type `dokomodo`:
```
$ dokomodo
Usage: dokomodo [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
assetchains Replacement for assetchains script
generate_docker_compose Generates docker-compose file with all assetchains
```
Then you can continue specify subcommands:
```
$ dokomodo assetchains --help
Usage: dokomodo assetchains [OPTIONS]
Options:
-b, --branch [development|production]
[required]
--help Show this message and exit.
```

0
dokomodo/__init__.py

110
dokomodo/cli.py

@ -0,0 +1,110 @@
#!/usr/bin/env python3
from jinja2 import Environment, FileSystemLoader
from ruamel.yaml import YAML
import socket
import shlex
import subprocess
import time
from configparser import ConfigParser
import click
import py
import colorama
import sys
# asset_data_url = ("https://raw.githubusercontent.com/patchkez/kmdplatform/"
# "master/yaml/data.yaml")
env = Environment(loader=FileSystemLoader('./dokomodo/templates/'), trim_blocks=True,
lstrip_blocks=True)
config_dir = py.path.local('dokomodo/yaml')
class Config(object):
def __init__(self, *args, **kwargs):
# self.config = py.path.local('dokomodo').join('yaml').join('data.yaml')
self.config = config_dir.join('data.yaml')
# self.config_ini = py.path.local('dokomodo').join('yaml').join('config.ini')
self.config_ini = config_dir.join('config.ini')
super(Config, self).__init__(*args, **kwargs)
def load(self):
"""Try to load the yaml"""
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = True
self.config_data = yaml.load(self.config.read())
self.branches = self.config_data['assetchains']
self.seed_ip = socket.gethostbyname(self.config_data['seed_host'])
def load_ini(self):
ini_parser = ConfigParser()
ini_parser.read(str(self.config_ini))
self.assetchains = ini_parser['ASSETCHAINS']
self.mined_coins = self.assetchains['mined_coins'].split()
self.delay_asset = float(self.assetchains['delay_asset'])
# This is click thing, it will create decorator named pass_config from our Config class
# This decorator is then passed to every function which needs to access attributes from Config class
pass_config = click.make_pass_decorator(Config, ensure=True)
@click.group()
@pass_config
def cli(config):
config.load()
config.load_ini()
@click.command('generate_docker_compose',
short_help='Generates docker-compose file with all assetchains')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production']),
prompt=True)
@pass_config
def generate_docker_compose(ctx, branch):
""" TODO """
filename = 'docker-compose_assets_' + branch + '.yml'
click.echo('Writing new docker compose file into: %s' % filename)
template = env.get_template('docker-compose-template.conf.j2')
templatized_config = template.render(items=ctx.config_data['assetchains'][branch],
seed_ip=ctx.seed_ip, mined=ctx.mined_coins)
fo = open(filename, 'w')
fo.write(templatized_config)
fo.close()
@click.command('assetchains', short_help='Replacement for assetchains script')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production']),
prompt=True)
@pass_config
def assetchains(ctx, branch):
bash_template = env.get_template('assetchains.j2')
bash_templatized_config = bash_template.render(items=ctx.config_data['assetchains'][branch],
seed_ip=ctx.seed_ip, mined=ctx.mined_coins)
# fa = open('assetchains', 'w')
# fa.write(bash_templatized_config)
# fa.close()
# Remove empty strings
assetchains = list(filter(None, bash_templatized_config.split("\n")))
# Executed komodod commands with predefined sleep time
for assetchain_command in assetchains:
args = shlex.split(assetchain_command)
try:
subprocess.Popen(args)
except OSError as exception:
click.echo(exception)
sys.exit(1)
time.sleep(ctx.delay_asset)
# Add functions into cli() function which is main group for all commands
cli.add_command(generate_docker_compose)
cli.add_command(assetchains)
if __name__ == "__main__":
cli()

11
dokomodo/templates/assetchains.j2

@ -0,0 +1,11 @@
{% for assetname, asset in items.items() %}
komodod -pubkey=${pubkey} -ac_name={{ assetname }} -ac_supply={{ asset.amount
}} -addnode={{ seed_ip }}{% for mine in mined %}
{% if assetname in mine %} -gen{% endif %}
{% if 'random' in mine %}
{% if range(0, 32767) | random % 10 == 1 %}
-gen{% endif %}
{% endif %}
{% endfor %}
{% endfor %}

46
dokomodo/templates/docker-compose-template.conf.j2

@ -0,0 +1,46 @@
# vim: ts=2 sw=2 et
version: '3'
services:
{% for assetname, asset in items.items() %}
{{ assetname }}:
image: kmdplatform_komodo
network_mode: "host"
ports:
{% if asset.rpc_port %}
- "127.0.0.1:{{ asset.rpc_port }}:{{ asset.rpc_port }}"
{% endif %}
{% if asset.p2p_port %}
- "{{ asset.p2p_port }}:{{ asset.p2p_port }}"
{% endif %}
volumes:
- komodo-data:/home/komodo/.komodo
- shared-data:/home/komodo/.shared:ro
environment:
- RPC_USER=${RPC_USER}
- RPC_PASSWORD=${RPC_PASSWORD}
command: >
bash -c "komodod -pubkey=$$pubkey
-ac_name={{ assetname }}
-ac_supply={{ asset.amount }}
-addnode={{ seed_ip }}{% for mine in mined %}
{% if assetname in mine %} -gen{% endif %}
{% if 'random' in mine %}
{% if range(0, 32767) | random % 10 == 1 %}
-gen{% endif %}
{% endif %}"
{% endfor %}
{% endfor %}
volumes:
komodo-data:
driver_opts:
type: none
device: ${KOMODO_DATA}
o: bind
shared-data:
driver_opts:
type: none
device: ${SHARED_DATA}
o: bind

19
dokomodo/yaml/config.ini

@ -0,0 +1,19 @@
[DEFAULT]
[ASSETCHAINS]
# mined_coins is list of assetchains for which mining will be enabled
# When the list is empty, no -gen option will be addded to assetchain in question
# When the list contains only 'random' lowercase word, -gen param will be added to assetchains randomly
# Example 1:
# mined_coins = random
# Example 2:
# mined_coins = SUPERNET, BEER, PIZZA
# Example 3:
# mined_coins =
mined_coins =
# Delay in seconds between each assetchain is started
delay_asset = 20

109
dokomodo/yaml/data.yaml

@ -0,0 +1,109 @@
assetchains:
production:
REVS:
ammount: 1300000
p2p_port: 10195
rpc_port: 10196
SUPERNET:
amount: 816061
p2p_port: 11340
rpc_port: 11341
DEX:
amount: 999999
p2p_port: 11889
rpc_port: 11890
PANGEA:
amount: 999999
p2p_port: 14067
rpc_port: 14068
JUMBLR:
amount: 999999
p2p_port: 15105
rpc_port: 15106
BET:
amount: 999999
p2p_port: 14249
rpc_port: 14250
CRYPTO:
amount: 999999
p2p_port: 12947
rpc_port: 12948
HODL:
amount: 9999999
p2p_port: 14430
rpc_port: 14431
MSHARK:
amount: 1400000
p2p_port: 10113
rpc_port: 10114
BOTS:
amount: 999999
p2p_port: 11363
rpc_port: 11364
MGW:
amount: 999999
p2p_port: 12385
rpc_port: 12386
COQUI:
amount: 72000000
p2p_port: 14275
rpc_port: 14276
WLC:
amount: 210000000
p2p_port: 12166
rpc_port: 12167
KV:
amount: 1000000
p2p_port: 8298
rpc_port: 8299
CEAL:
amount: 366666666
p2p_port: 11115
rpc_port: 11116
MESH:
amount: 1000007
p2p_port: 9454
rpc_port: 9455
MNZ:
amount: 257142858
p2p_port: 14336
rpc_port: 14337
AXO:
amount: 200000000
p2p_port: 12926
rpc_port: 12927
ETOMIC:
amount: 100000000
p2p_port: 10270
rpc_port: 10271
BTCH:
amount: 20998641
p2p_port: 8799
rpc_port: 8800
VOTE2018:
amount: 600000000
p2p_port: 10316
rpc_port: 10317
PIZZA:
amount: 100000000
p2p_port:
rpc_port: 11116
BEER:
amount: 100000000
p2p_port:
rpc_port: 8923
NINJA:
amount: 100000000
p2p_port: 15430
rpc_port: 15431
development:
PIZZA:
amount: 100000000
p2p_port: 11607
rpc_port: 11608
BEER:
amount: 100000000
p2p_port: 8922
rpc_port: 8923
seed_host: zero.kolo.supernet.org

8
requirements.txt

@ -0,0 +1,8 @@
ruamel.yaml
Jinja2
requests
click
py
ipython
configparser
colorama

16
setup.py

@ -0,0 +1,16 @@
from setuptools import setup, find_packages
setup(
name="dokomodo",
version='0.1',
py_modules=['dokomodo'],
# packages=find_packages(),
packages=['dokomodo', 'dokomodo.containers', 'dokomodo.kmdmanage'],
install_requires=[
'Click',
],
entry_points='''
[console_scripts]
dokomodo=dokomodo.cli:cli
''',
)
Loading…
Cancel
Save