Compare commits

...

10 commits

81 changed files with 18791 additions and 280 deletions

33
app/cert.pem Normal file
View file

@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFqTCCA5GgAwIBAgIUaDekQPmZSXzcQt/QS8T/oqxenYwwDQYJKoZIhvcNAQEL
BQAwZDELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhdmFyaWExEDAOBgNVBAcMB0tv
ZWRpdHoxHDAaBgNVBAoME2luZm9AbGFuZy1kaWV0ZXIuZGUxEzARBgNVBAMMCjEw
MC42NC4wLjYwHhcNMjYwODA0MDgzNzAzWhcNMjcwODA0MDgzNzAzWjBkMQswCQYD
VQQGEwJERTEQMA4GA1UECAwHQmF2YXJpYTEQMA4GA1UEBwwHS29lZGl0ejEcMBoG
A1UECgwTaW5mb0BsYW5nLWRpZXRlci5kZTETMBEGA1UEAwwKMTAwLjY0LjAuNjCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/8wzUdh1QVQIrcPX50tif
Mr0GY4UIgF+9d4YaHPLct4MVqkW/Vw4o4zxjkehZdHiXIMxUnS2dnaxEl+HsPUDy
Cwr58nunimXqGxSofYLG5AT3lqSE++/be56UZ4sq+gkf3J/HNOoEKrAw5PL8xPNK
83hpyjDJ4+t6eEFgbuyUdgZE+AC2ZEZul4PYZ1FpaHTyg87zTO7i5IQdVtaPMBYw
vspI9k7p65fH0bPOU/h3LmULJCzDvAmUb0GXhEewDkda3XHHWRyFKvAk6eatW4md
ySkvJKgLCKt7JEceS5DNjNVwkWNFGwR2IkWywcG+IAj5mXiNfO2oRXusjDMd+T0v
B/lijWSrizsrFaq2ow9Ux/6TriRHsYqvscMlj+6fzK2eVmJ4vbuDRATrL/AP8J+3
6r/fdWvZ/11n4mnasO1Z2FpbbQCpLPdQs+vFcZKXYZI5Y0qJ7DjSI6ClmKs+sejS
E85Z104LMdm7mkmrsB6UrlpPatbzW0IJOd9XCbtVnDJlVyLmrFku8uIntUqrttt2
wEvxfMlwxhqZkD7d6Z1aosV8dVep6wVf+xkd6UeLA60GVG/UOAL8OQTGxxTK+uBe
DdqQiTFJPjHYssV/SmReuESpfM/l+prwcLAJqpgSzQWNoDM66pKJqyqPwVpEyU98
tmszuNOsmabMh079S1BPAgMBAAGjUzBRMB0GA1UdDgQWBBTT9DOUJio3dT7NuwVh
D2CcJzPqTjAfBgNVHSMEGDAWgBTT9DOUJio3dT7NuwVhD2CcJzPqTjAPBgNVHRMB
Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAf/K8i5fHPn+GZEMwSk8Hbakt6
/X5qtPommkmTX3QHYi9HwEd26S1841GWAHPlWhdnzucbsHL08r+1Ler3FXL8XlPL
Ivu/3PCC0rMlW+6/5goYPeA1Ev5bl0ioGH3DpKzPPVA+qdThZVOE780oRN0T6kFY
jK1jOY45tEHTdwCcx9IyFR7bWelQnYeHorSrfLi+ydzoWvD1wPG6/GebdkfCdqNj
aBv7T2Tu/kEqrfft/4VH9llD2PtgSZMygsxGLp3sgdjZui2++bm/VdZCwO1zzh07
8BmyYjOGs1zxmhFjFVVL8gpwtZX3Eymbm8hqogXDGLIrWAVOisd71deGgnLNHjCf
nAbS5IFE1G1sAc3Qq+8Ny1gtsOZNrkdaNV2hrPvA2wiJwssQj5WKXem4er4t0eP6
zOxUgmecK5MSKlJ/B0qxj2MDtX0LxgVBeD1tj7rScRlcsnuD7lNtDPx7vy7MmRJF
I4Ko88AgvtccAtxLsBa9cb6hTOFbco0eNc2mBnekUY4TDjIvRQza54DyTf0/S528
x/jiUUTPCqG6mSNa71FmTzibH9JJLsu3mVpBAKiKd00k4vUls+4AedtD00VuszWg
wXuKRC/CqOojFY6eZyXQOuXbR4XKGH8LSaHrl11jkQ3DB4v259t46oKtCo55Abtw
sIrfnoH2iDkjjjM+zg==
-----END CERTIFICATE-----

29
app/config.json Normal file
View file

@ -0,0 +1,29 @@
{
"web_port": ":8080",
"ssl_cert": "cert.pem",
"ssl_key": "key.pem",
"i2c_bus": "1",
"ads1115_address_1": 72,
"ads1115_address_2": 73,
"name_adc1_ch0": "23cm",
"factor_adc1_ch0": 2.0,
"name_adc1_ch1": "13 cm",
"factor_adc1_ch1": 2.0,
"name_adc1_ch2": "9 cm",
"factor_adc1_ch2": 2.0,
"name_adc1_ch3": "6 cm",
"factor_adc1_ch3": 2.0,
"name_adc2_ch0": "3 cm",
"factor_adc2_ch0": 2.0,
"relais_pins": [
{"id": 1, "name": "Relais 1 (230V Hauptschalter)", "gpio": "GPIO12"},
{"id": 2, "name": "USB-Relais 1 (Reserve)", "gpio": "USB_CH1"},
{"id": 3, "name": "USB-Relais 2 23 cm", "gpio": "USB_CH2"},
{"id": 4, "name": "USB-Relais 3 13 cm", "gpio": "USB_CH3"},
{"id": 5, "name": "USB-Relais 4 9 cm", "gpio": "USB_CH4"},
{"id": 6, "name": "USB-Relais 5 6 cm", "gpio": "USB_CH5"},
{"id": 7, "name": "USB-Relais 6 3 cm", "gpio": "USB_CH6"},
{"id": 8, "name": "USB-Relais 7 (Reserve)", "gpio": "USB_CH7"},
{"id": 9, "name": "USB-Relais 8 (Reserve)", "gpio": "USB_CH8"}
]
}

36
app/install.sh Executable file
View file

@ -0,0 +1,36 @@
#!/bin/bash
set -e
echo "🚀 Starte automatische Einrichtung des Spannung-Monitors..."
# Pfade und Benutzer auf dem aktuellen Pi ermitteln
PI_DIR=$(pwd)
PI_USER=$(whoami)
# Architektur des Betriebssystems prüfen
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
BINARY="spannung-arm64"
echo "🎯 64-Bit OS erkannt. Nutze: $BINARY"
else
BINARY="spannung-arm32_7"
echo "🎯 32-Bit OS erkannt. Nutze: $BINARY"
fi
# Platzhalter in der Service-Datei direkt auf dem Pi ersetzen
sed -i "s|{{TARGET_DIR}}|$PI_DIR|g" spannung.service
sed -i "s|{{TARGET_USER}}|$PI_USER|g" spannung.service
sed -i "s|{{BINARY}}|$BINARY|g" spannung.service
echo "📝 Service-Datei wurde erfolgreich für dieser Pi konfiguriert."
# Service in das Systemverzeichnis kopieren und aktivieren
echo "⚙️ Kopiere Service-Datei nach /etc/systemd/system/..."
sudo cp spannung.service /etc/systemd/system/spannung.service
sudo systemctl daemon-reload
sudo systemctl enable spannung.service
echo "▶️ Starte den Dienst..."
sudo systemctl restart spannung.service
echo "✅ Fertig! Der Spannung-Monitor läuft und der Autostart ist aktiv."

52
app/key.pem Normal file
View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCu//MM1HYdUFUC
K3D1+dLYnzK9BmOFCIBfvXeGGhzy3LeDFapFv1cOKOM8Y5HoWXR4lyDMVJ0tnZ2s
RJfh7D1A8gsK+fJ7p4pl6hsUqH2CxuQE95akhPvv23uelGeLKvoJH9yfxzTqBCqw
MOTy/MTzSvN4acowyePrenhBYG7slHYGRPgAtmRGbpeD2GdRaWh08oPO80zu4uSE
HVbWjzAWML7KSPZO6euXx9GzzlP4dy5lCyQsw7wJlG9Bl4RHsA5HWt1xx1kchSrw
JOnmrVuJnckpLySoCwireyRHHkuQzYzVcJFjRRsEdiJFssHBviAI+Zl4jXztqEV7
rIwzHfk9Lwf5Yo1kq4s7KxWqtqMPVMf+k64kR7GKr7HDJY/un8ytnlZieL27g0QE
6y/wD/Cft+q/33Vr2f9dZ+Jp2rDtWdhaW20AqSz3ULPrxXGSl2GSOWNKiew40iOg
pZirPrHo0hPOWddOCzHZu5pJq7AelK5aT2rW81tCCTnfVwm7VZwyZVci5qxZLvLi
J7VKq7bbdsBL8XzJcMYamZA+3emdWqLFfHVXqesFX/sZHelHiwOtBlRv1DgC/DkE
xscUyvrgXg3akIkxST4x2LLFf0pkXrhEqXzP5fqa8HCwCaqYEs0FjaAzOuqSiasq
j8FaRMlPfLZrM7jTrJmmzIdO/UtQTwIDAQABAoICABsOoMYhjWI/5ZIweZvWdLFL
KqhLi2nqDsB+xghPvkfAijEe0ZT3c17Rlzy4NRAvJeZv5hbMQwG8Bmu4WUwJiiOh
/hoZhifJ7N3lYdWCWDw27dIPc9UGaKuaYap6+JLDDNC0rUMY+kdFE1KVj2M7Dg/Y
d/zB9+HY5+qkegu6/LuLGBUlEbvjzMI6XtEi+D/VTodnvasVjBYSslFI9gBg4txI
zMma7qufLZlp6t7kQ7BoFkjHfbWGzT/P7u8THaqLKnysLGPnS2cGTJq/olh+V5JX
TonAa72oTb6xtey3CZOfFwDN5vS/HmEaC3d/nsc1UwpViSiN+7xaZuUrIFbWR2Qv
0wL29RGnG2doBlrYTic6gOIaq8ywpFkvqqFpgVhX74MZYntbb+vHU3HezGGDhFoR
SWXh+QP3Po48i1ueslKBby3+V5v0gzJx8JI78lEbDYGVPj2BlrZwC37jZGxGa5hf
JwJZMGRRKiBSaWIQV0VPIrCaP4n2uL28R/JXe6/byJIIns0/kyNcaPiPwY35Zny5
BToozOCztThGJZA2WwHBEyz79n11V/THU5302gum47pspOghkwyco+7bxHQy9YXc
q2iO+cddzsArfr7Q5yagqKcIuIdQ37vpvRDZhxfVfSSRE3qTiq74gb9dN1QMgd0L
gmn6ozzhRDA6Kg5Ps6b5AoIBAQDxdqVuwKmf3S5KNOdvO7GeAb8JqfvY3P0/TVNN
qwB6cHpapntQihabrwo7H6K7GGH6Xyn2P0+Ma1a5NnlYPw5gyDqEQI3r8B9oUJsQ
BpsXlGOgVwjALg/kTv8cGgw9fbaKVmK0MZSYX8hAcpIbYQ5tb9GWJMhNw/gidwky
50fHf3DCmwBrfgb+FoAeIM9NLpOJ9LQWwhgkohzL3qT5t05z8a3i6B5BdjEIqkoA
7sNOKaqWpNmwPl5WJjV4RjGG7mCuu1uDEGeVlaQ97rQtHNls21TwJSTncnndoats
kj0fT+yk4RgEmIo+/iQgTzb2g+KrzZI1qi7w/DOGANKc+FrZAoIBAQC5iPzTGj9a
5jImQX/RpGiBnpa6u49aaVWvL/tWWlrHrd7q5tjQKBwWYOzncgEYLgl17P4QAvst
1lDwtvEz9DezAAdP/EQDilsMMQBDG5Wv6itkMet/YlcGnd0ZyvYyNR2KUrQhPS0K
SDjJjcgaHiKBjDY+1JKUU3RwDCaTjMSbuSS57XVVrtnjk7xit+Nr/rrhzWUhlzz2
Cp4008D17CEcjqfCW8inKi7Ekv+znys2N/BYkaqeKF6Ci99lH8J1Pc6IzuncXs/I
vADKmQauUn29kj7qDPbh8IorfQHt1mBm5rjfpnHDaDsnDlR9mgg5+TSK9SoQiFq0
L4IYxugPLPtnAoIBAQDHfqEbqe36+ICAKslzazxKMWMmltxOxfYt0LMcnkWc40UT
lCyZ1Bztr2aihnaqYXDBrNI8cv5EI4LZLxp+QEqex48hKTyYTCGGy+HxEaQdjSnq
lT3TmbrjhCjdjN/EBhNEpC6UdcoxQiFurbntCPkkjZf5lpYvOdPOlc5x0gfJ2Y7O
GcX1CYC5eNmNCsp7GBophpUroFzWF2H3RhHDhyE4RdrGd8RXjVDhud++eYW/FEmu
gLCiHkVOo+7VWhkdQ+F5O65V0L3kJmg2CvutsgIpH+VDK00cM8ZfyGybHQ+GyT/Y
0WhIk8bUWKB8WTYt4bTrAMLlt59k1tmywwc/TSmxAoIBADA2PqyEl44BX2q9fn91
n4p/MV/YuUmfMZrSdxdbZ1eYAOM9lX2RzqqqCSWjZFFqNR8ltGdovuiMVoAWqdr8
TTUAfuX0AaCB5WLnoM/PbThHO3tP1YhGf6LCht/a89rcHo8BKrmwcfHIDqmhZCwV
RJYxXy84gdZ1UT6EicmxvK1SkQ6Xe/QF+ay/iSaF7lzz1pAylWMDL94nqDDGDdBZ
ycjn8QP6Ycu+lGSUZknAxLPUGWqKf7GVf+mgey6F8DwTEYZPbknLgWcCI5qB5VCL
Mw194UdkkwrnPKBMXaH2IRrcPZIwaEOE5Eoj2STCT/zwmwy45HNjW16TMdVKaqb2
42UCggEBAJ1wbENrdb7NJlt52AsdAoPEHAgXv0rJXQrtpmOgDJ8SaOq2EWtYDHmL
LqGj91Uz1ciexk8RCaP431aqZVHRiYZVhWRb95TS1j29d8dI6+TbheaiMVx7XAZG
mX5StASrLqp2caYQi4QofuBmebidFfZJG27bHSMBMR5oh8MgNWaCGA4zRx6AF3dP
Ref5JWXs8+yiQWpXRUyZjyHmafHR3kB4YpxTjNAfQNSRnASdNfd6dcfb8Bc/XSe+
ZDTRor7NoHXa2pHgLY+jssDOJMvejxbKwXiVYZRu93TjDiYXf9V9iLiG809IErar
a7pqwbMVR1jya0Ujochc8hWhyqzgMKA=
-----END PRIVATE KEY-----

BIN
app/spannung-arm32_7 Executable file

Binary file not shown.

BIN
app/spannung-arm64 Executable file

Binary file not shown.

26
app/spannung.service Normal file
View file

@ -0,0 +1,26 @@
[Unit]
Description=Spannung Control Service
After=network-online.target i2c.service
Wants=network-online.target
StartLimitIntervalSec=60s
StartLimitBurst=3
[Service]
Type=simple
# Vorprüfung ALS ROOT ausführen
ExecStartPre=/bin/bash -c 'for i in {1..5}; do /usr/sbin/i2cdetect -y 1 | grep -q 48 && /usr/sbin/i2cdetect -y 1 | grep -q 49 && exit 0; sleep 2; done; exit 1'
ExecStart={{TARGET_DIR}}/{{BINARY}}
WorkingDirectory={{TARGET_DIR}}
User={{TARGET_USER}}
Restart=on-failure
RestartSec=5s
# KORREKTUR: Verhindert, dass STRG+C über SSH den Dienst beim Beenden des Logs killt
KillMode=process
StandardOutput=append:{{TARGET_DIR}}/spannung.log
StandardError=append:{{TARGET_DIR}}/spannung.log
[Install]
WantedBy=multi-user.target

10
app/version.json Normal file
View file

@ -0,0 +1,10 @@
{
"version": "0.2.2",
"build_date": "04.08.2026 um 10:33 by DD1DLH",
"description": "Messung von zwei Spannung und Steuerung von Relais",
"features": [
"ADS1115-Abfrage über go-i2c",
"Weboberfläche mit Steuerbuttons für Reilais",
"Definiton der GPIO in der config.json"
]
}

97
app/web/server.go Normal file
View file

@ -0,0 +1,97 @@
package web
import (
"encoding/json"
"html/template"
"net/http"
"strconv"
)
type RelaisData struct {
ID int `json:"id"`
Name string `json:"name"`
State bool `json:"state"`
}
type StatusResponse struct {
V1 float64 `json:"v1"`
V2 float64 `json:"v2"`
V3 float64 `json:"v3"`
V4 float64 `json:"v4"`
V5 float64 `json:"v5"`
Names []string `json:"names"` // Neu: Sendet die Namen als Array mit
Relais []RelaisData `json:"relais"`
Version string `json:"version"`
BuildDate string `json:"build_date"`
}
type Server struct {
port string
readVoltFunc func(channel int) float64
toggleFunc func(id int)
getRelais func() []RelaisData
versionFunc func() (string, string)
getNamesFunc func() []string // Neu hinzugefügt
}
func NewServer(port string, readVolt func(int) float64, toggle func(int), getRelais func() []RelaisData, getVersion func() (string, string), getNames func() []string) *Server {
return &Server{
port: port,
readVoltFunc: readVolt,
toggleFunc: toggle,
getRelais: getRelais,
versionFunc: getVersion,
getNamesFunc: getNames, // Neu hinzugefügt
}
}
func (s *Server) Start(certFile, keyFile string) error {
http.HandleFunc("/", s.handleIndex)
http.HandleFunc("/api/status", s.handleAPIStatus)
http.HandleFunc("/api/toggle", s.handleAPIToggle)
return http.ListenAndServeTLS(s.port, certFile, keyFile, nil)
}
func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
ver, date := s.versionFunc()
tmpl, err := template.ParseFiles("web/static/index.html")
if err != nil {
http.Error(w, "Template nicht gefunden: "+err.Error(), http.StatusInternalServerError)
return
}
data := StatusResponse{
Names: s.getNamesFunc(), // Namen für das erste Rendern bereitstellen
Relais: s.getRelais(),
Version: ver,
BuildDate: date,
}
tmpl.Execute(w, data)
}
func (s *Server) handleAPIStatus(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
ver, date := s.versionFunc()
resp := StatusResponse{
V1: s.readVoltFunc(0),
V2: s.readVoltFunc(1),
V3: s.readVoltFunc(2),
V4: s.readVoltFunc(3),
V5: s.readVoltFunc(4),
Names: s.getNamesFunc(),
Relais: s.getRelais(),
Version: ver,
BuildDate: date,
}
json.NewEncoder(w).Encode(resp)
}
func (s *Server) handleAPIToggle(w http.ResponseWriter, r *http.Request) {
idStr := r.URL.Query().Get("id")
id, err := strconv.Atoi(idStr)
if err == nil {
s.toggleFunc(id)
}
s.handleAPIStatus(w, r)
}

148
app/web/static/index.html Normal file
View file

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html>
<head>
<title>Funkstation Steuerung</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; text-align: center; background: #0f172a; color: #f8fafc; padding: 20px; }
/* Maximale Breite erhöht, um Platz für das zweispaltige Layout zu bieten */
.container { max-width: 1000px; margin: 0 auto; }
/* Das neue Haupt-Layout: Links Relais, rechts Spannungen */
.main-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
align-items: start;
text-align: left;
}
/* Spalten-Container für korrekte Ausrichtung */
.layout-col {
display: flex;
flex-direction: column;
}
.card { background: #1e293b; padding: 20px; margin: 15px 0; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.3); border: 1px solid #334155; text-align: center; }
.val { font-size: 2.5em; color: #38bdf8; font-weight: bold; font-family: monospace; }
.grid { display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 15px; }
.btn { width: 100%; padding: 14px; font-size: 1.1em; border: none; border-radius: 8px; cursor: pointer; font-weight: bold; transition: background 0.2s, transform 0.1s; color: white; }
.btn:active { transform: scale(0.98); }
.btn-on { background: #ef4444; }
.btn-on:hover { background: #dc2626; }
.btn-off { background: #10b981; }
.btn-off:hover { background: #059669; }
.footer-nav { margin-top: 25px; font-size: 0.9em; color: #64748b; clear: both; }
/* Responsive Anpassung: Schaltet auf Smartphones automatisch untereinander um */
@media (max-width: 768px) {
.main-layout { grid-template-columns: 1fr; gap: 0; }
}
</style>
</head>
<body>
<div class="container">
<h1>Funkstations-Monitor</h1>
<div class="main-layout">
<!-- LINKE SPALTE: Relaissteuerung -->
<div class="layout-col">
<div class="card">
<h3>Relaissteuerung</h3>
<div class="grid">
{{range .Relais}}
<button class="btn btn-off" id="relais-btn-{{.ID}}" onclick="toggleRelais({{.ID}})">
{{.Name}}: Laden...
</button>
{{end}}
</div>
</div>
</div>
<!-- RECHTE SPALTE: Spannungsanzeigen -->
<div class="layout-col">
<div class="card">
<h3>{{index .Names 0}}</h3>
<div class="val" id="v1">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 1}}</h3>
<div class="val" id="v2">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 2}}</h3>
<div class="val" id="v3">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 3}}</h3>
<div class="val" id="v4">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 4}}</h3>
<div class="val" id="v5">--.-- V</div>
</div>
</div>
</div>
<div class="footer-nav">
Live-Aktualisierung aktiv <br>
<span style="font-size: 0.8em; color: #475569; margin-top: 5px; display: block;">
Version {{.Version}} ({{.BuildDate}})
</span>
</div>
</div>
<script>
function updateUI(data) {
document.getElementById('v1').innerText = data.v1.toFixed(2) + ' V';
document.getElementById('v2').innerText = data.v2.toFixed(2) + ' V';
document.getElementById('v3').innerText = data.v3.toFixed(2) + ' V';
document.getElementById('v4').innerText = data.v4.toFixed(2) + ' V';
document.getElementById('v5').innerText = data.v5.toFixed(2) + ' V';
data.relais.forEach(r => {
const btn = document.getElementById(`relais-btn-${r.id}`);
if (btn) {
if (r.name && r.name.toLowerCase().includes('reserve')) {
btn.className = 'btn btn-off';
btn.innerText = `${r.name}: GESPERRT`;
btn.disabled = true;
btn.style.opacity = '0.3';
btn.style.cursor = 'not-allowed';
return;
}
if (r.state) {
btn.className = 'btn btn-on';
btn.innerText = `${r.name}: AKTIV (Ausschalten)`;
} else {
btn.className = 'btn btn-off';
btn.innerText = `${r.name}: INAKTIV (Einschalten)`;
}
}
});
}
function loadStatus() {
fetch('/api/status')
.then(response => response.json())
.then(data => updateUI(data))
.catch(err => console.error('Fehler beim Laden des Status:', err));
}
function toggleRelais(id) {
fetch(`/api/toggle?id=${id}`)
.then(response => response.json())
.then(data => updateUI(data))
.catch(err => console.error('Fehler beim Schalten:', err));
}
loadStatus();
setInterval(loadStatus, 2000);
</script>
</body>
</html>

135
build.sh
View file

@ -8,79 +8,122 @@ USER_HOME=$HOME
# 2. Version & Datum aus version.json auslesen
if [ -f version.json ]; then
VERSION=$(jq -r '.version' version.json)
DATE=$(jq -r '.date' version.json)
DATE=$(jq -r '.build_date' version.json)
else
VERSION="1.0.0"
DATE=$(date +'%Y-%m-%d')
fi
echo "🔧 Baue Spannung-Monitor v$VERSION ($DATE)"
echo "🔧 Baue Spannung-Monitor $VERSION ($DATE) für Raspberry Pi 3 & 4"
# KORREKTUR: Einfache Anführungszeichen fangen die Leerzeichen für den Go-Linker ab
LDFLAGS="-X 'main.Version=$VERSION' -X 'main.BuildDate=$DATE'"
# Multi-Plattform Builds ausführen
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "$LDFLAGS" -o spannung-amd64 .
echo "✅ Fertig gebaut: ./spannung-amd64"
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "$LDFLAGS" -o spannung-arm64 .
echo "✅ Fertig gebaut: ./spannung-arm64"
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "$LDFLAGS" -o spannung-arm32_7 .
echo "✅ Fertig gebaut: ./spannung-arm32_7"
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "$LDFLAGS" -o spannung-arm32_6 .
echo "✅ Fertig gebaut: ./spannung-arm32_6"
# Dateiberechtigungen setzen
chmod +x ./spannung-*
# Zielverzeichnis 'app' neu erstellen
rm -rf app
# Zielverzeichnis 'app' bereinigen und neu erstellen
rm -rf app spannung-arm*
mkdir app
# Binaries, Konfiguration und Web-Ordner kopieren
cp spannung-* ./app/
# --- BUILD-PROZESS MIT CGO ---
# Definiere die Pfade zu den lokalen sysroots
SYSROOT_64="$USER_HOME/spannung/sysroot-arm64"
SYSROOT_32="$USER_HOME/spannung/sysroot-arm32"
# 1. Für 64-Bit Raspberry Pi (Standard bei Pi 4 und neueren Pi 3 OS)
echo "📦 Kompiliere für ARM64 (64-Bit)..."
CGO_LDFLAGS="-L$SYSROOT_64/lib/aarch64-linux-gnu -L$SYSROOT_64/usr/lib/aarch64-linux-gnu -Wl,-rpath-link=$SYSROOT_64/lib/aarch64-linux-gnu -Wl,-rpath-link=$SYSROOT_64/usr/lib/aarch64-linux-gnu" \
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc \
go build -ldflags "$LDFLAGS" -o ./app/spannung-arm64 .
echo "✅ Fertig gebaut: ./app/spannung-arm64"
# 2. Für 32-Bit Raspberry Pi (Klassisch für Pi 3 / ältere OS)
echo "📦 Kompiliere für ARM32 v7 (32-Bit)..."
CGO_LDFLAGS="-L$SYSROOT_32/lib/arm-linux-gnueabihf -L$SYSROOT_32/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link=$SYSROOT_32/lib/arm-linux-gnueabihf -Wl,-rpath-link=$SYSROOT_32/usr/lib/arm-linux-gnueabihf" \
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc \
go build -ldflags "$LDFLAGS" -o ./app/spannung-arm32_7 .
echo "✅ Fertig gebaut: ./app/spannung-arm32_7"
# Dateiberechtigungen im Zielordner setzen
chmod +x ./app/spannung-*
# Konfiguration und Web-Ordner kopieren
cp config.json ./app/
cp version.json ./app/
cp web ./app/ -r
# 3. Die Service-Datei universell generiert (nutzt systemd %h/%u Specifiers)
# 3. Die Service-Datei mit Platzhaltern generieren
cat << 'EOF' > ./app/spannung.service
# ==============================================================================
# KURZANLEITUNG ZUR INSTALLATION UND VERWALTUNG
# ==============================================================================
# 1. Datei kopieren nach: /etc/systemd/system/spannung.service
# 2. Systemd neu laden: sudo systemctl daemon-reload
# 3. Autostart aktivieren: sudo systemctl enable spannung.service
# 4. Dienst starten: sudo systemctl start spannung.service
# ==============================================================================
[Unit]
Description=Spannung Control Service
After=network-online.target i2c.service
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=simple
ExecStartPre=/bin/bash -c 'for i in {1..10}; do i2cdetect -y 1 | grep -E "^40:" | grep -q -E "\b48\b" && i2cdetect -y 1 | grep -E "^40:" | grep -q -E "\b49\b" && exit 0; echo "warte auf ADS1115 Module..."; sleep 2; done; exit 1'
ExecStart=%h/spannung/app/spannung-arm32_7
WorkingDirectory=%h/spannung/app
User=%u
Restart=on-failure
RestartSec=5s
StartLimitIntervalSec=60s
StartLimitBurst=3
StandardOutput=append:%h/spannung/app/spannung.log
StandardError=append:%h/spannung/app/spannung.log
[Service]
Type=simple
# Vorprüfung ALS ROOT ausführen
ExecStartPre=/bin/bash -c 'for i in {1..5}; do /usr/sbin/i2cdetect -y 1 | grep -q 48 && /usr/sbin/i2cdetect -y 1 | grep -q 49 && exit 0; sleep 2; done; exit 1'
ExecStart={{TARGET_DIR}}/{{BINARY}}
WorkingDirectory={{TARGET_DIR}}
User={{TARGET_USER}}
Restart=on-failure
RestartSec=5s
# KORREKTUR: Verhindert, dass STRG+C über SSH den Dienst beim Beenden des Logs killt
KillMode=process
StandardOutput=append:{{TARGET_DIR}}/spannung.log
StandardError=append:{{TARGET_DIR}}/spannung.log
[Install]
WantedBy=multi-user.target
EOF
echo "📝 Service-Datei universell generiert (nutzt systemd %h/%u Specifiers)"
# 4. Ein automatisches Installations-Skript für den Pi im app-Ordner erstellen
cat << 'EOF' > ./app/install.sh
#!/bin/bash
set -e
echo "🚀 Starte automatische Einrichtung des Spannung-Monitors..."
# Pfade und Benutzer auf dem aktuellen Pi ermitteln
PI_DIR=$(pwd)
PI_USER=$(whoami)
# Architektur des Betriebssystems prüfen
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
BINARY="spannung-arm64"
echo "🎯 64-Bit OS erkannt. Nutze: $BINARY"
else
BINARY="spannung-arm32_7"
echo "🎯 32-Bit OS erkannt. Nutze: $BINARY"
fi
# Platzhalter in der Service-Datei direkt auf dem Pi ersetzen
sed -i "s|{{TARGET_DIR}}|$PI_DIR|g" spannung.service
sed -i "s|{{TARGET_USER}}|$PI_USER|g" spannung.service
sed -i "s|{{BINARY}}|$BINARY|g" spannung.service
echo "📝 Service-Datei wurde erfolgreich für dieser Pi konfiguriert."
# Service in das Systemverzeichnis kopieren und aktivieren
echo "⚙️ Kopiere Service-Datei nach /etc/systemd/system/..."
sudo cp spannung.service /etc/systemd/system/spannung.service
sudo systemctl daemon-reload
sudo systemctl enable spannung.service
echo "▶️ Starte den Dienst..."
sudo systemctl restart spannung.service
echo "✅ Fertig! Der Spannung-Monitor läuft und der Autostart ist aktiv."
EOF
chmod +x ./app/install.sh
echo "📝 Service-Datei und install.sh generiert."
echo "📂 Inhalt des fertigen app-Verzeichnisses:"
ls -la app

View file

@ -1,18 +1,20 @@
{
"web_port": ":8080",
"i2c_bus": "1",
"ssl_cert": "cert.pem",
"ssl_key": "key.pem",
"i2c_bus": "1",
"ads1115_address_1": 72,
"ads1115_address_2": 73,
"name_adc1_ch0": "Hauptbatterie (U12V)",
"factor_adc1_ch0": 5.0,
"name_adc1_ch1": "Backup-Batterie",
"factor_adc1_ch1": 5.0,
"name_adc1_ch2": "Solar-Eingang",
"factor_adc1_ch2": 1.0,
"name_adc1_ch3": "Steuerspannung Intern",
"factor_adc1_ch3": 1.0,
"name_adc2_ch0": "Zusatzakku Funk",
"factor_adc2_ch0": 1.0,
"name_adc1_ch0": "23cm",
"factor_adc1_ch0": 2.0,
"name_adc1_ch1": "13 cm",
"factor_adc1_ch1": 2.0,
"name_adc1_ch2": "9 cm",
"factor_adc1_ch2": 2.0,
"name_adc1_ch3": "6 cm",
"factor_adc1_ch3": 2.0,
"name_adc2_ch0": "3 cm",
"factor_adc2_ch0": 2.0,
"relais_pins": [
{"id": 1, "name": "Relais 1 (230V Hauptschalter)", "gpio": "GPIO12"},
{"id": 2, "name": "USB-Relais 1 (Reserve)", "gpio": "USB_CH1"},

53
deploy.sh Executable file
View file

@ -0,0 +1,53 @@
#!/bin/bash
set -e
# --- PARAMETER-PRÜFUNG ---
if [ $# -lt 2 ]; then
echo "❌ Fehler: Fehlende Argumente."
echo "Verwendung: $0 <user> <host>"
echo "Beispiel: $0 afu 100.64.0.4"
exit 1
fi
PI_USER="$1"
PI_HOST="$2"
TARGET_DIR="spannung/app"
SERVICE_NAME="spannung.service"
echo "🚀 Starte Deployment auf $PI_USER@$PI_HOST..."
# --- ZERTIFIKATE ERZEUGEN ---
# Prüfen, ob die Zertifikate bereits im lokalen app-Ordner existieren
if [ ! -f ./app/cert.pem ] || [ ! -f ./app/key.pem ]; then
echo "🔐 Generiere selbstsignierte SSL-Zertifikate für HTTPS..."
openssl req -x509 -newkey rsa:4096 -nodes \
-keyout ./app/key.pem \
-out ./app/cert.pem \
-days 365 \
-subj "/C=DE/ST=Bavaria/L=Koeditz/O=info@lang-dieter.de/CN=$PI_HOST" 2>/dev/null
echo "✅ SSL-Zertifikate lokal in ./app/ erstellt."
else
echo "🔒 Bestehende SSL-Zertifikate in ./app/ gefunden. Werden wiederverwendet."
fi
# 1. Altes Zielverzeichnis auf dem Pi löschen und frisch erstellen
ssh "$PI_USER@$PI_HOST" "rm -rf \"\$HOME/$TARGET_DIR\" && mkdir -p \"\$HOME/$TARGET_DIR\""
# 2. Den INHALT des lokal fertig gebauten 'app'-Ordners (inkl. Zertifikate) zum Pi kopieren
echo "📦 Übertrage vorkompilierte Anwendung, Webseiten und Zertifikate..."
scp -r ./app/* "$PI_USER@$PI_HOST:$TARGET_DIR/"
# 3. Das Setup-Skript direkt auf dem Pi ausführen
ssh -t "$PI_USER@$PI_HOST" "
cd \${HOME}/${TARGET_DIR}
# Windows-Zeilenumbrüche zur Sicherheit entfernen
sed -i 's/\r//' ./install.sh
sed -i 's/\r//' ./${SERVICE_NAME}
# Das Installationsskript auf dem Pi ausführen
./install.sh
"
echo "✅ Deployment erfolgreich abgeschlossen! Zeige Live-Logs (Beenden mit STRG+C)..."
ssh -t "$PI_USER@$PI_HOST" "sudo journalctl -f -u ${SERVICE_NAME}"

32
get_lib_ARM.sh Executable file
View file

@ -0,0 +1,32 @@
#!/bin/bash
cd /tmp || exit
# ==========================================
# 1. ARM64 (64-Bit) verarbeiten
# ==========================================
echo "Lade libcap2 für ARM64 herunter..."
apt download libcap2:arm64
dpkg-deb -x libcap2_*_arm64.deb libcap-arm64
echo "Kopiere ARM64-Dateien..."
cp -d libcap-arm64/usr/lib/aarch64-linux-gnu/libcap.so.* /home/dieter/spannung/sysroot-arm64/usr/lib/aarch64-linux-gnu/
# ==========================================
# 2. ARM32 v7 / armhf (32-Bit) verarbeiten
# ==========================================
echo "Lade libcap2 für ARM32 (armhf) direkt herunter..."
# Bereinigung alter Versuche
rm -f libcap2_*_armhf.deb
rm -rf libcap-armhf
# Download direkt von den Ubuntu-Servern (Sicherheitsupdates/Main)
#wget https://de.archive.ubuntu.com/ubuntu/pool/main/libc/libcap2/libcap2_2.66-5ubuntu2.4_armhf.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libc/libcap2/libcap2_2.66-5ubuntu2.4_armhf.deb
dpkg-deb -x libcap2_*_armhf.deb libcap-armhf
echo "Kopiere ARM32-Dateien..."
cp -d libcap-armhf/usr/lib/arm-linux-gnueabihf/libcap.so.* /home/dieter/spannung/sysroot-arm32/usr/lib/arm-linux-gnueabihf/
echo "✅ Fertig! Bereinige temporäre Dateien..."
rm -f libcap2_*.deb

6
go.mod
View file

@ -3,12 +3,8 @@ module spannung
go 1.25.0
require (
github.com/google/gousb v1.1.3
periph.io/x/conn/v3 v3.7.3
periph.io/x/devices/v3 v3.7.4
periph.io/x/host/v3 v3.8.5
)
require (
github.com/adriankumpf/abacom-relay-board v0.7.1 // indirect
github.com/google/gousb v1.1.3 // indirect
)

2
go.sum
View file

@ -1,5 +1,3 @@
github.com/adriankumpf/abacom-relay-board v0.7.1 h1:BEq26Z+mstFFO12Anla7QXmi/C5tkZT/8dCqB/vyfwY=
github.com/adriankumpf/abacom-relay-board v0.7.1/go.mod h1:j1JZRj26BIUMuxdtiBP1G5dF9piCbX/xQATZB5+CPs4=
github.com/google/gousb v1.1.3 h1:xt6M5TDsGSZ+rlomz5Si5Hmd/Fvbmo2YCJHN+yGaK4o=
github.com/google/gousb v1.1.3/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg=
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=

73
install.sh Normal file
View file

@ -0,0 +1,73 @@
# 3. Die Service-Datei mit Platzhaltern generieren
cat << 'EOF' > ./app/spannung.service
[Unit]
Description=Spannung Control Service
After=network-online.target i2c.service
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=simple
ExecStartPre=/bin/bash -c 'for i in {1..10}; do i2cdetect -y 1 | grep -E "40:" | grep -q -E "\b48\b" && i2cdetect -y 1 | grep -E "40:" | grep -q -E "\b49\b" && exit 0; echo "warte auf ADS1115 Module..."; sleep 2; done; exit 1'
# Diese Platzhalter werden beim Installieren auf dem Pi automatisch ersetzt:
ExecStart={{TARGET_DIR}}/{{BINARY}}
WorkingDirectory={{TARGET_DIR}}
User={{TARGET_USER}}
Restart=on-failure
RestartSec=5s
StartLimitIntervalSec=60s
StartLimitBurst=3
StandardOutput=append:{{TARGET_DIR}}/spannung.log
StandardError=append:{{TARGET_DIR}}/spannung.log
[Install]
WantedBy=multi-user.target
EOF
# 4. Ein automatisches Installations-Skript für den Pi im app-Ordner erstellen
cat << 'EOF' > ./app/install.sh
#!/bin/bash
set -e
echo "🚀 Starte automatische Einrichtung des Spannung-Monitors..."
# Pfade und Benutzer auf dem aktuellen Pi ermitteln
PI_DIR=$(pwd)
PI_USER=$(whoami)
# Architektur des Betriebssystems prüfen
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
BINARY="spannung-arm64"
echo "🎯 64-Bit OS erkannt. Nutze: $BINARY"
else
BINARY="spannung-arm32_7"
echo "🎯 32-Bit OS erkannt. Nutze: $BINARY"
fi
# Platzhalter in der Service-Datei direkt auf dem Pi ersetzen
sed -i "s|{{TARGET_DIR}}|$PI_DIR|g" spannung.service
sed -i "s|{{TARGET_USER}}|$PI_USER|g" spannung.service
sed -i "s|{{BINARY}}|$BINARY|g" spannung.service
echo "📝 Service-Datei wurde erfolgreich für diesen Pi konfiguriert."
# Service in das Systemverzeichnis kopieren und aktivieren
echo "⚙️ Kopiere Service-Datei nach /etc/systemd/system/..."
sudo cp spannung.service /etc/systemd/system/spannung.service
sudo systemctl daemon-reload
sudo systemctl enable spannung.service
echo "▶️ Starte den Dienst..."
sudo systemctl restart spannung.service
echo "✅ Fertig! Der Spannung-Monitor läuft und der Autostart ist aktiv."
EOF
chmod +x ./app/install.sh
echo "📝 Service-Datei und install.sh generiert."
echo "📂 Inhalt des fertigen app-Verzeichnisses:"
ls -la app

Binary file not shown.

105
main.go
View file

@ -5,7 +5,10 @@ import (
"fmt"
"log"
"os"
"strings"
"sync"
"os/signal"
"syscall"
"spannung/web" // Importiert Ihr eigenes web-Paket
@ -20,6 +23,8 @@ import (
type Config struct {
WebPort string `json:"web_port"`
SSLCert string `json:"ssl_cert"`
SSLKey string `json:"ssl_key"`
I2CBus string `json:"i2c_bus"`
ADS1115Address1 uint16 `json:"ads1115_address_1"`
ADS1115Address2 uint16 `json:"ads1115_address_2"`
@ -92,29 +97,55 @@ func main() {
log.Fatalf("ADS1115 #2 Init fehlgeschlagen: %v", err)
}
// 6. GPIO-Pins registrieren (ID 1 ist der 230V Hauptschalter am Raspberry Pi)
for i, r := range config.Relais {
// 6. Internen Software-Zustand für ALLE Relais VORAB auf AUS (false) setzen
for i := range config.Relais {
config.Relais[i].State = false
}
// 7. GPIO-Pins registrieren (ID 1 ist der 230V Hauptschalter am Raspberry Pi)
for _, r := range config.Relais {
if r.ID == 1 {
pin := gpioreg.ByName(r.GPIO)
if pin == nil {
log.Fatalf("GPIO-Pin %s existiert nicht", r.GPIO)
}
// Hauptschalter hardwareseitig sofort sicher ausschalten
if err := pin.Out(gpio.Low); err != nil {
log.Fatalf("Pin-Konfiguration für %s fehlgeschlagen: %v", r.GPIO, err)
}
relaisMap[r.ID] = pin
}
config.Relais[i].State = false
}
// 7. Beim Start alle USB-Relais initial auswerfen
updateUsbRelays()
// 8. SICHERHEITS-START: Alle USB-Relais initial zwingend ausschalten
if err := updateUsbRelaysStrict(); err != nil {
log.Fatalf("[❌] KRITISCHER FEHLER: USB-Relais-Reset beim Start fehlgeschlagen! Programm gestoppt: %v", err)
}
// 8. Instanziierung des Webservers mit Übergabe der Callback-Funktionen
server := web.NewServer(config.WebPort, readVoltageCallback, toggleRelaisCallback, getRelaisStateCallback, callbackGetVersion, getVoltNamesCallback)
// NEU: Signal-Handling für sauberes Herunterfahren einrichten
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
go func() {
<-sigChan
fmt.Println("\n[⚠️] Programm-Abbruch erkannt! Schalte Relais 1 (Hauptschalter) sicher aus...")
mutex.Lock()
if pin, exists := relaisMap[1]; exists {
_ = pin.Out(gpio.Low)
}
mutex.Unlock()
os.Exit(0)
}()
fmt.Printf("Webserver gestartet auf Port %s\n", config.WebPort)
log.Fatal(server.Start())
// 9. Instanziierung des Webservers mit Übergabe der Callback-Funktionen
server := web.NewServer(config.WebPort, readVoltageCallback,
toggleRelaisCallback, getRelaisStateCallback, callbackGetVersion,
getVoltNamesCallback)
fmt.Printf("Verschlüsselter HTTPS-Webserver gestartet auf Port %s...\n", config.WebPort)
// ÜBERGABE DER ZERTIFIKATE AUS DER CONFIG AN DIE NEUE START-METHODE
log.Fatal(server.Start(config.SSLCert, config.SSLKey))
}
// Hilfsfunktion zum Laden der version.json
@ -169,7 +200,6 @@ func readVoltageCallback(channel int) float64 {
return 0.0
}
// Pin-Instanz erzeugen und auslesen (periph.io API Standard)
pin, err := targetDevice.PinForChannel(adsChannel, physic.Volt*4096/1000, 128*physic.Hertz, 0)
if err != nil {
fmt.Printf("Fehler beim Erzeugen des Pins für Kanal %v: %v\n", channel, err)
@ -183,6 +213,11 @@ func readVoltageCallback(channel int) float64 {
}
voltValue := float64(sample.V) / 1000000000.0
//Unterdrückt Rauschen und negative Restspannungen bis einschließlich -0.01 V sowie kleine positive Offsets
if voltValue >= -0.011 && voltValue <= 0.011 {
return 0.0
}
return voltValue * factor
}
@ -193,10 +228,18 @@ func toggleRelaisCallback(id int) {
for i := range config.Relais {
if config.Relais[i].ID == id {
// 1. Sperre: Prüfen auf das Wort "Reserve"
if strings.Contains(strings.ToLower(config.Relais[i].Name), "reserve") {
fmt.Printf("[⚠️] Schalten blockiert: '%s' (ID %d) ist als Reserve geschützt!\n", config.Relais[i].Name, id)
return
}
// Zustand des ausgewählten Relais umkehren
config.Relais[i].State = !config.Relais[i].State
if id == 1 {
// Hardware-Schaltung Raspberry Pi GPIO
// Hardware-Schaltung Raspberry Pi GPIO (Hauptschalter bleibt unabhängig)
pin, exists := relaisMap[id]
if exists {
if config.Relais[i].State {
@ -206,28 +249,38 @@ func toggleRelaisCallback(id int) {
}
}
} else {
// Hardware-Schaltung über Abacom USB-Karte via Schieberegister-Emulation
updateUsbRelays()
// ERWEITERUNG: Gegenseitige Verriegelung für USB-Relais
if config.Relais[i].State {
for j := range config.Relais {
if config.Relais[j].ID != id && config.Relais[j].ID >= 2 {
config.Relais[j].State = false
}
}
fmt.Printf("[🔄] Exklusiv-Modus: Relais ID %d aktiviert. Alle anderen USB-Relais wurden ausgeschaltet.\n", id)
}
// Standard-Schaltvorgang (Fehler werfen im UI-Log, blockiert aber nicht den Server)
if err := updateUsbRelaysStrict(); err != nil {
fmt.Printf("[❌] Fehler beim Schalten der USB-Relais: %v\n", err)
}
}
break
}
}
}
// Hilfsfunktion: Schaltet die Abacom-Karte über exakte Schieberegister-Logik (Bit-Banging)
func updateUsbRelays() {
// Optimierte Hilfsfunktion: Schaltet die Abacom-Karte und gibt Fehler an den Aufrufer zurück
func updateUsbRelaysStrict() error {
fmt.Println("\n--- [USB ABACOM SCHALTVORGANG] ---")
ctx := gousb.NewContext()
defer ctx.Close()
dev, err := ctx.OpenDeviceWithVIDPID(0x1a86, 0x5512)
if err != nil {
fmt.Printf("[❌] USB-Fehler beim Öffnen des Geräts: %v\n", err)
return
return fmt.Errorf("USB-Fehler beim Öffnen des Geräts: %w", err)
}
if dev == nil {
fmt.Println("[❌] Hardware-Fehler: Abacom-Karte wurde am USB-Port nicht gefunden!")
return
return fmt.Errorf("Abacom-Karte wurde am USB-Port nicht gefunden")
}
defer dev.Close()
@ -235,22 +288,19 @@ func updateUsbRelays() {
cfg, err := dev.Config(1)
if err != nil {
fmt.Printf("[❌] Konfigurationsfehler: %v\n", err)
return
return fmt.Errorf("Konfigurationsfehler: %w", err)
}
defer cfg.Close()
intf, err := cfg.Interface(0, 0)
if err != nil {
fmt.Printf("[❌] Interface-Fehler: %v\n", err)
return
return fmt.Errorf("Interface-Fehler: %w", err)
}
defer intf.Close()
outEP, err := intf.OutEndpoint(2)
if err != nil {
fmt.Printf("[❌] Endpunkt-Fehler: %v\n", err)
return
return fmt.Errorf("Endpunkt-Fehler: %w", err)
}
// Bitmaske berechnen (ID 2 -> Bit 0 bis ID 9 -> Bit 7)
@ -286,11 +336,10 @@ func updateUsbRelays() {
fmt.Printf("[⚙️] Sende Bitmaske an Schieberegister: %08b\n", bitmask)
// --- Protokoll-Sequenz (Analog zu Python) ---
// --- Protokoll-Sequenz ---
sendOutput(0x00) // Latch initial auf Low halten
for i := 0; i < 8; i++ {
// MSB first (Bit 7 bis 0 prüfen)
if (bitmask & (1 << (7 - i))) != 0 {
sendOutput(DATA)
sendOutput(CLK | DATA)
@ -303,12 +352,12 @@ func updateUsbRelays() {
}
sendOutput(0x00) // Leitungen leeren
// Übernahme-Register per Latch freischalten
sendOutput(LATCH)
sendOutput(0x00)
fmt.Println("[✅] ERFOLG! Signal-Bytes an Schieberegister übergeben.")
fmt.Println("--- [USB DEBUG ENDE] ---\n")
return nil
}
// Callback: Wird vom Webserver aufgerufen, um den aktuellen UI-Status abzufragen

View file

@ -1,48 +0,0 @@
#!/usr/bin/env python3
import sys
import usb.core
import usb.util
# Abacom CH341A IDs
VENDOR_ID = 0x1a86
PRODUCT_ID = 0x5512
def main():
if len(sys.argv) < 2:
print("Nutzung: python3 relais.py <Wert_0_bis_255>")
sys.exit(1)
try:
data_value = int(sys.argv[1])
if not (0 <= data_value <= 255):
raise ValueError
except ValueError:
print("Fehler: Bitte eine Zahl zwischen 0 und 255 eingeben.")
sys.exit(1)
# Gerät suchen
dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
if dev is None:
print("Relaiskarte nicht gefunden! USB-Verbindung prüfen.")
sys.exit(1)
# Kernel-Treiber lösen, falls aktiv
if dev.is_kernel_driver_active(0):
dev.detach_kernel_driver(0)
# Konfiguration setzen
dev.set_configuration()
# CH341 Befehl zum Schreiben von IO-Pins (Abacom-Protokoll)
# Befehl 0xA6 setzt die Ausgänge beim CH341
# Das Format ist oft: [0xA6, Schalter-Byte, 0x00] oder direkte Control-Transfers
try:
# Steuerbefehl direkt an den Chip senden (CH341 spezifisch)
# 0x40 = Vendor-Write, 0x9a = CH341_REQ_WRITE_REG
dev.ctrl_transfer(0x40, 0x9a, 0x2525, data_value)
print(f"Erfolgreich geschaltet. Wert: {data_value} (Binär: {data_value:08b})")
except Exception as e:
print(f"Fehler beim Senden: {e}")
if __name__ == "__main__":
main()

View file

@ -1,56 +0,0 @@
#!/usr/bin/env python3
import sys
import usb.core
import usb.util
VENDOR_ID = 0x1a86
PRODUCT_ID = 0x5512
def main():
if len(sys.argv) < 2:
print("Nutzung: sudo python3 relais2.py <Wert_0_bis_255>")
sys.exit(1)
try:
data_value = int(sys.argv[1])
if not (0 <= data_value <= 255):
raise ValueError
except ValueError:
print("Fehler: Bitte eine Zahl zwischen 0 und 255 eingeben.")
sys.exit(1)
dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
if dev is None:
print("Relaiskarte nicht gefunden! USB-Verbindung prüfen.")
sys.exit(1)
if dev.is_kernel_driver_active(0):
try:
dev.detach_kernel_driver(0)
except Exception:
pass
dev.set_configuration()
try:
# CH341A GPIO-Befehl (0x5a)
# Aufbau des Pakets:
# Byte 0: 0x5a (Befehl für GPIO-Steuerung)
# Byte 1: 0x51 (Sub-Befehl für I/O-Wechsel)
# Byte 2: Richtungsmaske/Enable für die Pins (0xff = Alle Pins D0-D7 auf Ausgang)
# Byte 3: Datenwert für Pins D0-D7 (deine Relais 0-255)
# Byte 4: Richtung/Enable für obere Pins (0x00 = nicht genutzt)
# Byte 5: Datenwert für obere Pins (0x00)
cmd_packet = bytes([0x5a, 0x51, 0xff, data_value, 0x00, 0x00])
# Senden an den Standard-Bulk-Ausgang (Endpoint 0x02)
dev.write(0x02, cmd_packet, 1000)
print(f"Befehl gesendet. Wert: {data_value} (Binär: {data_value:08b})")
except Exception as e:
print(f"Fehler beim Senden: {e}")
if __name__ == "__main__":
main()

23
server.crt Normal file
View file

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID1TCCAr2gAwIBAgIUffKgdkPBvX0QynTQ84kpWQU05xUwDQYJKoZIhvcNAQEL
BQAwejELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhdmFyaWExEjAQBgNVBAcMCUvD
g8K2ZGl0ejEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMSIwIAYJ
KoZIhvcNAQkBFhNpbmZvQGxhbmctZGlldGVyLmRlMB4XDTI2MDgwMzA4MDE1OVoX
DTI3MDgwMzA4MDE1OVowejELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhdmFyaWEx
EjAQBgNVBAcMCUvDg8K2ZGl0ejEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
dHkgTHRkMSIwIAYJKoZIhvcNAQkBFhNpbmZvQGxhbmctZGlldGVyLmRlMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtf+D266GoYOYSJsQOal248PHrYey
3bfIun/Xx8MQPUw8aZJ4Zv8N3SZJh5/9Vx18TJfS8fQALxNushP7ofPmIqqjO4tk
13U9ITWGeOIreJ2HUAOAFVYk3TMCzsHK1Bb3f6WG0kx/q7Avp1jYVRUqIb0Et2+M
K8obYP+w05Vid32w3RrA+bF0sV233vfD/OkRuApg8ae2pHoVZtIm7PmrrndlynQU
s9Y2aCJR54kinR31HXUQVnJZFm2QEY0RpjQo9d+AF3Qzc6Kb9IcAMWw13t4yATBU
vDCnY6iXh7DhakOlPUBr3xm6ZZ3hW7Jq3E2+o65gfmu5IKv0ZK8TGvVzEQIDAQAB
o1MwUTAdBgNVHQ4EFgQUxxZZxiIHt7u9s7plRyOUUokpbgIwHwYDVR0jBBgwFoAU
xxZZxiIHt7u9s7plRyOUUokpbgIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
AQsFAAOCAQEAoujOIzroc1afSY9QO+Fv8uj1dbmZgciK+3yatV9cHD0gkhbUcb89
iNdLyGR9DARU3OwBSSxF71bnP/xJ1Hul6QQxivuFaLDy/fmJiV8U5GYzP8CB1aqZ
dGyx/oTrXIjGEgve2oDwo91EQhDoqGSGTFa2rRxZY7763Nx+tCS/2WVItvhKdfXw
Bqleyev6S8833ePpAO2jeRsQl4hulUrJQNeryEnkhX6wf/3sBUbZ5EQGjGDYjZ87
LxiXPUJ6sLslrwJIStE/kiSxaUkcIQQMmTsH/LuGr8ubCwOmlf2d3fqtjAKerhoG
A2vBEpaqN9zJ5tMws/VQgWDjOUWH44UpzA==
-----END CERTIFICATE-----

28
server.key Normal file
View file

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9CUywq5QuxlDG
5hBJEI9Bpo3Te3+iT7EzAoqRXCKA856YzGYfA3gmk02NhdPpdp+TzTYiOF/4Coa6
E++PRnmwFn/BC0SmsYZ+3iwioDV9EeuSsp9eBrCF1Ve40A8v1qSClWjm3MiO2BMB
V2YMFtNrtY3v4grWBk1LI4qrkx6VJdWX09lSJJvsTYM8E18XCN+5T6aw8JjH/iFy
yyLKw/KJwPEtt4NqyIpEryH8QBT8UwVc7n8HbpaSlb93JWATnXz2T/dfeP/d4UrO
EsN/DzhH9UUZfqJH2h5wJx0q3m6blwRIgTzTIDuL24z4riH2CPN7VVAum1pvgNcf
NmkphwXVAgMBAAECggEABmOVEveJl5ceTcqizEViAh8F9hrbcnntDENOuaD6jY8u
Ug2+edfdLLiXy2u1gNOAizdJWBi9rZ11dj6MPzRrkncANF8UH+oqGImbxkPR6vs7
Egc1ebESMEPIpjdp+/zuLHeuRvc5VBKbedUhXtE6rg5B0NS79wXZgOufmTLsuq+w
p6ivRn5uHlODDvQzvricRkwl3FvGfe/H/N50K6q+vQfAB/d3B7x97kfxvHpXw/LJ
BXwgchxJXWo371k/ks1z5mbdyjpol/Lu9KEVe4w6p3pR+0bdkvA4H8Y3FY1yDZ3c
olDsJTPBnBpGwJqvK+zzdHxt2uRmpRlVuea2QqIn1QKBgQD82fZ2YUp3i4vARzkw
+aER6PSPtAmlvMxe8s+dzkP7r/4sp8LbeqlgaF3RBfyt786SxRKjhFXRCrQOCrjH
tf+A/pnS6qrmeXZQtHlpwE8LXWNm/kdNs0leRcpTuEb+2zX+DBr0f8kbCxc+AtVy
y6DL+lI0zcgTTOtdOm1c7RUFpwKBgQC/Y+hfrx+l2c6pXEMoWE7XEhHL67ky3/AB
h3GiGPDzSzMZnqGsTnyWS/pmwchm5lBTlnRs4PmgdyvaJ/t0pZ4iWwSYmU3UsvLK
EjKXRh+AgubDOUiRgugAxeNVUitNpkTLgMGIr8/s22QqkVxZzORap0fzWhei9b4t
0VFoiobAIwKBgQCd3Ca3eb5YLFMv1Eesf+1DlUE6hpiPVPPzQ3zDdQeUlygFESfi
hw5AFmicGzTKEzHRCCC+3dwGCrynF6KNbN771fiLad8QzTxE3qf+kgXHfqKUpqQ1
qn1f0gqjgiUw8AMhfMVHaJBRxfbYzEQey2q0bq/sL51+D0PSjKvCnHHHeQKBgFms
wy1KDacVBbre6uyVa+NjqQkGGtFWkcr1nm2YCBXGz1uasx/b6o41bU8GTxK/qTVx
En4Nb4kbLWXbQ/ukuhJY2S9y7T/S1OWPXzr39TyumNcyGOltD62FCv5oMLgCRsuf
OY8E6YSOS0GSuFWvJfO/23uPY/HL+N7Y667y8S5HAoGBAL62NT4KM4jYCp7Jys1+
8OeoQMbSG2C02SnJT32iYqC2Au0lTVjKwOfiICvy37SAZtWqixj6TjpXoqNbel/i
FdaNV4wihIvmtUdh5UbEuEoPDgxsHKbQm3HXYf7RA356RV19KKmV524XYJV9/I5K
na9lXbV/90Jbmpjbm/tV9r+F
-----END PRIVATE KEY-----

View file

@ -1,44 +0,0 @@
# ==============================================================================
# KURZANLEITUNG ZUR INSTALLATION UND VERWALTUNG
# ==============================================================================
# 1. Datei kopieren nach: /etc/systemd/system/spannung.service
# 2. Systemd neu laden: sudo systemctl daemon-reload
# 3. Autostart aktivieren: sudo systemctl enable spannung.service
# 4. Dienst starten: sudo systemctl start spannung.service
#
# Befehle zur Steuerung:
# - Status prüfen: sudo systemctl status spannung.service
# - Live-Logs einsehen: sudo journalctl -u spannung.service -f
# - Dienst stoppen: sudo systemctl stop spannung.service
# - Dienst neu starten: sudo systemctl restart spannung.service
# ==============================================================================
#
# gewohnter rsync-Befehl (Beispiel)
# rsync -avz ./app/ pi@raspirotor:~/spannung/
# 2. Den Dienst auf dem Pi remote aktualisieren und neu starten
# ssh -t afu@raspirotor "sudo cp ~/spannung/app/spannung.service /etc/systemd/system/ && sudo systemctl daemon-reload && sudo systemctl restart spannung.service"
[Unit]
Description=Spannung Control Service
After=network-online.target i2c.service
Wants=network-online.target
StartLimitIntervalSec=0
[Service]
Type=simple
# Die ExecStartPre-Zeile muss bei 32-Bit auskommentiert werden, da kein i2cdetect verfügbar ist
ExecStartPre=/bin/bash -c 'for i in {1..10}; do i2cdetect -y 1 | grep -q "48" && exit 0; echo "warte auf ADS1115..."; sleep 2; done; exit 1'
ExecStart=/home/afu/spannung/spannung
WorkingDirectory=/home/afu/spannung
User=afu
#Restart=always
Restart=on-failure # Startet den Dienst nur bei Fehlern neu
RestartSec=5s # Wartet 5 Sekunden vor dem nächsten Versuch
StartLimitIntervalSec=60s # Innerhalb von 60 Sekunden
StartLimitBurst=3 # Maximal 3 Versuche in diesem Intervall
StandardOutput=append:/home/afu/spannung/spannung.log
StandardError=append:/home/afu/spannung/spannung.log
[Install]
WantedBy=multi-user.target

BIN
spannung_app.zip Normal file

Binary file not shown.

511
sysroot-arm32/index.html Normal file
View file

@ -0,0 +1,511 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<title>Launchpad</title>
<link rel="apple-touch-icon" sizes="180x180" href="/@@/apple-touch-icon.png?v=2022" />
<link rel="icon" type="image/png" sizes="32x32" href="/@@/favicon-32x32.png?v=2022" />
<link rel="icon" type="image/png" sizes="16x16" href="/@@/favicon-16x16.png?v=2022" />
<link rel="manifest" href="/@@/site.webmanifest?v=2022" />
<link rel="mask-icon" href="/@@/safari-pinned-tab.svg?v=2022" color="#e9531f" />
<link rel="shortcut icon" href="/@@/favicon.ico?v=2022" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="msapplication-config" content="/@@/browserconfig.xml?v=2022" />
<meta name="theme-color" content="#ffffff" />
<link rel="alternate" type="application/atom+xml" href="http://feeds.launchpad.net/announcements.atom" title="All Announcements" />
<link type="text/css" rel="stylesheet" media="screen, print" href="/+icing/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/combo.css" />
<meta property="og:title" content="Launchpad" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/@@/launchpad-og-image.png" />
<meta property="og:url" content="https://launchpad.net/index.html" />
<meta property="og:site_name" content="Launchpad" />
<script type="text/javascript">
var LP = {
cache: {},
links: {}
};
</script>
<script type="text/javascript">var cookie_scope = '; Path=/; Secure; Domain=.launchpad.net';</script>
<script type="text/javascript" src="/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?yui/yui/yui-min.js&amp;lp/meta.js&amp;yui/loader/loader-min.js"></script>
<script type="text/javascript">
var raw = null;
if (LP.devmode) {
raw = 'raw';
}
YUI.GlobalConfig = {
combine: true,
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'yui/',
filter: raw,
debug: false,
fetchCSS: false,
maxURLLength: 2000,
groups: {
lp: {
combine: true,
base: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?lp/',
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'lp/',
// comes from including lp/meta.js
modules: LP_MODULES,
fetchCSS: false
}
}
}</script>
<script type="text/javascript">
// we need this to create a single YUI instance all events and code
// talks across. All instances of YUI().use should be based off of
// LPJS instead.
var LPJS = new YUI();
</script>
<script id="base-layout-load-scripts" type="text/javascript">
//<![CDATA[
LPJS.use('base', 'node', 'console', 'event',
'oop', 'lp', 'lp.app.foldables','lp.app.sorttable',
'lp.app.inlinehelp', 'lp.app.links',
'lp.bugs.bugtask_index', 'lp.bugs.subscribers',
'lp.app.ellipsis', 'lp.code.branchmergeproposal.diff',
'lp.views.global',
function(Y) {
Y.on("domready", function () {
var global_view = new Y.lp.views.Global();
global_view.render();
Y.lp.app.sorttable.SortTable.init();
Y.lp.app.inlinehelp.init_help();
Y.lp.activate_collapsibles();
Y.lp.app.foldables.activate();
Y.lp.app.links.check_valid_lp_links();
});
Y.on('lp:context:web_link:changed', function(e) {
window.location = e.new_value;
});
});
//]]>
</script>
<script id="base-helper-functions" type="text/javascript">
//<![CDATA[
// This code is pulled from lp.js that needs to be available on every
// request. Pulling here to get it outside the scope of the YUI block.
function setFocusByName(name) {
// Focus the first element matching the given name which can be focused.
var nodes = document.getElementsByName(name);
var i, node;
for (i = 0; i < nodes.length; i++) {
node = nodes[i];
if (node.focus) {
try {
// Trying to focus a hidden element throws an error in IE8.
if (node.offsetHeight !== 0) {
node.focus();
}
} catch (e) {
LPJS.use('console', function(Y) {
Y.log('In setFocusByName(<' +
node.tagName + ' type=' + node.type + '>): ' + e);
});
}
break;
}
}
}
function selectWidget(widget_name, event) {
if (event && (event.keyCode === 9 || event.keyCode === 13)) {
// Avoid firing if user is tabbing through or simply pressing
// enter to submit the form.
return;
}
document.getElementById(widget_name).checked = true;
}
//]]>
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/+icing/vanilla-framework-version-4.7.0.min.css" />
</head>
<body id="document" itemscope="" itemtype="http://schema.org/WebPage" class="tab-unknown
main_only
public
yui3-skin-sam">
<div class="yui-d0">
<div id="locationbar" class="login-logout">
<div id="logincontrol"><a href="https://launchpad.net/+login">Log in / Register</a></div>
</div><!--id="locationbar"-->
<div id="maincontent" class="yui-main">
<div class="yui-b" dir="ltr">
<div class="context-publication">
<div id="registration" class="registering">
</div>
</div>
<div id="request-notifications">
</div>
<div>
<!-- Is your project registered yet? -->
<div id="homepage" class="homepage">
<div class="top-portlet">
<img src="/@@/launchpad-logo-and-name.svg" class="homepage__logo" id="launchpad-logo-and-name" alt="Launchpad logo and name" />
</div>
<hr>
<section class="p-strip is-shallow">
<div class="u-fixed-width">
<form id="homepage-searchform" class="p-form p-form--inline" xml:lang="en" lang="en" dir="ltr" method="get" accept-charset="UTF-8" action="https://launchpad.net/+search">
<div class="p-form__group p-form--search">
<label for="search-input" class="u-off-screen">Search</label>
<div class="p-form__control u-clearfix">
<input id="search-input" type="search" name="field.text" value="" autofocus="">
</div>
</div>
<button id="search" class="p-button--positive" type="submit" value="Search Launchpad">Search</button>
</form>
<script type="text/javascript">
LPJS.use('lp', function () {
setFocusByName('field.text');
});
</script>
<div id="homepage-stats" class="u-text--muted">
<strong>49,106</strong>&nbsp;projects,
<strong>2,108,367</strong>&nbsp;bugs,
<strong>1,009,234</strong>&nbsp;branches,
<strong>119,025</strong>&nbsp;Git repositories,
<strong>3,185,634</strong>&nbsp;translations,
<strong>822,311</strong>&nbsp;answers,
<strong>76,426</strong>&nbsp;blueprints,
and&nbsp;counting...
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div class="homepage-whatslaunchpad">
<div class="u-fixed-width u-clearfix">
<h2>Launchpad</h2>
<h4>A software collaboration platform that provides</h4>
</div>
<div class="u-fixed-width u-clearfix">
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://bugs.launchpad.net/">Bug tracking</a></h4>
<p>One place to track bugs across project boundaries and tools</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://code.launchpad.net/">Code hosting</a> using <a href="https://git-scm.com/">Git</a></h4>
<p>Easy for anyone to get your project's code using Git</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/how-to/work-with-code-hosted-on-launchpad/create-and-manage-a-merge-proposal/">Code reviews</a></h4>
<p>Full control of who can land code in your project remains with you</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://launchpad.net/ubuntu">Ubuntu package building and hosting</a></h4>
<p>Publishing your software is simple with Personal Package Archives</p>
</div>
</div>
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://translations.launchpad.net/">Crowd source translations</a></h4>
<p>Build an open community to translate your software into almost any language</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/Teams/MailingLists">Mailing lists</a></h4>
<p>Find and work with the right people by building a social network of individuals and teams around projects</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://answers.launchpad.net/">Answer tracking and FAQs</a></h4>
<p>Free software thrives on people helping each other when the unexpected happens</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://blueprints.launchpad.net/">Specification tracking</a></h4>
<p>Track ideas and chunks of work as “blueprints”</p>
</div>
</div>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-getstarted">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Get started</h2>
</div>
<div class="u-fixed-width u-clearfix">
<span>
Learn more about Launchpad in the
<a href="https://documentation.ubuntu.com/launchpad/">user guide</a>.
</span>
If you're ready, you can:
<ul class="p-matrix">
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/add-homepage.png" alt="add">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+login">Create an account</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/tour-homepage.png" alt="tour">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+tour">Take the tour</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/question-homepage.png" alt="question">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="https://answers.launchpad.net/">Find answers</a></h4>
</div>
</li>
</ul>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-featured">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Featured projects</h2>
</div>
<div class="u-fixed-width u-clearfix">
<ul class="p-matrix featured-projects-list">
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Beautiful Soup" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/beautifulsoup">Beautiful Soup</a></h4>
<div class="p-matrix__desc">
<p>A program designed for screen-scraping HTML. The discussion group is at: http://groups.google.com...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Inkscape" src="https://launchpadlibrarian.net/66795469/ink-lp-logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/inkscape">Inkscape</a></h4>
<div class="p-matrix__desc">
<p>Inkscape is an SVG-based graphics editor featuring alpha
blending, node editing, SVG to PNG exp...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Launchpad itself" src="https://launchpadlibrarian.net/600817174/Canonical_Launchpad_icon_64px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpad">Launchpad itself</a></h4>
<div class="p-matrix__desc">
<p>Launchpad is a set of Web services to help software developers collaborate.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="launchpadlib " src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpadlib">launchpadlib </a></h4>
<div class="p-matrix__desc">
<p>Python client library for Launchpad's web service</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenMW" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openmw">OpenMW</a></h4>
<div class="p-matrix__desc">
<p>OpenMW is an attempt to reimplement the popular role playing game Morrowind. It aims to be a full...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenShot Video Editor" src="https://launchpadlibrarian.net/250357498/OpenShot-2-Logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openshot">OpenShot Video Editor</a></h4>
<div class="p-matrix__desc">
<p>OpenShot Video Editor is a free, open-source, non-linear video editor. It can create and edit vid...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenStack" src="https://launchpadlibrarian.net/52042558/os64.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openstack">OpenStack</a></h4>
<div class="p-matrix__desc">
<p>The OpenStack Open Source Cloud Mission: to produce the ubiquitous Open Source Cloud Computing pl...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="txpkgupload" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/txpkgupload">txpkgupload</a></h4>
<div class="p-matrix__desc">
<p>Package upload server used by Launchpad.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Ubuntu" src="https://launchpadlibrarian.net/606381979/CoF%2064px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/ubuntu">Ubuntu</a></h4>
<div class="p-matrix__desc">
<p>Ubuntu is a complete Linux-based operating system, freely available with both community and profe...</p>
</div>
</div>
</li>
</ul>
<ul class="horizontal">
<li>
<strong><a href="/projects">Browse all
49106
projects</a>!</strong>
</li>
</ul>
</div>
</div>
</section>
</div><!-- homepage -->
</div>
</div><!-- yui-b -->
</div><!-- yui-main -->
<!-- yui-b side -->
<!-- yui-t4 -->
<div id="footer" class="footer">
<div class="colophon">
&copy; 2004
<a href="http://canonical.com/">Canonical&nbsp;Ltd.</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.com/legal/launchpad-terms-of-service">Terms of use</a>
&nbsp;&bull;&nbsp;
<a href="https://www.ubuntu.com/legal/dataprivacy">Data privacy</a>
&nbsp;&bull;&nbsp;
<a href="/feedback">Contact Launchpad Support</a>
&nbsp;&bull;&nbsp;
<a href="http://blog.launchpad.net/">Blog</a>
&nbsp;&bull;&nbsp;
<a href="https://canonical.com/careers">Careers</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.social/@launchpadstatus">System status</a>
<span id="lp-version">
&nbsp;&bull;&nbsp;
b042f2d
(<a href="https://documentation.ubuntu.com/launchpad/developer/how-to/get-source-code/">Get the code!</a>)
</span>
</div>
</div>
</div><!-- yui-d0-->
<script id="json-cache-script">LP.cache = {"related_features": {}};</script>
</body>
<!--
Facet name: unknown
Page type: main_only
Has global search: True
Has application tabs: True
Has side portlets: False
At least 22 queries/external actions issued in 0.12 seconds
Features: {'profiling.enabled': None, 'hard_timeout': '5000', 'js.yui_version': None, 'app.maintenance_message': None, 'app.mainsite_only.canonical_url': None, 'baselayout.careers_link.disabled': None, 'visible_render_time': None}
rb042f2d
-->
</html>

511
sysroot-arm32/index.html.1 Normal file
View file

@ -0,0 +1,511 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<title>Launchpad</title>
<link rel="apple-touch-icon" sizes="180x180" href="/@@/apple-touch-icon.png?v=2022" />
<link rel="icon" type="image/png" sizes="32x32" href="/@@/favicon-32x32.png?v=2022" />
<link rel="icon" type="image/png" sizes="16x16" href="/@@/favicon-16x16.png?v=2022" />
<link rel="manifest" href="/@@/site.webmanifest?v=2022" />
<link rel="mask-icon" href="/@@/safari-pinned-tab.svg?v=2022" color="#e9531f" />
<link rel="shortcut icon" href="/@@/favicon.ico?v=2022" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="msapplication-config" content="/@@/browserconfig.xml?v=2022" />
<meta name="theme-color" content="#ffffff" />
<link rel="alternate" type="application/atom+xml" href="http://feeds.launchpad.net/announcements.atom" title="All Announcements" />
<link type="text/css" rel="stylesheet" media="screen, print" href="/+icing/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/combo.css" />
<meta property="og:title" content="Launchpad" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/@@/launchpad-og-image.png" />
<meta property="og:url" content="https://launchpad.net/index.html" />
<meta property="og:site_name" content="Launchpad" />
<script type="text/javascript">
var LP = {
cache: {},
links: {}
};
</script>
<script type="text/javascript">var cookie_scope = '; Path=/; Secure; Domain=.launchpad.net';</script>
<script type="text/javascript" src="/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?yui/yui/yui-min.js&amp;lp/meta.js&amp;yui/loader/loader-min.js"></script>
<script type="text/javascript">
var raw = null;
if (LP.devmode) {
raw = 'raw';
}
YUI.GlobalConfig = {
combine: true,
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'yui/',
filter: raw,
debug: false,
fetchCSS: false,
maxURLLength: 2000,
groups: {
lp: {
combine: true,
base: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?lp/',
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'lp/',
// comes from including lp/meta.js
modules: LP_MODULES,
fetchCSS: false
}
}
}</script>
<script type="text/javascript">
// we need this to create a single YUI instance all events and code
// talks across. All instances of YUI().use should be based off of
// LPJS instead.
var LPJS = new YUI();
</script>
<script id="base-layout-load-scripts" type="text/javascript">
//<![CDATA[
LPJS.use('base', 'node', 'console', 'event',
'oop', 'lp', 'lp.app.foldables','lp.app.sorttable',
'lp.app.inlinehelp', 'lp.app.links',
'lp.bugs.bugtask_index', 'lp.bugs.subscribers',
'lp.app.ellipsis', 'lp.code.branchmergeproposal.diff',
'lp.views.global',
function(Y) {
Y.on("domready", function () {
var global_view = new Y.lp.views.Global();
global_view.render();
Y.lp.app.sorttable.SortTable.init();
Y.lp.app.inlinehelp.init_help();
Y.lp.activate_collapsibles();
Y.lp.app.foldables.activate();
Y.lp.app.links.check_valid_lp_links();
});
Y.on('lp:context:web_link:changed', function(e) {
window.location = e.new_value;
});
});
//]]>
</script>
<script id="base-helper-functions" type="text/javascript">
//<![CDATA[
// This code is pulled from lp.js that needs to be available on every
// request. Pulling here to get it outside the scope of the YUI block.
function setFocusByName(name) {
// Focus the first element matching the given name which can be focused.
var nodes = document.getElementsByName(name);
var i, node;
for (i = 0; i < nodes.length; i++) {
node = nodes[i];
if (node.focus) {
try {
// Trying to focus a hidden element throws an error in IE8.
if (node.offsetHeight !== 0) {
node.focus();
}
} catch (e) {
LPJS.use('console', function(Y) {
Y.log('In setFocusByName(<' +
node.tagName + ' type=' + node.type + '>): ' + e);
});
}
break;
}
}
}
function selectWidget(widget_name, event) {
if (event && (event.keyCode === 9 || event.keyCode === 13)) {
// Avoid firing if user is tabbing through or simply pressing
// enter to submit the form.
return;
}
document.getElementById(widget_name).checked = true;
}
//]]>
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/+icing/vanilla-framework-version-4.7.0.min.css" />
</head>
<body id="document" itemscope="" itemtype="http://schema.org/WebPage" class="tab-unknown
main_only
public
yui3-skin-sam">
<div class="yui-d0">
<div id="locationbar" class="login-logout">
<div id="logincontrol"><a href="https://launchpad.net/+login">Log in / Register</a></div>
</div><!--id="locationbar"-->
<div id="maincontent" class="yui-main">
<div class="yui-b" dir="ltr">
<div class="context-publication">
<div id="registration" class="registering">
</div>
</div>
<div id="request-notifications">
</div>
<div>
<!-- Is your project registered yet? -->
<div id="homepage" class="homepage">
<div class="top-portlet">
<img src="/@@/launchpad-logo-and-name.svg" class="homepage__logo" id="launchpad-logo-and-name" alt="Launchpad logo and name" />
</div>
<hr>
<section class="p-strip is-shallow">
<div class="u-fixed-width">
<form id="homepage-searchform" class="p-form p-form--inline" xml:lang="en" lang="en" dir="ltr" method="get" accept-charset="UTF-8" action="https://launchpad.net/+search">
<div class="p-form__group p-form--search">
<label for="search-input" class="u-off-screen">Search</label>
<div class="p-form__control u-clearfix">
<input id="search-input" type="search" name="field.text" value="" autofocus="">
</div>
</div>
<button id="search" class="p-button--positive" type="submit" value="Search Launchpad">Search</button>
</form>
<script type="text/javascript">
LPJS.use('lp', function () {
setFocusByName('field.text');
});
</script>
<div id="homepage-stats" class="u-text--muted">
<strong>49,106</strong>&nbsp;projects,
<strong>2,108,367</strong>&nbsp;bugs,
<strong>1,009,234</strong>&nbsp;branches,
<strong>119,025</strong>&nbsp;Git repositories,
<strong>3,185,634</strong>&nbsp;translations,
<strong>822,311</strong>&nbsp;answers,
<strong>76,426</strong>&nbsp;blueprints,
and&nbsp;counting...
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div class="homepage-whatslaunchpad">
<div class="u-fixed-width u-clearfix">
<h2>Launchpad</h2>
<h4>A software collaboration platform that provides</h4>
</div>
<div class="u-fixed-width u-clearfix">
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://bugs.launchpad.net/">Bug tracking</a></h4>
<p>One place to track bugs across project boundaries and tools</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://code.launchpad.net/">Code hosting</a> using <a href="https://git-scm.com/">Git</a></h4>
<p>Easy for anyone to get your project's code using Git</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/how-to/work-with-code-hosted-on-launchpad/create-and-manage-a-merge-proposal/">Code reviews</a></h4>
<p>Full control of who can land code in your project remains with you</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://launchpad.net/ubuntu">Ubuntu package building and hosting</a></h4>
<p>Publishing your software is simple with Personal Package Archives</p>
</div>
</div>
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://translations.launchpad.net/">Crowd source translations</a></h4>
<p>Build an open community to translate your software into almost any language</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/Teams/MailingLists">Mailing lists</a></h4>
<p>Find and work with the right people by building a social network of individuals and teams around projects</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://answers.launchpad.net/">Answer tracking and FAQs</a></h4>
<p>Free software thrives on people helping each other when the unexpected happens</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://blueprints.launchpad.net/">Specification tracking</a></h4>
<p>Track ideas and chunks of work as “blueprints”</p>
</div>
</div>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-getstarted">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Get started</h2>
</div>
<div class="u-fixed-width u-clearfix">
<span>
Learn more about Launchpad in the
<a href="https://documentation.ubuntu.com/launchpad/">user guide</a>.
</span>
If you're ready, you can:
<ul class="p-matrix">
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/add-homepage.png" alt="add">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+login">Create an account</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/tour-homepage.png" alt="tour">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+tour">Take the tour</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/question-homepage.png" alt="question">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="https://answers.launchpad.net/">Find answers</a></h4>
</div>
</li>
</ul>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-featured">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Featured projects</h2>
</div>
<div class="u-fixed-width u-clearfix">
<ul class="p-matrix featured-projects-list">
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Beautiful Soup" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/beautifulsoup">Beautiful Soup</a></h4>
<div class="p-matrix__desc">
<p>A program designed for screen-scraping HTML. The discussion group is at: http://groups.google.com...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Inkscape" src="https://launchpadlibrarian.net/66795469/ink-lp-logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/inkscape">Inkscape</a></h4>
<div class="p-matrix__desc">
<p>Inkscape is an SVG-based graphics editor featuring alpha
blending, node editing, SVG to PNG exp...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Launchpad itself" src="https://launchpadlibrarian.net/600817174/Canonical_Launchpad_icon_64px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpad">Launchpad itself</a></h4>
<div class="p-matrix__desc">
<p>Launchpad is a set of Web services to help software developers collaborate.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="launchpadlib " src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpadlib">launchpadlib </a></h4>
<div class="p-matrix__desc">
<p>Python client library for Launchpad's web service</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenMW" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openmw">OpenMW</a></h4>
<div class="p-matrix__desc">
<p>OpenMW is an attempt to reimplement the popular role playing game Morrowind. It aims to be a full...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenShot Video Editor" src="https://launchpadlibrarian.net/250357498/OpenShot-2-Logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openshot">OpenShot Video Editor</a></h4>
<div class="p-matrix__desc">
<p>OpenShot Video Editor is a free, open-source, non-linear video editor. It can create and edit vid...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenStack" src="https://launchpadlibrarian.net/52042558/os64.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openstack">OpenStack</a></h4>
<div class="p-matrix__desc">
<p>The OpenStack Open Source Cloud Mission: to produce the ubiquitous Open Source Cloud Computing pl...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="txpkgupload" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/txpkgupload">txpkgupload</a></h4>
<div class="p-matrix__desc">
<p>Package upload server used by Launchpad.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Ubuntu" src="https://launchpadlibrarian.net/606381979/CoF%2064px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/ubuntu">Ubuntu</a></h4>
<div class="p-matrix__desc">
<p>Ubuntu is a complete Linux-based operating system, freely available with both community and profe...</p>
</div>
</div>
</li>
</ul>
<ul class="horizontal">
<li>
<strong><a href="/projects">Browse all
49106
projects</a>!</strong>
</li>
</ul>
</div>
</div>
</section>
</div><!-- homepage -->
</div>
</div><!-- yui-b -->
</div><!-- yui-main -->
<!-- yui-b side -->
<!-- yui-t4 -->
<div id="footer" class="footer">
<div class="colophon">
&copy; 2004
<a href="http://canonical.com/">Canonical&nbsp;Ltd.</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.com/legal/launchpad-terms-of-service">Terms of use</a>
&nbsp;&bull;&nbsp;
<a href="https://www.ubuntu.com/legal/dataprivacy">Data privacy</a>
&nbsp;&bull;&nbsp;
<a href="/feedback">Contact Launchpad Support</a>
&nbsp;&bull;&nbsp;
<a href="http://blog.launchpad.net/">Blog</a>
&nbsp;&bull;&nbsp;
<a href="https://canonical.com/careers">Careers</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.social/@launchpadstatus">System status</a>
<span id="lp-version">
&nbsp;&bull;&nbsp;
b042f2d
(<a href="https://documentation.ubuntu.com/launchpad/developer/how-to/get-source-code/">Get the code!</a>)
</span>
</div>
</div>
</div><!-- yui-d0-->
<script id="json-cache-script">LP.cache = {"related_features": {}};</script>
</body>
<!--
Facet name: unknown
Page type: main_only
Has global search: True
Has application tabs: True
Has side portlets: False
At least 22 queries/external actions issued in 0.12 seconds
Features: {'profiling.enabled': None, 'hard_timeout': '5000', 'js.yui_version': None, 'app.maintenance_message': None, 'app.mainsite_only.canonical_url': None, 'baselayout.careers_link.disabled': None, 'visible_render_time': None}
rb042f2d
-->
</html>

511
sysroot-arm32/index.html.2 Normal file
View file

@ -0,0 +1,511 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<title>Launchpad</title>
<link rel="apple-touch-icon" sizes="180x180" href="/@@/apple-touch-icon.png?v=2022" />
<link rel="icon" type="image/png" sizes="32x32" href="/@@/favicon-32x32.png?v=2022" />
<link rel="icon" type="image/png" sizes="16x16" href="/@@/favicon-16x16.png?v=2022" />
<link rel="manifest" href="/@@/site.webmanifest?v=2022" />
<link rel="mask-icon" href="/@@/safari-pinned-tab.svg?v=2022" color="#e9531f" />
<link rel="shortcut icon" href="/@@/favicon.ico?v=2022" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="msapplication-config" content="/@@/browserconfig.xml?v=2022" />
<meta name="theme-color" content="#ffffff" />
<link rel="alternate" type="application/atom+xml" href="http://feeds.launchpad.net/announcements.atom" title="All Announcements" />
<link type="text/css" rel="stylesheet" media="screen, print" href="/+icing/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/combo.css" />
<meta property="og:title" content="Launchpad" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/@@/launchpad-og-image.png" />
<meta property="og:url" content="https://launchpad.net/index.html" />
<meta property="og:site_name" content="Launchpad" />
<script type="text/javascript">
var LP = {
cache: {},
links: {}
};
</script>
<script type="text/javascript">var cookie_scope = '; Path=/; Secure; Domain=.launchpad.net';</script>
<script type="text/javascript" src="/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?yui/yui/yui-min.js&amp;lp/meta.js&amp;yui/loader/loader-min.js"></script>
<script type="text/javascript">
var raw = null;
if (LP.devmode) {
raw = 'raw';
}
YUI.GlobalConfig = {
combine: true,
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'yui/',
filter: raw,
debug: false,
fetchCSS: false,
maxURLLength: 2000,
groups: {
lp: {
combine: true,
base: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?lp/',
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'lp/',
// comes from including lp/meta.js
modules: LP_MODULES,
fetchCSS: false
}
}
}</script>
<script type="text/javascript">
// we need this to create a single YUI instance all events and code
// talks across. All instances of YUI().use should be based off of
// LPJS instead.
var LPJS = new YUI();
</script>
<script id="base-layout-load-scripts" type="text/javascript">
//<![CDATA[
LPJS.use('base', 'node', 'console', 'event',
'oop', 'lp', 'lp.app.foldables','lp.app.sorttable',
'lp.app.inlinehelp', 'lp.app.links',
'lp.bugs.bugtask_index', 'lp.bugs.subscribers',
'lp.app.ellipsis', 'lp.code.branchmergeproposal.diff',
'lp.views.global',
function(Y) {
Y.on("domready", function () {
var global_view = new Y.lp.views.Global();
global_view.render();
Y.lp.app.sorttable.SortTable.init();
Y.lp.app.inlinehelp.init_help();
Y.lp.activate_collapsibles();
Y.lp.app.foldables.activate();
Y.lp.app.links.check_valid_lp_links();
});
Y.on('lp:context:web_link:changed', function(e) {
window.location = e.new_value;
});
});
//]]>
</script>
<script id="base-helper-functions" type="text/javascript">
//<![CDATA[
// This code is pulled from lp.js that needs to be available on every
// request. Pulling here to get it outside the scope of the YUI block.
function setFocusByName(name) {
// Focus the first element matching the given name which can be focused.
var nodes = document.getElementsByName(name);
var i, node;
for (i = 0; i < nodes.length; i++) {
node = nodes[i];
if (node.focus) {
try {
// Trying to focus a hidden element throws an error in IE8.
if (node.offsetHeight !== 0) {
node.focus();
}
} catch (e) {
LPJS.use('console', function(Y) {
Y.log('In setFocusByName(<' +
node.tagName + ' type=' + node.type + '>): ' + e);
});
}
break;
}
}
}
function selectWidget(widget_name, event) {
if (event && (event.keyCode === 9 || event.keyCode === 13)) {
// Avoid firing if user is tabbing through or simply pressing
// enter to submit the form.
return;
}
document.getElementById(widget_name).checked = true;
}
//]]>
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/+icing/vanilla-framework-version-4.7.0.min.css" />
</head>
<body id="document" itemscope="" itemtype="http://schema.org/WebPage" class="tab-unknown
main_only
public
yui3-skin-sam">
<div class="yui-d0">
<div id="locationbar" class="login-logout">
<div id="logincontrol"><a href="https://launchpad.net/+login">Log in / Register</a></div>
</div><!--id="locationbar"-->
<div id="maincontent" class="yui-main">
<div class="yui-b" dir="ltr">
<div class="context-publication">
<div id="registration" class="registering">
</div>
</div>
<div id="request-notifications">
</div>
<div>
<!-- Is your project registered yet? -->
<div id="homepage" class="homepage">
<div class="top-portlet">
<img src="/@@/launchpad-logo-and-name.svg" class="homepage__logo" id="launchpad-logo-and-name" alt="Launchpad logo and name" />
</div>
<hr>
<section class="p-strip is-shallow">
<div class="u-fixed-width">
<form id="homepage-searchform" class="p-form p-form--inline" xml:lang="en" lang="en" dir="ltr" method="get" accept-charset="UTF-8" action="https://launchpad.net/+search">
<div class="p-form__group p-form--search">
<label for="search-input" class="u-off-screen">Search</label>
<div class="p-form__control u-clearfix">
<input id="search-input" type="search" name="field.text" value="" autofocus="">
</div>
</div>
<button id="search" class="p-button--positive" type="submit" value="Search Launchpad">Search</button>
</form>
<script type="text/javascript">
LPJS.use('lp', function () {
setFocusByName('field.text');
});
</script>
<div id="homepage-stats" class="u-text--muted">
<strong>49,106</strong>&nbsp;projects,
<strong>2,108,367</strong>&nbsp;bugs,
<strong>1,009,234</strong>&nbsp;branches,
<strong>119,025</strong>&nbsp;Git repositories,
<strong>3,185,634</strong>&nbsp;translations,
<strong>822,311</strong>&nbsp;answers,
<strong>76,426</strong>&nbsp;blueprints,
and&nbsp;counting...
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div class="homepage-whatslaunchpad">
<div class="u-fixed-width u-clearfix">
<h2>Launchpad</h2>
<h4>A software collaboration platform that provides</h4>
</div>
<div class="u-fixed-width u-clearfix">
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://bugs.launchpad.net/">Bug tracking</a></h4>
<p>One place to track bugs across project boundaries and tools</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://code.launchpad.net/">Code hosting</a> using <a href="https://git-scm.com/">Git</a></h4>
<p>Easy for anyone to get your project's code using Git</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/how-to/work-with-code-hosted-on-launchpad/create-and-manage-a-merge-proposal/">Code reviews</a></h4>
<p>Full control of who can land code in your project remains with you</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://launchpad.net/ubuntu">Ubuntu package building and hosting</a></h4>
<p>Publishing your software is simple with Personal Package Archives</p>
</div>
</div>
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://translations.launchpad.net/">Crowd source translations</a></h4>
<p>Build an open community to translate your software into almost any language</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/Teams/MailingLists">Mailing lists</a></h4>
<p>Find and work with the right people by building a social network of individuals and teams around projects</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://answers.launchpad.net/">Answer tracking and FAQs</a></h4>
<p>Free software thrives on people helping each other when the unexpected happens</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://blueprints.launchpad.net/">Specification tracking</a></h4>
<p>Track ideas and chunks of work as “blueprints”</p>
</div>
</div>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-getstarted">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Get started</h2>
</div>
<div class="u-fixed-width u-clearfix">
<span>
Learn more about Launchpad in the
<a href="https://documentation.ubuntu.com/launchpad/">user guide</a>.
</span>
If you're ready, you can:
<ul class="p-matrix">
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/add-homepage.png" alt="add">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+login">Create an account</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/tour-homepage.png" alt="tour">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+tour">Take the tour</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/question-homepage.png" alt="question">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="https://answers.launchpad.net/">Find answers</a></h4>
</div>
</li>
</ul>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-featured">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Featured projects</h2>
</div>
<div class="u-fixed-width u-clearfix">
<ul class="p-matrix featured-projects-list">
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Beautiful Soup" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/beautifulsoup">Beautiful Soup</a></h4>
<div class="p-matrix__desc">
<p>A program designed for screen-scraping HTML. The discussion group is at: http://groups.google.com...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Inkscape" src="https://launchpadlibrarian.net/66795469/ink-lp-logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/inkscape">Inkscape</a></h4>
<div class="p-matrix__desc">
<p>Inkscape is an SVG-based graphics editor featuring alpha
blending, node editing, SVG to PNG exp...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Launchpad itself" src="https://launchpadlibrarian.net/600817174/Canonical_Launchpad_icon_64px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpad">Launchpad itself</a></h4>
<div class="p-matrix__desc">
<p>Launchpad is a set of Web services to help software developers collaborate.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="launchpadlib " src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpadlib">launchpadlib </a></h4>
<div class="p-matrix__desc">
<p>Python client library for Launchpad's web service</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenMW" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openmw">OpenMW</a></h4>
<div class="p-matrix__desc">
<p>OpenMW is an attempt to reimplement the popular role playing game Morrowind. It aims to be a full...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenShot Video Editor" src="https://launchpadlibrarian.net/250357498/OpenShot-2-Logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openshot">OpenShot Video Editor</a></h4>
<div class="p-matrix__desc">
<p>OpenShot Video Editor is a free, open-source, non-linear video editor. It can create and edit vid...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenStack" src="https://launchpadlibrarian.net/52042558/os64.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openstack">OpenStack</a></h4>
<div class="p-matrix__desc">
<p>The OpenStack Open Source Cloud Mission: to produce the ubiquitous Open Source Cloud Computing pl...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="txpkgupload" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/txpkgupload">txpkgupload</a></h4>
<div class="p-matrix__desc">
<p>Package upload server used by Launchpad.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Ubuntu" src="https://launchpadlibrarian.net/606381979/CoF%2064px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/ubuntu">Ubuntu</a></h4>
<div class="p-matrix__desc">
<p>Ubuntu is a complete Linux-based operating system, freely available with both community and profe...</p>
</div>
</div>
</li>
</ul>
<ul class="horizontal">
<li>
<strong><a href="/projects">Browse all
49106
projects</a>!</strong>
</li>
</ul>
</div>
</div>
</section>
</div><!-- homepage -->
</div>
</div><!-- yui-b -->
</div><!-- yui-main -->
<!-- yui-b side -->
<!-- yui-t4 -->
<div id="footer" class="footer">
<div class="colophon">
&copy; 2004
<a href="http://canonical.com/">Canonical&nbsp;Ltd.</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.com/legal/launchpad-terms-of-service">Terms of use</a>
&nbsp;&bull;&nbsp;
<a href="https://www.ubuntu.com/legal/dataprivacy">Data privacy</a>
&nbsp;&bull;&nbsp;
<a href="/feedback">Contact Launchpad Support</a>
&nbsp;&bull;&nbsp;
<a href="http://blog.launchpad.net/">Blog</a>
&nbsp;&bull;&nbsp;
<a href="https://canonical.com/careers">Careers</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.social/@launchpadstatus">System status</a>
<span id="lp-version">
&nbsp;&bull;&nbsp;
b042f2d
(<a href="https://documentation.ubuntu.com/launchpad/developer/how-to/get-source-code/">Get the code!</a>)
</span>
</div>
</div>
</div><!-- yui-d0-->
<script id="json-cache-script">LP.cache = {"related_features": {}};</script>
</body>
<!--
Facet name: unknown
Page type: main_only
Has global search: True
Has application tabs: True
Has side portlets: False
At least 22 queries/external actions issued in 0.38 seconds
Features: {'profiling.enabled': None, 'hard_timeout': '5000', 'js.yui_version': None, 'app.maintenance_message': None, 'app.mainsite_only.canonical_url': None, 'baselayout.careers_link.disabled': None, 'visible_render_time': None}
rb042f2d
-->
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
libcap.so.2.66

View file

@ -0,0 +1 @@
../../../lib/arm-linux-gnueabihf/libudev.so.1

View file

@ -0,0 +1 @@
libudev.so.1.7.8

Binary file not shown.

View file

@ -0,0 +1 @@
libusb-1.0.so.0.4.0

View file

@ -0,0 +1 @@
libusb-1.0.so.0.4.0

View file

@ -0,0 +1,11 @@
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/arm-linux-gnueabihf
includedir=${prefix}/include
Name: libusb-1.0
Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
Version: 1.0.27
Libs: -L${libdir} -lusb-1.0
Libs.private: -ludev
Cflags: -I${includedir}/libusb-1.0

Binary file not shown.

View file

@ -0,0 +1,287 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: systemd
Upstream-Contact: systemd-devel@lists.freedesktop.org
Source: https://www.freedesktop.org/wiki/Software/systemd/
Files: *
Copyright: 2008-2015 Kay Sievers <kay@vrfy.org>
2010-2015 Lennart Poettering
2012-2015 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2013-2015 Tom Gundersen <teg@jklm.no>
2013-2015 Daniel Mack
2010-2015 Harald Hoyer
2013-2015 David Herrmann
2013, 2014 Thomas H.P. Andersen
2013, 2014 Daniel Buch
2014 Susant Sahani
2009-2015 Intel Corporation
2000, 2005 Red Hat, Inc.
2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
2010 ProFUSION embedded systems
2010 Maarten Lankhorst
1995-2004 Miquel van Smoorenburg
1999 Tom Tromey
2011 Michal Schmidt
2012 B. Poettering
2012 Holger Hans Peter Freyther
2012 Dan Walsh
2012 Roberto Sassu
2013 David Strauss
2013 Marius Vollmer
2013 Jan Janssen
2013 Simon Peeters
License: LGPL-2.1+
Files: src/basic/siphash24.h
src/basic/siphash24.c
Copyright: 2012 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
2012 Daniel J. Bernstein <djb@cr.yp.to>
License: CC0-1.0
Files: src/shared/linux/*
src/basic/linux/*
Copyright: 2004-2009 Red Hat, Inc.
2011-2014 PLUMgrid
2001-2003 Sistina Software (UK) Limited.
2008 Ian Kent <raven@themaw.net>
1998 David S. Miller >davem@redhat.com>
2001 Jeff Garzik <jgarzik@pobox.com>
2006-2010 Johannes Berg <johannes@sipsolutions.net
2008 Michael Wu <flamingice@sourmilk.net>
2008 Luis Carlos Cobo <luisca@cozybit.com>
2008 Michael Buesch <m@bues.ch>
2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
2008 Jouni Malinen <jouni.malinen@atheros.com>
2008 Colin McCabe <colin@cozybit.com>
2018-2019 Intel Corporation
2007 Oracle.
2009 Wolfgang Grandegger <wg@grandegger.com>
1999 Thomas Davis <tadavis@lbl.gov>
2015 Sabrina Dubroca <sd@queasysnail.net>
1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>
License: GPL-2 with Linux-syscall-note exception
Files: src/basic/sparse-endian.h
Copyright: 2012 Josh Triplett <josh@joshtriplett.org>
License: Expat
Files: src/basic/MurmurHash2.c
src/basic/MurmurHash2.h
src/libsystemd/sd-journal/lookup3.c
src/libsystemd/sd-journal/lookup3.h
Copyright: none
License: public-domain
You can use this free for any purpose. It's in the public domain. It has no
warranty.
Files: src/udev/ata_id/ata_id.c
src/udev/cdrom_id/cdrom_id.c
src/udev/dmi_memory_id/dmi_memory_id.c
src/udev/mtd_probe/mtd_probe.c
src/udev/mtd_probe/mtd_probe.h
src/udev/mtd_probe/probe_smartmedia.c
src/udev/scsi_id/scsi.h
src/udev/scsi_id/scsi_id.c
src/udev/scsi_id/scsi_id.h
src/udev/scsi_id/scsi_serial.c
src/udev/udevadm.c
src/udev/udevadm-control.c
src/udev/udevadm.h
src/udev/udevadm-info.c
src/udev/udevadm-monitor.c
src/udev/udevadm-settle.c
src/udev/udevadm-test-builtin.c
src/udev/udevadm-test.c
src/udev/udevadm-trigger.c
src/udev/udevadm-util.c
src/udev/udevadm-util.h
src/udev/udev-builtin-blkid.c
src/udev/udev-builtin.h
src/udev/udev-builtin-input_id.c
src/udev/udev-builtin-kmod.c
src/udev/udev-builtin-path_id.c
src/udev/udev-builtin-uaccess.c
src/udev/udev-builtin-usb_id.c
src/udev/udev-ctrl.h
src/udev/udevd.c
src/udev/udevd.h
src/udev/udev-event.c
src/udev/udev-event.h
src/udev/udev-node.c
src/udev/udev-node.h
src/udev/udev-rules.c
src/udev/udev-rules.h
src/udev/udev-watch.c
src/udev/udev-watch.h
src/udev/v4l_id/v4l_id.c
Copyright: 2003-2012 Kay Sievers <kay@vrfy.org>
2003-2004 Greg Kroah-Hartman <greg@kroah.com>
2004 Chris Friesen <chris_friesen@sympatico.ca>
2004, 2009, 2010 David Zeuthen <david@fubar.dk>
2005, 2006 SUSE Linux Products GmbH
2003 IBM Corp.
2007 Hannes Reinecke <hare@suse.de>
2009 Canonical Ltd.
2009 Scott James Remnant <scott@netsplit.com>
2009 Martin Pitt <martin.pitt@ubuntu.com>
2009 Piter Punk <piterpunk@slackware.com>
2009, 2010 Lennart Poettering
2009 Filippo Argiolas <filippo.argiolas@gmail.com>
2010 Maxim Levitsky
2011 ProFUSION embedded systems
2011 Karel Zak <kzak@redhat.com>
2014 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2014 David Herrmann <dh.herrmann@gmail.com>
2014 Carlos Garnacho <carlosg@gnome.org>
License: GPL-2+
Files: debian/*
Copyright: 2010-2013 Tollef Fog Heen <tfheen@debian.org>
2011 Josh Triplett <josh@joshtriplett.org>
2013-2014 Michael Stapelberg <stapelberg@debian.org>
2013-2020 Martin Pitt <martin.pitt@ubuntu.com>
2013-2022 Michael Biebl <biebl@debian.org>
2013 Daniel Schaal <farbing@web.de>
2013 Guido Günther <agx@sigxcpu.org>
2014-2015 Didier Roche <didrocks@ubuntu.com>
2014-2015 Marco d'Itri <md@linux.it>
2014-2017 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
2014 Ansgar Burchardt <ansgar@debian.org>
2014 Jon Severinsson <jon@severinsson.net>
2015-2019 Felipe Sateler <fsateler@debian.org>
2015 Adam Conrad <adconrad@debian.org>
2015 Andreas Henriksson <andreas@fatal.se>
2015 Christian Seiler <christian@iwakd.de>
2015 Julian Wollrath <jwollrath@web.de>
2016-2018 Evgeny Vereshchagin <evvers@ya.ru>
2016,2018 Laurent Bigonville <bigon@debian.org>
2016-2019 Dimitri John Ledkov <xnox@ubuntu.com>
2016,2019 Michael Prokop <mika@debian.org>
2016 Alexander Kurtz <alexander@kurtz.be>
2016 Antonio Ospite <ao2@ao2.it>
2016 Iain Lane <iain@orangesquash.org.uk>
2016 Simon McVittie <simon.mcvittie@collabora.co.uk>
2017-2018 Nicolas Braud-Santoni <nicolas@braud-santoni.eu>
2017-2019 Martin Pitt <mpitt@debian.org>
2017 Cyril Brulebois <kibi@debian.org>
2017 Ondřej Nový <onovy@debian.org>
2018-2019 Mert Dirik <mertdirik@gmail.com>
2018 Adam Borowski <kilobyte@angband.pl>
2018 Alf Gaida <agaida@siduction.org>
2018 Benjamin Drung <benjamin.drung@profitbricks.com>
2018 Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
2018 Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>
2019-2021 Balint Reczey <balint.reczey@canonical.com>
2019-2021 Dan Streetman <ddstreet@canonical.com>
2019 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2020-2021 Helmut Grohne <helmut@subdivi.de>
2020 Topi Miettinen <toiwoton@gmail.com>
2020 Youfu Zhang <zhangyoufu@gmail.com>
2020 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2020 наб <nabijaczleweli@nabijaczleweli.xyz>
2021-2022 Luca Boccassi <bluca@debian.org>
2021-2022 Lukas Märdian <slyon@ubuntu.com>
2021 Frantisek Sumsal <frantisek@sumsal.cz>
2021 Ioanna Alifieraki <ioanna-maria.alifieraki@canonical.com>
2021 Jan Kiszka <jan.kiszka@web.de>
2021 Matthias Klumpp <matthias@tenstral.net>
2021 Salvatore Bonaccorso <carnil@debian.org>
License: LGPL-2.1+
License: Expat
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
License: GPL-2 with Linux-syscall-note exception
NOTE! This copyright does *not* cover user programs that use kernel services
by normal system calls - this is merely considered normal use of the kernel,
and does *not* fall under the heading of "derived work". Also note that the
GPL below is copyrighted by the Free Software Foundation, but the instance of
code that it refers to (the Linux kernel) is copyrighted by me and others who
actually wrote it.
.
Also note that the only valid version of the GPL as far as the kernel is
concerned is _this_ particular version of the license (ie v2, not v2.2 or v3.x
or whatever), unless explicitly otherwise stated.
.
Linus Torvalds
.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian and systems the full text of the GNU General Public
License version 2 can be found in the file
`/usr/share/common-licenses/GPL-2`
License: GPL-2+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in /usr/share/common-licenses/GPL-2.
License: LGPL-2.1+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1, or (at your option)
any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian systems, the complete text of the GNU Lesser General Public
License version 2.1 can be found in /usr/share/common-licenses/LGPL-2.1.
License: CC0-1.0
To the extent possible under law, the author(s) have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
.
You should have received a copy of the CC0 Public Domain Dedication along with
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
.
On Debian systems, the complete text of the CC0 1.0 Universal license can be
found in /usr/share/common-licenses/CC0-1.0.

View file

@ -0,0 +1 @@
../libusb-1.0-0/README

View file

@ -0,0 +1 @@
../libusb-1.0-0/changelog.Debian.gz

View file

@ -0,0 +1,121 @@
This package was debianized by Christopher L Cheney <ccheney@debian.org> on
Wed, 13 Jun 2001 12:21:44 -0500.
It was downloaded from http://www.libusb.info
Authors:
Alan Ott
Alan Stern
Alex Vatchenko
Andrew Fernandes
Anthony Clay
Artem Egorkine
Aurelien Jarno
Bastien Nocera
Bei Zhang
Benjamin Dobell
Chris Dickens
Colin Walters
Dave Camarillo
David Engraf
David Moore
Davidlohr Bueso
Federico Manzan
Felipe Balbi
Florian Albrechtskirchinger
Francesco Montorsi
Francisco Facioni
Graeme Gill
Gustavo Zacarias
Hans Ulrich Niedermann
Hector Martin
Hoi-Ho Chan
Ilya Konstantinov
James Hanko
Joshua Blake
Karsten Koenig
Konrad Rzepecki
Kuangye Guo
Lars Wirzenius
Luca Longinotti
Martin Koegler
Matthias Bolte
Mike Frysinger
Mikhail Gusarov
Moritz Fischer
Nicholas Corgan
Omri Iluz
Orin Eman
Paul Fertser
Pekka Nikander
Rob Walker
Sean McBride
Sebastian Pipping
Simon Haggett
Thomas Röfer
Tim Roberts
Toby Peterson
Trygve Laugstøl
Uri Lublin
Vasily Khoruzhick
Vegard Storheil Eriksen
Vitali Lovich
Xiaofan Chen
Zoltán Kovács
Роман Донченко
xantares
Copyright:
Copyright (C) 2001 Johannes Erdfelt <johannes@erdfelt.com>
Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
Copyright (C) 2010-2012 Peter Stuge <peter@stuge.se>
Copyright (C) 2008-2013 Nathan Hjelm <hjelmn@users.sourceforge.net>
Copyright (C) 2009-2013 Pete Batard <pete@akeo.ie>
Copyright (C) 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>
Copyright (C) 2010-2012 Michael Plante <michael.plante@gmail.com>
Copyright (C) 2011-2013 Hans de Goede <hdegoede@redhat.com>
Copyright (C) 2012-2013 Martin Pieuchot <mpi@openbsd.org>
License of the libusb library and most examples except ezusb and fxload:
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA.
On Debian systems, the complete text of the LGPL license can be found
in the /usr/share/common-licenses/LGPL-2.1 file.
License of ezusb and fxload:
This source code is free software; you can redistribute it
and/or modify it in source code form under the terms of the GNU
General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA.
On Debian systems, the complete text of the GPL license can be found
in the /usr/share/common-licenses/GPL-2 file.

View file

@ -0,0 +1,29 @@
# libusb
libusb is a library for USB device access from Linux, macOS,
Windows, OpenBSD/NetBSD, Haiku, Solaris userspace, and WebAssembly
via WebUSB.
It is written in C (Haiku backend in C++) and licensed under the GNU
Lesser General Public License version 2.1 or, at your option, any later
version (see COPYING).
libusb is abstracted internally in such a way that it can hopefully
be ported to other operating systems. Please see the PORTING
file for more information.
libusb homepage:
https://libusb.info/
Developers will wish to consult the API documentation:
http://api.libusb.info
Use the mailing list for questions, comments, etc:
http://mailing-list.libusb.info
- Hans de Goede <hdegoede@redhat.com>
- Xiaofan Chen <xiaofanc@gmail.com>
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
- Nathan Hjelm <hjelmn@cs.unm.edu>
- Chris Dickens <christopher.a.dickens@gmail.com>
(Please use the mailing list rather than mailing developers directly)

View file

@ -0,0 +1,121 @@
This package was debianized by Christopher L Cheney <ccheney@debian.org> on
Wed, 13 Jun 2001 12:21:44 -0500.
It was downloaded from http://www.libusb.info
Authors:
Alan Ott
Alan Stern
Alex Vatchenko
Andrew Fernandes
Anthony Clay
Artem Egorkine
Aurelien Jarno
Bastien Nocera
Bei Zhang
Benjamin Dobell
Chris Dickens
Colin Walters
Dave Camarillo
David Engraf
David Moore
Davidlohr Bueso
Federico Manzan
Felipe Balbi
Florian Albrechtskirchinger
Francesco Montorsi
Francisco Facioni
Graeme Gill
Gustavo Zacarias
Hans Ulrich Niedermann
Hector Martin
Hoi-Ho Chan
Ilya Konstantinov
James Hanko
Joshua Blake
Karsten Koenig
Konrad Rzepecki
Kuangye Guo
Lars Wirzenius
Luca Longinotti
Martin Koegler
Matthias Bolte
Mike Frysinger
Mikhail Gusarov
Moritz Fischer
Nicholas Corgan
Omri Iluz
Orin Eman
Paul Fertser
Pekka Nikander
Rob Walker
Sean McBride
Sebastian Pipping
Simon Haggett
Thomas Röfer
Tim Roberts
Toby Peterson
Trygve Laugstøl
Uri Lublin
Vasily Khoruzhick
Vegard Storheil Eriksen
Vitali Lovich
Xiaofan Chen
Zoltán Kovács
Роман Донченко
xantares
Copyright:
Copyright (C) 2001 Johannes Erdfelt <johannes@erdfelt.com>
Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
Copyright (C) 2010-2012 Peter Stuge <peter@stuge.se>
Copyright (C) 2008-2013 Nathan Hjelm <hjelmn@users.sourceforge.net>
Copyright (C) 2009-2013 Pete Batard <pete@akeo.ie>
Copyright (C) 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>
Copyright (C) 2010-2012 Michael Plante <michael.plante@gmail.com>
Copyright (C) 2011-2013 Hans de Goede <hdegoede@redhat.com>
Copyright (C) 2012-2013 Martin Pieuchot <mpi@openbsd.org>
License of the libusb library and most examples except ezusb and fxload:
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA.
On Debian systems, the complete text of the LGPL license can be found
in the /usr/share/common-licenses/LGPL-2.1 file.
License of ezusb and fxload:
This source code is free software; you can redistribute it
and/or modify it in source code form under the terms of the GNU
General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA.
On Debian systems, the complete text of the GPL license can be found
in the /usr/share/common-licenses/GPL-2 file.

5038
sysroot-arm64/index.html Normal file

File diff suppressed because it is too large Load diff

5038
sysroot-arm64/index.html.1 Normal file

File diff suppressed because it is too large Load diff

511
sysroot-arm64/index.html.2 Normal file
View file

@ -0,0 +1,511 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<title>Launchpad</title>
<link rel="apple-touch-icon" sizes="180x180" href="/@@/apple-touch-icon.png?v=2022" />
<link rel="icon" type="image/png" sizes="32x32" href="/@@/favicon-32x32.png?v=2022" />
<link rel="icon" type="image/png" sizes="16x16" href="/@@/favicon-16x16.png?v=2022" />
<link rel="manifest" href="/@@/site.webmanifest?v=2022" />
<link rel="mask-icon" href="/@@/safari-pinned-tab.svg?v=2022" color="#e9531f" />
<link rel="shortcut icon" href="/@@/favicon.ico?v=2022" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="msapplication-config" content="/@@/browserconfig.xml?v=2022" />
<meta name="theme-color" content="#ffffff" />
<link rel="alternate" type="application/atom+xml" href="http://feeds.launchpad.net/announcements.atom" title="All Announcements" />
<link type="text/css" rel="stylesheet" media="screen, print" href="/+icing/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/combo.css" />
<meta property="og:title" content="Launchpad" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/@@/launchpad-og-image.png" />
<meta property="og:url" content="https://launchpad.net/index.html" />
<meta property="og:site_name" content="Launchpad" />
<script type="text/javascript">
var LP = {
cache: {},
links: {}
};
</script>
<script type="text/javascript">var cookie_scope = '; Path=/; Secure; Domain=.launchpad.net';</script>
<script type="text/javascript" src="/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?yui/yui/yui-min.js&amp;lp/meta.js&amp;yui/loader/loader-min.js"></script>
<script type="text/javascript">
var raw = null;
if (LP.devmode) {
raw = 'raw';
}
YUI.GlobalConfig = {
combine: true,
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'yui/',
filter: raw,
debug: false,
fetchCSS: false,
maxURLLength: 2000,
groups: {
lp: {
combine: true,
base: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?lp/',
comboBase: '/+combo/revb042f2deb3ecfaa583e2ab7763b0e6f8b706ff27/?',
root: 'lp/',
// comes from including lp/meta.js
modules: LP_MODULES,
fetchCSS: false
}
}
}</script>
<script type="text/javascript">
// we need this to create a single YUI instance all events and code
// talks across. All instances of YUI().use should be based off of
// LPJS instead.
var LPJS = new YUI();
</script>
<script id="base-layout-load-scripts" type="text/javascript">
//<![CDATA[
LPJS.use('base', 'node', 'console', 'event',
'oop', 'lp', 'lp.app.foldables','lp.app.sorttable',
'lp.app.inlinehelp', 'lp.app.links',
'lp.bugs.bugtask_index', 'lp.bugs.subscribers',
'lp.app.ellipsis', 'lp.code.branchmergeproposal.diff',
'lp.views.global',
function(Y) {
Y.on("domready", function () {
var global_view = new Y.lp.views.Global();
global_view.render();
Y.lp.app.sorttable.SortTable.init();
Y.lp.app.inlinehelp.init_help();
Y.lp.activate_collapsibles();
Y.lp.app.foldables.activate();
Y.lp.app.links.check_valid_lp_links();
});
Y.on('lp:context:web_link:changed', function(e) {
window.location = e.new_value;
});
});
//]]>
</script>
<script id="base-helper-functions" type="text/javascript">
//<![CDATA[
// This code is pulled from lp.js that needs to be available on every
// request. Pulling here to get it outside the scope of the YUI block.
function setFocusByName(name) {
// Focus the first element matching the given name which can be focused.
var nodes = document.getElementsByName(name);
var i, node;
for (i = 0; i < nodes.length; i++) {
node = nodes[i];
if (node.focus) {
try {
// Trying to focus a hidden element throws an error in IE8.
if (node.offsetHeight !== 0) {
node.focus();
}
} catch (e) {
LPJS.use('console', function(Y) {
Y.log('In setFocusByName(<' +
node.tagName + ' type=' + node.type + '>): ' + e);
});
}
break;
}
}
}
function selectWidget(widget_name, event) {
if (event && (event.keyCode === 9 || event.keyCode === 13)) {
// Avoid firing if user is tabbing through or simply pressing
// enter to submit the form.
return;
}
document.getElementById(widget_name).checked = true;
}
//]]>
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/+icing/vanilla-framework-version-4.7.0.min.css" />
</head>
<body id="document" itemscope="" itemtype="http://schema.org/WebPage" class="tab-unknown
main_only
public
yui3-skin-sam">
<div class="yui-d0">
<div id="locationbar" class="login-logout">
<div id="logincontrol"><a href="https://launchpad.net/+login">Log in / Register</a></div>
</div><!--id="locationbar"-->
<div id="maincontent" class="yui-main">
<div class="yui-b" dir="ltr">
<div class="context-publication">
<div id="registration" class="registering">
</div>
</div>
<div id="request-notifications">
</div>
<div>
<!-- Is your project registered yet? -->
<div id="homepage" class="homepage">
<div class="top-portlet">
<img src="/@@/launchpad-logo-and-name.svg" class="homepage__logo" id="launchpad-logo-and-name" alt="Launchpad logo and name" />
</div>
<hr>
<section class="p-strip is-shallow">
<div class="u-fixed-width">
<form id="homepage-searchform" class="p-form p-form--inline" xml:lang="en" lang="en" dir="ltr" method="get" accept-charset="UTF-8" action="https://launchpad.net/+search">
<div class="p-form__group p-form--search">
<label for="search-input" class="u-off-screen">Search</label>
<div class="p-form__control u-clearfix">
<input id="search-input" type="search" name="field.text" value="" autofocus="">
</div>
</div>
<button id="search" class="p-button--positive" type="submit" value="Search Launchpad">Search</button>
</form>
<script type="text/javascript">
LPJS.use('lp', function () {
setFocusByName('field.text');
});
</script>
<div id="homepage-stats" class="u-text--muted">
<strong>49,106</strong>&nbsp;projects,
<strong>2,108,367</strong>&nbsp;bugs,
<strong>1,009,234</strong>&nbsp;branches,
<strong>119,025</strong>&nbsp;Git repositories,
<strong>3,185,634</strong>&nbsp;translations,
<strong>822,311</strong>&nbsp;answers,
<strong>76,426</strong>&nbsp;blueprints,
and&nbsp;counting...
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div class="homepage-whatslaunchpad">
<div class="u-fixed-width u-clearfix">
<h2>Launchpad</h2>
<h4>A software collaboration platform that provides</h4>
</div>
<div class="u-fixed-width u-clearfix">
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://bugs.launchpad.net/">Bug tracking</a></h4>
<p>One place to track bugs across project boundaries and tools</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://code.launchpad.net/">Code hosting</a> using <a href="https://git-scm.com/">Git</a></h4>
<p>Easy for anyone to get your project's code using Git</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/how-to/work-with-code-hosted-on-launchpad/create-and-manage-a-merge-proposal/">Code reviews</a></h4>
<p>Full control of who can land code in your project remains with you</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://launchpad.net/ubuntu">Ubuntu package building and hosting</a></h4>
<p>Publishing your software is simple with Personal Package Archives</p>
</div>
</div>
<div class="row p-divider">
<div class="col-3 p-divider__block">
<h4><a href="https://translations.launchpad.net/">Crowd source translations</a></h4>
<p>Build an open community to translate your software into almost any language</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://documentation.ubuntu.com/launchpad/user/Teams/MailingLists">Mailing lists</a></h4>
<p>Find and work with the right people by building a social network of individuals and teams around projects</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://answers.launchpad.net/">Answer tracking and FAQs</a></h4>
<p>Free software thrives on people helping each other when the unexpected happens</p>
</div>
<div class="col-3 p-divider__block">
<h4><a href="https://blueprints.launchpad.net/">Specification tracking</a></h4>
<p>Track ideas and chunks of work as “blueprints”</p>
</div>
</div>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-getstarted">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Get started</h2>
</div>
<div class="u-fixed-width u-clearfix">
<span>
Learn more about Launchpad in the
<a href="https://documentation.ubuntu.com/launchpad/">user guide</a>.
</span>
If you're ready, you can:
<ul class="p-matrix">
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/add-homepage.png" alt="add">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+login">Create an account</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/tour-homepage.png" alt="tour">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/+tour">Take the tour</a></h4>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" src="/@@/question-homepage.png" alt="question">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="https://answers.launchpad.net/">Find answers</a></h4>
</div>
</li>
</ul>
</div>
</div>
</section>
<section class="p-strip is-shallow">
<div id="homepage-featured">
<div class="u-fixed-width u-clearfix">
<h2 class="u-float-left">Featured projects</h2>
</div>
<div class="u-fixed-width u-clearfix">
<ul class="p-matrix featured-projects-list">
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Beautiful Soup" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/beautifulsoup">Beautiful Soup</a></h4>
<div class="p-matrix__desc">
<p>A program designed for screen-scraping HTML. The discussion group is at: http://groups.google.com...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Inkscape" src="https://launchpadlibrarian.net/66795469/ink-lp-logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/inkscape">Inkscape</a></h4>
<div class="p-matrix__desc">
<p>Inkscape is an SVG-based graphics editor featuring alpha
blending, node editing, SVG to PNG exp...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Launchpad itself" src="https://launchpadlibrarian.net/600817174/Canonical_Launchpad_icon_64px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpad">Launchpad itself</a></h4>
<div class="p-matrix__desc">
<p>Launchpad is a set of Web services to help software developers collaborate.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="launchpadlib " src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/launchpadlib">launchpadlib </a></h4>
<div class="p-matrix__desc">
<p>Python client library for Launchpad's web service</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenMW" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openmw">OpenMW</a></h4>
<div class="p-matrix__desc">
<p>OpenMW is an attempt to reimplement the popular role playing game Morrowind. It aims to be a full...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenShot Video Editor" src="https://launchpadlibrarian.net/250357498/OpenShot-2-Logo.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openshot">OpenShot Video Editor</a></h4>
<div class="p-matrix__desc">
<p>OpenShot Video Editor is a free, open-source, non-linear video editor. It can create and edit vid...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="OpenStack" src="https://launchpadlibrarian.net/52042558/os64.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/openstack">OpenStack</a></h4>
<div class="p-matrix__desc">
<p>The OpenStack Open Source Cloud Mission: to produce the ubiquitous Open Source Cloud Computing pl...</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="txpkgupload" src="/@@/product-logo">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/txpkgupload">txpkgupload</a></h4>
<div class="p-matrix__desc">
<p>Package upload server used by Launchpad.</p>
</div>
</div>
</li>
<li class="p-matrix__item">
<img class="p-matrix__img" alt="Ubuntu" src="https://launchpadlibrarian.net/606381979/CoF%2064px.png">
<div class="p-matrix__content">
<h4 class="p-matrix__title"><a class="p-matrix__link" href="/ubuntu">Ubuntu</a></h4>
<div class="p-matrix__desc">
<p>Ubuntu is a complete Linux-based operating system, freely available with both community and profe...</p>
</div>
</div>
</li>
</ul>
<ul class="horizontal">
<li>
<strong><a href="/projects">Browse all
49106
projects</a>!</strong>
</li>
</ul>
</div>
</div>
</section>
</div><!-- homepage -->
</div>
</div><!-- yui-b -->
</div><!-- yui-main -->
<!-- yui-b side -->
<!-- yui-t4 -->
<div id="footer" class="footer">
<div class="colophon">
&copy; 2004
<a href="http://canonical.com/">Canonical&nbsp;Ltd.</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.com/legal/launchpad-terms-of-service">Terms of use</a>
&nbsp;&bull;&nbsp;
<a href="https://www.ubuntu.com/legal/dataprivacy">Data privacy</a>
&nbsp;&bull;&nbsp;
<a href="/feedback">Contact Launchpad Support</a>
&nbsp;&bull;&nbsp;
<a href="http://blog.launchpad.net/">Blog</a>
&nbsp;&bull;&nbsp;
<a href="https://canonical.com/careers">Careers</a>
&nbsp;&bull;&nbsp;
<a href="https://ubuntu.social/@launchpadstatus">System status</a>
<span id="lp-version">
&nbsp;&bull;&nbsp;
b042f2d
(<a href="https://documentation.ubuntu.com/launchpad/developer/how-to/get-source-code/">Get the code!</a>)
</span>
</div>
</div>
</div><!-- yui-d0-->
<script id="json-cache-script">LP.cache = {"related_features": {}};</script>
</body>
<!--
Facet name: unknown
Page type: main_only
Has global search: True
Has application tabs: True
Has side portlets: False
At least 22 queries/external actions issued in 0.19 seconds
Features: {'profiling.enabled': None, 'hard_timeout': '5000', 'js.yui_version': None, 'app.maintenance_message': None, 'app.mainsite_only.canonical_url': None, 'baselayout.careers_link.disabled': None, 'visible_render_time': None}
rb042f2d
-->
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
libcap.so.2.66

Binary file not shown.

View file

@ -0,0 +1 @@
lib/aarch64-linux-gnu/libudev.so.1

View file

@ -0,0 +1 @@
libudev.so.1.7.8

Binary file not shown.

View file

@ -0,0 +1 @@
libusb-1.0.so.0.4.0

View file

@ -0,0 +1 @@
libusb-1.0.so.0.4.0

View file

@ -0,0 +1,11 @@
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/aarch64-linux-gnu
includedir=${prefix}/include
Name: libusb-1.0
Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
Version: 1.0.27
Libs: -L${libdir} -lusb-1.0
Libs.private: -ludev
Cflags: -I${includedir}/libusb-1.0

Binary file not shown.

View file

@ -0,0 +1,287 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: systemd
Upstream-Contact: systemd-devel@lists.freedesktop.org
Source: https://www.freedesktop.org/wiki/Software/systemd/
Files: *
Copyright: 2008-2015 Kay Sievers <kay@vrfy.org>
2010-2015 Lennart Poettering
2012-2015 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2013-2015 Tom Gundersen <teg@jklm.no>
2013-2015 Daniel Mack
2010-2015 Harald Hoyer
2013-2015 David Herrmann
2013, 2014 Thomas H.P. Andersen
2013, 2014 Daniel Buch
2014 Susant Sahani
2009-2015 Intel Corporation
2000, 2005 Red Hat, Inc.
2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
2010 ProFUSION embedded systems
2010 Maarten Lankhorst
1995-2004 Miquel van Smoorenburg
1999 Tom Tromey
2011 Michal Schmidt
2012 B. Poettering
2012 Holger Hans Peter Freyther
2012 Dan Walsh
2012 Roberto Sassu
2013 David Strauss
2013 Marius Vollmer
2013 Jan Janssen
2013 Simon Peeters
License: LGPL-2.1+
Files: src/basic/siphash24.h
src/basic/siphash24.c
Copyright: 2012 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
2012 Daniel J. Bernstein <djb@cr.yp.to>
License: CC0-1.0
Files: src/shared/linux/*
src/basic/linux/*
Copyright: 2004-2009 Red Hat, Inc.
2011-2014 PLUMgrid
2001-2003 Sistina Software (UK) Limited.
2008 Ian Kent <raven@themaw.net>
1998 David S. Miller >davem@redhat.com>
2001 Jeff Garzik <jgarzik@pobox.com>
2006-2010 Johannes Berg <johannes@sipsolutions.net
2008 Michael Wu <flamingice@sourmilk.net>
2008 Luis Carlos Cobo <luisca@cozybit.com>
2008 Michael Buesch <m@bues.ch>
2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
2008 Jouni Malinen <jouni.malinen@atheros.com>
2008 Colin McCabe <colin@cozybit.com>
2018-2019 Intel Corporation
2007 Oracle.
2009 Wolfgang Grandegger <wg@grandegger.com>
1999 Thomas Davis <tadavis@lbl.gov>
2015 Sabrina Dubroca <sd@queasysnail.net>
1999-2000 Maxim Krasnyansky <max_mk@yahoo.com>
2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>
License: GPL-2 with Linux-syscall-note exception
Files: src/basic/sparse-endian.h
Copyright: 2012 Josh Triplett <josh@joshtriplett.org>
License: Expat
Files: src/basic/MurmurHash2.c
src/basic/MurmurHash2.h
src/libsystemd/sd-journal/lookup3.c
src/libsystemd/sd-journal/lookup3.h
Copyright: none
License: public-domain
You can use this free for any purpose. It's in the public domain. It has no
warranty.
Files: src/udev/ata_id/ata_id.c
src/udev/cdrom_id/cdrom_id.c
src/udev/dmi_memory_id/dmi_memory_id.c
src/udev/mtd_probe/mtd_probe.c
src/udev/mtd_probe/mtd_probe.h
src/udev/mtd_probe/probe_smartmedia.c
src/udev/scsi_id/scsi.h
src/udev/scsi_id/scsi_id.c
src/udev/scsi_id/scsi_id.h
src/udev/scsi_id/scsi_serial.c
src/udev/udevadm.c
src/udev/udevadm-control.c
src/udev/udevadm.h
src/udev/udevadm-info.c
src/udev/udevadm-monitor.c
src/udev/udevadm-settle.c
src/udev/udevadm-test-builtin.c
src/udev/udevadm-test.c
src/udev/udevadm-trigger.c
src/udev/udevadm-util.c
src/udev/udevadm-util.h
src/udev/udev-builtin-blkid.c
src/udev/udev-builtin.h
src/udev/udev-builtin-input_id.c
src/udev/udev-builtin-kmod.c
src/udev/udev-builtin-path_id.c
src/udev/udev-builtin-uaccess.c
src/udev/udev-builtin-usb_id.c
src/udev/udev-ctrl.h
src/udev/udevd.c
src/udev/udevd.h
src/udev/udev-event.c
src/udev/udev-event.h
src/udev/udev-node.c
src/udev/udev-node.h
src/udev/udev-rules.c
src/udev/udev-rules.h
src/udev/udev-watch.c
src/udev/udev-watch.h
src/udev/v4l_id/v4l_id.c
Copyright: 2003-2012 Kay Sievers <kay@vrfy.org>
2003-2004 Greg Kroah-Hartman <greg@kroah.com>
2004 Chris Friesen <chris_friesen@sympatico.ca>
2004, 2009, 2010 David Zeuthen <david@fubar.dk>
2005, 2006 SUSE Linux Products GmbH
2003 IBM Corp.
2007 Hannes Reinecke <hare@suse.de>
2009 Canonical Ltd.
2009 Scott James Remnant <scott@netsplit.com>
2009 Martin Pitt <martin.pitt@ubuntu.com>
2009 Piter Punk <piterpunk@slackware.com>
2009, 2010 Lennart Poettering
2009 Filippo Argiolas <filippo.argiolas@gmail.com>
2010 Maxim Levitsky
2011 ProFUSION embedded systems
2011 Karel Zak <kzak@redhat.com>
2014 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2014 David Herrmann <dh.herrmann@gmail.com>
2014 Carlos Garnacho <carlosg@gnome.org>
License: GPL-2+
Files: debian/*
Copyright: 2010-2013 Tollef Fog Heen <tfheen@debian.org>
2011 Josh Triplett <josh@joshtriplett.org>
2013-2014 Michael Stapelberg <stapelberg@debian.org>
2013-2020 Martin Pitt <martin.pitt@ubuntu.com>
2013-2022 Michael Biebl <biebl@debian.org>
2013 Daniel Schaal <farbing@web.de>
2013 Guido Günther <agx@sigxcpu.org>
2014-2015 Didier Roche <didrocks@ubuntu.com>
2014-2015 Marco d'Itri <md@linux.it>
2014-2017 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
2014 Ansgar Burchardt <ansgar@debian.org>
2014 Jon Severinsson <jon@severinsson.net>
2015-2019 Felipe Sateler <fsateler@debian.org>
2015 Adam Conrad <adconrad@debian.org>
2015 Andreas Henriksson <andreas@fatal.se>
2015 Christian Seiler <christian@iwakd.de>
2015 Julian Wollrath <jwollrath@web.de>
2016-2018 Evgeny Vereshchagin <evvers@ya.ru>
2016,2018 Laurent Bigonville <bigon@debian.org>
2016-2019 Dimitri John Ledkov <xnox@ubuntu.com>
2016,2019 Michael Prokop <mika@debian.org>
2016 Alexander Kurtz <alexander@kurtz.be>
2016 Antonio Ospite <ao2@ao2.it>
2016 Iain Lane <iain@orangesquash.org.uk>
2016 Simon McVittie <simon.mcvittie@collabora.co.uk>
2017-2018 Nicolas Braud-Santoni <nicolas@braud-santoni.eu>
2017-2019 Martin Pitt <mpitt@debian.org>
2017 Cyril Brulebois <kibi@debian.org>
2017 Ondřej Nový <onovy@debian.org>
2018-2019 Mert Dirik <mertdirik@gmail.com>
2018 Adam Borowski <kilobyte@angband.pl>
2018 Alf Gaida <agaida@siduction.org>
2018 Benjamin Drung <benjamin.drung@profitbricks.com>
2018 Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
2018 Manuel A. Fernandez Montecelo <manuel.montezelo@gmail.com>
2019-2021 Balint Reczey <balint.reczey@canonical.com>
2019-2021 Dan Streetman <ddstreet@canonical.com>
2019 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2020-2021 Helmut Grohne <helmut@subdivi.de>
2020 Topi Miettinen <toiwoton@gmail.com>
2020 Youfu Zhang <zhangyoufu@gmail.com>
2020 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
2020 наб <nabijaczleweli@nabijaczleweli.xyz>
2021-2022 Luca Boccassi <bluca@debian.org>
2021-2022 Lukas Märdian <slyon@ubuntu.com>
2021 Frantisek Sumsal <frantisek@sumsal.cz>
2021 Ioanna Alifieraki <ioanna-maria.alifieraki@canonical.com>
2021 Jan Kiszka <jan.kiszka@web.de>
2021 Matthias Klumpp <matthias@tenstral.net>
2021 Salvatore Bonaccorso <carnil@debian.org>
License: LGPL-2.1+
License: Expat
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
License: GPL-2 with Linux-syscall-note exception
NOTE! This copyright does *not* cover user programs that use kernel services
by normal system calls - this is merely considered normal use of the kernel,
and does *not* fall under the heading of "derived work". Also note that the
GPL below is copyrighted by the Free Software Foundation, but the instance of
code that it refers to (the Linux kernel) is copyrighted by me and others who
actually wrote it.
.
Also note that the only valid version of the GPL as far as the kernel is
concerned is _this_ particular version of the license (ie v2, not v2.2 or v3.x
or whatever), unless explicitly otherwise stated.
.
Linus Torvalds
.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian and systems the full text of the GNU General Public
License version 2 can be found in the file
`/usr/share/common-licenses/GPL-2`
License: GPL-2+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in /usr/share/common-licenses/GPL-2.
License: LGPL-2.1+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1, or (at your option)
any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.
On Debian systems, the complete text of the GNU Lesser General Public
License version 2.1 can be found in /usr/share/common-licenses/LGPL-2.1.
License: CC0-1.0
To the extent possible under law, the author(s) have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
.
You should have received a copy of the CC0 Public Domain Dedication along with
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
.
On Debian systems, the complete text of the CC0 1.0 Universal license can be
found in /usr/share/common-licenses/CC0-1.0.

View file

@ -0,0 +1 @@
../libusb-1.0-0/README

View file

@ -0,0 +1 @@
../libusb-1.0-0/changelog.Debian.gz

View file

@ -0,0 +1,121 @@
This package was debianized by Christopher L Cheney <ccheney@debian.org> on
Wed, 13 Jun 2001 12:21:44 -0500.
It was downloaded from http://www.libusb.info
Authors:
Alan Ott
Alan Stern
Alex Vatchenko
Andrew Fernandes
Anthony Clay
Artem Egorkine
Aurelien Jarno
Bastien Nocera
Bei Zhang
Benjamin Dobell
Chris Dickens
Colin Walters
Dave Camarillo
David Engraf
David Moore
Davidlohr Bueso
Federico Manzan
Felipe Balbi
Florian Albrechtskirchinger
Francesco Montorsi
Francisco Facioni
Graeme Gill
Gustavo Zacarias
Hans Ulrich Niedermann
Hector Martin
Hoi-Ho Chan
Ilya Konstantinov
James Hanko
Joshua Blake
Karsten Koenig
Konrad Rzepecki
Kuangye Guo
Lars Wirzenius
Luca Longinotti
Martin Koegler
Matthias Bolte
Mike Frysinger
Mikhail Gusarov
Moritz Fischer
Nicholas Corgan
Omri Iluz
Orin Eman
Paul Fertser
Pekka Nikander
Rob Walker
Sean McBride
Sebastian Pipping
Simon Haggett
Thomas Röfer
Tim Roberts
Toby Peterson
Trygve Laugstøl
Uri Lublin
Vasily Khoruzhick
Vegard Storheil Eriksen
Vitali Lovich
Xiaofan Chen
Zoltán Kovács
Роман Донченко
xantares
Copyright:
Copyright (C) 2001 Johannes Erdfelt <johannes@erdfelt.com>
Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
Copyright (C) 2010-2012 Peter Stuge <peter@stuge.se>
Copyright (C) 2008-2013 Nathan Hjelm <hjelmn@users.sourceforge.net>
Copyright (C) 2009-2013 Pete Batard <pete@akeo.ie>
Copyright (C) 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>
Copyright (C) 2010-2012 Michael Plante <michael.plante@gmail.com>
Copyright (C) 2011-2013 Hans de Goede <hdegoede@redhat.com>
Copyright (C) 2012-2013 Martin Pieuchot <mpi@openbsd.org>
License of the libusb library and most examples except ezusb and fxload:
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA.
On Debian systems, the complete text of the LGPL license can be found
in the /usr/share/common-licenses/LGPL-2.1 file.
License of ezusb and fxload:
This source code is free software; you can redistribute it
and/or modify it in source code form under the terms of the GNU
General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA.
On Debian systems, the complete text of the GPL license can be found
in the /usr/share/common-licenses/GPL-2 file.

View file

@ -0,0 +1,29 @@
# libusb
libusb is a library for USB device access from Linux, macOS,
Windows, OpenBSD/NetBSD, Haiku, Solaris userspace, and WebAssembly
via WebUSB.
It is written in C (Haiku backend in C++) and licensed under the GNU
Lesser General Public License version 2.1 or, at your option, any later
version (see COPYING).
libusb is abstracted internally in such a way that it can hopefully
be ported to other operating systems. Please see the PORTING
file for more information.
libusb homepage:
https://libusb.info/
Developers will wish to consult the API documentation:
http://api.libusb.info
Use the mailing list for questions, comments, etc:
http://mailing-list.libusb.info
- Hans de Goede <hdegoede@redhat.com>
- Xiaofan Chen <xiaofanc@gmail.com>
- Ludovic Rousseau <ludovic.rousseau@gmail.com>
- Nathan Hjelm <hjelmn@cs.unm.edu>
- Chris Dickens <christopher.a.dickens@gmail.com>
(Please use the mailing list rather than mailing developers directly)

View file

@ -0,0 +1,121 @@
This package was debianized by Christopher L Cheney <ccheney@debian.org> on
Wed, 13 Jun 2001 12:21:44 -0500.
It was downloaded from http://www.libusb.info
Authors:
Alan Ott
Alan Stern
Alex Vatchenko
Andrew Fernandes
Anthony Clay
Artem Egorkine
Aurelien Jarno
Bastien Nocera
Bei Zhang
Benjamin Dobell
Chris Dickens
Colin Walters
Dave Camarillo
David Engraf
David Moore
Davidlohr Bueso
Federico Manzan
Felipe Balbi
Florian Albrechtskirchinger
Francesco Montorsi
Francisco Facioni
Graeme Gill
Gustavo Zacarias
Hans Ulrich Niedermann
Hector Martin
Hoi-Ho Chan
Ilya Konstantinov
James Hanko
Joshua Blake
Karsten Koenig
Konrad Rzepecki
Kuangye Guo
Lars Wirzenius
Luca Longinotti
Martin Koegler
Matthias Bolte
Mike Frysinger
Mikhail Gusarov
Moritz Fischer
Nicholas Corgan
Omri Iluz
Orin Eman
Paul Fertser
Pekka Nikander
Rob Walker
Sean McBride
Sebastian Pipping
Simon Haggett
Thomas Röfer
Tim Roberts
Toby Peterson
Trygve Laugstøl
Uri Lublin
Vasily Khoruzhick
Vegard Storheil Eriksen
Vitali Lovich
Xiaofan Chen
Zoltán Kovács
Роман Донченко
xantares
Copyright:
Copyright (C) 2001 Johannes Erdfelt <johannes@erdfelt.com>
Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
Copyright (C) 2010-2012 Peter Stuge <peter@stuge.se>
Copyright (C) 2008-2013 Nathan Hjelm <hjelmn@users.sourceforge.net>
Copyright (C) 2009-2013 Pete Batard <pete@akeo.ie>
Copyright (C) 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>
Copyright (C) 2010-2012 Michael Plante <michael.plante@gmail.com>
Copyright (C) 2011-2013 Hans de Goede <hdegoede@redhat.com>
Copyright (C) 2012-2013 Martin Pieuchot <mpi@openbsd.org>
License of the libusb library and most examples except ezusb and fxload:
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA.
On Debian systems, the complete text of the LGPL license can be found
in the /usr/share/common-licenses/LGPL-2.1 file.
License of ezusb and fxload:
This source code is free software; you can redistribute it
and/or modify it in source code form under the terms of the GNU
General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA.
On Debian systems, the complete text of the GPL license can be found
in the /usr/share/common-licenses/GPL-2 file.

View file

@ -1,6 +1,6 @@
{
"version": "0.1",
"date": "06.06.2026 um 20:57",
"version": "0.2.2",
"build_date": "04.08.2026 um 10:33 by DD1DLH",
"description": "Messung von zwei Spannung und Steuerung von Relais",
"features": [
"ADS1115-Abfrage über go-i2c",

View file

@ -45,11 +45,11 @@ func NewServer(port string, readVolt func(int) float64, toggle func(int), getRel
}
}
func (s *Server) Start() error {
func (s *Server) Start(certFile, keyFile string) error {
http.HandleFunc("/", s.handleIndex)
http.HandleFunc("/api/status", s.handleAPIStatus)
http.HandleFunc("/api/toggle", s.handleAPIToggle)
return http.ListenAndServe(s.port, nil)
return http.ListenAndServeTLS(s.port, certFile, keyFile, nil)
}
func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) {

View file

@ -5,8 +5,25 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: 'Segoe UI', Arial, sans-serif; text-align: center; background: #0f172a; color: #f8fafc; padding: 20px; }
.container { max-width: 500px; margin: 0 auto; }
.card { background: #1e293b; padding: 20px; margin: 15px 0; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.3); border: 1px solid #334155; }
/* Maximale Breite erhöht, um Platz für das zweispaltige Layout zu bieten */
.container { max-width: 1000px; margin: 0 auto; }
/* Das neue Haupt-Layout: Links Relais, rechts Spannungen */
.main-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
align-items: start;
text-align: left;
}
/* Spalten-Container für korrekte Ausrichtung */
.layout-col {
display: flex;
flex-direction: column;
}
.card { background: #1e293b; padding: 20px; margin: 15px 0; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.3); border: 1px solid #334155; text-align: center; }
.val { font-size: 2.5em; color: #38bdf8; font-weight: bold; font-family: monospace; }
.grid { display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 15px; }
.btn { width: 100%; padding: 14px; font-size: 1.1em; border: none; border-radius: 8px; cursor: pointer; font-weight: bold; transition: background 0.2s, transform 0.1s; color: white; }
@ -15,55 +32,66 @@
.btn-on:hover { background: #dc2626; }
.btn-off { background: #10b981; }
.btn-off:hover { background: #059669; }
.footer-nav { margin-top: 25px; font-size: 0.9em; color: #64748b; }
.footer-nav { margin-top: 25px; font-size: 0.9em; color: #64748b; clear: both; }
/* Responsive Anpassung: Schaltet auf Smartphones automatisch untereinander um */
@media (max-width: 768px) {
.main-layout { grid-template-columns: 1fr; gap: 0; }
}
</style>
</head>
<body>
<div class="container">
<h1>U12V Funkstations-Monitor</h1>
<h1>Funkstations-Monitor</h1>
<!-- Dynamische Überschriften aus dem Names-Array der config.json -->
<div class="card">
<h3>{{index .Names 0}}</h3>
<div class="val" id="v1">--.-- V</div>
</div>
<div class="main-layout">
<!-- LINKE SPALTE: Relaissteuerung -->
<div class="layout-col">
<div class="card">
<h3>Relaissteuerung</h3>
<div class="grid">
{{range .Relais}}
<button class="btn btn-off" id="relais-btn-{{.ID}}" onclick="toggleRelais({{.ID}})">
{{.Name}}: Laden...
</button>
{{end}}
</div>
</div>
</div>
<div class="card">
<h3>{{index .Names 1}}</h3>
<div class="val" id="v2">--.-- V</div>
</div>
<!-- RECHTE SPALTE: Spannungsanzeigen -->
<div class="layout-col">
<div class="card">
<h3>{{index .Names 0}}</h3>
<div class="val" id="v1">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 2}}</h3>
<div class="val" id="v3">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 1}}</h3>
<div class="val" id="v2">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 3}}</h3>
<div class="val" id="v4">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 2}}</h3>
<div class="val" id="v3">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 4}}</h3>
<div class="val" id="v5">--.-- V</div>
</div>
<div class="card">
<h3>{{index .Names 3}}</h3>
<div class="val" id="v4">--.-- V</div>
</div>
<!-- Relaissteuerung -->
<div class="card">
<h3>Relaissteuerung</h3>
<div class="grid">
{{range .Relais}}
<button class="btn btn-off" id="relais-btn-{{.ID}}" onclick="toggleRelais({{.ID}})">
{{.Name}}: Laden...
</button>
{{end}}
<div class="card">
<h3>{{index .Names 4}}</h3>
<div class="val" id="v5">--.-- V</div>
</div>
</div>
</div>
<div class="footer-nav">
Live-Aktualisierung aktiv (ohne Flackern)<br>
Live-Aktualisierung aktiv <br>
<span style="font-size: 0.8em; color: #475569; margin-top: 5px; display: block;">
Version v{{.Version}} ({{.BuildDate}})
Version {{.Version}} ({{.BuildDate}})
</span>
</div>
</div>
@ -79,6 +107,15 @@
data.relais.forEach(r => {
const btn = document.getElementById(`relais-btn-${r.id}`);
if (btn) {
if (r.name && r.name.toLowerCase().includes('reserve')) {
btn.className = 'btn btn-off';
btn.innerText = `${r.name}: GESPERRT`;
btn.disabled = true;
btn.style.opacity = '0.3';
btn.style.cursor = 'not-allowed';
return;
}
if (r.state) {
btn.className = 'btn btn-on';
btn.innerText = `${r.name}: AKTIV (Ausschalten)`;