From 5a6160a6862db868ec355c038c89625e93bfd2ee Mon Sep 17 00:00:00 2001 From: cryptosharks131 Date: Tue, 13 Sep 2022 15:13:05 -0400 Subject: [PATCH] Add favicon and custom tls/macaroon/db paths --- delete_payments.py | 3 +- gui/lnd_deps/lnd_connect.py | 9 +- gui/migrations/0021_auto_20220221_1309.py | 7 +- gui/static/favicon.ico | Bin 0 -> 15406 bytes gui/views.py | 103 +++++++++++----------- htlc_stream.py | 3 +- initialize.py | 23 +++-- jobs.py | 6 +- keysend.py | 7 +- lndg/urls.py | 6 +- rebalancer.py | 3 +- 11 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 gui/static/favicon.ico diff --git a/delete_payments.py b/delete_payments.py index 22c039d..c69666b 100644 --- a/delete_payments.py +++ b/delete_payments.py @@ -1,10 +1,9 @@ -from lndg import settings from gui.lnd_deps import lightning_pb2 as ln from gui.lnd_deps import lightning_pb2_grpc as lnrpc from gui.lnd_deps.lnd_connect import lnd_connect def main(): - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) try: stub.DeleteAllPayments(ln.DeleteAllPaymentsRequest(failed_payments_only=False, failed_htlcs_only=True)) stub.DeleteAllPayments(ln.DeleteAllPaymentsRequest(failed_payments_only=True, failed_htlcs_only=False)) diff --git a/gui/lnd_deps/lnd_connect.py b/gui/lnd_deps/lnd_connect.py index 45b6c06..6593a89 100644 --- a/gui/lnd_deps/lnd_connect.py +++ b/gui/lnd_deps/lnd_connect.py @@ -1,18 +1,19 @@ import os, codecs, grpc +from lndg import settings -def lnd_connect(LND_DIR_PATH, LND_NETWORK, LND_RPC_SERVER): +def lnd_connect(): #Open connection with lnd via grpc - with open(os.path.expanduser(LND_DIR_PATH + '/data/chain/bitcoin/' + LND_NETWORK + '/admin.macaroon'), 'rb') as f: + with open(os.path.expanduser(settings.LND_MACAROON_PATH), 'rb') as f: macaroon_bytes = f.read() macaroon = codecs.encode(macaroon_bytes, 'hex') def metadata_callback(context, callback): callback([('macaroon', macaroon)], None) os.environ["GRPC_SSL_CIPHER_SUITES"] = 'HIGH+ECDSA' - cert = open(os.path.expanduser(LND_DIR_PATH + '/tls.cert'), 'rb').read() + cert = open(os.path.expanduser(settings.LND_TLS_PATH), 'rb').read() cert_creds = grpc.ssl_channel_credentials(cert) auth_creds = grpc.metadata_call_credentials(metadata_callback) creds = grpc.composite_channel_credentials(cert_creds, auth_creds) - channel = grpc.secure_channel(LND_RPC_SERVER, creds, options=[('grpc.max_send_message_length', 29999999), ('grpc.max_receive_message_length', 29999999),]) + channel = grpc.secure_channel(settings.LND_RPC_SERVER, creds, options=[('grpc.max_send_message_length', 29999999), ('grpc.max_receive_message_length', 29999999),]) return channel def main(): diff --git a/gui/migrations/0021_auto_20220221_1309.py b/gui/migrations/0021_auto_20220221_1309.py index 7395eef..4d38539 100644 --- a/gui/migrations/0021_auto_20220221_1309.py +++ b/gui/migrations/0021_auto_20220221_1309.py @@ -7,15 +7,14 @@ from gui.lnd_deps import lightning_pb2_grpc as lnrpc from gui.lnd_deps import signer_pb2 as lns from gui.lnd_deps import signer_pb2_grpc as lnsigner from gui.lnd_deps.lnd_connect import lnd_connect -from lndg import settings def update_messages(apps, schedma_editor): invoices = apps.get_model('gui', 'invoices') try: messages = invoices.objects.exclude(message=None) if len(messages) > 0: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) - signerstub = lnsigner.SignerStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) + signerstub = lnsigner.SignerStub(lnd_connect()) self_pubkey = stub.GetInfo(ln.GetInfoRequest()).identity_pubkey for message in messages: records = stub.LookupInvoice(ln.PaymentHash(r_hash=bytes.fromhex(message.r_hash))).htlcs[0].custom_records @@ -46,7 +45,7 @@ def update_rebal_channel(apps, schedma_editor): payments = apps.get_model('gui', 'payments') hops = apps.get_model('gui', 'paymenthops') try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) self_pubkey = stub.GetInfo(ln.GetInfoRequest()).identity_pubkey for payment in payments.objects.filter(status=2).iterator(): last_hop = hops.objects.filter(payment_hash=payment.payment_hash).order_by('-step')[0] if hops.objects.filter(payment_hash=payment.payment_hash).exists() else None diff --git a/gui/static/favicon.ico b/gui/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec8ee03d5e58a6071147b68ae9a577ccac84eafe GIT binary patch literal 15406 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 M|N6ZI{?`)tA3{A_od5s; literal 0 HcmV?d00001 diff --git a/gui/views.py b/gui/views.py index d6ce95c..b2ada9d 100644 --- a/gui/views.py +++ b/gui/views.py @@ -3,7 +3,6 @@ from django.shortcuts import get_object_or_404, render, redirect from django.db.models import Sum, IntegerField, Count, F, Q from django.db.models.functions import Round from django.contrib.auth.decorators import login_required -from django.conf import settings from datetime import datetime, timedelta from rest_framework import viewsets from rest_framework.response import Response @@ -18,7 +17,7 @@ from gui.lnd_deps import router_pb2_grpc as lnrouter from gui.lnd_deps import wtclient_pb2 as wtrpc from gui.lnd_deps import wtclient_pb2_grpc as wtstub from .lnd_deps.lnd_connect import lnd_connect -from lndg.settings import LND_NETWORK, LND_DIR_PATH +from lndg import settings from os import path from pandas import DataFrame, merge from requests import get @@ -49,7 +48,7 @@ def get_tx_fees(txid): def home(request): if request.method == 'GET': try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) #Get balance and general node information node_info = stub.GetInfo(ln.GetInfoRequest()) balances = stub.WalletBalance(ln.WalletBalanceRequest()) @@ -225,7 +224,7 @@ def home(request): total_channels = node_info.num_active_channels + node_info.num_inactive_channels - private_count local_settings = LocalSettings.objects.filter(key__contains='AR-').order_by('key') try: - db_size = round(path.getsize(path.expanduser(LND_DIR_PATH + '/data/graph/' + LND_NETWORK + '/channel.db'))*0.000000001, 3) + db_size = round(path.getsize(path.expanduser(settings.LND_DATABASE_PATH))*0.000000001, 3) except: db_size = 0 #Build context for front-end and render page @@ -290,7 +289,7 @@ def home(request): 'eligible_count': channels.filter(is_active=True, is_open=True, private=False, auto_rebalance=True).annotate(inbound_can=((Sum('remote_balance')+Sum('pending_inbound'))*100)/Sum('capacity')).annotate(fee_ratio=(Sum('remote_fee_rate')*100)/Sum('local_fee_rate')).filter(inbound_can__gte=F('ar_in_target'), fee_ratio__lte=F('ar_max_cost')).count(), 'enabled_count': channels.filter(is_open=True, auto_rebalance=True).count(), 'available_count': channels.filter(is_active=True, is_open=True, private=False, auto_rebalance=False).annotate(outbound_can=((Sum('local_balance')+Sum('pending_outbound'))*100)/Sum('capacity')).filter(outbound_can__gte=F('ar_out_target')).count(), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links(), 'db_size': db_size, @@ -393,7 +392,7 @@ def channels(request): 'channels': [] if channels_df.empty else channels_df.sort_values(by=['cv_30day'], ascending=False).to_dict(orient='records'), 'apy_7day': apy_7day, 'apy_30day': apy_30day, - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links() } @@ -486,7 +485,7 @@ def fees(request): context = { 'channels': [] if channels_df.empty else channels_df.sort_values(by=['out_percent']).to_dict(orient='records'), 'local_settings': LocalSettings.objects.filter(key__contains='AF-').order_by('key'), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links() } @@ -508,7 +507,7 @@ def advanced(request): context = { 'channels': channels_df.to_dict(orient='records'), 'local_settings': LocalSettings.objects.all().order_by('key'), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links() } @@ -520,7 +519,7 @@ def advanced(request): def route(request): if request.method == 'GET': try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) block_height = stub.GetInfo(ln.GetInfoRequest()).block_height payment_hash = request.GET.urlencode()[1:] context = { @@ -561,7 +560,7 @@ def peers(request): context = { 'peers': peers, 'num_peers': len(peers), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links() } return render(request, 'peers.html', context) @@ -571,11 +570,11 @@ def peers(request): @login_required(login_url='/lndg-admin/login/?next=/') def balances(request): if request.method == 'GET': - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) context = { 'utxos': stub.ListUnspent(ln.ListUnspentRequest(min_confs=0, max_confs=9999999)).utxos, 'transactions': list(Onchain.objects.filter(block_height=0)) + list(Onchain.objects.exclude(block_height=0).order_by('-block_height')), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'network_links': network_links() } return render(request, 'balances.html', context) @@ -586,7 +585,7 @@ def balances(request): def closures(request): if request.method == 'GET': try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) pending_channels = stub.PendingChannels(ln.PendingChannelsRequest()) channels = Channels.objects.all() pending_closed = None @@ -617,7 +616,7 @@ def closures(request): 'pending_force_closed': pending_force_closed, 'waiting_for_close': waiting_for_close, 'closures': [] if merged.empty else merged.sort_values(by=['close_height'], ascending=False).to_dict(orient='records'), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'network_links': network_links(), 'graph_links': graph_links() } @@ -645,7 +644,7 @@ def find_next_block_maturity(force_closing_channel): def towers(request): if request.method == 'GET': try: - stub = wtstub.WatchtowerClientStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = wtstub.WatchtowerClientStub(lnd_connect()) towers = stub.ListTowers(wtrpc.ListTowersRequest(include_sessions=False)).towers active_towers = [] inactive_towers = [] @@ -679,7 +678,7 @@ def add_tower_form(request): form = AddTowerForm(request.POST) if form.is_valid(): try: - stub = wtstub.WatchtowerClientStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = wtstub.WatchtowerClientStub(lnd_connect()) tower = form.cleaned_data['tower'] if tower.count('@') == 1 and len(tower.split('@')[0]) == 66: peer_pubkey, host = tower.split('@') @@ -703,7 +702,7 @@ def delete_tower_form(request): form = DeleteTowerForm(request.POST) if form.is_valid(): try: - stub = wtstub.WatchtowerClientStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = wtstub.WatchtowerClientStub(lnd_connect()) pubkey = bytes.fromhex(form.cleaned_data['pubkey']) address = form.cleaned_data['address'] response = stub.RemoveTower(wtrpc.RemoveTowerRequest(pubkey=pubkey, address=address)) @@ -724,7 +723,7 @@ def remove_tower_form(request): form = RemoveTowerForm(request.POST) if form.is_valid(): try: - stub = wtstub.WatchtowerClientStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = wtstub.WatchtowerClientStub(lnd_connect()) pubkey = bytes.fromhex(form.cleaned_data['pubkey']) response = stub.RemoveTower(wtrpc.RemoveTowerRequest(pubkey=pubkey)) messages.success(request, 'Tower removal successful!' + str(response)) @@ -745,7 +744,7 @@ def resolutions(request): context = { 'chan_id': chan_id, 'resolutions': Resolutions.objects.filter(chan_id=chan_id), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'network_links': network_links() } return render(request, 'resolutions.html', context) @@ -755,7 +754,7 @@ def resolutions(request): @login_required(login_url='/lndg-admin/login/?next=/') def income(request): if request.method == 'GET': - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) filter_90day = datetime.now() - timedelta(days=90) filter_30day = datetime.now() - timedelta(days=30) filter_7day = datetime.now() - timedelta(days=7) @@ -889,7 +888,7 @@ def income(request): 'percent_cost_30day': 0 if total_revenue_30day == 0 else int(((total_fees_30day+onchain_costs_30day)/total_revenue_30day)*100), 'percent_cost_7day': 0 if total_revenue_7day == 0 else int(((total_fees_7day+onchain_costs_7day)/total_revenue_7day)*100), 'percent_cost_1day': 0 if total_revenue_1day == 0 else int(((total_fees_1day+onchain_costs_1day)/total_revenue_1day)*100), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links() } return render(request, 'income.html', context) @@ -1274,7 +1273,7 @@ def channel(request): 'rebalances': [] if rebalancer_df.empty else rebalancer_df.to_dict(orient='records')[:5], 'failed_htlcs': [] if failed_htlc_df.empty else failed_htlc_df.to_dict(orient='records')[:5], 'peer_info': [] if peer_info_df.empty else peer_info_df.to_dict(orient='records')[0], - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links() } @@ -1292,7 +1291,7 @@ def channel(request): @login_required(login_url='/lndg-admin/login/?next=/') def opens(request): if request.method == 'GET': - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) self_pubkey = stub.GetInfo(ln.GetInfoRequest()).identity_pubkey current_peers = Channels.objects.filter(is_open=True).values_list('remote_pubkey') filter_60day = datetime.now() - timedelta(days=60) @@ -1300,7 +1299,7 @@ def opens(request): open_list = PaymentHops.objects.filter(payment_hash__in=payments_60day).exclude(node_pubkey=self_pubkey).exclude(node_pubkey__in=current_peers).values('node_pubkey', 'alias').annotate(ppm=(Sum('fee')/Sum('amt'))*1000000).annotate(score=Round((Round(Count('id')/5, output_field=IntegerField())+Round(Sum('amt')/500000, output_field=IntegerField()))/10, output_field=IntegerField())).annotate(count=Count('id')).annotate(amount=Sum('amt')).annotate(fees=Sum('fee')).annotate(sum_cost_to=Sum('cost_to')/(Sum('amt')/1000000)).exclude(score=0).order_by('-score', 'ppm')[:21] context = { 'open_list': open_list, - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links() } return render(request, 'open_list.html', context) @@ -1360,7 +1359,7 @@ def actions(request): action_list.append(result) context = { 'action_list': action_list, - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links(), 'network_links': network_links() } @@ -1371,7 +1370,7 @@ def actions(request): @login_required(login_url='/lndg-admin/login/?next=/') def pending_htlcs(request): if request.method == 'GET': - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) block_height = stub.GetInfo(ln.GetInfoRequest()).block_height context = { 'incoming_htlcs': PendingHTLCs.objects.filter(incoming=True).annotate(blocks_til_expiration=Sum('expiration_height')-block_height).annotate(hours_til_expiration=((Sum('expiration_height')-block_height)*10)/60).order_by('hash_lock'), @@ -1466,7 +1465,7 @@ def batch_open(request): count = 0 fail = False open_list = [] - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) if form.cleaned_data['pubkey1'] and form.cleaned_data['amt1'] and len(form.cleaned_data['pubkey1']) == 66: count += 1 peer_pubkey = form.cleaned_data['pubkey1'] @@ -1627,7 +1626,7 @@ def rebalancing(request): 'rebalancer': Rebalancer.objects.all().annotate(ppm=Round((Sum('fee_limit')*1000000)/Sum('value'), output_field=IntegerField())).order_by('-id')[:20], 'rebalancer_form': RebalancerForm, 'local_settings': LocalSettings.objects.filter(key__contains='AR-').order_by('key'), - 'network': 'testnet/' if LND_NETWORK == 'testnet' else '', + 'network': 'testnet/' if settings.LND_NETWORK == 'testnet' else '', 'graph_links': graph_links() } return render(request, 'rebalancing.html', context) @@ -1684,7 +1683,7 @@ def open_channel_form(request): form = OpenChannelForm(request.POST) if form.is_valid(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) peer_pubkey = form.cleaned_data['peer_pubkey'] connected = False if Peers.objects.filter(pubkey=peer_pubkey, connected=True).exists(): @@ -1732,7 +1731,7 @@ def close_channel_form(request): channel_point.funding_txid_bytes = bytes.fromhex(funding_txid) channel_point.funding_txid_str = funding_txid channel_point.output_index = output_index - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) if form.cleaned_data['force']: for response in stub.CloseChannel(ln.CloseChannelRequest(channel_point=channel_point, force=True)): messages.success(request, 'Channel force closed! Closing TXID: ' + str(response.close_pending.txid[::-1].hex()) + ':' + str(response.close_pending.output_index)) @@ -1759,7 +1758,7 @@ def connect_peer_form(request): form = ConnectPeerForm(request.POST) if form.is_valid(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) peer_id = form.cleaned_data['peer_id'] if peer_id.count('@') == 0 and len(peer_id) == 66: peer_pubkey = peer_id @@ -1786,7 +1785,7 @@ def connect_peer_form(request): def new_address_form(request): if request.method == 'POST': try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.NewAddress(ln.NewAddressRequest(type=0)) messages.success(request, 'Deposit Address: ' + str(response.address)) except Exception as e: @@ -1803,7 +1802,7 @@ def add_invoice_form(request): form = AddInvoiceForm(request.POST) if form.is_valid(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.AddInvoice(ln.Invoice(value=form.cleaned_data['value'])) messages.success(request, 'Invoice created! ' + str(response.payment_request)) except Exception as e: @@ -1852,7 +1851,7 @@ def update_chan_policy(request): if form.is_valid(): if form.cleaned_data['new_base_fee'] is not None or form.cleaned_data['new_fee_rate'] is not None or form.cleaned_data['new_cltv'] is not None: try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) if form.cleaned_data['target_all']: if form.cleaned_data['new_base_fee'] is not None and form.cleaned_data['new_fee_rate'] is not None and form.cleaned_data['new_cltv'] is not None: args = {'global': True, 'base_fee_msat': form.cleaned_data['new_base_fee'], 'fee_rate': (form.cleaned_data['new_fee_rate']/1000000), 'time_lock_delta': form.cleaned_data['new_cltv']} @@ -2053,7 +2052,7 @@ def update_channel(request): update_target = int(form.cleaned_data['update_target']) db_channel = Channels.objects.filter(chan_id=chan_id)[0] if update_target == 0: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2063,7 +2062,7 @@ def update_channel(request): db_channel.save() messages.success(request, 'Base fee for channel ' + str(db_channel.alias) + ' (' + str(db_channel.chan_id) + ') updated to a value of: ' + str(target)) elif update_target == 1: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2094,7 +2093,7 @@ def update_channel(request): db_channel.save() messages.success(request, 'Auto rebalancer max cost for channel ' + str(db_channel.alias) + ' (' + str(db_channel.chan_id) + ') updated to a value of: ' + str(target) + '%') elif update_target == 7: - stub = lnrouter.RouterStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrouter.RouterStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2110,7 +2109,7 @@ def update_channel(request): db_channel.save() messages.success(request, 'Auto fees status for channel ' + str(db_channel.alias) + ' (' + str(db_channel.chan_id) + ') updated to a value of: ' + str(db_channel.auto_fees)) elif update_target == 9: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2340,7 +2339,7 @@ def update_setting(request): messages.success(request, 'Updated payment cleanup retention days to: ' + str(retention_days)) elif key == 'ALL-oRate': target = int(value) - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channels = Channels.objects.filter(is_open=True) for db_channel in channels: channel_point = ln.ChannelPoint() @@ -2354,10 +2353,10 @@ def update_setting(request): messages.success(request, 'Fee rate for all open channels updated to a value of: ' + str(target)) elif key == 'ALL-oBase': target = int(value) - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channels = Channels.objects.filter(is_open=True) for db_channel in channels: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2368,10 +2367,10 @@ def update_setting(request): messages.success(request, 'Base fee for all channels updated to a value of: ' + str(target)) elif key == 'ALL-CLTV': target = int(value) - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channels = Channels.objects.filter(is_open=True) for db_channel in channels: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) channel_point = ln.ChannelPoint() channel_point.funding_txid_bytes = bytes.fromhex(db_channel.funding_txid) channel_point.funding_txid_str = db_channel.funding_txid @@ -2584,7 +2583,7 @@ def connect_peer(request): serializer = ConnectPeerSerializer(data=request.data) if serializer.is_valid(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) peer_id = serializer.validated_data['peer_id'] if peer_id.count('@') == 0 and len(peer_id) == 66: peer_pubkey = peer_id @@ -2611,7 +2610,7 @@ def open_channel(request): serializer = OpenChannelSerializer(data=request.data) if serializer.is_valid(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) peer_pubkey = serializer.validated_data['peer_pubkey'] connected = False if Peers.objects.filter(pubkey=peer_pubkey, connected=True).exists(): @@ -2656,7 +2655,7 @@ def close_channel(request): channel_point.funding_txid_bytes = bytes.fromhex(funding_txid) channel_point.funding_txid_str = funding_txid channel_point.output_index = output_index - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) if serializer.validated_data['force']: for response in stub.CloseChannel(ln.CloseChannelRequest(channel_point=channel_point, force=True)): return Response({'message': 'Channel force closed! Closing TXID: ' + str(response.close_pending.txid[::-1].hex()) + ':' + str(response.close_pending.output_index)}) @@ -2679,7 +2678,7 @@ def add_invoice(request): serializer = AddInvoiceSerializer(data=request.data) if serializer.is_valid() and serializer.validated_data['value'] >= 0: try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.AddInvoice(ln.Invoice(value=serializer.validated_data['value'])) return Response({'message': 'Invoice created!', 'data':str(response.payment_request)}) except Exception as e: @@ -2694,7 +2693,7 @@ def add_invoice(request): @api_view(['GET']) def new_address(request): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.NewAddress(ln.NewAddressRequest(type=0)) return Response({'message': 'Retrieved new deposit address!', 'data':str(response.address)}) except Exception as e: @@ -2711,7 +2710,7 @@ def update_alias(request): peer_pubkey = serializer.validated_data['peer_pubkey'] if Channels.objects.filter(remote_pubkey=peer_pubkey).exists(): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) new_alias = stub.GetNodeInfo(ln.NodeInfoRequest(pub_key=peer_pubkey)).node.alias update_channels = Channels.objects.filter(remote_pubkey=peer_pubkey) for channel in update_channels: @@ -2733,7 +2732,7 @@ def update_alias(request): @api_view(['GET']) def get_info(request): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.GetInfo(ln.GetInfoRequest()) target = {'identity_pubkey':response.identity_pubkey, 'alias':response.alias, 'num_active_channels':response.num_active_channels, 'num_peers':response.num_peers, 'block_height':response.block_height, 'block_hash':response.block_hash,'synced_to_chain':response.synced_to_chain,'testnet':response.testnet,'uris':[uri for uri in response.uris],'best_header_timestamp':response.best_header_timestamp,'version':response.version,'num_inactive_channels':response.num_inactive_channels,'chains':[{'chain':response.chains[i].chain,'network':response.chains[i].network} for i in range(0,len(response.chains))],'color':response.color,'synced_to_graph':response.synced_to_graph} return Response({'message': 'success', 'data':target}) @@ -2747,7 +2746,7 @@ def get_info(request): @api_view(['GET']) def api_balances(request): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.WalletBalance(ln.WalletBalanceRequest()) target = {'total_balance':response.confirmed_balance, 'confirmed_balance':response.confirmed_balance} return Response({'message': 'success', 'data':target}) @@ -2761,7 +2760,7 @@ def api_balances(request): @api_view(['GET']) def pending_channels(request): try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) response = stub.PendingChannels(ln.PendingChannelsRequest()) if response.pending_open_channels or response.pending_closing_channels or response.pending_force_closing_channels or response.waiting_close_channels or response.total_limbo_balance: target = {} diff --git a/htlc_stream.py b/htlc_stream.py index 1a41044..9342dbb 100644 --- a/htlc_stream.py +++ b/htlc_stream.py @@ -2,7 +2,6 @@ import django from gui.lnd_deps import router_pb2 as lnr from gui.lnd_deps import router_pb2_grpc as lnrouter from gui.lnd_deps.lnd_connect import lnd_connect -from lndg import settings from os import environ from time import sleep environ['DJANGO_SETTINGS_MODULE'] = 'lndg.settings' @@ -11,7 +10,7 @@ from gui.models import Channels, FailedHTLCs def main(): try: - connection = lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER) + connection = lnd_connect() routerstub = lnrouter.RouterStub(connection) for response in routerstub.SubscribeHtlcEvents(lnr.SubscribeHtlcEventsRequest()): if response.event_type == 3 and str(response.link_fail_event) != '': diff --git a/initialize.py b/initialize.py index b2232b8..aee83b4 100644 --- a/initialize.py +++ b/initialize.py @@ -5,7 +5,7 @@ from django.contrib.auth import get_user_model from django.conf import settings BASE_DIR = Path(__file__).resolve().parent -def write_settings(node_ip, lnd_dir_path, lnd_network, lnd_rpc_server, whitenoise, debug, csrftrusted): +def write_settings(node_ip, lnd_tls_path, lnd_macaroon_path, lnd_database_path, lnd_network, lnd_rpc_server, whitenoise, debug, csrftrusted): #Generate a unique secret to be used for your django site secret = secrets.token_urlsafe(64) if whitenoise: @@ -48,7 +48,9 @@ DEBUG = %s ALLOWED_HOSTS = ['%s'] %s -LND_DIR_PATH = '%s' +LND_TLS_PATH = '%s' +LND_MACAROON_PATH = '%s' +LND_DATABASE_PATH = '%s' LND_NETWORK = '%s' LND_RPC_SERVER = '%s' @@ -157,7 +159,7 @@ USE_TZ = False STATIC_URL = 'static/' STATIC_ROOT = os.path.join(BASE_DIR, 'gui/static/') DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -''' % (secret, debug, node_ip, csrf, lnd_dir_path, lnd_network, lnd_rpc_server, wnl) +''' % (secret, debug, node_ip, csrf, lnd_tls_path, lnd_macaroon_path, lnd_database_path, lnd_network, lnd_rpc_server, wnl) try: f = open("lndg/settings.py", "x") f.close() @@ -245,7 +247,7 @@ def main(): help_msg = "LNDg Initializer" parser = argparse.ArgumentParser(description = help_msg) parser.add_argument('-ip', '--nodeip',help = 'IP that will be used to access the LNDg page', default='*') - parser.add_argument('-dir', '--lnddir',help = 'LND Directory for tls cert and admin macaroon paths', default='~/.lnd') + parser.add_argument('-dir', '--lnddir',help = 'LND Directory for tls cert and admin macaroon paths', default=None) parser.add_argument('-net', '--network', help = 'Network LND will run over', default='mainnet') parser.add_argument('-server', '--rpcserver', help = 'Server address to use for rpc communications with LND', default='localhost:10009') parser.add_argument('-sd', '--supervisord', help = 'Setup supervisord to run jobs/rebalancer background processes', action='store_true') @@ -256,9 +258,15 @@ def main(): parser.add_argument('-u', '--adminuser', help = 'Setup a custom admin username', default='lndg-admin') parser.add_argument('-pw', '--adminpw', help = 'Setup a custom admin password', default=None) parser.add_argument('-csrf', '--csrftrusted', help = 'Set trusted CSRF origins', default=None) + parser.add_argument('-tls', '--tlscert', help = 'Set the path to the tls cert', default=None) + parser.add_argument('-mcrn', '--macaroon', help = 'Set the path to the macroon file', default=None) + parser.add_argument('-lnddb', '--lnddatabase', help = 'Set the path to the channel.db for monitoring', default=None) args = parser.parse_args() + if args.lnddir and (args.tlscert or args.macaroon or args.lnddatabase): + parser.error("You may not use tlscert or macaroon flags with the lnddir flag") + exit node_ip = args.nodeip - lnd_dir_path = args.lnddir + lnd_dir_path = args.lnddir if args.lnddir else '~/.lnd' lnd_network = args.network lnd_rpc_server = args.rpcserver setup_supervisord = args.supervisord @@ -269,10 +277,13 @@ def main(): adminuser = args.adminuser adminpw = args.adminpw csrftrusted = args.csrftrusted + lnd_tls_path = args.tlscert if args.tlscert else lnd_dir_path + '/tls.cert' + lnd_macaroon_path = args.macaroon if args.macaroon else lnd_dir_path + '/data/chain/bitcoin/' + lnd_network + '/admin.macaroon' + lnd_database_path = args.lnddatabase if args.lnddatabase else lnd_dir_path + '/data/graph/' + lnd_network + '/channel.db' if docker: setup_supervisord = True whitenoise = True - write_settings(node_ip, lnd_dir_path, lnd_network, lnd_rpc_server, whitenoise, debug, csrftrusted) + write_settings(node_ip, lnd_tls_path, lnd_macaroon_path, lnd_database_path, lnd_network, lnd_rpc_server, whitenoise, debug, csrftrusted) if setup_supervisord: print('Supervisord setup requested...') write_supervisord_settings(sduser) diff --git a/jobs.py b/jobs.py index 3b73761..7f410f2 100644 --- a/jobs.py +++ b/jobs.py @@ -1,5 +1,5 @@ import django -from django.db.models import Max, Min +from django.db.models import Max from datetime import datetime, timedelta from gui.lnd_deps import lightning_pb2 as ln from gui.lnd_deps import lightning_pb2_grpc as lnrpc @@ -159,7 +159,7 @@ def update_invoice(stub, invoice, db_invoice): keysend_preimage = records[5482373484].hex() if 5482373484 in records else None message = records[34349334].decode('utf-8', errors='ignore')[:1000] if 34349334 in records else None if 34349337 in records and 34349339 in records and 34349343 in records and 34349334 in records: - signerstub = lnsigner.SignerStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + signerstub = lnsigner.SignerStub(lnd_connect()) self_pubkey = stub.GetInfo(ln.GetInfoRequest()).identity_pubkey try: valid = signerstub.VerifyMessage(lns.VerifyMessageReq(msg=(records[34349339]+bytes.fromhex(self_pubkey)+records[34349343]+records[34349334]), signature=records[34349337], pubkey=records[34349339])).valid @@ -602,7 +602,7 @@ def auto_fees(stub): def main(): #print (f"{datetime.now().strftime('%c')} : Entering Jobs") try: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) #Update data update_peers(stub) update_channels(stub) diff --git a/keysend.py b/keysend.py index defc22e..febc9ae 100644 --- a/keysend.py +++ b/keysend.py @@ -1,6 +1,5 @@ import secrets, time, struct from hashlib import sha256 -from lndg import settings from gui.lnd_deps import lightning_pb2 as ln from gui.lnd_deps import lightning_pb2_grpc as lnrpc from gui.lnd_deps import router_pb2 as lnr @@ -12,7 +11,7 @@ from gui.lnd_deps.lnd_connect import lnd_connect def keysend(target_pubkey, msg, amount, fee_limit, timeout, sign): #Construct and send try: - routerstub = lnrouter.RouterStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + routerstub = lnrouter.RouterStub(lnd_connect()) secret = secrets.token_bytes(32) hashed_secret = sha256(secret).hexdigest() custom_records = [(5482373484, secret),] @@ -20,8 +19,8 @@ def keysend(target_pubkey, msg, amount, fee_limit, timeout, sign): if len(msg) > 0: custom_records.append((34349334, bytes.fromhex(msg.encode('utf-8').hex()))) if sign == True: - stub = lnrpc.LightningStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) - signerstub = lnsigner.SignerStub(lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER)) + stub = lnrpc.LightningStub(lnd_connect()) + signerstub = lnsigner.SignerStub(lnd_connect()) self_pubkey = stub.GetInfo(ln.GetInfoRequest()).identity_pubkey timestamp = struct.pack(">i", int(time.time())) signature = signerstub.SignMessage(lns.SignMessageReq(msg=(bytes.fromhex(self_pubkey)+bytes.fromhex(target_pubkey)+timestamp+bytes.fromhex(msg.encode('utf-8').hex())), key_loc=lns.KeyLocator(key_family=6, key_index=0))).signature diff --git a/lndg/urls.py b/lndg/urls.py index e3b8a13..7716408 100644 --- a/lndg/urls.py +++ b/lndg/urls.py @@ -13,9 +13,11 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from django.contrib import admin from django.urls import path, include +from django.views.generic.base import RedirectView +from django.contrib.staticfiles.storage import staticfiles_storage urlpatterns = [ + path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url("favicon.ico"))), path('', include('gui.urls')), -] +] \ No newline at end of file diff --git a/rebalancer.py b/rebalancer.py index 3648fc1..c85cc0f 100644 --- a/rebalancer.py +++ b/rebalancer.py @@ -6,7 +6,6 @@ from gui.lnd_deps import lightning_pb2_grpc as lnrpc from gui.lnd_deps import router_pb2 as lnr from gui.lnd_deps import router_pb2_grpc as lnrouter from gui.lnd_deps.lnd_connect import lnd_connect -from lndg import settings from os import environ environ['DJANGO_SETTINGS_MODULE'] = 'lndg.settings' django.setup() @@ -29,7 +28,7 @@ def run_rebalancer(rebalance): rebalance.start = datetime.now() try: #Open connection with lnd via grpc - connection = lnd_connect(settings.LND_DIR_PATH, settings.LND_NETWORK, settings.LND_RPC_SERVER) + connection = lnd_connect() stub = lnrpc.LightningStub(connection) routerstub = lnrouter.RouterStub(connection) chan_ids = json.loads(rebalance.outgoing_chan_ids)