defmodule Image.Application do @moduledoc false # This env var, if set, will prevent `libvips` # from loading untrusted loaders. We set this to # true if it is not otherwise set. # See https://github.com/kipcole9/image/issues/9 @untrusted_env_var "VIPS_BLOCK_UNTRUSTED" use Application require Logger @doc false def start(_type, _args) do Image.SetSafeLoader.set(@untrusted_env_var) Supervisor.start_link( children(Code.ensure_loaded?(Bumblebee)), strategy: :one_for_one, name: Image.Supervisor ) end # When Bumblebee is available if Code.ensure_loaded?(Bumblebee) do @services [ {{Image.Classification, :classifier, []}, true}, {{Image.Generation, :generator, []}, false} ] defp children(true) do Enum.reduce(@services, [], fn {{module, function, args}, start?}, acc -> if autostart?(function, start?) do case apply(module, function, args) do {:error, reason} -> Logger.warning("Cannot autostart #{inspect(function)}. Error: #{inspect(reason)}") acc server -> [server | acc] end else acc end end) end end # When bumblebee is not available defp children(_) do [] end @doc false def autostart?(service, start?) do :image |> Application.get_env(service, autostart: start?) |> Keyword.get(:autostart) end end defmodule Image.SetSafeLoader do @moduledoc false def set(env_var) do unless System.get_env(env_var) do System.put_env(env_var, "TRUE") end {:ok, env_var} end end