View difference between Paste ID: ZRV8weh9 and j6ykRYrb
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