Skip to content

Commit

Permalink
web: legal: show a list of packages along with their license in the w…
Browse files Browse the repository at this point in the history
…eb ui

Signed-off-by: Leonard Göhrs <[email protected]>
  • Loading branch information
hnez committed Aug 23, 2024
1 parent 1ac7040 commit b6f5a92
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 1 deletion.
5 changes: 4 additions & 1 deletion web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,10 @@ function Navigation() {
{
type: "section",
text: "Documentation",
items: [{ type: "link", text: "REST API", href: "#/docs/api" }],
items: [
{ type: "link", text: "REST API", href: "#/docs/api" },
{ type: "link", text: "Legal Information", href: "#/docs/legal" },
],
},
{
type: "section",
Expand Down
5 changes: 5 additions & 0 deletions web/src/LandingPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ export default function LandingPage() {
href: "/#/docs/api",
description: "Find API definitions to automate you LXA TAC",
},
{
name: "Documentation / Legal Information",
href: "/#/docs/legal",
description: "See the software components and their licenses",
},
]}
/>
</SpaceBetween>
Expand Down
184 changes: 184 additions & 0 deletions web/src/Legal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
// This file is part of tacd, the LXA TAC system daemon
// Copyright (C) 2024 Pengutronix e.K.
//
// 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 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.

import Container from "@cloudscape-design/components/container";
import Header from "@cloudscape-design/components/header";
import Spinner from "@cloudscape-design/components/spinner";
import Table from "@cloudscape-design/components/table";
import Link from "@cloudscape-design/components/link";
import SpaceBetween from "@cloudscape-design/components/space-between";

import { useEffect, useState } from "react";

const MANIFEST_PATH = "/legal/license.manifest";

type Package = {
package_name: string;
version: string;
recipe_name: string;
license: string;
};

function parse_mainifest(text: string) {
let packages: Package[] = [];

// The content of `text` looks something like this:
//
// PACKAGE NAME: tacd
// PACKAGE VERSION: 1.0.0
// RECIPE NAME: tacd
// LICENSE: GPL-2.0-or-later
//
// PACKAGE NAME: tacd-webinterface
// ...

for (var group of text.split("\n\n")) {
let pkg: Package = {
package_name: "",
version: "",
recipe_name: "",
license: "",
};

for (var line of group.split("\n")) {
if (line.startsWith("PACKAGE NAME: ")) {
pkg.package_name = line.replace("PACKAGE NAME: ", "");
}
if (line.startsWith("PACKAGE VERSION: ")) {
pkg.version = line.replace("PACKAGE VERSION: ", "");
}
if (line.startsWith("RECIPE NAME: ")) {
pkg.recipe_name = line.replace("RECIPE NAME: ", "");
}
if (line.startsWith("LICENSE: ")) {
pkg.license = line.replace("LICENSE: ", "");
}
}

if (pkg.package_name && pkg.version && pkg.recipe_name && pkg.license) {
packages.push(pkg);
}
}

return packages;
}

function PackageList() {
const [packages, setPackages] = useState<Package[]>();

useEffect(() => {
fetch("/docs/legal/license.manifest").then((response) => {
if (response.ok) {
response.text().then((text) => setPackages(parse_mainifest(text)));
}
});
}, []);

return (
<Table
header={
<Header
variant="h3"
description="Software packages used on this LXA TAC"
>
Packages
</Header>
}
columnDefinitions={[
{
id: "package_name",
header: "Package Name",
cell: (p) => p.package_name,
},
{
id: "version",
header: "Version",
cell: (p) => p.version,
},
{
id: "recipe_name",
header: "Recipe Name",
cell: (p) => p.recipe_name,
},
{
id: "license",
header: "License",
cell: (p) => (
<Link href={"/docs/legal/files/" + p.recipe_name}>{p.license}</Link>
),
},
]}
items={packages || []}
loading={packages === undefined}
sortingDisabled
resizableColumns
stickyHeader
trackBy="package_name"
/>
);
}

export default function Legal() {
return (
<SpaceBetween size="m">
<Header
variant="h1"
description="Information regarding your rights as an LXA TAC software user"
>
LXA TAC / Legal Information
</Header>

<Container
header={
<Header
variant="h2"
description="Where to find the source code that makes up the LXA TAC software"
>
Availability of Source Code
</Header>
}
>
<p>
The LXA TAC software uses many pieces of free and open source
software. A list of these pieces of software, along with their version
number and their respective software license, is shown below.
</p>

<p>
Linux Automation GmbH provides all software components required to
build your own LXA TAC software bundles in the form of a public Yocto
Layer:{" "}
<Link href="https://github.com/linux-automation/meta-lxatac">
linux-automation/meta-lxatac
</Link>
.
</p>

<p>
To comply with the terms of copyleft licenses like the GPL we also
provide copies of their sources, along with the applied patches on our{" "}
<Link href="https://downloads.linux-automation.com/lxatac/software/">
download server
</Link>
.
</p>
</Container>

<PackageList />
</SpaceBetween>
);
}
2 changes: 2 additions & 0 deletions web/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import DashboardTac from "./DashboardTac";
import LandingPage from "./LandingPage";
import SettingsLabgrid from "./SettingsLabgrid";
import Setup from "./Setup";
import Legal from "./Legal";

import { useState } from "react";

Expand All @@ -53,6 +54,7 @@ function WebUi() {
/>
<Route path="/settings/labgrid" element={<SettingsLabgrid />} />
<Route path="/docs/api" element={<ApiDocs />} />
<Route path="/docs/legal" element={<Legal />} />y
</Route>
<Route path="/setup" element={<Setup />} />
</Routes>
Expand Down

0 comments on commit b6f5a92

Please sign in to comment.