Class: CliController

Inherits:
Object
  • Object
show all
Includes:
Myer::Config
Defined in:
lib/myer/cli_controller.rb

Instance Attribute Summary collapse

Attributes included from Myer::Config

#config_dir, #data_dir

Instance Method Summary collapse

Methods included from Myer::Config

#default_server, #default_server=, define_attribute, #initialize_config, #local_csv_path, #read_config, #server, #servers, #subdirectory, #write_config

Constructor Details

#initializeCliController

Returns a new instance of CliController.



6
7
8
9
10
# File 'lib/myer/cli_controller.rb', line 6

def initialize
  @out = STDOUT
  initialize_config
  @crypto = Crypto.new
end

Instance Attribute Details

#cryptoObject

Returns the value of attribute crypto.



4
5
6
# File 'lib/myer/cli_controller.rb', line 4

def crypto
  @crypto
end

#outObject

Returns the value of attribute out.



4
5
6
# File 'lib/myer/cli_controller.rb', line 4

def out
  @out
end

Instance Method Details

#api(server_name = default_server) ⇒ Object



12
13
14
15
16
17
18
19
20
# File 'lib/myer/cli_controller.rb', line 12

def api(server_name = default_server)
  api = MySelf::Api.new
  api.server = server_name
  if server(server_name)
    api.user = server(server_name).user_id
    api.password = server(server_name).user_password
  end
  api
end

#consume_ticket(ticket_source_path) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
# File 'lib/myer/cli_controller.rb', line 171

def consume_ticket(ticket_source_path)
  read_config

  ticket_target_path = File.join(config_dir, File.basename(ticket_source_path))
  FileUtils.mv(ticket_source_path, ticket_target_path)
  store = TicketStore.new(config_dir)
  ticket = store.load_ticket_from_file(ticket_target_path)
  self.default_bucket_id = ticket.bucket_id

  write_config
end

#create_bucket(name) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/myer/cli_controller.rb', line 22

def create_bucket(name)
  read_config

  bucket_id = api.create_bucket

  self.default_bucket_id = bucket_id

  ticket = Ticket.new
  ticket.server = default_server
  ticket.bucket_id = bucket_id
  ticket.key = @crypto.generate_passphrase
  ticket.name = name

  store = TicketStore.new(config_dir)
  store.save_ticket(ticket)

  write_config

  out.puts("Created new bucket and stored its secret ticket at #{store.ticket_path(ticket)}.")
  out.puts("You need this ticket to give other clients access to the bucket.")
  out.puts("Keep it safe and secret. Everybody who has the ticket can read the bucket data.")

  bucket_id
end

#create_payload(value, tag = nil) ⇒ Object



132
133
134
135
136
137
138
139
# File 'lib/myer/cli_controller.rb', line 132

def create_payload(value, tag = nil)
  payload = {}
  payload["id"] = SecureRandom.hex
  payload["written_at"] = Time.now.utc.strftime("%FT%TZ")
  payload["tag"] = tag if tag
  payload["data"] = value.to_s
  JSON.generate(payload)
end

#create_tokenObject



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/myer/cli_controller.rb', line 47

def create_token
  read_config

  token = api.create_token

  out.puts("Created token: #{token}")
  out.puts("Use this token to register another client, " +
           "e.g. with `myer register #{default_server} #{token}`.")

  token
end

#export(output_path) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
# File 'lib/myer/cli_controller.rb', line 159

def export(output_path)
  read_config

  content = Content.new
  inner_items = read
  inner_items.each do |inner_item|
    content.add(inner_item)
  end

  content.write_as_json(output_path)
end

#list_tickets(show_status: false) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/myer/cli_controller.rb', line 183

def list_tickets(show_status: false)
  read_config

  store = TicketStore.new(config_dir)
  out.puts "Available Tickets:"
  store.tickets_per_server.each do |server_name,tickets|
    if show_status
      server_api = api(server_name)
      begin
        server_api.ping
        status = " [pings]"
      rescue StandardError => e
        status = " [ping error: #{e.message.chomp}]"
      end
    end
    out.puts "  Server '#{server_name}'#{status}:"
    tickets.each do |ticket|
      out.puts "    Bucket '#{ticket.name}' (#{ticket.bucket_id})"
    end
  end
end

#plot(dont_sync: false) ⇒ Object



150
151
152
153
154
155
156
157
# File 'lib/myer/cli_controller.rb', line 150

def plot(dont_sync: false)
  read_config

  read unless dont_sync

  plot = Plot.new
  plot.show(local_csv_path(default_bucket_id))
end

#readObject



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/myer/cli_controller.rb', line 112

def read
  read_config
  if !default_bucket_id || default_bucket_id.empty?
    raise Myer::Error.new("Default bucket id not set")
  end
  inner_items = read_items(default_bucket_id)

  FileUtils.mkdir_p(data_dir)
  csv_file = local_csv_path(default_bucket_id)
  content = Content.new

  inner_items.each do |inner_item|
    content.add(inner_item)
  end

  content.write_as_csv(csv_file)

  inner_items
end

#read_items(bucket_id) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/myer/cli_controller.rb', line 92

def read_items(bucket_id)
  read_config

  store = TicketStore.new(config_dir)
  ticket = store.load_ticket(default_bucket_id)

  @crypto.passphrase = ticket.key

  items = api.get_items(bucket_id)

  content_list = []
  items.each do |item|
    content = @crypto.decrypt(item.content)
    out.puts("#{item.id}: #{content}")
    content_list.push(content)
  end

  content_list
end

#register(server_name, token) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/myer/cli_controller.rb', line 59

def register(server_name, token)
  read_config

  self.default_server = server_name
  self.user_id, self.user_password = api(server_name).register(token)

  write_config
end

#write(content) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/myer/cli_controller.rb', line 79

def write(content)
  read_config

  store = TicketStore.new(config_dir)
  ticket = store.load_ticket(default_bucket_id)

  @crypto.passphrase = ticket.key

  encrypted_content = @crypto.encrypt(content)

  write_item(default_bucket_id, encrypted_content)
end

#write_item(bucket_id, content) ⇒ Object



68
69
70
71
72
# File 'lib/myer/cli_controller.rb', line 68

def write_item(bucket_id, content)
  read_config

  return api.create_item(bucket_id, content)
end

#write_pair(value1, value2) ⇒ Object



145
146
147
148
# File 'lib/myer/cli_controller.rb', line 145

def write_pair(value1, value2)
  json = [ value1, value2 ]
  write_value(JSON.generate(json))
end

#write_raw(content) ⇒ Object



74
75
76
77
# File 'lib/myer/cli_controller.rb', line 74

def write_raw(content)
  read_config
  write_item(default_bucket_id, content)
end

#write_value(value, tag = nil) ⇒ Object



141
142
143
# File 'lib/myer/cli_controller.rb', line 141

def write_value(value, tag = nil)
  write(create_payload(value, tag))
end