policy: new applet

to show different versions of package and the repositories from
which it is available from.
cute-signatures
Timo Teräs 2013-06-18 14:53:59 +03:00
parent 98c6b46de6
commit 5725f656b0
4 changed files with 83 additions and 6 deletions

View File

@ -21,7 +21,7 @@ endif
progs-y += apk progs-y += apk
apk-objs := apk.o add.o del.o fix.o update.o info.o \ apk-objs := apk.o add.o del.o fix.o update.o info.o \
search.o upgrade.o cache.o ver.o index.o fetch.o \ search.o upgrade.o cache.o ver.o index.o fetch.o \
audit.o verify.o dot.o audit.o verify.o dot.o policy.o
libapk.so-objs := common.o database.o package.o archive.o \ libapk.so-objs := common.o database.o package.o archive.o \
version.o io.o url.o gunzip.o blob.o hash.o print.o \ version.o io.o url.o gunzip.o blob.o hash.o print.o \

View File

@ -97,7 +97,7 @@ struct apk_name {
}; };
struct apk_repository { struct apk_repository {
char *url; const char *url;
struct apk_checksum csum; struct apk_checksum csum;
apk_blob_t description; apk_blob_t description;
}; };

View File

@ -68,7 +68,7 @@ static const char * const apk_triggers_file = "lib/apk/db/triggers";
static const char * const apk_triggers_file_tmp = "lib/apk/db/triggers.new"; static const char * const apk_triggers_file_tmp = "lib/apk/db/triggers.new";
static const char * const apk_triggers_file_old = "var/lib/apk/triggers"; static const char * const apk_triggers_file_old = "var/lib/apk/triggers";
static const char * const apk_installed_file = "lib/apk/db/installed"; const char * const apk_installed_file = "lib/apk/db/installed";
static const char * const apk_installed_file_tmp = "lib/apk/db/installed.new"; static const char * const apk_installed_file_tmp = "lib/apk/db/installed.new";
static const char * const apk_installed_file_old = "var/lib/apk/installed"; static const char * const apk_installed_file_old = "var/lib/apk/installed";
@ -609,7 +609,7 @@ int apk_repo_format_real_url(struct apk_database *db, struct apk_repository *rep
int apk_repo_format_item(struct apk_database *db, struct apk_repository *repo, struct apk_package *pkg, int apk_repo_format_item(struct apk_database *db, struct apk_repository *repo, struct apk_package *pkg,
int *fd, char *buf, size_t len) int *fd, char *buf, size_t len)
{ {
if (strcmp(repo->url, "cache") == 0) { if (repo->url == apk_linked_cache_dir) {
*fd = db->cache_fd; *fd = db->cache_fd;
return apk_pkg_format_cache_pkg(APK_BLOB_PTR_LEN(buf, len), pkg); return apk_pkg_format_cache_pkg(APK_BLOB_PTR_LEN(buf, len), pkg);
} else { } else {
@ -1423,7 +1423,7 @@ static int add_repos_from_file(void *ctx, int dirfd, const char *file)
static void apk_db_setup_repositories(struct apk_database *db) static void apk_db_setup_repositories(struct apk_database *db)
{ {
db->repos[APK_REPOSITORY_CACHED] = (struct apk_repository) { db->repos[APK_REPOSITORY_CACHED] = (struct apk_repository) {
.url = "cache", .url = apk_linked_cache_dir,
.csum.data = { .csum.data = {
0xb0,0x35,0x92,0x80,0x6e,0xfa,0xbf,0xee,0xb7,0x09, 0xb0,0x35,0x92,0x80,0x6e,0xfa,0xbf,0xee,0xb7,0x09,
0xf5,0xa7,0x0a,0x7c,0x17,0x26,0x69,0xb0,0x05,0x38 }, 0xf5,0xa7,0x0a,0x7c,0x17,0x26,0x69,0xb0,0x05,0x38 },
@ -1737,7 +1737,7 @@ void apk_db_close(struct apk_database *db)
} }
for (i = APK_REPOSITORY_FIRST_CONFIGURED; i < db->num_repos; i++) { for (i = APK_REPOSITORY_FIRST_CONFIGURED; i < db->num_repos; i++) {
free(db->repos[i].url); free((void*) db->repos[i].url);
free(db->repos[i].description.ptr); free(db->repos[i].description.ptr);
} }
foreach_array_item(ppath, db->protected_paths) foreach_array_item(ppath, db->protected_paths)

77
src/policy.c Normal file
View File

@ -0,0 +1,77 @@
/* policy.c - Alpine Package Keeper (APK)
*
* Copyright (C) 2013 Timo Teräs <timo.teras@iki.fi>
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation. See http://www.gnu.org/ for details.
*/
#include <stdio.h>
#include "apk_defines.h"
#include "apk_applet.h"
#include "apk_database.h"
#include "apk_version.h"
#include "apk_print.h"
extern const char * const apk_installed_file;
static void print_policy(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
{
struct apk_provider *p;
struct apk_repository *repo;
int i, j, num = 0;
/*
zlib1g policy:
2.0:
@testing http://nl.alpinelinux.org/alpine/edge/testing
1.7:
@edge http://nl.alpinelinux.org/alpine/edge/main
1.2.3.5 (upgradeable):
http://nl.alpinelinux.org/alpine/v2.6/main
1.2.3.4 (installed):
/media/cdrom/...
http://nl.alpinelinux.org/alpine/v2.5/main
1.1:
http://nl.alpinelinux.org/alpine/v2.4/main
*/
foreach_array_item(p, name->providers) {
if (p->pkg->name != name)
continue;
if (num++ == 0)
printf("%s policy:\n", name->name);
printf(" " BLOB_FMT ":\n", BLOB_PRINTF(*p->version));
if (p->pkg->ipkg != NULL)
printf(" %s\n", apk_installed_file);
for (i = 0; i < db->num_repos; i++) {
repo = &db->repos[i];
if (!(BIT(i) & p->pkg->repos))
continue;
for (j = 0; j < db->num_repo_tags; j++) {
if (db->repo_tags[j].allowed_repos & p->pkg->repos)
printf(" "BLOB_FMT"%s%s\n",
BLOB_PRINTF(db->repo_tags[j].tag),
j == 0 ? "" : " ",
repo->url);
}
}
}
}
static int policy_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
{
apk_name_foreach_matching(db, args, apk_foreach_genid(), print_policy, NULL);
return 0;
}
static struct apk_applet apk_policy = {
.name = "policy",
.help = "Show repository policy for packages.",
.open_flags = APK_OPENF_READ,
.main = policy_main,
};
APK_DEFINE_APPLET(apk_policy);