def status(multi, identity, jobid): """ Show user info and active jobs. """ (log, user, key, urls) = init(multi, identity) Order.update_orders(rein, Document, Document.get_user_documents) documents = Document.get_user_documents(rein) if jobid is None: click.echo("User: %s" % user.name) click.echo("Master bitcoin address: %s" % user.maddr) click.echo("Delegate bitcoin address: %s" % user.daddr) click.echo("Delegate public key: %s" % key) click.echo("Willing to mediate: %s" % user.will_mediate) if user.will_mediate: click.echo("Mediator fee: %s %%" % user.mediator_fee) click.echo("Total document count: %s" % len(documents)) click.echo("Registered servers: ") for url in urls: click.echo(" " + url) click.echo("Testnet: %s" % PersistConfig.get_testnet(rein)) click.echo('') click.echo('ID Job ID Status') click.echo('-----------------------------------------------------') orders = Order.get_user_orders(rein, Document) for order in orders: past_tense = order.get_past_tense(order.get_state(rein, Document)) click.echo("%s %s %s" % (order.id, order.job_id, past_tense)) else: remote_documents = [] for url in urls: log.info("Querying %s for job id %s..." % (url, jobid)) sel_url = "{0}query?owner={1}&query=by_job_id&job_ids={2}&testnet={3}" try: answer = requests.get( url=sel_url.format(url, user.maddr, jobid, rein.testnet)) except: click.echo('Error connecting to server.') log.error('server connect error ' + url) continue data = answer.json() remote_documents += filter_and_parse_valid_sigs( rein, data['by_job_id']) unique_documents = unique(remote_documents) for doc in remote_documents: click.echo(doc) if len(remote_documents) == 0: order = Order.get_by_job_id(rein, jobid) if order: documents = order.get_documents(rein, Document) for document in documents: click.echo("\n" + document.contents) else: click.echo("Job id not found")
def status(multi, identity, jobid): """ Show user info and active jobs. """ (log, user, key, urls) = init(multi, identity) Order.update_orders(rein, Document, Document.get_user_documents) documents = Document.get_user_documents(rein) if jobid is None: click.echo("User: %s" % user.name) click.echo("Master bitcoin address: %s" % user.maddr) click.echo("Delegate bitcoin address: %s" % user.daddr) click.echo("Delegate public key: %s" % key) click.echo("Willing to mediate: %s" % user.will_mediate) if user.will_mediate: click.echo("Mediator fee: %s %%" % user.mediator_fee) click.echo("Total document count: %s" % len(documents)) click.echo("Registered servers: ") for url in urls: click.echo(" " + url) click.echo("Testnet: %s" % PersistConfig.get_testnet(rein)) click.echo('') click.echo('ID Job ID Status') click.echo('-----------------------------------------------------') orders = Order.get_user_orders(rein, Document) for order in orders: past_tense = order.get_past_tense(order.get_state(rein, Document)) click.echo("%s %s %s" % (order.id, order.job_id, past_tense)) else: remote_documents = [] for url in urls: log.info("Querying %s for job id %s..." % (url, jobid)) sel_url = "{0}query?owner={1}&query=by_job_id&job_ids={2}&testnet={3}" try: answer = requests.get(url=sel_url.format(url, user.maddr, jobid, rein.testnet)) except: click.echo('Error connecting to server.') log.error('server connect error ' + url) continue data = answer.json() remote_documents += filter_and_parse_valid_sigs(rein, data['by_job_id']) unique_documents = unique(remote_documents) for doc in remote_documents: click.echo(doc) if len(remote_documents) == 0: order = Order.get_by_job_id(rein, jobid) if order: documents = order.get_documents(rein, Document) for document in documents: click.echo("\n" + document.contents) else: click.echo("Job id not found")
def sync(multi, identity): """ Upload records to each registered server. Each user, bid, offer, etc. (i.e. anything except actual payments) is stored as document across a public database that is maintained across a network of paid servers. This command pushes the documents you have created to the servers from which you have purchased hosting. """ (log, user, key, urls) = init(multi, identity) click.echo("User: "******"No buckets registered. Run 'rein request' to continue.") return Placement.create_placements(rein.engine) upload = [] nonce = {} for url in urls: nonce[url] = get_new_nonce(rein, url) if nonce[url] is None: continue check = Document.get_user_documents(rein) if len(check) == 0: click.echo("Nothing to do.") for doc in check: if len(doc.contents) > 8192: click.echo('Document is too big. 8192 bytes should be enough for anyone.') log.error("Document oversized %s" % doc.doc_hash) else: placements = Placement.get_placements(rein, url, doc.id) if len(placements) == 0: upload.append([doc, url]) else: for plc in placements: if Placement.get_remote_document_hash(rein, plc) != doc.doc_hash: upload.append([doc, url]) failed = [] succeeded = 0 for doc, url in upload: placements = Placement.get_placements(rein, url, doc.id) if len(placements) == 0: remote_key = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(32)) plc = Placement(doc.id, url, remote_key, False, rein.testnet) rein.session.add(plc) rein.session.commit() else: plc = placements[0] for p in placements[1:]: rein.session.delete(p) rein.session.commit() if len(doc.contents) > 8192: log.error("Document oversized %s" % doc.doc_hash) click.echo('Document is too big. 8192 bytes should be enough for anyone.') elif nonce[url] is None: continue else: message = plc.remote_key + doc.contents + user.daddr + nonce[url] message = message.decode('utf8') message = message.encode('ascii') signature = sign(user.dkey, message) data = {"key": plc.remote_key, "value": doc.contents, "nonce": nonce[url], "signature": signature, "signature_address": user.daddr, "owner": user.maddr, "testnet": rein.testnet} body = json.dumps(data) headers = {'Content-Type': 'application/json'} answer = requests.post(url='{0}put'.format(url), headers=headers, data=body) res = answer.json() if 'result' not in res or res['result'] != 'success': log.error('upload failed doc=%s plc=%s url=%s' % (doc.id, plc.id, url)) failed.append(doc) else: plc.verified += 1 rein.session.commit() log.info('upload succeeded doc=%s plc=%s url=%s' % (doc.id, plc.id, url)) click.echo('uploaded %s' % doc.doc_hash) succeeded += 1 for url in urls: if nonce[url] is None: continue sel_url = url + 'nonce?address={0}&clear={1}' answer = requests.get(url=sel_url.format(user.maddr, nonce[url])) log.info('nonce cleared for %s' % (url)) click.echo('%s docs checked on %s servers, %s uploads done.' % (len(check), len(urls), str(succeeded)))
def sync(multi, identity): """ Upload records to each registered server. Each user, bid, offer, etc. (i.e. anything except actual payments) is stored as document across a public database that is maintained across a network of paid servers. This command pushes the documents you have created to the servers from which you have purchased hosting. """ (log, user, key, urls) = init(multi, identity) click.echo("User: "******"No buckets registered. Run 'rein request' to continue.") return Placement.create_placements(rein.engine) upload = [] nonce = {} for url in urls: nonce[url] = get_new_nonce(rein, url) if nonce[url] is None: continue check = Document.get_user_documents(rein) if len(check) == 0: click.echo("Nothing to do.") for doc in check: if len(doc.contents) > 8192: click.echo( 'Document is too big. 8192 bytes should be enough for anyone.' ) log.error("Document oversized %s" % doc.doc_hash) else: placements = Placement.get_placements(rein, url, doc.id) if len(placements) == 0: upload.append([doc, url]) else: for plc in placements: if Placement.get_remote_document_hash( rein, plc) != doc.doc_hash: upload.append([doc, url]) failed = [] succeeded = 0 for doc, url in upload: placements = Placement.get_placements(rein, url, doc.id) if len(placements) == 0: remote_key = ''.join( random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(32)) plc = Placement(doc.id, url, remote_key, False, rein.testnet) rein.session.add(plc) rein.session.commit() else: plc = placements[0] for p in placements[1:]: rein.session.delete(p) rein.session.commit() if len(doc.contents) > 8192: log.error("Document oversized %s" % doc.doc_hash) click.echo( 'Document is too big. 8192 bytes should be enough for anyone.') elif nonce[url] is None: continue else: message = plc.remote_key + doc.contents + user.daddr + nonce[url] message = message.decode('utf8') message = message.encode('ascii') signature = sign(user.dkey, message) data = { "key": plc.remote_key, "value": doc.contents, "nonce": nonce[url], "signature": signature, "signature_address": user.daddr, "owner": user.maddr, "testnet": rein.testnet } body = json.dumps(data) headers = {'Content-Type': 'application/json'} answer = requests.post(url='{0}put'.format(url), headers=headers, data=body) res = answer.json() if 'result' not in res or res['result'] != 'success': log.error('upload failed doc=%s plc=%s url=%s' % (doc.id, plc.id, url)) failed.append(doc) else: plc.verified += 1 rein.session.commit() log.info('upload succeeded doc=%s plc=%s url=%s' % (doc.id, plc.id, url)) click.echo('uploaded %s' % doc.doc_hash) succeeded += 1 for url in urls: if nonce[url] is None: continue sel_url = url + 'nonce?address={0}&clear={1}' answer = requests.get(url=sel_url.format(user.maddr, nonce[url])) log.info('nonce cleared for %s' % (url)) click.echo('%s docs checked on %s servers, %s uploads done.' % (len(check), len(urls), str(succeeded)))