Pigeon-Ruby/bin/pigeon-cli

206 lines
4.7 KiB
Plaintext
Raw Normal View History

2019-09-22 02:30:03 +00:00
#!/usr/bin/env ruby
2020-04-18 17:52:39 +00:00
require "pigeon"
2019-09-22 02:30:03 +00:00
require "thor"
2020-04-18 15:51:08 +00:00
def db
if File.file?(Pigeon::PIGEON_DB_PATH)
$db ||= Pigeon::Database.new
else
2020-04-18 18:18:00 +00:00
STDERR.puts("You must first run `pigeon-cli identity new`.")
exit 1
2020-04-18 15:51:08 +00:00
end
end
def bail(msg)
$stderr.puts msg
exit 1
end
2019-09-22 02:30:03 +00:00
module Pigeon
2020-03-15 17:32:41 +00:00
class ThorBase < Thor
no_commands do
def exit_on_failure?
true
end
end
end
class Identity < ThorBase
class ConfigAlreadyExists < StandardError; end
2019-09-22 02:30:03 +00:00
desc "new", "Creates a new identiy in `.pigeon` directory if none exists"
def new
2019-12-03 03:18:44 +00:00
if File.file?(Pigeon::PIGEON_DB_PATH)
2020-04-18 15:51:08 +00:00
puts <<-END
Pigeon has detected a `pigeon.db` file.
2019-09-22 02:30:03 +00:00
Refusing to overwrite existing Pigeon config.
Remove config dir or switch to a different directory."
2020-04-18 15:51:08 +00:00
END
raise ConfigAlreadyExists
2019-09-22 02:30:03 +00:00
end
2020-04-18 15:51:08 +00:00
$db = Pigeon::Database.new
puts db.local_identity.multihash
2019-09-22 02:30:03 +00:00
end
2020-04-06 00:38:37 +00:00
desc "show", "Prints your identiy string to STDOUT"
2019-09-22 02:30:03 +00:00
def show
2020-04-18 15:51:08 +00:00
puts db.local_identity.multihash
2019-09-22 02:30:03 +00:00
end
end
2020-03-15 17:32:41 +00:00
class Blob < ThorBase
desc "set", "Copy arbitrary binary data into the database"
2019-09-22 02:30:03 +00:00
2019-09-22 17:34:08 +00:00
def set(data = "")
blob = (data != "") ? data : STDIN.read
2020-04-18 15:51:08 +00:00
puts db.put_blob(blob)
2019-09-22 02:30:03 +00:00
end
desc "get", "Read arbitrary data from the database"
2019-09-22 02:30:03 +00:00
2019-09-22 11:00:19 +00:00
def get(hex_digest)
2020-04-18 15:51:08 +00:00
puts db.get_blob(hex_digest)
2019-09-22 02:30:03 +00:00
end
end
2020-03-15 17:32:41 +00:00
class Peer < ThorBase
desc "add", "Begin following a Pigeon peer"
def add(identity)
2020-04-18 15:51:08 +00:00
puts db.add_peer(identity)
end
desc "remove", "Stop following a Pigeon peer"
def remove(identity)
2020-04-18 15:51:08 +00:00
puts db.remove_peer(identity)
end
desc "block", "Stop following a Pigeon peer AND refuse to replicate"
def block(identity)
2020-04-18 15:51:08 +00:00
puts db.block_peer(identity)
end
desc "all", "List all Pigeon peers"
def all
2020-04-18 15:51:08 +00:00
puts db.all_peers
end
end
2020-03-15 17:32:41 +00:00
class PigeonDraft < ThorBase
desc "create", "Begin a new Pigeon message"
def create(kind)
puts db.create_draft(kind: kind).render_as_draft
end
2019-10-19 20:29:29 +00:00
desc "append", "Add a key/value pair to the current DRAFT"
def append(key, raw_value = "")
v = (raw_value != "") ? raw_value : STDIN.read
2020-04-18 14:13:53 +00:00
draft = db.current_draft
if draft
2020-04-18 15:51:08 +00:00
puts draft.put(db, key, v)
else
bail("You must create a draft first")
end
2019-10-19 20:29:29 +00:00
end
2019-10-19 20:48:17 +00:00
desc "show", "Print a message to STDOUT. If message_id is missing, current draft will be displayed."
def show(message_id = "")
if message_id == ""
2020-04-18 14:13:53 +00:00
puts db.current_draft.render_as_draft
2019-10-19 20:48:17 +00:00
else
bail("You must create a draft first")
2019-10-19 20:48:17 +00:00
end
end
desc "sign", "Commit current DRAFT to local feed."
def sign
2020-04-18 15:51:08 +00:00
puts db.publish_draft(db.current_draft).render
end
end
2020-03-15 17:32:41 +00:00
class PigeonBundle < ThorBase
desc "create", "Create a pigeon bundle file"
def create(file_path = Pigeon::DEFAULT_BUNDLE_PATH)
2020-04-18 15:51:08 +00:00
db.create_bundle(file_path)
2020-03-15 17:32:41 +00:00
end
2020-04-18 19:51:10 +00:00
desc "ingest", "Ingest a pigeon bundle file"
def ingest(file_path = Pigeon::DEFAULT_BUNDLE_PATH)
db.ingest_bundle(file_path)
end
2020-03-15 17:32:41 +00:00
end
class PigeonMessage < ThorBase
desc "find", "Find a pigeon message in the local DB"
def find(multihash)
2020-04-18 15:51:08 +00:00
puts db.read_message(multihash).render
end
desc "find-all", "Find a pigeon message in the local DB"
2020-04-18 15:51:08 +00:00
def find_all(author = db.local_identity.multihash)
puts db.find_all_messages(author).join(Pigeon::CR) + Pigeon::CR
end
desc "last", "Grab your last message. INTERNAL USE ONLY"
def last
2020-04-18 15:51:08 +00:00
me = db.local_identity
mcount = db.get_message_count_for(me.multihash)
multihash = db.get_message_by_depth(me.multihash, mcount - 1)
puts multihash
end
end
2020-03-15 17:32:41 +00:00
class CLI < ThorBase
2019-09-22 02:30:03 +00:00
desc "status", "Show various information about the `.pigeon` directory"
def status
2020-04-18 15:51:08 +00:00
me = db.local_identity.multihash
mcount = db.get_message_count_for(me)
2019-09-25 01:54:32 +00:00
puts "
-`. Pigeon Protocol Ruby Client
2020-04-10 12:53:38 +00:00
'( @ > Version: #{Pigeon::VERSION}
2020-04-18 15:51:08 +00:00
_) ( Peers: #{db.all_peers.count}
/ ) Blocked: #{db.all_blocks.count}
2020-04-10 12:53:38 +00:00
/_,' / Published: #{mcount}
\\ / Ident: #{me}
===m" "m===
2019-09-25 01:54:32 +00:00
"
2019-09-22 02:30:03 +00:00
end
desc "blob SUBCOMMAND ...ARGS", "Manage blob storage"
subcommand "blob", Blob
2020-03-15 18:12:26 +00:00
desc "bundle SUBCOMMAND ...ARGS", "Consume and create bundle files"
subcommand "bundle", PigeonBundle
2020-03-15 18:12:26 +00:00
desc "draft SUBCOMMAND ...ARGS", "Manage drafts"
subcommand "draft", PigeonDraft
2020-03-15 17:32:41 +00:00
2020-03-15 18:12:26 +00:00
desc "identity SUBCOMMAND ...ARGS", "Manage `.pigeon` identity"
subcommand "identity", Identity
desc "message SUBCOMMAND ...ARGS", "Manage blob storage"
subcommand "message", PigeonMessage
2020-03-15 18:12:26 +00:00
desc "peer SUBCOMMAND ...ARGS", "Manage blob storage"
subcommand "peer", Peer
2019-09-22 02:30:03 +00:00
end
end
Pigeon::CLI.start(ARGV)