aboutsummaryrefslogtreecommitdiff
path: root/cmd/web/install.go
blob: 26457979b3d2120c397e6464971e8b481f6e49ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main

/*

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)

func (a *App) installHTTP(u string) error {
	Logger.Println("Installer: loading from url")
	resp, err := http.Get(u)
	if err != nil {
		return fmt.Errorf("Installer: getting %w", err)
	}

	estSize, err := strconv.ParseInt(resp.Header.Get("Estimated-size"), 10, 64)
	if err != nil {
		return fmt.Errorf("Failed to convert estimated size header: %w", err)
	}

	a.Status.Lock()
	a.Status.Size = estSize
	a.Status.Unlock()

	rdr, wrtr := io.Pipe()

	go func() {
		err = a.Library.Extract(rdr)
		if err != nil {
			Logger.Printf("Installer: extracting %s", err)
		}
		resp.Body.Close()
	}()

	var total int64
	start := time.Now()
	a.Status.Lock()
	a.Status.Start = &start
	a.Status.Unlock()
	for {
		var n int64
		n, err = io.CopyN(wrtr, resp.Body, 100*1024*1024)
		if err == io.EOF {
			break
		} else if err != nil {
			Logger.Printf("Error encountered read from response body in installer: %s", err)
			break
		}

		total += n
		mb := float64(total / 1024 / 1024)
		rate := mb / time.Since(start).Seconds()

		Logger.Printf("Downloading from %s, Size: %s, %0.1f%% Done, Rate: %.2f mb/s",
			u, formatBytes(estSize), float64(total)/float64(estSize)*100, rate)

		a.Status.Lock()
		a.Status.Transferred = total
		a.Status.Unlock()
	}

	if err == io.EOF {
		return nil
	}

	return err
}

func (a *App) installPath(p string) error {
	Logger.Println("Installer: loading from filesystem")
	fh, err := os.Open(p)
	if err != nil {
		return fmt.Errorf("Installer: opening %w", err)
	}

	err = a.Library.Extract(fh)
	if err != nil {
		return fmt.Errorf("Installer: opening %w", err)
	}
	fh.Close()
	return nil
}

// installer runs in the background installing games either from a local path or
// a remote URL
func (a *App) installer() {
	var err error
	for u := range a.download {
		a.Status.Lock()
		Logger.Printf("Installer: running for URI: %s", u)
		a.Status.Running = true
		a.Status.Url = u
		a.Status.Unlock()

		if strings.HasPrefix(u, "http") {
			err = a.installHTTP(u)
		} else {
			err = a.installPath(u)
		}

		a.Status.Lock()
		a.Status.Running = false
		a.Status.Error = err
		Logger.Printf("Installer: Completed request %s Errors: %s", u, err)
		a.Status.Unlock()

		a.LibraryReload()
	}
}
*/