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 local ret, err = pcall(state.rollback, state, self.register)
34 function Task.step(self)
35 local state = table.remove(self.work)
36 local ret, next = pcall(state.process, state, self.register)
40 local nstate = self.machine:state(next)
42 table.insert(self.work, state)
43 table.insert(self.work, nstate)
45 self.register.error = "Unknown state: " .. next
49 table.insert(self.done, state)
54 self.register.error = next
59 function Task.perform(self)
63 if not self.register.error then
68 stat, err = self:rollback()
72 self.register.errstr = err
73 self.register.error = 2
81 Machine = luci.util.class()
83 function Machine.__init__(self, namespace)
84 self.namespace = namespace or _NAME
87 function Machine.state(self, name)
88 local ret, state = pcall(require, self.namespace .. "." .. name)
92 function Machine.task(self, name, ...)
93 local start = self:state(name)
95 if type(start) ~= "table" or not start.entry then
96 return false, "No such command: " .. name
101 return start:entry(register) and Task(self, register, start)