]> git.ipfire.org Git - pakfire.git/blob - src/cli/pakfire-builder.c
cli: Check for root privileges when needed
[pakfire.git] / src / cli / pakfire-builder.c
1 /*#############################################################################
2 # #
3 # Pakfire - The IPFire package management system #
4 # Copyright (C) 2023 Pakfire development team #
5 # #
6 # This program is free software: you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation, either version 3 of the License, or #
9 # (at your option) any later version. #
10 # #
11 # This program is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
15 # #
16 # You should have received a copy of the GNU General Public License #
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
18 # #
19 #############################################################################*/
20
21 #include <argp.h>
22 #include <limits.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <syslog.h>
26 #include <unistd.h>
27
28 #include <pakfire/arch.h>
29 #include <pakfire/pakfire.h>
30 #include <pakfire/string.h>
31
32 #include "lib/assert.h"
33 #include "lib/build.h"
34 #include "lib/clean.h"
35 #include "lib/command.h"
36 #include "lib/config.h"
37 #include "lib/dist.h"
38 #include "lib/image.h"
39 #include "lib/info.h"
40 #include "lib/pakfire.h"
41 #include "lib/progressbar.h"
42 #include "lib/provides.h"
43 #include "lib/repo.h"
44 #include "lib/repolist.h"
45 #include "lib/requires.h"
46 #include "lib/shell.h"
47 #include "lib/search.h"
48 #include "lib/terminal.h"
49 #include "lib/version.h"
50
51 const char* argp_program_version = PACKAGE_VERSION;
52
53 enum {
54 OPT_ARCH = 1,
55 OPT_DEBUG = 2,
56 OPT_DISTRO = 3,
57
58 OPT_ENABLE_REPO = 4,
59 OPT_DISABLE_REPO = 5,
60 };
61
62 static struct argp_option options[] = {
63 { "arch", OPT_ARCH, "ARCH", 0, "Choose an architecture", 0 },
64 { "debug", OPT_DEBUG, NULL, 0, "Run in debug mode", 0 },
65 { "distro", OPT_DISTRO, "DISTRO", 0, "Build for this distribution", 0 },
66 { "enable-repo", OPT_ENABLE_REPO, "REPO", 0, "Enable a repository", 0 },
67 { "disable-repo", OPT_DISABLE_REPO, "REPO", 0, "Disable a repository", 0 },
68 { NULL },
69 };
70
71 static const struct command commands[] = {
72 { "build", cli_build, 1, -1, 0 },
73 { "clean", cli_clean, 0, 0, 0 },
74 { "dist", cli_dist, 1, -1, 0 },
75 { "image", cli_image, -1, -1, 0 },
76 { "info", cli_info, 1, -1, 0 },
77 { "provides", cli_provides, 1, -1, 0 },
78 { "repo", cli_repo, -1, -1, 0 },
79 { "repolist", cli_repolist, 0, 0, 0 },
80 { "requires", cli_requires, 1, -1, 0 },
81 { "shell", cli_shell, 0, 0, 0 },
82 { "search", cli_search, 1, -1, 0 },
83 { NULL },
84 };
85
86 const char* args_doc =
87 "build [OPTIONS...] MAKEFILES...\n"
88 "clean\n"
89 "dist MAKEFILES...\n"
90 "image ...\n"
91 "provides PATTERN\n"
92 "repo compose PATH PACKAGES...\n"
93 "repolist\n"
94 "requires PATTERN\n"
95 "shell [OPTIONS...]\n"
96 "search [OPTIONS...] PATTERN";
97
98 static error_t parse(int key, char* arg, struct argp_state* state, void* data) {
99 struct cli_config* config = data;
100
101 switch (key) {
102 case OPT_ARCH:
103 // Check if the architecture is supported
104 if (!pakfire_arch_is_supported_by_host(arg))
105 argp_failure(state, EXIT_FAILURE, 0, "Unsupported architecture: %s", arg);
106
107 config->arch = arg;
108 break;
109
110 case OPT_DEBUG:
111 pakfire_ctx_set_log_level(config->ctx, LOG_DEBUG);
112 break;
113
114 case OPT_DISTRO:
115 config->distro = arg;
116 break;
117
118 // Enable/Disable Repositories
119
120 case OPT_ENABLE_REPO:
121 if (config->num_enable_repos >= MAX_REPOS)
122 return -ENOBUFS;
123
124 config->enable_repos[config->num_enable_repos++] = arg;
125 break;
126
127 case OPT_DISABLE_REPO:
128 if (config->num_disable_repos >= MAX_REPOS)
129 return -ENOBUFS;
130
131 config->disable_repos[config->num_disable_repos++] = arg;
132 break;
133
134 default:
135 return ARGP_ERR_UNKNOWN;
136 }
137
138 return 0;
139 }
140
141 static int cli_confirm(struct pakfire_ctx* ctx, struct pakfire* pakfire,
142 void* data, const char* message, const char* question) {
143 // Just print the message
144 if (message)
145 printf("%s\n", message);
146
147 return 0;
148 }
149
150 int main(int argc, char* argv[]) {
151 struct pakfire_ctx* ctx = NULL;
152 int r;
153
154 // Setup the context
155 r = pakfire_ctx_create(&ctx, NULL);
156 if (r)
157 goto ERROR;
158
159 // Setup confirm callback
160 pakfire_ctx_set_confirm_callback(ctx, cli_confirm, NULL);
161
162 // Setup progress callback
163 pakfire_ctx_set_progress_callback(ctx, cli_setup_progressbar, NULL);
164
165 // Set the default cache path
166 r = pakfire_ctx_set_cache_path(ctx, "~/.cache/pakfire");
167 if (r)
168 goto ERROR;
169
170 struct cli_config config = {
171 .ctx = ctx,
172 .distro = cli_get_default_distro(ctx),
173 .arch = NULL,
174 .flags = PAKFIRE_FLAGS_BUILD,
175 };
176
177 // Parse the command line and run any commands
178 r = cli_parse(options, commands, args_doc, NULL,
179 parse, CLI_REQUIRE_ROOT, argc, argv, &config);
180
181 ERROR:
182 if (ctx)
183 pakfire_ctx_unref(ctx);
184
185 return r;
186 }