Skip to content

Commit

Permalink
Implement the FreeBSD backend.
Browse files Browse the repository at this point in the history
The configuration file for the FreeBSD backend is expected to point to the
Poudriere-built repository root. The ArchiveRoot property should be the path
to Poudriere "data/packages" directory and Suite names correspond to its
subdirectories.

Here is an sample config:

{
"ProjectName": "FreeBSD",
"ArchiveRoot": "/usr/local/poudriere/data/packages/",
"Backend": "freebsd",
"Suites": {
  "131amd64-default":
    {
      "sections": ["default"],
      "architectures": ["amd64"]
    }
  }
}

Sponsored by:	Serenity Cybersecurity, LLC
  • Loading branch information
arrowd committed May 15, 2023
1 parent 24ffdba commit ef42a7f
Show file tree
Hide file tree
Showing 6 changed files with 234 additions and 1 deletion.
102 changes: 102 additions & 0 deletions src/asgen/backends/freebsd/fbsdpkg.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Copyright (C) 2023 Serenity Cyber Security, LLC
* Author: Gleb Popov <[email protected]>
*
* Licensed under the GNU Lesser General Public License Version 3
*
* 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 3 of the license, or
* (at your option) any later version.
*
* This software 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 software. If not, see <http://www.gnu.org/licenses/>.
*/

module asgen.backends.freebsd.fbsdpkg;

import std.stdio;
import std.json;
import std.path;
import std.string;
import std.array : empty;
import asgen.backends.interfaces;
import asgen.logging;
import asgen.zarchive;


final class FreeBSDPackage : Package
{
private:
JSONValue pkgjson;

string pkgFname;
PackageKind _kind;

public:
this (string pkgRoot, JSONValue[string] j)
{
pkgjson = j;
pkgFname = buildPath (pkgRoot, pkgjson["path"].str()); // TODO: or pkgjson["repopath"] ???
_kind = PackageKind.PHYSICAL;
}

@property override string name () const { return pkgjson["name"].str(); }
@property override string ver () const { return pkgjson["version"].str(); }
@property override string arch () const { return pkgjson["arch"].str(); }
@property override string maintainer () const { return pkgjson["maintainer"].str(); }
@property override string getFilename () const { return pkgFname; }


@property override const(string[string]) summary () const
{
string[string] sums;
sums["en"] = pkgjson["comment"].str();
return sums;
}

@property override const(string[string]) description () const
{
string[string] descs;
descs["en"] = pkgjson["desc"].str();
return descs;
}

override
const(ubyte[]) getFileData (string fname)
{
ArchiveDecompressor ad;
ad.open (pkgFname);

return ad.readData(fname);
}

@property override
string[] contents ()
{
ArchiveDecompressor ad;
ad.open (pkgFname);

auto c = ad.readContents();

//throw new Exception(join(c, "\n"));

return c;
}

override
void finish ()
{
}

@property override
PackageKind kind () @safe pure
{
return this._kind;
}
}
93 changes: 93 additions & 0 deletions src/asgen/backends/freebsd/fbsdpkgindex.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* Copyright (C) 2023 Serenity Cyber Security, LLC
* Author: Gleb Popov <[email protected]>
*
* Licensed under the GNU Lesser General Public License Version 3
*
* 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 3 of the license, or
* (at your option) any later version.
*
* This software 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 software. If not, see <http://www.gnu.org/licenses/>.
*/

module asgen.backends.freebsd.fbsdpkgindex;

import std.json;
import std.stdio;
import std.path;
import std.string;
import std.conv : to;
import std.array : appender;
import std.algorithm : remove;
static import std.file;

import asgen.logging;
import asgen.zarchive;
import asgen.backends.interfaces;
import asgen.backends.freebsd.fbsdpkg;


final class FreeBSDPackageIndex : PackageIndex
{

private:
string rootDir;
Package[][string] pkgCache;

public:

this (string dir)
{
this.rootDir = dir;
if (!std.file.exists (dir))
throw new Exception ("Directory '%s' does not exist.", dir);
}

void release ()
{
pkgCache = null;
}

Package[] packagesFor (string suite, string section, string arch, bool withLongDescs = true)
{
auto pkgRoot = buildPath (rootDir, suite);
auto listsTarFname = buildPath (pkgRoot, "packagesite.pkg");
if (!std.file.exists (listsTarFname)) {
logWarning ("Package lists file '%s' does not exist.", listsTarFname);
return [];
}

ArchiveDecompressor ad;
ad.open (listsTarFname);
logDebug ("Opened: %s", listsTarFname);

auto d = ad.readData("packagesite.yaml");
auto pkgs = appender!(Package[]);

foreach(entry; d.split('\n')) {
auto j = parseJSON(assumeUTF(entry));
if (j.type == JSONType.object)
pkgs ~= to!Package(new FreeBSDPackage(pkgRoot, j.object));
}

return pkgs.data;
}

Package packageForFile (string fname, string suite = null, string section = null)
{
return null; // FIXME: not implemented
}

bool hasChanges (DataStore dstore, string suite, string section, string arch)
{
return true;
}
}
24 changes: 24 additions & 0 deletions src/asgen/backends/freebsd/package.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright (C) 2023 Serenity Cyber Security, LLC
* Author: Gleb Popov <[email protected]>
*
* Licensed under the GNU Lesser General Public License Version 3
*
* 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 3 of the license, or
* (at your option) any later version.
*
* This software 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 software. If not, see <http://www.gnu.org/licenses/>.
*/

module asgen.backends.freebsd;

public import asgen.backends.freebsd.fbsdpkg;
public import asgen.backends.freebsd.fbsdpkgindex;
8 changes: 7 additions & 1 deletion src/asgen/config.d
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ enum Backend
Ubuntu,
Archlinux,
RpmMd,
Alpinelinux
Alpinelinux,
FreeBSD
}

/**
Expand Down Expand Up @@ -411,6 +412,11 @@ public:
this.backend = Backend.Alpinelinux;
this.metadataType = DataType.XML;
break;
case "freebsd":
this.backendName = "FreeBSD";
this.backend = Backend.FreeBSD;
this.metadataType = DataType.XML;
break;
default:
break;
}
Expand Down
4 changes: 4 additions & 0 deletions src/asgen/engine.d
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import asgen.backends.ubuntu;
import asgen.backends.archlinux;
import asgen.backends.alpinelinux;
static if (HAVE_RPMMD) import asgen.backends.rpmmd;
import asgen.backends.freebsd;


import asgen.iconhandler : IconHandler;
Expand Down Expand Up @@ -100,6 +101,9 @@ public:
case Backend.Alpinelinux:
pkgIndex = new AlpinePackageIndex (conf.archiveRoot);
break;
case Backend.FreeBSD:
pkgIndex = new FreeBSDPackageIndex (conf.archiveRoot);
break;
default:
throw new Exception ("No backend specified, can not continue!");
}
Expand Down
4 changes: 4 additions & 0 deletions src/asgen/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ backend_sources = [
'backends/ubuntu/package.d',
'backends/ubuntu/ubupkg.d',
'backends/ubuntu/ubupkgindex.d',

'backends/freebsd/package.d',
'backends/freebsd/fbsdpkg.d',
'backends/freebsd/fbsdpkgindex.d',
]

if get_option('rpmmd')
Expand Down

0 comments on commit ef42a7f

Please sign in to comment.