@@ -14,6 +14,7 @@ use ostree_ext::container as ostree_container;
14
14
use ostree_ext:: container:: SignatureSource ;
15
15
use ostree_ext:: keyfileext:: KeyFileExt ;
16
16
use ostree_ext:: ostree;
17
+ use ostree_ext:: ostree:: Deployment ;
17
18
use ostree_ext:: sysroot:: SysrootLock ;
18
19
use std:: ffi:: OsString ;
19
20
use std:: os:: unix:: process:: CommandExt ;
@@ -109,6 +110,9 @@ pub(crate) enum Opt {
109
110
/// Add a transient writable overlayfs on `/usr` that will be discarded on reboot.
110
111
#[ clap( alias = "usroverlay" ) ]
111
112
UsrOverlay ,
113
+ /// Manipulate configuration
114
+ #[ clap( subcommand) ]
115
+ Config ( crate :: config:: ConfigOpts ) ,
112
116
/// Install to the target block device
113
117
#[ cfg( feature = "install" ) ]
114
118
Install ( crate :: install:: InstallOpts ) ,
@@ -208,24 +212,16 @@ async fn pull(
208
212
209
213
/// Stage (queue deployment of) a fetched container image.
210
214
#[ context( "Staging" ) ]
211
- async fn stage (
215
+ pub ( crate ) async fn stage (
212
216
sysroot : & SysrootLock ,
213
217
stateroot : & str ,
214
218
imgref : & ostree_container:: OstreeImageReference ,
215
219
image : Box < LayeredImageState > ,
216
220
origin : & glib:: KeyFile ,
217
221
) -> Result < ( ) > {
218
- let cancellable = gio:: Cancellable :: NONE ;
219
- let stateroot = Some ( stateroot) ;
220
- let merge_deployment = sysroot. merge_deployment ( stateroot) ;
221
- let _new_deployment = sysroot. stage_tree_with_options (
222
- stateroot,
223
- image. merge_commit . as_str ( ) ,
224
- Some ( origin) ,
225
- merge_deployment. as_ref ( ) ,
226
- & Default :: default ( ) ,
227
- cancellable,
228
- ) ?;
222
+ let merge_deployment = sysroot. merge_deployment ( Some ( stateroot) ) ;
223
+ crate :: deploy:: deploy ( sysroot, merge_deployment. as_ref ( ) , stateroot, image, origin) . await ?;
224
+ crate :: deploy:: cleanup ( sysroot) . await ?;
229
225
println ! ( "Queued for next boot: {imgref}" ) ;
230
226
Ok ( ( ) )
231
227
}
@@ -244,7 +240,7 @@ pub(crate) fn require_root() -> Result<()> {
244
240
245
241
/// A few process changes that need to be made for writing.
246
242
#[ context( "Preparing for write" ) ]
247
- async fn prepare_for_write ( ) -> Result < ( ) > {
243
+ pub ( crate ) async fn prepare_for_write ( ) -> Result < ( ) > {
248
244
if ostree_ext:: container_utils:: is_ostree_container ( ) ? {
249
245
anyhow:: bail!(
250
246
"Detected container (ostree base); this command requires a booted host system."
@@ -257,16 +253,21 @@ async fn prepare_for_write() -> Result<()> {
257
253
Ok ( ( ) )
258
254
}
259
255
256
+ pub ( crate ) fn target_deployment ( sysroot : & SysrootLock ) -> Result < Deployment > {
257
+ let booted_deployment = sysroot. require_booted_deployment ( ) ?;
258
+ Ok ( sysroot. staged_deployment ( ) . unwrap_or ( booted_deployment) )
259
+ }
260
+
260
261
/// Implementation of the `bootc upgrade` CLI command.
261
262
#[ context( "Upgrading" ) ]
262
263
async fn upgrade ( opts : UpgradeOpts ) -> Result < ( ) > {
263
264
prepare_for_write ( ) . await ?;
264
265
let sysroot = & get_locked_sysroot ( ) . await ?;
265
266
let repo = & sysroot. repo ( ) ;
266
- let booted_deployment = & sysroot . require_booted_deployment ( ) ?;
267
- let status = crate :: status:: DeploymentStatus :: from_deployment ( booted_deployment , true ) ?;
268
- let osname = booted_deployment . osname ( ) ;
269
- let origin = booted_deployment
267
+ let merge_deployment = & target_deployment ( sysroot ) ?;
268
+ let status = crate :: status:: DeploymentStatus :: from_deployment ( merge_deployment , true ) ?;
269
+ let osname = merge_deployment . osname ( ) ;
270
+ let origin = merge_deployment
270
271
. origin ( )
271
272
. ok_or_else ( || anyhow:: anyhow!( "Deployment is missing an origin" ) ) ?;
272
273
let imgref = status
@@ -278,7 +279,7 @@ async fn upgrade(opts: UpgradeOpts) -> Result<()> {
278
279
"Booted deployment contains local rpm-ostree modifications; cannot upgrade via bootc"
279
280
) ) ;
280
281
}
281
- let commit = booted_deployment . csum ( ) ;
282
+ let commit = merge_deployment . csum ( ) ;
282
283
let state = ostree_container:: store:: query_image_commit ( repo, & commit) ?;
283
284
let digest = state. manifest_digest . as_str ( ) ;
284
285
let fetched = pull ( repo, & imgref, opts. quiet ) . await ?;
@@ -303,11 +304,11 @@ async fn switch(opts: SwitchOpts) -> Result<()> {
303
304
prepare_for_write ( ) . await ?;
304
305
305
306
let cancellable = gio:: Cancellable :: NONE ;
306
- let sysroot = get_locked_sysroot ( ) . await ?;
307
- let booted_deployment = & sysroot . require_booted_deployment ( ) ?;
308
- let ( origin, booted_image) = crate :: utils:: get_image_origin ( booted_deployment ) ?;
307
+ let sysroot = & get_locked_sysroot ( ) . await ?;
308
+ let merge_deployment = & target_deployment ( sysroot ) ?;
309
+ let ( origin, booted_image) = crate :: utils:: get_image_origin ( merge_deployment ) ?;
309
310
let booted_refspec = origin. optional_string ( "origin" , "refspec" ) ?;
310
- let osname = booted_deployment . osname ( ) ;
311
+ let osname = merge_deployment . osname ( ) ;
311
312
let repo = & sysroot. repo ( ) ;
312
313
313
314
let transport = ostree_container:: Transport :: try_from ( opts. transport . as_str ( ) ) ?;
@@ -373,6 +374,8 @@ where
373
374
Opt :: Upgrade ( opts) => upgrade ( opts) . await ,
374
375
Opt :: Switch ( opts) => switch ( opts) . await ,
375
376
Opt :: UsrOverlay => usroverlay ( ) . await ,
377
+ #[ cfg( feature = "k8s-base" ) ]
378
+ Opt :: Config ( opts) => crate :: config:: run ( opts) . await ,
376
379
#[ cfg( feature = "install" ) ]
377
380
Opt :: Install ( opts) => crate :: install:: install ( opts) . await ,
378
381
#[ cfg( feature = "install" ) ]
0 commit comments