complete ipfs command
This commit is contained in:
		
							parent
							
								
									a35abdf37e
								
							
						
					
					
						commit
						50a627c65a
					
				| 
						 | 
				
			
			@ -1,13 +1,17 @@
 | 
			
		|||
from pathlib import Path
 | 
			
		||||
import getpass
 | 
			
		||||
import subprocess
 | 
			
		||||
import urllib.request
 | 
			
		||||
 | 
			
		||||
from negromate.songs import logger
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
name = 'ipfs'
 | 
			
		||||
help_text = 'Upload the web to IPFS'
 | 
			
		||||
initial_config = {
 | 
			
		||||
    'api': 'http://negromate.rocks:5001',
 | 
			
		||||
    'api': 'http://ipfs.negromate.rocks',
 | 
			
		||||
    'pinfile': '~/.negromate/ipfs.hash',
 | 
			
		||||
    'realm': 'IPFS Gitea Negromate',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,6 +24,9 @@ def options(parser, config, **kwargs):
 | 
			
		|||
    parser.add_argument(
 | 
			
		||||
        '-a', '--api', default=config[name]['api'],
 | 
			
		||||
        help="IPFS API server, defaults to {}.".format(config[name]['api']))
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '-r', '--realm', default=config[name]['realm'],
 | 
			
		||||
        help="IPFS API basic authentication realm, defaults to {}.".format(config[name]['realm']))
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        '-p', '--pinfile', default=config[name]['pinfile'], type=Path,
 | 
			
		||||
        help="file to store the current ipfs hash, defaults to {}".format(
 | 
			
		||||
| 
						 | 
				
			
			@ -27,43 +34,63 @@ def options(parser, config, **kwargs):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def run(args, **kwargs):
 | 
			
		||||
    # Setup HTTP Basic authentication
 | 
			
		||||
    user = input('Username: ')
 | 
			
		||||
    password = getpass.getpass('Password:')
 | 
			
		||||
    auth_handler = urllib.request.HTTPBasicAuthHandler()
 | 
			
		||||
    auth_handler.add_password(
 | 
			
		||||
        realm=args.realm,
 | 
			
		||||
        uri=args.api,
 | 
			
		||||
        user=user,
 | 
			
		||||
        passwd=password)
 | 
			
		||||
    opener = urllib.request.build_opener(auth_handler)
 | 
			
		||||
    urllib.request.install_opener(opener)
 | 
			
		||||
 | 
			
		||||
    # add to local
 | 
			
		||||
    command = [
 | 
			
		||||
        "ipfs",
 | 
			
		||||
        "add",
 | 
			
		||||
        "--recursive",
 | 
			
		||||
        "--quieter",
 | 
			
		||||
        args.song_folder,
 | 
			
		||||
        args.song_folder.expanduser(),
 | 
			
		||||
    ]
 | 
			
		||||
    final_hash = subprocess.check_output(command).decode('utf-8').strip()
 | 
			
		||||
    new_hash = subprocess.check_output(command).decode('utf-8').strip()
 | 
			
		||||
    logger.info('New hash: {}'.format(new_hash))
 | 
			
		||||
 | 
			
		||||
    # pin in server
 | 
			
		||||
    url = "{}/api/v0/pin/add?arg={}&progress=false".format(
 | 
			
		||||
        args.api,
 | 
			
		||||
        final_hash,
 | 
			
		||||
    )
 | 
			
		||||
    urllib.request.urlopen(url)
 | 
			
		||||
    data = urllib.parse.urlencode({
 | 
			
		||||
        'arg': new_hash,
 | 
			
		||||
        'progress': 'false',
 | 
			
		||||
    })
 | 
			
		||||
    url = '{}/api/v0/pin/add?{}'.format(args.api, data)
 | 
			
		||||
    logger.debug("server pin request: {}".format(url))
 | 
			
		||||
    request = urllib.request.Request(url, method='POST')
 | 
			
		||||
    urllib.request.urlopen(request)
 | 
			
		||||
    logger.info('Hash pinned on server.')
 | 
			
		||||
 | 
			
		||||
    # update ipns on server
 | 
			
		||||
    url = "{}/api/v0/name/publish?arg={}&resolve=yes".format(
 | 
			
		||||
        args.api,
 | 
			
		||||
        final_hash,
 | 
			
		||||
    )
 | 
			
		||||
    urllib.request.urlopen(url)
 | 
			
		||||
    data = urllib.parse.urlencode({
 | 
			
		||||
        'arg': new_hash,
 | 
			
		||||
        'resolve': 'true',
 | 
			
		||||
    })
 | 
			
		||||
    url = "{}/api/v0/name/publish?{}".format(args.api, data)
 | 
			
		||||
    logger.debug("server ipns request: {}".format(url))
 | 
			
		||||
    request = urllib.request.Request(url, method='POST')
 | 
			
		||||
    urllib.request.urlopen(request)
 | 
			
		||||
    logger.info('IPNS name updated.')
 | 
			
		||||
 | 
			
		||||
    # read previous hash and update value
 | 
			
		||||
    pinfile = args.pinfile.expanduser()
 | 
			
		||||
    if pinfile.exists():
 | 
			
		||||
        with pinfile.open() as f:
 | 
			
		||||
            previous_hash = f.read()
 | 
			
		||||
        logger.info('Previous hash: {}'.format(previous_hash))
 | 
			
		||||
    else:
 | 
			
		||||
        if not pinfile.parent.exists():
 | 
			
		||||
            pinfile.parent.mkdir()
 | 
			
		||||
        previous_hash = None
 | 
			
		||||
    with pinfile.open('w') as f:
 | 
			
		||||
        f.write(final_hash)
 | 
			
		||||
 | 
			
		||||
    if previous_hash is not None:
 | 
			
		||||
    if previous_hash is not None and previous_hash != new_hash:
 | 
			
		||||
        # remove previous pin on local
 | 
			
		||||
        command = [
 | 
			
		||||
            'ipfs',
 | 
			
		||||
| 
						 | 
				
			
			@ -72,10 +99,17 @@ def run(args, **kwargs):
 | 
			
		|||
            previous_hash,
 | 
			
		||||
        ]
 | 
			
		||||
        subprocess.check_call(command)
 | 
			
		||||
        logger.info('Previous hash unpinned on local')
 | 
			
		||||
 | 
			
		||||
        # remove previous pin on server
 | 
			
		||||
        url = "{}/api/v0/pin/rm?arg={}".format(
 | 
			
		||||
            args.api,
 | 
			
		||||
            previous_hash,
 | 
			
		||||
        )
 | 
			
		||||
        urllib.request.urlopen(url)
 | 
			
		||||
        data = urllib.parse.urlencode({
 | 
			
		||||
            'arg': previous_hash,
 | 
			
		||||
        })
 | 
			
		||||
        url = "{}/api/v0/pin/rm?{}".format(args.api, data)
 | 
			
		||||
        logger.debug("server unpin request: {}".format(url))
 | 
			
		||||
        request = urllib.request.Request(url, method='POST')
 | 
			
		||||
        urllib.request.urlopen(request)
 | 
			
		||||
        logger.info('Previous hash unpinned on server')
 | 
			
		||||
 | 
			
		||||
    with pinfile.open('w') as f:
 | 
			
		||||
        f.write(new_hash)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue