Skip to content
Snippets Groups Projects
003-site-auto-select 2.12 KiB
Newer Older
#!/usr/bin/lua

local uci = require('luci.model.uci').cursor()
local json = require 'luci.json'
local tools = require 'gluon.site_generate'
local shape = require 'gluon.pointwithinshape'
local geo_default_site = "ffho_error"
function get_config(file)
  local f = io.open(file)
  if f then
    local config = json.decode(f:read('*a'))
    f:close()
    return config
  end
  return nil
end

function is_site_valid(site_code)
  local sites = get_config('/lib/gluon/site-select/sites.json')
  for _, site in pairs(sites) do
    if site.site_code == site_code then
      return true
    end
  end
  return false
end

function set_currentsite(site_code)
  if site_code and is_site_valid(site_code) then
    uci:set('currentsite', 'current', 'name', site_code)
    uci:save('currentsite')
    uci:commit('currentsite')
    return true
  end
  return false
end

function get_site_by_geo(latitude, longitude)
  if not latitude or not longitude then
    return nil
  end
  local sites = tools.get_config('/lib/gluon/site-select/geo.json').features
  for _,site in ipairs(sites) do
    if site.geometry and site.geometry.coordinates then
      local tmp1 = {}
      for _, val in ipairs(site.geometry.coordinates[1]) do
        local tmp2 = {}
        tmp2.x=val[2]
        tmp2.y=val[1]
        table.insert(tmp1, tmp2)
      end
      if shape.PointWithinShape(tmp1, tonumber(latitude), tonumber(longitude)) then
        return site.properties.site_code
      end
  return geo_default_site
end

local currentsite = uci:get('currentsite', 'current', 'name')
local configured = is_site_valid(currentsite)

if configured == false then
  local latitude = uci:get_first('gluon-node-info', 'location', 'latitude')
  local longitude = uci:get_first('gluon-node-info', 'location', 'longitude')
  if latitude and longitude then
    currentsite = get_site_by_geo(latitude, longitude)
    configured = set_currentsite(currentsite)
  end
end

if configured == false then
  local minute = math.random(0, 59)
  local f = io.open('/usr/lib/micron.d/ffho-site-auto-select', 'w')
  f:write(string.format('%i * * * * /usr/sbin/ffho-site-auto-select\n', minute))
  f:close()
end