Module: Browserctl::Commands::Daemon

Extended by:
CliOutput
Defined in:
lib/browserctl/commands/daemon.rb

Constant Summary collapse

USAGE =
"Usage: browserctl daemon <ping|status|start|stop|list> [args]"

Class Method Summary collapse

Methods included from CliOutput

print_result

Class Method Details

.run(client, args) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/browserctl/commands/daemon.rb', line 14

def self.run(client, args)
  sub = args.shift or abort USAGE
  case sub
  when "ping"   then print_result(client.ping)
  when "status" then run_status(client)
  when "start"  then run_start(args)
  when "stop"   then print_result(client.shutdown)
  when "list"   then run_list
  else abort "unknown daemon subcommand '#{sub}'\n#{USAGE}"
  end
end

.run_listObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/browserctl/commands/daemon.rb', line 59

def self.run_list
  sockets = Dir[File.join(Browserctl::BROWSERCTL_DIR, "*.sock")]
  rows = sockets.map do |sock_path|
    daemon_name = File.basename(sock_path, ".sock")
    display_name = daemon_name == "browserd" ? "default" : daemon_name
    socket_name = daemon_name == "browserd" ? nil : daemon_name
    client = Browserctl::Client.new(Browserctl.socket_path(socket_name))
    status = client.ping
    next unless status&.dig(:ok)

    { name: display_name, pid: status[:pid], pages: (client.page_list[:pages] || []).length }
  rescue RuntimeError
    nil
  end.compact
  puts({ daemons: rows }.to_json)
end

.run_start(args) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/browserctl/commands/daemon.rb', line 46

def self.run_start(args)
  opts = Optimist.options(args) do
    opt :headed, "Run with visible browser", default: false
    opt :name,   "Daemon name", type: :string
  end
  flags = []
  flags << "--headed" if opts[:headed]
  flags += ["--name", opts[:name]] if opts[:name]
  pid = Process.spawn("browserd", *flags, out: File::NULL, err: File::NULL)
  Process.detach(pid)
  puts "browserd started (pid #{pid})"
end

.run_status(client) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/browserctl/commands/daemon.rb', line 26

def self.run_status(client)
  ping = client.ping
  pages = client.page_list[:pages] || []
  page_info = pages.map do |name|
    url_res = client.url(name)
    { name: name, url: url_res[:url] || url_res[:error] }
  end
  puts JSON.pretty_generate(
    daemon: "online",
    pid: ping[:pid],
    protocol_version: ping[:protocol_version],
    pages: page_info
  )
rescue RuntimeError => e
  raise unless e.message.include?("browserd is not running")

  puts JSON.pretty_generate(daemon: "offline", error: e.message)
  exit 1
end