2019-11-24 17:28:39 +00:00
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.org>
//
// 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, see <http://www.gnu.org/licenses/>.
package cmd
import (
"os"
"path/filepath"
installer "github.com/mudler/luet/pkg/installer"
2020-05-23 06:51:33 +00:00
helpers "github.com/mudler/luet/cmd/helpers"
2019-12-29 15:33:10 +00:00
. "github.com/mudler/luet/pkg/config"
2019-11-24 17:28:39 +00:00
. "github.com/mudler/luet/pkg/logger"
pkg "github.com/mudler/luet/pkg/package"
"github.com/spf13/cobra"
)
var installCmd = & cobra . Command {
2020-05-10 18:24:08 +00:00
Use : "install <pkg1> <pkg2> ..." ,
Short : "Install a package" ,
Aliases : [ ] string { "i" } ,
2019-11-25 18:55:30 +00:00
PreRun : func ( cmd * cobra . Command , args [ ] string ) {
2019-12-31 00:21:06 +00:00
LuetCfg . Viper . BindPFlag ( "system.database_path" , cmd . Flags ( ) . Lookup ( "system-dbpath" ) )
LuetCfg . Viper . BindPFlag ( "system.rootfs" , cmd . Flags ( ) . Lookup ( "system-target" ) )
2020-02-12 10:23:38 +00:00
LuetCfg . Viper . BindPFlag ( "solver.type" , cmd . Flags ( ) . Lookup ( "solver-type" ) )
LuetCfg . Viper . BindPFlag ( "solver.discount" , cmd . Flags ( ) . Lookup ( "solver-discount" ) )
LuetCfg . Viper . BindPFlag ( "solver.rate" , cmd . Flags ( ) . Lookup ( "solver-rate" ) )
LuetCfg . Viper . BindPFlag ( "solver.max_attempts" , cmd . Flags ( ) . Lookup ( "solver-attempts" ) )
2020-02-18 17:37:56 +00:00
LuetCfg . Viper . BindPFlag ( "onlydeps" , cmd . Flags ( ) . Lookup ( "onlydeps" ) )
LuetCfg . Viper . BindPFlag ( "nodeps" , cmd . Flags ( ) . Lookup ( "nodeps" ) )
LuetCfg . Viper . BindPFlag ( "force" , cmd . Flags ( ) . Lookup ( "force" ) )
2019-11-25 18:55:30 +00:00
} ,
Long : ` Install packages in parallel ` ,
2019-11-24 17:28:39 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2020-04-04 12:29:08 +00:00
var toInstall pkg . Packages
2019-12-31 00:21:06 +00:00
var systemDB pkg . PackageDatabase
2019-11-24 17:28:39 +00:00
for _ , a := range args {
2020-02-21 20:56:32 +00:00
pack , err := helpers . ParsePackageStr ( a )
2019-11-24 17:28:39 +00:00
if err != nil {
2019-12-29 15:43:32 +00:00
Fatal ( "Invalid package string " , a , ": " , err . Error ( ) )
2019-11-24 17:28:39 +00:00
}
2019-12-29 15:43:32 +00:00
toInstall = append ( toInstall , pack )
2019-11-24 17:28:39 +00:00
}
2019-11-25 18:55:30 +00:00
// This shouldn't be necessary, but we need to unmarshal the repositories to a concrete struct, thus we need to port them back to the Repositories type
2019-12-31 11:48:12 +00:00
repos := installer . Repositories { }
2019-12-31 00:21:06 +00:00
for _ , repo := range LuetCfg . SystemRepositories {
if ! repo . Enable {
continue
}
2020-01-02 17:31:25 +00:00
r := installer . NewSystemRepository ( repo )
repos = append ( repos , r )
2019-11-25 18:55:30 +00:00
}
2020-02-12 11:24:07 +00:00
stype := LuetCfg . Viper . GetString ( "solver.type" )
discount := LuetCfg . Viper . GetFloat64 ( "solver.discount" )
rate := LuetCfg . Viper . GetFloat64 ( "solver.rate" )
attempts := LuetCfg . Viper . GetInt ( "solver.max_attempts" )
2020-02-18 17:37:56 +00:00
force := LuetCfg . Viper . GetBool ( "force" )
nodeps := LuetCfg . Viper . GetBool ( "nodeps" )
onlydeps := LuetCfg . Viper . GetBool ( "onlydeps" )
2020-02-12 11:24:07 +00:00
LuetCfg . GetSolverOptions ( ) . Type = stype
LuetCfg . GetSolverOptions ( ) . LearnRate = float32 ( rate )
LuetCfg . GetSolverOptions ( ) . Discount = float32 ( discount )
LuetCfg . GetSolverOptions ( ) . MaxAttempts = attempts
Debug ( "Solver" , LuetCfg . GetSolverOptions ( ) . CompactString ( ) )
2020-02-18 17:37:56 +00:00
inst := installer . NewLuetInstaller ( installer . LuetInstallerOptions {
2020-02-27 22:14:36 +00:00
Concurrency : LuetCfg . GetGeneral ( ) . Concurrency ,
SolverOptions : * LuetCfg . GetSolverOptions ( ) ,
NoDeps : nodeps ,
Force : force ,
OnlyDeps : onlydeps ,
PreserveSystemEssentialData : true ,
2020-02-18 17:37:56 +00:00
} )
2019-12-31 11:48:12 +00:00
inst . Repositories ( repos )
2019-11-24 17:28:39 +00:00
2019-12-31 00:21:06 +00:00
if LuetCfg . GetSystem ( ) . DatabaseEngine == "boltdb" {
systemDB = pkg . NewBoltDatabase (
2020-02-12 09:20:07 +00:00
filepath . Join ( LuetCfg . GetSystem ( ) . GetSystemRepoDatabaseDirPath ( ) , "luet.db" ) )
2019-12-31 00:21:06 +00:00
} else {
systemDB = pkg . NewInMemoryDatabase ( true )
}
system := & installer . System { Database : systemDB , Target : LuetCfg . GetSystem ( ) . Rootfs }
2020-04-13 17:28:27 +00:00
err := inst . Install ( toInstall , system )
2019-11-24 17:28:39 +00:00
if err != nil {
Fatal ( "Error: " + err . Error ( ) )
}
} ,
}
func init ( ) {
path , err := os . Getwd ( )
if err != nil {
Fatal ( err )
}
installCmd . Flags ( ) . String ( "system-dbpath" , path , "System db path" )
installCmd . Flags ( ) . String ( "system-target" , path , "System rootpath" )
2020-02-12 10:23:38 +00:00
installCmd . Flags ( ) . String ( "solver-type" , "" , "Solver strategy ( Defaults none, available: " + AvailableResolvers + " )" )
installCmd . Flags ( ) . Float32 ( "solver-rate" , 0.7 , "Solver learning rate" )
installCmd . Flags ( ) . Float32 ( "solver-discount" , 1.0 , "Solver discount rate" )
installCmd . Flags ( ) . Int ( "solver-attempts" , 9000 , "Solver maximum attempts" )
2020-02-18 17:37:56 +00:00
installCmd . Flags ( ) . Bool ( "nodeps" , false , "Don't consider package dependencies (harmful!)" )
installCmd . Flags ( ) . Bool ( "onlydeps" , false , "Consider **only** package dependencies" )
installCmd . Flags ( ) . Bool ( "force" , false , "Skip errors and keep going (potentially harmful)" )
2019-11-24 17:28:39 +00:00
RootCmd . AddCommand ( installCmd )
}