#!/usr/bin/env ruby
require 'json'
require 'socket'

ctid = ENV.fetch('LXC_NAME', nil)
veth = ENV.fetch('LXC_NET_PEER', nil)

if ctid.nil? || veth.nil?
  warn 'Expected environment variables:'
  warn '  LXC_NAME'
  warn '  LXC_NET_PEER'
  exit(false)
end

if %r{^/run/osctl/pools/([^/]+)/hooks} !~ $0
  warn "Unable to detect pool name from '#{$0}'"
  exit(false)
end

pool = Regexp.last_match(1)

base = File.basename($0)
ctid2, ifname = base.split('.')

if ctid != ctid2
  warn "Expected to handle CT '#{ctid2}', but was called for '#{ctid}' instead"
  exit(false)

elsif !ifname
  warn 'Expected to be called via symlink named as: <ctid>.<interface>, ' \
       "called as '#{base}' instead"
  exit(false)
end

s = UNIXSocket.new("/run/osctl/user-control/#{Process.uid}.sock")
s.puts({ cmd: :veth_up, opts: {
  id: ctid,
  pool:,
  interface: ifname,
  veth:
} }.to_json)
ret = JSON.parse(s.readline, symbolize_names: true)
s.close

exit if ret[:status]
warn "Error: #{ret[:message]}"
exit(false)
