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 0000000..ec8ee03 Binary files /dev/null and b/gui/static/favicon.ico differ 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)