1 module("luci.lpk.core", package.seeall)
4 Task = luci.util.class()
6 function Task.__init__(self, machine, register, start)
9 -- The queue that has to be processed
12 -- The queue that has to be processed in case of rollback
16 self.register = register
19 function Task.rollback(self)
20 if #self.done < 1 then
24 local state = table.remove(self.done)
25 if not state.rollback then
29 local ret, err = pcall(state.rollback, state, self.register)
38 function Task.step(self)
39 local state = table.remove(self.work)
40 local ret, next = pcall(state.process, self.register)
44 local nstate = self.machine:state(next)
46 table.insert(self.work, state)
47 table.insert(self.work, nstate)
49 self.register.error = 2
50 self.register.errstr = "Unknown state: " .. next
54 table.insert(self.done, state)
59 self.register.error = next
64 function Task.perform(self)
68 if not self.register.error then
73 stat, err = self:rollback()
77 self.register.errstr = err
78 self.register.error = 2
86 Machine = luci.util.class()
88 function Machine.__init__(self, namespace)
89 self.namespace = namespace or _NAME
92 function Machine.state(self, name)
93 local ret, state = pcall(require, self.namespace .. "." .. name)
97 function Machine.task(self, name, ...)
98 local start = self:state(name)
100 if type(start) ~= "table" or not start.entry then
101 return false, "No such command: " .. name
106 return start.entry(register, ...) and Task(self, register, start)