SHOW:
|
|
- or go back to the newest paste.
1 | -- Debiget - (c) monster010 | |
2 | local pUrl = "http://pastebin.com/raw/" | |
3 | ||
4 | local debiget_path = '/debiget.d' | |
5 | local debiget_backuppath = debiget_path..'/backup' | |
6 | local debiget_installpath = debiget_path..'/installed.list' | |
7 | ||
8 | local debiget_sources = {} | |
9 | local debiget_installed = {} | |
10 | ||
11 | local tArgs = { ... } | |
12 | local peripSides = peripheral.getNames() | |
13 | ||
14 | ||
15 | if not http or not http.checkURL(pUrl) then | |
16 | print("Bei dir ist in der ComputerCraft-config http nicht aktiviert.") | |
17 | print("Stelle sicher das 'pastebin.com' in der http.whitelist eingetragen ist.") | |
18 | print("Aktiviere es, starte Minecraft neu und fuehre debiget erneut aus.") | |
19 | return | |
20 | end | |
21 | ||
22 | ||
23 | ||
24 | local function clear() | |
25 | term.clear() | |
26 | term.setCursorPos(1,1) | |
27 | term.setTextColor(colors.white) | |
28 | end | |
29 | ||
30 | ||
31 | ||
32 | function table.removeKey(tables, key) | |
33 | local i = 0 | |
34 | local ks, vs = {}, {} | |
35 | ||
36 | for k, v in pairs(tables) do | |
37 | i = i + 1 | |
38 | ks[i] = k | |
39 | vs[i] = v | |
40 | end | |
41 | ||
42 | while i > 0 do | |
43 | if ks[i] == key then | |
44 | table.remove(ks, i) | |
45 | table.remove(vs, i) | |
46 | break | |
47 | end | |
48 | ||
49 | i = i - 1 | |
50 | end | |
51 | ||
52 | local a = {} | |
53 | for i = 1, #ks do | |
54 | a[ks[i]] = vs[i] | |
55 | end | |
56 | ||
57 | return a | |
58 | end | |
59 | ||
60 | ||
61 | ||
62 | local function loadSources() | |
63 | - | local dl = http.get(pUrl.."01W8xQyC") |
63 | + | local request, err = http.get(pUrl.."01W8xQyC") |
64 | ||
65 | - | if dl then |
65 | + | if not request then exit("Fehler:", err) end |
66 | - | debiget_sources = textutils.unserialize(dl.readAll()) |
66 | + | |
67 | - | dl.close() |
67 | + | if request then |
68 | debiget_sources = textutils.unserialize(request.readAll()) | |
69 | request.close() | |
70 | else | |
71 | exit("Konnte sources.list nicht aufrufen! Bitte kontaktiere monster8570 auf Twitter oder YouTube!") | |
72 | end | |
73 | end | |
74 | ||
75 | ||
76 | ||
77 | local function showDebiget() | |
78 | print("----- Debiget -----") | |
79 | print("-- by monster010 --") | |
80 | print() | |
81 | end | |
82 | ||
83 | local function showSources() | |
84 | for name, data in pairs(debiget_sources) do | |
85 | term.setTextColor(colors.green) | |
86 | write(name) | |
87 | term.setTextColor(colors.white) | |
88 | write(' -- ') | |
89 | term.setTextColor(colors.lightBlue) | |
90 | write(data["desc"].."\n") | |
91 | term.setTextColor(colors.white) | |
92 | end | |
93 | end | |
94 | ||
95 | local function showInstalled() | |
96 | for name, data in pairs(debiget_installed) do | |
97 | term.setTextColor(colors.green) | |
98 | write(name) | |
99 | term.setTextColor(colors.white) | |
100 | write(' -- ') | |
101 | term.setTextColor(colors.lightBlue) | |
102 | write('v.'..data["version"].."\n") | |
103 | term.setTextColor(colors.white) | |
104 | end | |
105 | end | |
106 | ||
107 | local function showHelp() | |
108 | print("debiget help -- Zeigt dieses Hilfemenu an") | |
109 | print("debiget install <programm> -- Installieren von Programmen") | |
110 | print("debiget update <programm> -- Updaten von Programmen") | |
111 | print("debiget remove <programm> -- Entfernen von Programmen") | |
112 | print("debiget config <programm> -- Zum Teilkonfigurieren") | |
113 | end | |
114 | ||
115 | ||
116 | ||
117 | local function readInput() | |
118 | term.setTextColor(colors.yellow) | |
119 | write("\n>") | |
120 | term.setTextColor(colors.white) | |
121 | ||
122 | local input = read():lower() | |
123 | ||
124 | return input | |
125 | end | |
126 | ||
127 | local function checkInput(table, input) | |
128 | local selected = false | |
129 | ||
130 | for name, data in pairs(table) do | |
131 | if not selected then | |
132 | if input == name then | |
133 | selected = true | |
134 | else | |
135 | selected = false | |
136 | end | |
137 | end | |
138 | end | |
139 | ||
140 | return selected | |
141 | end | |
142 | ||
143 | local function checkInputNum(table, input, text) | |
144 | local exists = false | |
145 | ||
146 | for i = 1, #table do | |
147 | if input == table[i] then | |
148 | exists = true | |
149 | end | |
150 | end | |
151 | ||
152 | if exists == false then | |
153 | print(text) | |
154 | checkInputNum(table, input) | |
155 | else | |
156 | return input | |
157 | end | |
158 | end | |
159 | ||
160 | local function exit(text, err) | |
161 | if not err then err = false end | |
162 | ||
163 | if err then | |
164 | term.setTextColor(colors.red) | |
165 | else | |
166 | term.setTextColor(colors.green) | |
167 | end | |
168 | write(text.."\n") | |
169 | term.setTextColor(colors.white) | |
170 | error() | |
171 | end | |
172 | ||
173 | local function confirm() | |
174 | local input = read():lower() | |
175 | ||
176 | if input == "j" or input == "ja" then | |
177 | return true | |
178 | else | |
179 | return false | |
180 | end | |
181 | end | |
182 | ||
183 | ||
184 | ||
185 | local function loadInstall() | |
186 | if fs.exists(debiget_installpath) then | |
187 | local file = fs.open(debiget_installpath, "r") | |
188 | debiget_installed = textutils.unserialize(file.readAll()) | |
189 | file.close() | |
190 | end | |
191 | end | |
192 | ||
193 | local function saveInstall() | |
194 | local file = fs.open(debiget_installpath, "w") | |
195 | file.write(textutils.serialize(debiget_installed)) | |
196 | file.close() | |
197 | end | |
198 | ||
199 | local function setInstallProg(table, program) | |
200 | debiget_installed[program] = table | |
201 | saveInstall() | |
202 | end | |
203 | ||
204 | local function setInstall(program, key, val) | |
205 | debiget_installed[program][key] = val | |
206 | saveInstall() | |
207 | end | |
208 | ||
209 | local function addInstall(table, program) | |
210 | debiget_installed[program] = table | |
211 | saveInstall() | |
212 | end | |
213 | ||
214 | local function removeInstall(program) | |
215 | debiget_installed = table.removeKey(debiget_installed, program) | |
216 | saveInstall() | |
217 | end | |
218 | ||
219 | local function checkInstall(programm) | |
220 | if debiget_installed[programm] ~= nil then | |
221 | return true | |
222 | end | |
223 | ||
224 | return false | |
225 | end | |
226 | ||
227 | local function startupInstall(program) | |
228 | if debiget_sources[program] == nil then | |
229 | exit("Programm '"..program.."' existiert nicht!", true) | |
230 | elseif debiget_installed[program] == nil then | |
231 | exit("Programm '"..program.."' ist nicht installiert!", true) | |
232 | end | |
233 | ||
234 | local startup = debiget_sources[program]["startup"] | |
235 | ||
236 | if fs.exists('startup') then | |
237 | if fs.exists('startup-old') then | |
238 | fs.delete('startup-old') | |
239 | end | |
240 | fs.move('startup', 'startup-old') | |
241 | end | |
242 | ||
243 | local sfile = fs.open("startup", "w") | |
244 | sfile.write(startup) | |
245 | sfile.close() | |
246 | end | |
247 | ||
248 | ||
249 | ||
250 | local function checkSides(pType) | |
251 | local rSides = {} | |
252 | local nSides = 0 | |
253 | ||
254 | for i = 1, #peripSides do | |
255 | if peripheral.getType(peripSides[i]) == pType then | |
256 | nSides = nSides + 1 | |
257 | rSides[nSides] = peripSides[i] | |
258 | ||
259 | write(peripSides[i]) | |
260 | ||
261 | if i ~= #peripSides then | |
262 | write(", ") | |
263 | end | |
264 | end | |
265 | end | |
266 | ||
267 | return rSides | |
268 | end | |
269 | ||
270 | ||
271 | ||
272 | local function writeFile(path, content) | |
273 | local file = fs.open(path, 'w') | |
274 | file.write(content) | |
275 | file.close() | |
276 | end | |
277 | ||
278 | local function writeFiles(files) | |
279 | for path, content in pairs(files) do | |
280 | writeFile(path, content) | |
281 | end | |
282 | end | |
283 | ||
284 | local function backupFile(path, name) | |
285 | if fs.exists(path..'/'..name) then | |
286 | fs.move(path..name, debiget_backuppath..name) | |
287 | end | |
288 | end | |
289 | ||
290 | local function restoreFile(path, name) | |
291 | if fs.exists(debiget_backuppath..'/'..name) then | |
292 | fs.move(debiget_backuppath..name, path..name) | |
293 | end | |
294 | end | |
295 | - | local download = http.get(url) |
295 | + | |
296 | local function downloadFile(name, pid, url) | |
297 | local download, err = http.get(url) | |
298 | local file | |
299 | ||
300 | if not download then exit("Fehler: ", err) end | |
301 | ||
302 | if download then | |
303 | print("Fetching "..name.." ("..pid..")") | |
304 | file = download.readAll() | |
305 | download.close() | |
306 | return file | |
307 | else | |
308 | exit("Konnte "..name.." ("..pid..") nicht herunterladen!\nHerunterladen fehlgeschlagen!\n", true) | |
309 | end | |
310 | end | |
311 | ||
312 | ||
313 | ||
314 | local function install(program) | |
315 | local filelist = debiget_sources[program]["files"] | |
316 | local path = debiget_sources[program]["path"] | |
317 | local name = debiget_sources[program]["name"] | |
318 | local files = {} | |
319 | ||
320 | if fs.exists(path) or checkInstall(program) then | |
321 | exit("Programm "..name.." ist bereits installiert!", true) | |
322 | else | |
323 | fs.makeDir(path) | |
324 | end | |
325 | ||
326 | print("Installiere "..name.."...") | |
327 | ||
328 | for __, data in pairs(filelist) do | |
329 | local url = pUrl..data["pid"] | |
330 | local lpath = path..'/'..data["name"] | |
331 | local download = downloadFile(data["name"], data["pid"], url) | |
332 | ||
333 | files[lpath] = download | |
334 | end | |
335 | ||
336 | writeFiles(files) | |
337 | addInstall(debiget_sources[program], program) | |
338 | ||
339 | startupInstall(program) | |
340 | ||
341 | exit("Installation von "..name.." abgeschlossen!") | |
342 | end | |
343 | ||
344 | local function update(program) | |
345 | if debiget_sources[program] == nil then | |
346 | exit("Programm '"..program.."' existiert nicht!", true) | |
347 | elseif debiget_installed[program] == nil then | |
348 | exit("Programm '"..program.."' ist nicht installiert!", true) | |
349 | end | |
350 | ||
351 | local filelist = debiget_sources[program]["files"] | |
352 | local path = debiget_installed[program]["path"] | |
353 | local name = debiget_installed[program]["name"] | |
354 | local cfgs = debiget_sources[program]["cfgs"] | |
355 | local lversion = debiget_installed[program]["version"] | |
356 | local sversion = debiget_sources[program]["version"] | |
357 | local files = {} | |
358 | ||
359 | if lversion == sversion then | |
360 | exit(name.." ist bereits auf der neusten Version!") | |
361 | end | |
362 | ||
363 | print("Update "..name.."...") | |
364 | ||
365 | if #cfgs ~= 0 then | |
366 | print("Erstelle Backup von "..name.."...") | |
367 | ||
368 | for i=1, #cfgs do | |
369 | backupFile(path, cfgs[i]) | |
370 | end | |
371 | ||
372 | term.setTextColor(colors.green) | |
373 | print("Backup wurde erstellt!") | |
374 | term.setTextColor(colors.white) | |
375 | end | |
376 | ||
377 | fs.delete(path) | |
378 | fs.makeDir(path) | |
379 | ||
380 | for __, data in pairs(filelist) do | |
381 | local url = pUrl..data["pid"] | |
382 | local lpath = path..'/'..data["name"] | |
383 | local download = downloadFile(data["name"], data["pid"], url) | |
384 | ||
385 | files[lpath] = download | |
386 | end | |
387 | ||
388 | writeFiles(files) | |
389 | ||
390 | if #cfgs ~= 0 then | |
391 | print("Stelle Backup von "..name.." wieder her...") | |
392 | ||
393 | for i=1, #cfgs do | |
394 | restoreFile(path, cfgs[i]) | |
395 | end | |
396 | ||
397 | term.setTextColor(colors.green) | |
398 | print("Backup wurde wiederhergestellt!") | |
399 | term.setTextColor(colors.white) | |
400 | end | |
401 | ||
402 | setInstallProg(debiget_sources[program], program) | |
403 | ||
404 | exit("Update von "..name.." abgeschlossen!") | |
405 | end | |
406 | ||
407 | local function remove(program) | |
408 | if debiget_sources[program] == nil then | |
409 | exit("Programm '"..program.."' existiert nicht!", true) | |
410 | elseif debiget_installed[program] == nil then | |
411 | exit("Programm '"..program.."' ist nicht installiert!", true) | |
412 | end | |
413 | ||
414 | local path = debiget_installed[program]["path"] | |
415 | local name = debiget_installed[program]["name"] | |
416 | ||
417 | print("Deinstalliere "..name.."...") | |
418 | ||
419 | if fs.exists(path) then | |
420 | fs.delete(path) | |
421 | end | |
422 | ||
423 | removeInstall(program) | |
424 | ||
425 | exit("Deinstallation von "..name.." abgeschlossen!") | |
426 | end | |
427 | ||
428 | local function config(program) | |
429 | if debiget_sources[program] == nil then | |
430 | exit("Programm '"..program.."' existiert nicht!", true) | |
431 | elseif debiget_installed[program] == nil then | |
432 | exit("Programm '"..program.."' ist nicht installiert!", true) | |
433 | end | |
434 | ||
435 | local path = debiget_installed[program]["path"] | |
436 | local name = debiget_installed[program]["name"] | |
437 | local needs = debiget_installed[program]["needs"] | |
438 | local dataCfg = {} | |
439 | local cfg = {} | |
440 | ||
441 | print("Konfiguration von "..name.."...") | |
442 | ||
443 | if needs["monitor"] == true then | |
444 | print("Auf welcher Seite befindet sich der Monitor?") | |
445 | write("Moegliche Seiten sind ") | |
446 | ||
447 | local rSides = checkSides("monitor") | |
448 | ||
449 | if #rSides == 1 then | |
450 | cfg["monSide"] = rSides[1] | |
451 | print("Benutze Monitor "..rSides[1]) | |
452 | elseif #rSides == 0 then | |
453 | exit("Kein Monitor vorhanden!", true) | |
454 | else | |
455 | local input = readInput() | |
456 | local exists = checkInputNum(rSides, input, "An der angegeben Seite ist kein Monitor angeschlossen!") | |
457 | ||
458 | cfg["monSide"] = exists | |
459 | end | |
460 | end | |
461 | ||
462 | if needs["redstone"] == true then | |
463 | print("Auf welcher Seite befindet sich das BundledCable?") | |
464 | term.setTextColor(colors.blue) | |
465 | print("Info: Es kann nicht geprueft werden, ob sich an der angegebenen Seite ein BundledCable befindet!") | |
466 | ||
467 | local input = readInput() | |
468 | cfg["redSide"] = input | |
469 | end | |
470 | ||
471 | if needs["modem"] == true then | |
472 | print("Auf welcher Seite befindet sich das Modem?") | |
473 | write("Moegliche Seiten sind ") | |
474 | ||
475 | local rSides = checkSides("modem") | |
476 | ||
477 | if #rSides == 1 then | |
478 | cfg["modSide"] = rSides[1] | |
479 | print("Benutze Modem "..rSides[1]) | |
480 | elseif #rSides == 0 then | |
481 | exit("Kein Modem vorhanden!", true) | |
482 | else | |
483 | local input = readInput() | |
484 | local exists = checkInputNum(rSides, input, "An der angegeben Seite ist kein Modem angeschlossen!") | |
485 | ||
486 | cfg["modSide"] = exists | |
487 | end | |
488 | end | |
489 | ||
490 | if fs.exists(path..'/'..'cfg') then | |
491 | local rFile = fs.open(path..'/'..'cfg', "r") | |
492 | dataCfg = textutils.unserialize(rFile.readAll()) | |
493 | rFile.close() | |
494 | end | |
495 | ||
496 | dataCfg["monSide"] = cfg["monSide"] | |
497 | dataCfg["redSide"] = cfg["redSide"] | |
498 | dataCfg["modSide"] = cfg["modSide"] | |
499 | ||
500 | local wFile = fs.open(path..'/'..'cfg', "w") | |
501 | wFile.write(textutils.serialize(dataCfg)) | |
502 | wFile.close() | |
503 | ||
504 | exit("Konfiguration von "..name.." abgeschlossen!") | |
505 | end | |
506 | ||
507 | ||
508 | ||
509 | ||
510 | --showDebiget() | |
511 | loadSources() | |
512 | loadInstall() | |
513 | ||
514 | if #tArgs <= 0 then | |
515 | showHelp() | |
516 | end | |
517 | ||
518 | if #tArgs >= 1 and tArgs[1] == "help" then | |
519 | showHelp() | |
520 | elseif #tArgs >= 1 and tArgs[1] == "install" then | |
521 | local installFound = false | |
522 | local input | |
523 | ||
524 | if #tArgs == 2 then | |
525 | input = tArgs[2]:lower() | |
526 | else | |
527 | print("Folgende Programme koennen installiert werden:") | |
528 | showSources() | |
529 | input = readInput() | |
530 | end | |
531 | ||
532 | installFound = checkInput(debiget_sources, input) | |
533 | ||
534 | if installFound == false then | |
535 | if input == "" then | |
536 | exit("Es wurde kein Programm angegeben!", true) | |
537 | else | |
538 | exit("Es konnte kein Programm Names '"..input.."' gefunden werden!", true) | |
539 | end | |
540 | else | |
541 | install(input) | |
542 | end | |
543 | elseif #tArgs >= 1 and tArgs[1] == "remove" then | |
544 | local progFound = false | |
545 | local input | |
546 | ||
547 | if #tArgs == 2 then | |
548 | input = tArgs[2]:lower() | |
549 | else | |
550 | print("Folgende Programme koennen entfernt werden:") | |
551 | showInstalled() | |
552 | input = readInput() | |
553 | end | |
554 | ||
555 | progFound = checkInput(debiget_installed, input) | |
556 | ||
557 | if progFound == false then | |
558 | if input == "" then | |
559 | exit("Es wurde kein Programm angegeben!", true) | |
560 | else | |
561 | exit("Es konnte kein Programm Names '"..input.."' gefunden werden!", true) | |
562 | end | |
563 | else | |
564 | remove(input) | |
565 | end | |
566 | elseif #tArgs >= 1 and tArgs[1] == "update" then | |
567 | local progFound = false | |
568 | local input | |
569 | ||
570 | if #tArgs == 2 then | |
571 | input = tArgs[2]:lower() | |
572 | else | |
573 | print("Folgende Programme koennen geupdatet werden:") | |
574 | showInstalled() | |
575 | input = readInput() | |
576 | end | |
577 | ||
578 | progFound = checkInput(debiget_installed, input) | |
579 | ||
580 | if progFound == false then | |
581 | if input == "" then | |
582 | exit("Es wurde kein Programm angegeben!", true) | |
583 | else | |
584 | exit("Es konnte kein Programm Names '"..input.."' gefunden werden!", true) | |
585 | end | |
586 | else | |
587 | update(input) | |
588 | end | |
589 | elseif #tArgs >= 1 and tArgs[1] == "config" then | |
590 | local progFound = false | |
591 | local input | |
592 | ||
593 | if #tArgs == 2 then | |
594 | input = tArgs[2]:lower() | |
595 | else | |
596 | print("Folgende Programme koennen konfiguriert werden:") | |
597 | showInstalled() | |
598 | input = readInput() | |
599 | end | |
600 | ||
601 | progFound = checkInput(debiget_installed, input) | |
602 | ||
603 | if progFound == false then | |
604 | if input == "" then | |
605 | exit("Es wurde kein Programm angegeben!", true) | |
606 | else | |
607 | exit("Es konnte kein Programm Names '"..input.."' gefunden werden!", true) | |
608 | end | |
609 | else | |
610 | config(input) | |
611 | end | |
612 | elseif #tArgs >= 1 then | |
613 | exit("Der Befehl "..tArgs[1].." wurde nicht gefunden!", true) | |
614 | end |