You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.3 KiB
Lua
105 lines
2.3 KiB
Lua
local package = {}
|
|
local packList = readFile("/apps/installed.cfg")
|
|
local packageLoading = {}
|
|
|
|
function package.setEntry(name,info)
|
|
packList[name] = info
|
|
info.running = {}
|
|
info.running.enabled = false
|
|
end
|
|
local function packageEnableFor(info,forName)
|
|
info.running.enabled = true
|
|
if forName then
|
|
info.running.neededFor[forName] = true
|
|
end
|
|
end
|
|
function package.enableFor(name,forName)
|
|
local info = packList[name]
|
|
if not info then
|
|
return false,"Package is not installed"
|
|
end
|
|
if packageLoading[name] then
|
|
return true
|
|
end
|
|
if info.running.enabled then
|
|
return packageEnabledFor(info,forName)
|
|
end
|
|
if info.enabledState < 0 then
|
|
return false,"Package is disabled"
|
|
end
|
|
if not info.requirements then
|
|
return packageEnabledFor(info,forName)
|
|
end
|
|
packageLoading[name] = true
|
|
for _,v in pairs(info.requirements) do
|
|
if not package.enable(v,name) then
|
|
return false,"Requirements are missing"
|
|
end
|
|
end
|
|
return packageEnabledFor(info,forName)
|
|
end
|
|
function package.isInstalled(name)
|
|
return packList[name] ~= nil
|
|
end
|
|
function package.enable(name)
|
|
return package.enableFor(name,nil)
|
|
end
|
|
function package.isEnabled(name)
|
|
local info = packList[name]
|
|
if not info then
|
|
return false,"Package is not installed"
|
|
end
|
|
return info.running.enabled
|
|
end
|
|
function package.disable(name) do
|
|
local info = packList[name]
|
|
if not info then
|
|
return false,"Package is not installed"
|
|
end
|
|
if packageLoading[name] then
|
|
return true
|
|
end
|
|
packageLoading[name] = true
|
|
for k,v in pairs(info.running.neededBy)
|
|
package.disable(name)
|
|
end
|
|
if info.requirements then
|
|
for k,v in pairs(info.requirements) do
|
|
package.disableUnneded(v)
|
|
end
|
|
end
|
|
for k,v in pairs(info.running.neededFor) do
|
|
package.disable(k)
|
|
end
|
|
info.running.neededFor = {}
|
|
info.running.enabled = false
|
|
return true
|
|
end
|
|
function package.disableUnneeded(name)
|
|
local info = packList[name]
|
|
if not info then
|
|
return false,"Package is not installed"
|
|
end
|
|
if info.running.disabled then
|
|
return true
|
|
end
|
|
if info.enabledState > 0 then
|
|
return false,"Package should be activated"
|
|
end
|
|
local needed = false
|
|
for k,v in pairs(info.running.neededFor)
|
|
if v then
|
|
return false,"Package is needed"
|
|
end
|
|
end
|
|
return package.disable(name)
|
|
end
|
|
function package.save()
|
|
local sav = table.copy(packList)
|
|
for name,info in pairs(sav)
|
|
info.running = nil
|
|
end
|
|
writeFile("/apps/installed.cfg",sav)
|
|
end
|
|
|
|
return package |