SHOW:
|
|
- or go back to the newest paste.
1 | version = 20230824.1330 | |
2 | --[[ | |
3 | https://pastebin.com/8qbeZevX | |
4 | Last edited: see version YYYYMMDD.HHMM | |
5 | use ' pastebin run 8qbeZevX ' in turtle terminal | |
6 | This will load useful tools and utilities | |
7 | ]] | |
8 | ||
9 | local libDir = "lib" -- set library directory name | |
10 | local tmpDir = "tmp" -- set temp folder name to 'tmp' | |
11 | local root = "." | |
12 | local files = {} -- table of main files | |
13 | local libFiles = {} -- table of lib files (clsTurtle.lua and menu.lua) | |
14 | local fileSizes = {} -- table of current file sizes | |
15 | local libFileSizes = {} -- table of current library file sizes | |
16 | ||
17 | local function clear() | |
18 | term.clear() | |
19 | term.setCursorPos(1, 1) | |
20 | end | |
21 | ||
22 | local function log(text) | |
23 | print(text) | |
24 | local h = fs.open("update.log", "a") | |
25 | h.writeLine(text) | |
26 | h.close() | |
27 | end | |
28 | ||
29 | local function checkLabel() | |
30 | if os.getComputerLabel() == nil then | |
31 | local noname = true | |
32 | while noname do | |
33 | clear() | |
34 | log("Give this turtle a name (no spaces)_") | |
35 | name = read() | |
36 | if name == '' then | |
37 | print("Just pressing Enter does not work") | |
38 | elseif string.find(name, ' ') ~= nil then | |
39 | print("NO SPACES!") | |
40 | else | |
41 | noname = false | |
42 | end | |
43 | if noname then | |
44 | sleep(2) | |
45 | end | |
46 | end | |
47 | ||
48 | os.setComputerLabel(name) | |
49 | log("Computer label set to "..os.getComputerLabel()) | |
50 | end | |
51 | end | |
52 | ||
53 | local function checkFileExists(fileName, isLib) | |
54 | --[[ check in ./ or ./lib/ only (existing files) ]] | |
55 | if isLib then -- checking a library file | |
56 | if fs.exists(fs.combine(libDir, fileName)) or fs.exists(fs.combine(libDir, fileName..".lua")) then | |
57 | return true | |
58 | end | |
59 | else | |
60 | if fs.exists(fileName) or fs.exists(fileName..".lua") then | |
61 | return true | |
62 | end | |
63 | end | |
64 | return false | |
65 | end | |
66 | ||
67 | local function createTempDir() | |
68 | if fs.exists(tmpDir) then | |
69 | log("./"..tmpDir.." already exists") | |
70 | else | |
71 | log("./"..tmpDir.." created") | |
72 | fs.makeDir(tmpDir) | |
73 | end | |
74 | end | |
75 | ||
76 | local function getFile(pastebin, fileName) | |
77 | --[[eg "UFvjc1bw", "tmp", "tk" | |
78 | use pastebin get to download file to tmp]] | |
79 | log("Fetching "..pastebin.." from Pastebin...") | |
80 | status, retval = pcall(shell.run, "pastebin", "get", pastebin, fs.combine(tmpDir, fileName)) | |
81 | --if shell.run("pastebin", "get", pastebin, fs.combine(tmpDir, fileName)) then | |
82 | if status then | |
83 | log("Fetch error message "..tostring(retVal)) | |
84 | log("Fetch success: "..tostring(status)) | |
85 | log(fileName.." copied to ./"..tmpDir) | |
86 | return true | |
87 | else | |
88 | log(retval) | |
89 | log("failed to copy "..fileName.." from Pastebin") | |
90 | return false | |
91 | end | |
92 | end | |
93 | ||
94 | local function moveFile(isLib, fileName) -- movgee tmp copy to /lib/ | |
95 | if isLib then | |
96 | fs.delete(fs.combine(libDir, fileName)) | |
97 | sleep(1) | |
98 | fs.move(fs.combine(tmpDir, fileName), fs.combine(libDir, fileName)) -- move to lib/ | |
99 | log("Moved: "..fileName.." from ./"..tmpDir.." to ./"..libDir.."/") | |
100 | else | |
101 | fs.delete(fileName) | |
102 | sleep(1) | |
103 | fs.move(fs.combine(tmpDir, fileName), fs.combine(root, fileName)) --move to root | |
104 | log("Moved: "..fileName.." from ./"..tmpDir.." to ./") | |
105 | end | |
106 | end | |
107 | ||
108 | local function getVersion(line, fileName) | |
109 | --[[ version = 20201223.1104 ]] | |
110 | local version = 0 | |
111 | if line == nil then | |
112 | log("Error reading "..fileName) | |
113 | else | |
114 | line = line:gsub(" ", "") -- remove spaces | |
115 | local start = line:find("=") | |
116 | ||
117 | if start ~= nil then -- found | |
118 | version = tonumber(line:sub(start + 1)) | |
119 | end | |
120 | end | |
121 | ||
122 | return version | |
123 | end | |
124 | ||
125 | local function isNewer(isLib, fileName) | |
126 | --[[ open files in tmp and .. or ../tmp to read file version ]] | |
127 | local old = nil -- declare old file handle | |
128 | local new = nil -- declare new file handle | |
129 | local move = true -- set move flag to true | |
130 | local oldOpen, newOpen = false, false | |
131 | ||
132 | if isLib then -- file is in lib/ | |
133 | if checkFileExists(fileName, true) then | |
134 | old = fs.open(fs.combine(libDir, fileName), "r") | |
135 | move = false | |
136 | oldOpen = true | |
137 | end | |
138 | else -- not a library file | |
139 | if checkFileExists(fileName, false) then | |
140 | old = fs.open(fileName, "r") | |
141 | move = false | |
142 | oldOpen = true | |
143 | end | |
144 | end | |
145 | ||
146 | if not move then -- previous version of file exists | |
147 | if fs.exists(fs.combine(tmpDir, fileName)) then -- should exist in tmp folder | |
148 | new = fs.open(fs.combine(tmpDir, fileName), "r") | |
149 | newOpen = true | |
150 | local oldVer = getVersion(old.readLine(),fileName) | |
151 | log("Existing "..fileName.." version: "..oldVer) | |
152 | local newVer = getVersion(new.readLine(), fileName) | |
153 | log("Downloaded "..fileName.." version: "..newVer) | |
154 | if oldVer > 0 and newVer > 0 then | |
155 | if newVer > oldVer then | |
156 | move = true | |
157 | end | |
158 | elseif oldVer == 0 and newVer > 0 then | |
159 | move = true | |
160 | end | |
161 | end | |
162 | end | |
163 | ||
164 | if newOpen then | |
165 | new.close() | |
166 | end | |
167 | if oldOpen then | |
168 | old.close() | |
169 | end | |
170 | return move | |
171 | end | |
172 | ||
173 | local function process(key, value, isLib) | |
174 | local fileName = key..".lua" | |
175 | local count = 0 | |
176 | local fileSize = 0 | |
177 | local freeSpace = fs.getFreeSpace("./") | |
178 | log("\nAvailable space: "..freeSpace) | |
179 | log("Checking: "..fileName) | |
180 | if isLib then | |
181 | fileSize = libFileSizes[key] | |
182 | else | |
183 | fileSize = fileSizes[key] | |
184 | end | |
185 | log(fileName.." size:"..fileSize) | |
186 | log("Available space after fetch: "..freeSpace - fileSize) | |
187 | - | if freeSpace - fileSize < 50000 then |
187 | + | if freeSpace - fileSize < 0 then |
188 | clear() | |
189 | local message = | |
190 | [[Insufficient disk space for update. | |
191 | 1. Save your game | |
192 | 2. Edit the file: | |
193 | serverconfig/computercraft-server.toml | |
194 | (in your game save folder) | |
195 | 3. Change line 2: | |
196 | computer_space_limit = 1000000 to | |
197 | computer_space_limit = 2000000 or more | |
198 | 4. Re-start the game | |
199 | 5. Run the updater again | |
200 | ]] | |
201 | log(message) | |
202 | return -1 | |
203 | else | |
204 | if getFile(value, fileName) then -- download file to /tmp | |
205 | if isNewer(isLib, fileName) then | |
206 | moveFile(isLib, fileName) -- move tmp copy to /lib | |
207 | count = count + 1 | |
208 | else | |
209 | log(fileName.." is newer or unchanged") | |
210 | end | |
211 | sleep(1) | |
212 | log("Removing "..tmpDir.."/"..fileName) | |
213 | fs.delete(fs.combine(tmpDir, fileName)) | |
214 | sleep(2) | |
215 | end | |
216 | end | |
217 | ||
218 | return count | |
219 | end | |
220 | ||
221 | local function addFileSize(isLib, tblName, key) | |
222 | local fileName = key..".lua" | |
223 | if checkFileExists(fileName, isLib) then | |
224 | if isLib then | |
225 | tblName[key] = fs.getSize(fs.combine(libDir, fileName)) | |
226 | log("File size "..libDir.."/"..fileName..": "..tblName[key]) | |
227 | else | |
228 | tblName[key] = fs.getSize(fileName) | |
229 | log("File size "..fileName..": "..tblName[key]) | |
230 | end | |
231 | else | |
232 | tblName[key] = 0 | |
233 | log("File size "..fileName.."\t: "..tblName[key].." (file not present)") | |
234 | end | |
235 | ||
236 | end | |
237 | ||
238 | function main() | |
239 | local doContinue = true -- set continue flag | |
240 | clear() | |
241 | checkLabel() -- make sure turtle label is set | |
242 | createTempDir() -- create /tmp/ | |
243 | local tk = "UFvjc1bw" | |
244 | ||
245 | libFiles['clsTurtle'] = "tvfj90gK" | |
246 | libFiles['menu'] = "BhjbYsw4" | |
247 | ||
248 | --files["tk"] = "UFvjc1bw" | |
249 | files['go'] = "xQqK3VcK" | |
250 | files['lavaRefuel'] = "kFZsXu99" | |
251 | files['d'] = "i2MRYcsZ" | |
252 | files['u'] = "idtySGKX" | |
253 | files['b'] = "g7DjxRbr" | |
254 | files['f'] = "KXCakmNn" | |
255 | files['r'] = "DH6smTHb" | |
256 | files['l'] = "yWDKZpvj" | |
257 | files['p'] = "D25pg0QQ" | |
258 | files['x'] = 'Z9GBSM8e' | |
259 | files['flint'] = "dBJ0frzj" | |
260 | files['data'] = "fCKDc9Vi" | |
261 | ||
262 | local updated = 0 | |
263 | local libUpdated = 0 | |
264 | local h = fs.open("update.log", "w") | |
265 | h.writeLine('Update Log:') | |
266 | h.close() | |
267 | ||
268 | log("Checking file sizes:\n") | |
269 | ||
270 | for key, _ in pairs(libFiles) do | |
271 | addFileSize(true, libFileSizes, key) | |
272 | end | |
273 | addFileSize(false, fileSizes, "tk") | |
274 | for key, _ in pairs(files) do | |
275 | addFileSize(false, fileSizes, key) | |
276 | end | |
277 | local freeSpace = fs.getFreeSpace("./") | |
278 | log("Free space: "..freeSpace.."\n") | |
279 | clear() | |
280 | local updated, libUpdated = 0, 0 | |
281 | updated = updated + process("tk", tk, false) -- start with tk as may cause out of space error | |
282 | if updated >= 0 then | |
283 | for key,value in pairs(libFiles) do | |
284 | libUpdated = libUpdated + process(key, value, true) -- download lib files from pastebin to tmp/ | |
285 | end | |
286 | for key,value in pairs(files) do | |
287 | updated = updated + process(key, value, false) -- download root files from pastebin to tmp/ | |
288 | end | |
289 | sleep(1) | |
290 | log("Attempting deletion of ./"..tmpDir) | |
291 | status, retval = pcall(fs.delete, tmpDir) | |
292 | if status then | |
293 | log("./"..tmpDir.." deleted") | |
294 | else | |
295 | log("Directory delete error message:\n "..tostring(retVal)) | |
296 | end | |
297 | log("\nOperation Complete ") | |
298 | log(libUpdated.." library files updated") | |
299 | log(updated.." root files updated") | |
300 | end | |
301 | print("See update.log for details") | |
302 | end | |
303 | ||
304 | main() |