diff --git a/0001-bugfix-transfer-can-only-save-file-to-specified-dir.patch b/0001-bugfix-transfer-can-only-save-file-to-specified-dir.patch deleted file mode 100644 index e861a8d..0000000 --- a/0001-bugfix-transfer-can-only-save-file-to-specified-dir.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 34007d0d2fba94e43fbaf294d18cb2fc68857116 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 9 Aug 2023 15:07:04 +0800 -Subject: [PATCH 1/3] bugfix: transfer can only save file to specified dir - ---- - analysis/engine/transfer.py | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/analysis/engine/transfer.py b/analysis/engine/transfer.py -index 7fa5777..154f3df 100644 ---- a/analysis/engine/transfer.py -+++ b/analysis/engine/transfer.py -@@ -31,7 +31,7 @@ LOGGER = logging.getLogger(__name__) - - class Transfer(Resource): - """restful api for transfer""" -- file_path = "/etc/atuned/" -+ file_path = "/etc/atuned/{service}" - - def post(self): - """provide the method of post""" -@@ -40,15 +40,19 @@ class Transfer(Resource): - file_obj = request.files.get("file") - service = request.form.get("service") - -+ target_path = self.file_path.format(service=service) -+ dir_name, _ = os.path.split(os.path.abspath(save_path)) -+ if not dir_name == target_path: -+ return "illegal path to save file", 400 -+ - if service == "classification": - os.makedirs(ANALYSIS_DATA_PATH, exist_ok=True) -- file_name = ANALYSIS_DATA_PATH + save_path.split(self.file_path + service)[1][1:] -+ file_name = ANALYSIS_DATA_PATH + save_path.split(target_path)[1][1:] - current_app.logger.info(file_name) - file_obj.save(file_name) - return file_name, 200 - - file_obj.save(save_path) -- target_path = self.file_path + service - res = utils.extract_file(save_path, target_path) - os.remove(save_path) - return res, 200 --- -2.27.0 - diff --git a/0001-define-fix-privilege-escalation.patch b/0001-define-fix-privilege-escalation.patch deleted file mode 100644 index a971ae8..0000000 --- a/0001-define-fix-privilege-escalation.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 09c719964b362fa358c705a7b7e24bb02a1259bb Mon Sep 17 00:00:00 2001 -From: zhoupengcheng -Date: Wed, 8 Nov 2023 12:32:43 +0800 -Subject: [PATCH] 0001-define-fix-privilege-escalation.patch - ---- - modules/client/profile/profile_define.go | 16 +++++++++++++++- - 1 file changed, 15 insertions(+), 1 deletion(-) - -diff --git a/modules/client/profile/profile_define.go b/modules/client/profile/profile_define.go -index 87b3781..24e31d3 100644 ---- a/modules/client/profile/profile_define.go -+++ b/modules/client/profile/profile_define.go -@@ -19,6 +19,7 @@ import ( - SVC "gitee.com/openeuler/A-Tune/common/service" - "gitee.com/openeuler/A-Tune/common/utils" - "fmt" -+ "regexp" - "io/ioutil" - - "github.com/go-ini/ini" -@@ -88,11 +89,22 @@ func profileDefined(ctx *cli.Context) error { - if err := profileDefineCheck(ctx); err != nil { - return err - } -+ -+ -+ detectRule := `[./].*` -+ detectPathchar := regexp.MustCompile(detectRule) -+ - serviceType := ctx.Args().Get(0) -+ if detectPathchar.MatchString(serviceType) { -+ return fmt.Errorf("serviceType:%s cannot contain special path characters '/' or '.' ", serviceType) -+ } - if !utils.IsInputStringValid(serviceType) { - return fmt.Errorf("input:%s is invalid", serviceType) - } - applicationName := ctx.Args().Get(1) -+ if detectPathchar.MatchString(applicationName) { -+ return fmt.Errorf("applicationName:%s cannot contain special path characters '/' or '.' ", applicationName) -+ } - if !utils.IsInputStringValid(applicationName) { - return fmt.Errorf("input:%s is invalid", applicationName) - } -@@ -100,7 +112,9 @@ func profileDefined(ctx *cli.Context) error { - if !utils.IsInputStringValid(scenarioName) { - return fmt.Errorf("input:%s is invalid", scenarioName) - } -- -+ if detectPathchar.MatchString(scenarioName) { -+ return fmt.Errorf("scenarioName:%s cannot contain special path characters '/' or '.' ", scenarioName) -+ } - data, err := ioutil.ReadFile(ctx.Args().Get(3)) - if err != nil { - return err --- -2.33.0 - diff --git a/0002-bugfix-training-model-can-only-save-file-to-specifie.patch b/0002-bugfix-training-model-can-only-save-file-to-specifie.patch deleted file mode 100644 index d1a8196..0000000 --- a/0002-bugfix-training-model-can-only-save-file-to-specifie.patch +++ /dev/null @@ -1,290 +0,0 @@ -From 65d2dc509e851d138154ee6a8a3ff3acb3780a30 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 9 Aug 2023 19:15:07 +0800 -Subject: [PATCH 2/3] bugfix: training model can only save file to specified - dir - ---- - analysis/default_config.py | 1 + - analysis/engine/parser.py | 4 +-- - analysis/engine/train.py | 38 ++++++++++++++++++---- - api/profile/profile.pb.go | 6 ++-- - api/profile/profile.proto | 2 +- - common/models/training.go | 2 +- - modules/client/profile/profile_train.go | 42 +++++++++---------------- - modules/server/profile/profile.go | 4 +-- - 8 files changed, 56 insertions(+), 43 deletions(-) - -diff --git a/analysis/default_config.py b/analysis/default_config.py -index cf56ac2..7c921cc 100644 ---- a/analysis/default_config.py -+++ b/analysis/default_config.py -@@ -23,6 +23,7 @@ GRPC_CERT_PATH = '/etc/atuned/grpc_certs' - ANALYSIS_DATA_PATH = '/var/atune_data/analysis/' - TUNING_DATA_PATH = '/var/atune_data/tuning/' - TUNING_DATA_DIRS = ['running', 'finished', 'error'] -+TRAINING_MODEL_PATH = '/usr/libexec/atuned/analysis/models/' - - - def get_or_default(config, section, key, value): -diff --git a/analysis/engine/parser.py b/analysis/engine/parser.py -index c16089f..c36c74d 100644 ---- a/analysis/engine/parser.py -+++ b/analysis/engine/parser.py -@@ -69,8 +69,8 @@ CLASSIFICATION_POST_PARSER.add_argument('model', - TRAIN_POST_PARSER = reqparse.RequestParser() - TRAIN_POST_PARSER.add_argument('datapath', required=True, - help="The datapath can not be null") --TRAIN_POST_PARSER.add_argument('outputpath', required=True, -- help="The output path can not be null") -+TRAIN_POST_PARSER.add_argument('modelname', required=True, -+ help="The model name can not be null") - TRAIN_POST_PARSER.add_argument('modelpath', required=True, - help="The model path can not be null") - -diff --git a/analysis/engine/train.py b/analysis/engine/train.py -index 9fdca46..7608660 100644 ---- a/analysis/engine/train.py -+++ b/analysis/engine/train.py -@@ -22,6 +22,7 @@ from flask_restful import Resource - - from analysis.optimizer.workload_characterization import WorkloadCharacterization - from analysis.engine.parser import TRAIN_POST_PARSER -+from analysis.default_config import TRAINING_MODEL_PATH - - LOGGER = logging.getLogger(__name__) - -@@ -29,7 +30,7 @@ LOGGER = logging.getLogger(__name__) - class Training(Resource): - """provide the method of post for training""" - model_path = "modelpath" -- output_path = "outputpath" -+ model_name = "modelname" - data_path = "datapath" - - def post(self): -@@ -40,18 +41,43 @@ class Training(Resource): - LOGGER.info(args) - - model_path = args.get(self.model_path) -- output_path = args.get(self.output_path) -+ model_name = args.get(self.model_name) - data_path = args.get(self.data_path) - -+ valid, err = valid_model_name(model_name) -+ if not valid: -+ return "Illegal model name provide: {}".format(err), 400 -+ - characterization = WorkloadCharacterization(model_path) - try: -+ output_path = TRAINING_MODEL_PATH + model_name - characterization.retrain(data_path, output_path) - except Exception as err: - LOGGER.error(err) - abort(500) - -- if os.path.isdir(data_path): -- shutil.rmtree(data_path) -- else: -- os.remove(data_path) - return {}, 200 -+ -+ -+def valid_model_name(name): -+ file_name, file_ext = os.path.splitext(name) -+ -+ if file_ext != ".m": -+ return False, "the ext of model name should be .m" -+ -+ if file_name in ['scaler', 'aencoder', 'tencoder', 'default_clf', 'total_clf', 'throughput_performance_clf']: -+ return False, "model name cannot be set as default_clf/scaler/aencoder/tencoder/throughput_performance_clf/total_clf" -+ -+ for ind, char in enumerate(file_name): -+ if 'a' <= char <= 'z': -+ continue -+ if 'A' <= char <= 'Z': -+ continue -+ if '0' <= char <= '9': -+ continue -+ if ind != 0 and ind != len(file_name) - 1 and char == '_': -+ continue -+ return False, "model name cannot contains special character" -+ -+ return True, None -+ -diff --git a/api/profile/profile.pb.go b/api/profile/profile.pb.go -index dba166d..81a6757 100644 ---- a/api/profile/profile.pb.go -+++ b/api/profile/profile.pb.go -@@ -493,7 +493,7 @@ func (m *CollectFlag) GetType() string { - - type TrainMessage struct { - DataPath string `protobuf:"bytes,1,opt,name=DataPath,proto3" json:"DataPath,omitempty"` -- OutputPath string `protobuf:"bytes,2,opt,name=OutputPath,proto3" json:"OutputPath,omitempty"` -+ ModelName string `protobuf:"bytes,2,opt,name=ModelName,proto3" json:"ModelName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -@@ -531,9 +531,9 @@ func (m *TrainMessage) GetDataPath() string { - return "" - } - --func (m *TrainMessage) GetOutputPath() string { -+func (m *TrainMessage) GetModelName() string { - if m != nil { -- return m.OutputPath -+ return m.ModelName - } - return "" - } -diff --git a/api/profile/profile.proto b/api/profile/profile.proto -index 2a6e751..29cf91e 100755 ---- a/api/profile/profile.proto -+++ b/api/profile/profile.proto -@@ -84,7 +84,7 @@ message CollectFlag { - - message TrainMessage { - string DataPath = 1; -- string OutputPath = 2; -+ string ModelName = 2; - } - - message DetectMessage { -diff --git a/common/models/training.go b/common/models/training.go -index 3cc9d60..9497261 100644 ---- a/common/models/training.go -+++ b/common/models/training.go -@@ -24,7 +24,7 @@ import ( - type Training struct { - DataPath string `json:"datapath"` - ModelPath string `json:"modelpath"` -- OutputPath string `json:"outputpath"` -+ ModelName string `json:"modelname"` - } - - // Post method call training service -diff --git a/modules/client/profile/profile_train.go b/modules/client/profile/profile_train.go -index f4e68cb..a645bc3 100644 ---- a/modules/client/profile/profile_train.go -+++ b/modules/client/profile/profile_train.go -@@ -18,9 +18,9 @@ import ( - "gitee.com/openeuler/A-Tune/common/client" - SVC "gitee.com/openeuler/A-Tune/common/service" - "gitee.com/openeuler/A-Tune/common/utils" -+ "gitee.com/openeuler/A-Tune/common/config" - "fmt" - "io" -- "os" - "path/filepath" - - "github.com/urfave/cli" -@@ -39,8 +39,8 @@ var trainCommand = cli.Command{ - Value: "", - }, - cli.StringFlag{ -- Name: "output_file,o", -- Usage: "the model to be generated", -+ Name: "model_name,m", -+ Usage: "the model name of generate model", - Value: "", - }, - }, -@@ -48,9 +48,9 @@ var trainCommand = cli.Command{ - desc := ` - training a new model with the self collected data, data_path option specified - the path that storage the collected data, the collected data must have more -- than two workload type. output_file specified the file path where to store -+ than two workload type. model_name specified the name of model to be generated - the trained model, which must be end with .m. -- example: atune-adm train --data_path=./data --output_file=./model/trained.m` -+ example: atune-adm train --data_path=/home/data --model_name=trained.m` - return desc - }(), - Action: train, -@@ -82,13 +82,13 @@ func checkTrainCtx(ctx *cli.Context) error { - return fmt.Errorf("input:%s is invalid", dataPath) - } - -- outputPath := ctx.String("output_file") -- if outputPath == "" { -+ modelName := ctx.String("model_name") -+ if modelName == "" { - _ = cli.ShowCommandHelp(ctx, "train") -- return fmt.Errorf("error: output_file must be specified") -+ return fmt.Errorf("error: model_name must be specified") - } -- if !utils.IsInputStringValid(outputPath) { -- return fmt.Errorf("input:%s is invalid", outputPath) -+ if !utils.IsInputStringValid(modelName) { -+ return fmt.Errorf("input:%s is invalid", modelName) - } - - return nil -@@ -103,23 +103,8 @@ func train(ctx *cli.Context) error { - if err != nil { - return err - } -- outputPath, err := filepath.Abs(ctx.String("output_file")) -- if err != nil { -- return err -- } -- -- dir := filepath.Dir(outputPath) - -- exist, err := utils.PathExist(dir) -- if err != nil { -- return err -- } -- if !exist { -- err = os.MkdirAll(dir, utils.FilePerm) -- if err != nil { -- return err -- } -- } -+ modelName := ctx.String("model_name") - - c, err := client.NewClientFromContext(ctx) - if err != nil { -@@ -128,7 +113,7 @@ func train(ctx *cli.Context) error { - defer c.Close() - - svc := PB.NewProfileMgrClient(c.Connection()) -- stream, err := svc.Training(CTX.Background(), &PB.TrainMessage{DataPath: dataPath, OutputPath: outputPath}) -+ stream, err := svc.Training(CTX.Background(), &PB.TrainMessage{DataPath: dataPath, ModelName: modelName}) - if err != nil { - return err - } -@@ -145,6 +130,7 @@ func train(ctx *cli.Context) error { - } - utils.Print(reply) - } -- fmt.Println("the model generate path:", outputPath) -+ modelPath := fmt.Sprintf("%s/models/%s", config.DefaultAnalysisPath, modelName) -+ fmt.Println("the model generate path:", modelPath) - return nil - } -diff --git a/modules/server/profile/profile.go b/modules/server/profile/profile.go -index 3264167..70047ca 100644 ---- a/modules/server/profile/profile.go -+++ b/modules/server/profile/profile.go -@@ -1137,7 +1137,7 @@ func (s *ProfileServer) Training(message *PB.TrainMessage, stream PB.ProfileMgr_ - } - - DataPath := message.GetDataPath() -- OutputPath := message.GetOutputPath() -+ ModelName := message.GetModelName() - - compressPath, err := utils.CreateCompressFile(DataPath) - if err != nil { -@@ -1156,7 +1156,7 @@ func (s *ProfileServer) Training(message *PB.TrainMessage, stream PB.ProfileMgr_ - - trainBody := new(models.Training) - trainBody.DataPath = trainPath -- trainBody.OutputPath = OutputPath -+ trainBody.ModelName = ModelName - trainBody.ModelPath = path.Join(config.DefaultAnalysisPath, "models") - - success, err := trainBody.Post() --- -2.27.0 - diff --git a/0002-define-fix-privilege-escalation.patch b/0002-define-fix-privilege-escalation.patch deleted file mode 100644 index c7bf633..0000000 --- a/0002-define-fix-privilege-escalation.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 8c411e610d702daf9e7505c1500163c481f7ed69 Mon Sep 17 00:00:00 2001 -From: zhoupengcheng -Date: Wed, 1 Nov 2023 17:45:05 +0800 -Subject: [PATCH] 0002-define-fix-privilege-escalation.patch - ---- - modules/server/profile/profile.go | 26 +++++++++++++++++++++++++- - 1 file changed, 25 insertions(+), 1 deletion(-) - -diff --git a/modules/server/profile/profile.go b/modules/server/profile/profile.go -index 5cdaa9a..cbf48b9 100644 ---- a/modules/server/profile/profile.go -+++ b/modules/server/profile/profile.go -@@ -1277,8 +1277,32 @@ func (s *ProfileServer) Define(ctx context.Context, message *PB.DefineMessage) ( - applicationName := message.GetApplicationName() - scenarioName := message.GetScenarioName() - content := string(message.GetContent()) -- profileName := serviceType + "-" + applicationName + "-" + scenarioName - -+ detectRule := `[./].*` -+ detectPathchar := regexp.MustCompile(detectRule) -+ -+ if detectPathchar.MatchString(serviceType) { -+ return &PB.Ack{}, fmt.Errorf("serviceType:%s cannot contain special path characters '/' or '.' ", serviceType) -+ } -+ if !utils.IsInputStringValid(serviceType) { -+ return &PB.Ack{}, fmt.Errorf("input:%s is invalid", serviceType) -+ } -+ -+ if detectPathchar.MatchString(applicationName) { -+ return &PB.Ack{}, fmt.Errorf("applicationName:%s cannot contain special path characters '/' or '.' ", applicationName) -+ } -+ if !utils.IsInputStringValid(applicationName) { -+ return &PB.Ack{}, fmt.Errorf("input:%s is invalid", applicationName) -+ } -+ -+ if detectPathchar.MatchString(scenarioName) { -+ return &PB.Ack{}, fmt.Errorf("scenarioName:%s cannot contain special path characters '/' or '.' ", scenarioName) -+ } -+ if !utils.IsInputStringValid(scenarioName) { -+ return &PB.Ack{}, fmt.Errorf("input:%s is invalid", scenarioName) -+ } -+ -+ profileName := serviceType + "-" + applicationName + "-" + scenarioName - workloadTypeExist, err := sqlstore.ExistWorkloadType(profileName) - if err != nil { - return &PB.Ack{}, err --- -2.33.0 - diff --git a/0003-bugfix-collection-res-can-only-save-file-to-specifie.patch b/0003-bugfix-collection-res-can-only-save-file-to-specifie.patch deleted file mode 100644 index b923691..0000000 --- a/0003-bugfix-collection-res-can-only-save-file-to-specifie.patch +++ /dev/null @@ -1,211 +0,0 @@ -From 4b357a57599ed623abbe094838d22895dc22fb5a Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 9 Aug 2023 21:41:10 +0800 -Subject: [PATCH 3/3] bugfix: collection res can only save file to specified - dir - ---- - Makefile | 3 +++ - api/profile/profile.pb.go | 6 ++--- - api/profile/profile.proto | 2 +- - common/config/config.go | 1 + - modules/client/profile/profile_collection.go | 24 ++++++-------------- - modules/server/profile/profile.go | 11 +++++---- - 6 files changed, 21 insertions(+), 26 deletions(-) - -diff --git a/Makefile b/Makefile -index 5d9d317..bcac447 100755 ---- a/Makefile -+++ b/Makefile -@@ -53,6 +53,7 @@ cleanall: clean - rm -rf $(DESTDIR)/var/lib/atuned/ - rm -rf $(DESTDIR)/var/run/atuned/ - rm -rf $(DESTDIR)/var/atuned/ -+ rm -rf $(DESTDIR)/var/atune_data/ - - db: - sqlite3 database/atuned.db ".read database/init.sql" -@@ -78,6 +79,7 @@ libinstall: - rm -rf $(DESTDIR)/var/lib/atuned/ - rm -rf $(DESTDIR)/var/run/atuned/ - rm -rf $(DESTDIR)/var/atuned/ -+ rm -rf $(DESTDIR)/var/atune_data/ - mkdir -p $(DESTDIR)/etc/atuned/tuning - mkdir -p $(DESTDIR)/etc/atuned/rules - mkdir -p $(DESTDIR)/etc/atuned/training -@@ -90,6 +92,7 @@ libinstall: - mkdir -p $(DESTDIR)/var/lib/atuned - mkdir -p $(DESTDIR)/var/run/atuned - mkdir -p $(DESTDIR)/var/atuned -+ mkdir -p $(DESTDIR)/var/atune_data/collection - mkdir -p $(DESTDIR)$(PREFIX)/share/bash-completion/completions - install -m 640 pkg/daemon_profile_server.so $(DESTDIR)$(PREFIX)/lib/atuned/modules - install -m 750 pkg/atune-adm $(BINDIR) -diff --git a/api/profile/profile.pb.go b/api/profile/profile.pb.go -index dba166d..4e70c41 100644 ---- a/api/profile/profile.pb.go -+++ b/api/profile/profile.pb.go -@@ -408,7 +408,7 @@ type CollectFlag struct { - Interval int64 `protobuf:"varint,1,opt,name=Interval,proto3" json:"Interval,omitempty"` - Duration int64 `protobuf:"varint,2,opt,name=Duration,proto3" json:"Duration,omitempty"` - Workload string `protobuf:"bytes,3,opt,name=Workload,proto3" json:"Workload,omitempty"` -- OutputPath string `protobuf:"bytes,4,opt,name=OutputPath,proto3" json:"OutputPath,omitempty"` -+ OutputDir string `protobuf:"bytes,4,opt,name=OutputDir,proto3" json:"OutputDir,omitempty"` - Block string `protobuf:"bytes,5,opt,name=Block,proto3" json:"Block,omitempty"` - Network string `protobuf:"bytes,6,opt,name=Network,proto3" json:"Network,omitempty"` - Type string `protobuf:"bytes,7,opt,name=Type,proto3" json:"Type,omitempty"` -@@ -463,9 +463,9 @@ func (m *CollectFlag) GetWorkload() string { - return "" - } - --func (m *CollectFlag) GetOutputPath() string { -+func (m *CollectFlag) GetOutputDir() string { - if m != nil { -- return m.OutputPath -+ return m.OutputDir - } - return "" - } -diff --git a/api/profile/profile.proto b/api/profile/profile.proto -index 2a6e751..71d8ceb 100755 ---- a/api/profile/profile.proto -+++ b/api/profile/profile.proto -@@ -76,7 +76,7 @@ message CollectFlag { - int64 Interval = 1; - int64 Duration = 2; - string Workload = 3; -- string OutputPath = 4; -+ string OutputDir = 4; - string Block = 5; - string Network = 6; - string Type = 7; -diff --git a/common/config/config.go b/common/config/config.go -index 4bd70a6..b9d2b66 100644 ---- a/common/config/config.go -+++ b/common/config/config.go -@@ -55,6 +55,7 @@ const ( - DefaultCheckerPath = "/usr/share/atuned/checker/" - DefaultBackupPath = "/usr/share/atuned/backup/" - DefaultTuningLogPath = "/var/atuned" -+ DefaultCollectionPath = "/var/atune_data/collection/" - ) - - // log config -diff --git a/modules/client/profile/profile_collection.go b/modules/client/profile/profile_collection.go -index 26b8d65..2873dac 100644 ---- a/modules/client/profile/profile_collection.go -+++ b/modules/client/profile/profile_collection.go -@@ -20,7 +20,6 @@ import ( - "gitee.com/openeuler/A-Tune/common/utils" - "fmt" - "io" -- "path/filepath" - - "github.com/urfave/cli" - CTX "golang.org/x/net/context" -@@ -48,8 +47,8 @@ var collectionCommand = cli.Command{ - Value: 1200, - }, - cli.StringFlag{ -- Name: "output_path,o", -- Usage: "the output path of the collecting data", -+ Name: "output_dir,o", -+ Usage: "the output dir name of the collecting data, full dir path would be /var/atune_data/collection/{output_dir}", - Value: "", - }, - cli.StringFlag{ -@@ -71,8 +70,8 @@ var collectionCommand = cli.Command{ - Description: func() string { - desc := ` - collect data for train machine learning model, you must set the command options -- which has no default value, the output_path must be a absolute path. -- example: atune-adm collection -f mysql -i 5 -d 1200 -o /home -b sda -n eth0 -t mysql` -+ which has no default value. -+ example: atune-adm collection -f mysql -i 5 -d 1200 -o tmp -b sda -n eth0 -t mysql` - return desc - }(), - Action: collection, -@@ -118,9 +117,9 @@ func checkCollectionCtx(ctx *cli.Context) error { - return fmt.Errorf("error: app type must be specified") - } - -- if ctx.String("output_path") == "" { -+ if ctx.String("output_dir") == "" { - _ = cli.ShowCommandHelp(ctx, "collection") -- return fmt.Errorf("error: output_path must be specified") -+ return fmt.Errorf("error: output_dir must be specified") - } - - if ctx.Int64("interval") < 1 || ctx.Int64("interval") > 60 { -@@ -131,10 +130,6 @@ func checkCollectionCtx(ctx *cli.Context) error { - return fmt.Errorf("error: collection duration value must be bigger than interval*10") - } - -- if !filepath.IsAbs(ctx.String("output_path")) { -- return fmt.Errorf("error: output path must be absolute path") -- } -- - return nil - } - -@@ -149,16 +144,11 @@ func collection(ctx *cli.Context) error { - } - defer c.Close() - -- outputPath := ctx.String("output_path") -- outputPath, err = filepath.Abs(outputPath) -- if err != nil { -- return err -- } - message := PB.CollectFlag{ - Interval: ctx.Int64("interval"), - Duration: ctx.Int64("duration"), - Workload: ctx.String("filename"), -- OutputPath: outputPath, -+ OutputDir: ctx.String("output_dir"), - Block: ctx.String("disk"), - Network: ctx.String("network"), - Type: ctx.String("app_type"), -diff --git a/modules/server/profile/profile.go b/modules/server/profile/profile.go -index 3264167..ec1e739 100644 ---- a/modules/server/profile/profile.go -+++ b/modules/server/profile/profile.go -@@ -1019,8 +1019,8 @@ func (s *ProfileServer) Collection(message *PB.CollectFlag, stream PB.ProfileMgr - return fmt.Errorf("input:%s is invalid", message.GetWorkload()) - } - -- if valid := utils.IsInputStringValid(message.GetOutputPath()); !valid { -- return fmt.Errorf("input:%s is invalid", message.GetOutputPath()) -+ if valid, _ := regexp.MatchString("^[a-zA-Z]+(_[a-zA-Z0-9]+)*$", message.GetOutputDir()); !valid { -+ return fmt.Errorf("output dir:%s is invalid", message.GetOutputDir()) - } - - if valid := utils.IsInputStringValid(message.GetType()); !valid { -@@ -1049,12 +1049,13 @@ func (s *ProfileServer) Collection(message *PB.CollectFlag, stream PB.ProfileMgr - return err - } - -- exist, err := utils.PathExist(message.GetOutputPath()) -+ outputDir := path.Join(config.DefaultCollectionPath, message.GetOutputDir()) -+ exist, err := utils.PathExist(message.GetOutputDir()) - if err != nil { - return err - } - if !exist { -- return fmt.Errorf("output_path %s is not exist", message.GetOutputPath()) -+ _ = os.MkdirAll(outputDir, 0755) - } - - if err = utils.InterfaceByName(message.GetNetwork()); err != nil { -@@ -1106,7 +1107,7 @@ func (s *ProfileServer) Collection(message *PB.CollectFlag, stream PB.ProfileMgr - collectorBody.Monitors = monitors - nowTime := time.Now().Format("20060702-150405") - fileName := fmt.Sprintf("%s-%s.csv", message.GetWorkload(), nowTime) -- collectorBody.File = path.Join(message.GetOutputPath(), fileName) -+ collectorBody.File = path.Join(outputDir, fileName) - if include == "" { - include = "default" - } --- -2.27.0 - diff --git a/0004-atune-add-service-restart-mode.patch b/0004-atune-add-service-restart-mode.patch deleted file mode 100644 index 33a8025..0000000 --- a/0004-atune-add-service-restart-mode.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6aae35d592388924f5ab92db90912a1b7962d665 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 16 Aug 2023 10:26:19 +0800 -Subject: [PATCH] [atune]add service restart mode - ---- - misc/atuned.service | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/misc/atuned.service b/misc/atuned.service -index bc5de9b..58fb022 100644 ---- a/misc/atuned.service -+++ b/misc/atuned.service -@@ -7,6 +7,9 @@ Requires=polkit.service - Type=notify - ExecStart=/usr/bin/atuned - SuccessExitStatus=100 -+Restart=on-failure -+RestartSec=3s -+TimeoutSec=1m - - [Install] - WantedBy=multi-user.target --- -2.27.0 - diff --git a/0005-atune-update-Makefile-and-logs.patch b/0005-atune-update-Makefile-and-logs.patch deleted file mode 100644 index 1ae7e06..0000000 --- a/0005-atune-update-Makefile-and-logs.patch +++ /dev/null @@ -1,64 +0,0 @@ -From f1fa941597af1b27278b430c1f7172fc5820d0ac Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 16 Aug 2023 12:39:37 +0800 -Subject: [PATCH] [atune]update Makefile and logs - ---- - Makefile | 10 ++++------ - common/profile/profile.go | 2 +- - 2 files changed, 5 insertions(+), 7 deletions(-) - -diff --git a/Makefile b/Makefile -index bcac447..5c76b4e 100755 ---- a/Makefile -+++ b/Makefile -@@ -46,14 +46,13 @@ clean: - rm -rf $(PKGPATH)/* - - cleanall: clean -- rm -rf $(DESTDIR)/etc/atuned/ -+ rm -rf $(DESTDIR)/etc/atune* - rm -rf $(DESTDIR)$(PREFIX)/lib/atuned/ - rm -rf $(DESTDIR)$(PREFIX)/share/atuned/ - rm -rf $(DESTDIR)$(PREFIX)/$(LIBEXEC)/atuned/ - rm -rf $(DESTDIR)/var/lib/atuned/ - rm -rf $(DESTDIR)/var/run/atuned/ -- rm -rf $(DESTDIR)/var/atuned/ -- rm -rf $(DESTDIR)/var/atune_data/ -+ rm -rf $(DESTDIR)/var/atune* - - db: - sqlite3 database/atuned.db ".read database/init.sql" -@@ -72,14 +71,13 @@ libinstall: - @echo "BEGIN INSTALL A-Tune..." - mkdir -p $(BINDIR) - mkdir -p $(SYSTEMDDIR) -- rm -rf $(DESTDIR)/etc/atuned/ -+ rm -rf $(DESTDIR)/etc/atune* - rm -rf $(DESTDIR)$(PREFIX)/lib/atuned/ - rm -rf $(DESTDIR)$(PREFIX)/share/atuned/ - rm -rf $(DESTDIR)$(PREFIX)/$(LIBEXEC)/atuned/ - rm -rf $(DESTDIR)/var/lib/atuned/ - rm -rf $(DESTDIR)/var/run/atuned/ -- rm -rf $(DESTDIR)/var/atuned/ -- rm -rf $(DESTDIR)/var/atune_data/ -+ rm -rf $(DESTDIR)/var/atune* - mkdir -p $(DESTDIR)/etc/atuned/tuning - mkdir -p $(DESTDIR)/etc/atuned/rules - mkdir -p $(DESTDIR)/etc/atuned/training -diff --git a/common/profile/profile.go b/common/profile/profile.go -index 264fdd8..43a4e77 100644 ---- a/common/profile/profile.go -+++ b/common/profile/profile.go -@@ -294,7 +294,7 @@ func (p *Profile) ItemSort() error { - } else { - itemQuery, err := sqlstore.GetPropertyItem(key.Name()) - if err != nil { -- log.Errorf("key %s is not exist in tuned_item", key.Name()) -+ log.Infof("key %s is not exist in tuned_item", key.Name()) - itemName = "OTHERS" - } else { - itemName = itemQuery --- -2.27.0 - diff --git a/add-FAQ-and-self-signature-certificate-manufacturing.patch b/add-FAQ-and-self-signature-certificate-manufacturing.patch deleted file mode 100644 index df24f25..0000000 --- a/add-FAQ-and-self-signature-certificate-manufacturing.patch +++ /dev/null @@ -1,185 +0,0 @@ -From d14414365e8fa9590e46b63a29754fb29f81778c Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 16 Feb 2022 14:41:47 +0800 -Subject: [PATCH] add FAQ and self signature certificate manufacturing - ---- - Documentation/UserGuide/A-Tune-User-Guide.md | 70 ++++++++++++++++++ - ...50\346\210\267\346\214\207\345\215\227.md" | 72 +++++++++++++++++++ - 2 files changed, 142 insertions(+) - -diff --git a/Documentation/UserGuide/A-Tune-User-Guide.md b/Documentation/UserGuide/A-Tune-User-Guide.md -index cd99cd4..cbb9d66 100644 ---- a/Documentation/UserGuide/A-Tune-User-Guide.md -+++ b/Documentation/UserGuide/A-Tune-User-Guide.md -@@ -1235,6 +1235,12 @@ Perform tuning. - 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 - ``` - -+**Q4: The atuned or atune-engine service cannot be started, and the message "Startup failed. Please provide the authentication certificate." is displayed.** -+ -+**Cause:** Missing the certificate file during communication. The default communication protocol of REST APIs in the atuned or atune-engine service is HTTPS. -+ -+**Solution:** Providing the certificate file issued by the authority and saving it to the corresponding configuration directory. The default certificate directory of the atuned service is /etc/atuned/rest_certs/, and the default certificate directory of the atune-engine service is /etc/atuned/engine_certs/. You can also change the default certificate directory and certificate file name in the atuned.cnf and engine.cnf files under the /etc/atuned/ directory. For the development and commissioning environment, you can also make self-service signature certificate by following section 5.2. -+ - - - # 5 Appendixes -@@ -1248,3 +1254,67 @@ Perform tuning. - | profile | Set of optimization items and optimal parameter configuration. | - - -+## 5.2 Self-signature Certificate Manufacturing Method -+ -+### 5.2.1 Creating a Certificate Directory -+ -+```shell -+CERT_PATH=demo -+mkdir $CERT_PATH -+``` -+ -+### 5.2.2 Generating the RSA Key Pair for the CA -+ -+```shell -+openssl genrsa -out $CERT_PATH/ca.key 2048 -+``` -+ -+### 5.2.3 Generating the CA Root Certificate -+ -+```shell -+openssl req -new -x509 -days 3650 -subj "/CN=ca" -key $CERT_PATH/ca.key -out $CERT_PATH/ca.crt -+``` -+ -+### 5.2.4 Generating the Server Certificate -+ -+```shell -+# The IP address can be changed according to the actual situation. -+IP_ADDR=localhost -+openssl genrsa -out $CERT_PATH/server.key 2048 -+cp /etc/pki/tls/openssl.cnf $CERT_PATH -+if test $IP_ADDR == localhost; then -+ echo "[SAN]\nsubjectAltName=DNS:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=DNS:$IP_ADDR" > $CERT_PATH/extfile.cnf -+else -+ echo "[SAN]\nsubjectAltName=IP:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=IP:$IP_ADDR" > $CERT_PATH/extfile.cnf -+fi -+openssl req -new -subj "/CN=$IP_ADDR" -config $CERT_PATH/openssl.cnf \ -+ -key $CERT_PATH/server.key -out $CERT_PATH/server.csr -+openssl x509 -req -sha256 -CA $CERT_PATH/ca.crt -CAkey $CERT_PATH/ca.key -CAcreateserial -days 3650 \ -+ -extfile $CERT_PATH/extfile.cnf -in $CERT_PATH/server.csr -out $CERT_PATH/server.crt -+rm -rf $CERT_PATH/*.srl $CERT_PATH/*.csr $CERT_PATH/*.cnf -+``` -+ -+### 5.2.5 Generating the Client Certificate -+ -+```shell -+# The IP address can be changed according to the actual situation. -+IP_ADDR=localhost -+openssl genrsa -out $CERT_PATH/client.key 2048 -+cp /etc/pki/tls/openssl.cnf $CERT_PATH -+if test $IP_ADDR == localhost; then -+ echo "[SAN]\nsubjectAltName=DNS:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=DNS:$IP_ADDR" > $CERT_PATH/extfile.cnf -+else -+ echo "[SAN]\nsubjectAltName=IP:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=IP:$IP_ADDR" > $CERT_PATH/extfile.cnf -+fi -+openssl req -new -subj "/CN=$IP_ADDR" -config $CERT_PATH/openssl.cnf \ -+ -key $CERT_PATH/client.key -out $CERT_PATH/client.csr -+openssl x509 -req -sha256 -CA $CERT_PATH/ca.crt -CAkey $CERT_PATH/ca.key -CAcreateserial -days 3650 \ -+ -extfile $CERT_PATH/extfile.cnf -in $CERT_PATH/client.csr -out $CERT_PATH/client.crt -+rm -rf $CERT_PATH/*.srl $CERT_PATH/*.csr $CERT_PATH/*.cnf -+``` -+ -+ -diff --git "a/Documentation/UserGuide/A-Tune\347\224\250\346\210\267\346\214\207\345\215\227.md" "b/Documentation/UserGuide/A-Tune\347\224\250\346\210\267\346\214\207\345\215\227.md" -index 59b25e0..064708c 100644 ---- "a/Documentation/UserGuide/A-Tune\347\224\250\346\210\267\346\214\207\345\215\227.md" -+++ "b/Documentation/UserGuide/A-Tune\347\224\250\346\210\267\346\214\207\345\215\227.md" -@@ -1247,6 +1247,15 @@ evaluations : - 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 - ``` - -+**问题4:atuned或atune-engine服务无法启动,提示“Startup failed. Please provide the authentication certificate.”。** -+ -+**原因:** atuned或atune-engine服务中的REST API默认通信协议为https,通信中缺少证书文件 -+ -+**解决方法:** 用户提供权威机构签发的证书文件并放入对应的配置目录下,其中atuned服务的默认证书>目录为/etc/atuned/rest_certs/,atune-engine服务的默认证书目录为/etc/atuned/engine_certs/,也可 -+以通过/etc/atuned/目录下的atuned.cnf和engine.cnf配置文件修改默认证书目录和证书文件名。对于开发 -+调试环境也可以通过5.2节方法制作的自签名证书进行服务通信。 -+ -+ - # 5 附录 - - ## 5.1 术语和缩略语 -@@ -1258,3 +1267,66 @@ evaluations : - | profile | 优化项集合,最佳的参数配置 | - - -+## 5.2 自签名证书制作方法 -+ -+### 5.2.1 证书目录创建 -+ -+```shell -+CERT_PATH=demo -+mkdir $CERT_PATH -+``` -+ -+### 5.2.2 生成CA的RSA密钥对 -+ -+```shell -+openssl genrsa -out $CERT_PATH/ca.key 2048 -+``` -+ -+### 5.2.3 生成CA根证书 -+ -+```shell -+openssl req -new -x509 -days 3650 -subj "/CN=ca" -key $CERT_PATH/ca.key -out $CERT_PATH/ca.crt -+``` -+ -+### 5.2.4 生成服务器证书 -+ -+```shell -+# ip地址可以根据实际情况修改 -+IP_ADDR=localhost -+openssl genrsa -out $CERT_PATH/server.key 2048 -+cp /etc/pki/tls/openssl.cnf $CERT_PATH -+if test $IP_ADDR == localhost; then -+ echo "[SAN]\nsubjectAltName=DNS:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=DNS:$IP_ADDR" > $CERT_PATH/extfile.cnf -+else -+ echo "[SAN]\nsubjectAltName=IP:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=IP:$IP_ADDR" > $CERT_PATH/extfile.cnf -+fi -+openssl req -new -subj "/CN=$IP_ADDR" -config $CERT_PATH/openssl.cnf \ -+ -key $CERT_PATH/server.key -out $CERT_PATH/server.csr -+openssl x509 -req -sha256 -CA $CERT_PATH/ca.crt -CAkey $CERT_PATH/ca.key -CAcreateserial -days 3650 \ -+ -extfile $CERT_PATH/extfile.cnf -in $CERT_PATH/server.csr -out $CERT_PATH/server.crt -+rm -rf $CERT_PATH/*.srl $CERT_PATH/*.csr $CERT_PATH/*.cnf -+``` -+ -+### 5.2.5 生成客户端证书 -+ -+```shell -+# ip地址可以根据实际情况修改 -+IP_ADDR=localhost -+openssl genrsa -out $CERT_PATH/client.key 2048 -+cp /etc/pki/tls/openssl.cnf $CERT_PATH -+if test $IP_ADDR == localhost; then -+ echo "[SAN]\nsubjectAltName=DNS:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=DNS:$IP_ADDR" > $CERT_PATH/extfile.cnf -+else -+ echo "[SAN]\nsubjectAltName=IP:$IP_ADDR" >> $CERT_PATH/openssl.cnf -+ echo "subjectAltName=IP:$IP_ADDR" > $CERT_PATH/extfile.cnf -+fi -+openssl req -new -subj "/CN=$IP_ADDR" -config $CERT_PATH/openssl.cnf \ -+ -key $CERT_PATH/client.key -out $CERT_PATH/client.csr -+openssl x509 -req -sha256 -CA $CERT_PATH/ca.crt -CAkey $CERT_PATH/ca.key -CAcreateserial -days 3650 \ -+ -extfile $CERT_PATH/extfile.cnf -in $CERT_PATH/client.csr -out $CERT_PATH/client.crt -+rm -rf $CERT_PATH/*.srl $CERT_PATH/*.csr $CERT_PATH/*.cnf -+``` -+ --- -2.30.0 - diff --git a/adjust-the-startup-sequence-of-atune-rest.patch b/adjust-the-startup-sequence-of-atune-rest.patch new file mode 100644 index 0000000..12cbaa1 --- /dev/null +++ b/adjust-the-startup-sequence-of-atune-rest.patch @@ -0,0 +1,37 @@ +From 769eb65a6849b6663885fff1ab8dafbc1b3c92dd Mon Sep 17 00:00:00 2001 +From: root +Date: Sun, 25 Feb 2024 14:59:21 +0800 +Subject: [PATCH] Adjust the startup sequence of atune-rest + +--- + misc/atune-rest.service | 2 +- + misc/atuned.service | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/misc/atune-rest.service b/misc/atune-rest.service +index 3cf0794..7774683 100644 +--- a/misc/atune-rest.service ++++ b/misc/atune-rest.service +@@ -1,6 +1,6 @@ + [Unit] + Description=A-Tune AI service +-After=network.target ++After=network.target atuned.service + Requires=polkit.service + + [Service] +diff --git a/misc/atuned.service b/misc/atuned.service +index 58fb022..1677d30 100644 +--- a/misc/atuned.service ++++ b/misc/atuned.service +@@ -1,6 +1,6 @@ + [Unit] + Description=A-Tune Daemon +-After=systemd-sysctl.service network.target atune-rest.service ++After=systemd-sysctl.service network.target + Requires=polkit.service + + [Service] +-- +2.27.0 + diff --git a/atune.spec b/atune.spec index 1aa336a..fa2e1c5 100755 --- a/atune.spec +++ b/atune.spec @@ -2,33 +2,23 @@ Summary: AI auto tuning system Name: atune -Version: 1.0.0 -Release: 16 +Version: 1.2.0 +Release: 1 License: MulanPSL-2.0 URL: https://gitee.com/openeuler/A-Tune Source: https://gitee.com/openeuler/A-Tune/repository/archive/v%{version}.tar.gz -Patch9000: check-whether-the-certificate-file-exists.patch -Patch9001: add-FAQ-and-self-signature-certificate-manufacturing.patch -Patch9002: change-Makefile-A-Tune-version-to-1.0.0.patch -Patch9003: fix-start-failed-of-atuned-service.patch -Patch9004: A-Tune-Add-sw64-architecture.patch -Patch9005: add-riscv64-support.patch -Patch9006: 0001-bugfix-transfer-can-only-save-file-to-specified-dir.patch -Patch9007: 0002-bugfix-training-model-can-only-save-file-to-specifie.patch -Patch9008: 0003-bugfix-collection-res-can-only-save-file-to-specifie.patch -Patch9009: 0004-atune-add-service-restart-mode.patch -Patch9010: 0005-atune-update-Makefile-and-logs.patch -Patch9011: 0001-define-fix-privilege-escalation.patch -Patch9012: 0002-define-fix-privilege-escalation.patch -Patch9013: fix-collection-train-file-overwriting-through-soft-links.patch - +Patch9000: A-Tune-Add-sw64-architecture.patch +Patch9001: add-riscv64-support.patch +Patch9002: remove-the-installation-of-atune-ui-related-files.patch +Patch9003: adjust-the-startup-sequence-of-atune-rest.patch BuildRequires: rpm-build golang-bin procps-ng BuildRequires: sqlite >= 3.24.0 openssl BuildRequires: python3-scikit-optimize python3-pandas python3-xgboost BuildRequires: python3-pyyaml BuildRequires: systemd +BuildRequires: perf Requires: systemd Requires: atune-client = %{version}-%{release} Requires: atune-db = %{version}-%{release} @@ -44,7 +34,7 @@ Requires: sysstat Requires: hwloc-gui Requires: psmisc Requires: atune-collector - +Requires: atune-rest %define debug_package %{nil} @@ -73,31 +63,29 @@ Requires: python3-xgboost Requires: python3-flask-restful Requires: python3-pandas Requires: python3-lhsmdu -Conflicts: atune < 0.3-0.9 +Conflicts: atune < 1.1.0 %description engine atune engine tool for manage atuned AI tuning system. +%package rest +Summary: restful api for communication between atuned and atune-engine +License: MuLan PSL v2 +Conflicts: atune < 1.1.0 + +%description rest +atune restful api for manage atuned AI tuning system. + %prep %setup -n A-Tune-v%{version} -%patch9000 -p1 -%patch9001 -p1 -%patch9002 -p1 -%patch9003 -p1 %ifarch sw_64 -%patch9004 -p1 +%patch9000 -p1 %endif %ifarch riscv64 -%patch9005 -p1 +%patch9001 -p1 %endif -%patch9006 -p1 -%patch9007 -p1 -%patch9008 -p1 -%patch9009 -p1 -%patch9010 -p1 -%patch9011 -p1 -%patch9012 -p1 -%patch9013 -p1 +%patch9002 -p1 +%patch9003 -p1 %build %make_build @@ -125,24 +113,26 @@ atune engine tool for manage atuned AI tuning system. %postun engine %systemd_postun_with_restart atune-engine.service +%post rest +%systemd_post atune-rest.service + +%preun rest +%systemd_preun atune-rest.service + +%postun rest +%systemd_postun_with_restart atune-rest.service + %files %license License/LICENSE %defattr(0640,root,root,0750) %attr(0550,root,root) /usr/lib/atuned/modules/daemon_profile_server.so %attr(0640,root,root) %{_unitdir}/atuned.service %attr(0550,root,root) %{_bindir}/atuned -%attr(0550,root,root) /usr/libexec/atuned/analysis/* /usr/lib/atuned/profiles/* -%exclude /usr/libexec/atuned/analysis/app_engine.py -%exclude /usr/libexec/atuned/analysis/models/ -%exclude /usr/libexec/atuned/analysis/optimizer/ -%exclude /usr/libexec/atuned/analysis/engine/ -%exclude /usr/libexec/atuned/analysis/dataset/ %attr(0750,root,root) %dir /usr/lib/atuned %attr(0550,root,root) %dir /usr/lib/atuned/modules %attr(0750,root,root) %dir /usr/lib/atuned/profiles %attr(0750,root,root) %dir /usr/libexec/atuned -%attr(0550,root,root) %dir /usr/libexec/atuned/analysis %attr(0750,root,root) %dir /usr/share/atuned %attr(0750,root,root) %dir /etc/atuned %attr(0750,root,root) %dir /etc/atuned/rules @@ -154,6 +144,15 @@ atune engine tool for manage atuned AI tuning system. %exclude /etc/atuned/engine_certs/* %exclude /etc/atuned/rest_certs/* +%files rest +%attr(0550,root,root) %dir /usr/libexec/atuned/analysis +%attr(0550,root,root) /usr/libexec/atuned/analysis/* +%exclude /usr/libexec/atuned/analysis/app_engine.py +%exclude /usr/libexec/atuned/analysis/models/ +%exclude /usr/libexec/atuned/analysis/optimizer/ +%exclude /usr/libexec/atuned/analysis/engine/ +%exclude /usr/libexec/atuned/analysis/dataset/ +%attr(0640,root,root) %{_unitdir}/atune-rest.service %files client %attr(0550,root,root) %{_bindir}/atune-adm @@ -187,6 +186,9 @@ atune engine tool for manage atuned AI tuning system. %exclude /etc/atuned/rest_certs %changelog +* Tue Feb 6 2024 zhoupengcheng - 1.2.0-1 +- update atune-v1.2.0 + * Wed Nov 8 2023 zhoupengcheng - 1.0.0-16 - fix-collection-train-file-overwriting-through-soft-links diff --git a/change-Makefile-A-Tune-version-to-1.0.0.patch b/change-Makefile-A-Tune-version-to-1.0.0.patch deleted file mode 100644 index dfe5b49..0000000 --- a/change-Makefile-A-Tune-version-to-1.0.0.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 5b8ec9d923096e0ad6302e27d21d4de40087dfce Mon Sep 17 00:00:00 2001 -From: hubin73 -Date: Thu, 3 Mar 2022 20:41:08 +0800 -Subject: [PATCH] change Makefile A-Tune version to 1.0.0 - -Signed-off-by: hubin73 ---- - Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index 8e43062..715f698 100755 ---- a/Makefile -+++ b/Makefile -@@ -1,4 +1,4 @@ --VERSION = 0.3 -+VERSION = 1.0.0 - .PHONY: all clean modules - - PKGPATH=pkg --- -2.27.0 - diff --git a/check-whether-the-certificate-file-exists.patch b/check-whether-the-certificate-file-exists.patch deleted file mode 100644 index 431d666..0000000 --- a/check-whether-the-certificate-file-exists.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 8d7596125161bea13641644fca2384411e00a4e5 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Tue, 15 Feb 2022 17:03:40 +0800 -Subject: [PATCH] check whether the certificate file exists - ---- - analysis/app.py | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/analysis/app.py b/analysis/app.py -index 31b5f51..b25e784 100644 ---- a/analysis/app.py -+++ b/analysis/app.py -@@ -22,6 +22,8 @@ from logging.handlers import SysLogHandler - from flask import Flask - from flask_restful import Api - -+LOGGER = logging.getLogger(__name__) -+ - - class App: - """flask application""" -@@ -51,6 +51,9 @@ class App: - - def startup_app(self, host, port, tls, cert_file, key_file, ca_file, log_level): - """start flask app""" -+ if not os.path.exists(cert_file) or not os.path.exists(key_file) or not os.path.exists(ca_file): -+ LOGGER.error("Startup failed. Please provide the authentication certificate.") -+ raise FileNotFoundError("Startup failed. Please provide the authentication certificate.") - level = logging.getLevelName(log_level.upper()) - self.config_log(level) - self.add_resource() --- -2.30.0 diff --git a/fix-collection-train-file-overwriting-through-soft-links.patch b/fix-collection-train-file-overwriting-through-soft-links.patch deleted file mode 100644 index c527b16..0000000 --- a/fix-collection-train-file-overwriting-through-soft-links.patch +++ /dev/null @@ -1,57 +0,0 @@ -From c5e491e5dffab4dda814f2e1ba11c21714cac0c6 Mon Sep 17 00:00:00 2001 -From: zhoupengcheng -Date: Wed, 1 Nov 2023 11:14:37 +0800 -Subject: [PATCH] fix-collection-train-file-overwriting-through-soft-links.patch - ---- - analysis/atuned/collector.py | 10 +++++++++- - analysis/engine/train.py | 4 +++- - 2 files changed, 12 insertions(+), 2 deletions(-) - -diff --git a/analysis/atuned/collector.py b/analysis/atuned/collector.py -index 4749284..9a264dd 100755 ---- a/analysis/atuned/collector.py -+++ b/analysis/atuned/collector.py -@@ -39,6 +39,15 @@ class Collector(Resource): - args = COLLECTOR_POST_PARSER.parse_args() - current_app.logger.info(args) - n_pipe = get_npipe(args.get("pipe")) -+ -+ path = args.get("file") -+ path = os.path.abspath(path) -+ if not path.startswith("/var/atune_data/collection/"): -+ return "Files outside the /var/atune_data/collection/ directory cannot be modified.", 400 -+ -+ if os.path.exists(path): -+ return "File already exists!", 400 -+ - monitors = [] - mpis = [] - field_name = [] -@@ -91,7 +100,6 @@ class Collector(Resource): - if n_pipe is not None: - n_pipe.close() - -- path = args.get("file") - save_file(path, data, field_name) - result = {} - result["path"] = path -diff --git a/analysis/engine/train.py b/analysis/engine/train.py -index 7608660..462b16c 100644 ---- a/analysis/engine/train.py -+++ b/analysis/engine/train.py -@@ -49,8 +49,10 @@ class Training(Resource): - return "Illegal model name provide: {}".format(err), 400 - - characterization = WorkloadCharacterization(model_path) -+ output_path = TRAINING_MODEL_PATH + model_name -+ if os.path.exists(output_path): -+ return "File already exists!", 400 - try: -- output_path = TRAINING_MODEL_PATH + model_name - characterization.retrain(data_path, output_path) - except Exception as err: - LOGGER.error(err) --- -2.33.0 - diff --git a/fix-start-failed-of-atuned-service.patch b/fix-start-failed-of-atuned-service.patch deleted file mode 100644 index 951a5ee..0000000 --- a/fix-start-failed-of-atuned-service.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 945560933e7e118b9113f152a5f133e1ff0af183 Mon Sep 17 00:00:00 2001 -From: g00563147 -Date: Thu, 3 Mar 2022 16:52:04 +0800 -Subject: [PATCH] fix start failed of atuned service - ---- - analysis/app.py | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/analysis/app.py b/analysis/app.py -index e82e2b2..3a0c248 100644 ---- a/analysis/app.py -+++ b/analysis/app.py -@@ -53,14 +53,14 @@ class App: - - def startup_app(self, host, port, tls, cert_file, key_file, ca_file, log_level): - """start flask app""" -- if not os.path.exists(cert_file) or not os.path.exists(key_file) or not os.path.exists(ca_file): -- LOGGER.error("Startup failed. Please provide the authentication certificate.") -- raise FileNotFoundError("Startup failed. Please provide the authentication certificate.") - level = logging.getLevelName(log_level.upper()) - self.config_log(level) - self.add_resource() - context = None - if tls: -+ if not os.path.exists(cert_file) or not os.path.exists(key_file) or not os.path.exists(ca_file): -+ LOGGER.error("Startup failed. Please provide the authentication certificate.") -+ raise FileNotFoundError("Startup failed. Please provide the authentication certificate.") - context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) - context.load_cert_chain(certfile=cert_file, keyfile=key_file) - context.load_verify_locations(ca_file) --- -1.8.3.1 - diff --git a/remove-the-installation-of-atune-ui-related-files.patch b/remove-the-installation-of-atune-ui-related-files.patch new file mode 100644 index 0000000..c481566 --- /dev/null +++ b/remove-the-installation-of-atune-ui-related-files.patch @@ -0,0 +1,45 @@ +From 33dc1c15e65c0212635a5063a95206376e97e2bc Mon Sep 17 00:00:00 2001 +From: root +Date: Wed, 7 Feb 2024 10:53:14 +0800 +Subject: [PATCH] remove-the-installation-of-atune-ui-related-files + +--- + Makefile | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/Makefile b/Makefile +index 4c70a9f..cb1d16c 100755 +--- a/Makefile ++++ b/Makefile +@@ -28,7 +28,6 @@ abs-python: + @if [ $(PYDIR) ] ; then \ + sed -i "s?ExecStart=.*python3?ExecStart=$(PYDIR)?g" $(CURDIR)/misc/atune-engine.service; \ + sed -i "s?ExecStart=.*python3?ExecStart=$(PYDIR)?g" $(CURDIR)/misc/atune-rest.service; \ +- sed -i "s?ExecStart=.*python3?ExecStart=$(PYDIR)?g" $(CURDIR)/misc/atune-ui.service; \ + else \ + echo "no python3 exists."; \ + fi +@@ -99,12 +98,10 @@ libinstall: + install -m 640 misc/atuned.service $(SYSTEMDDIR) + install -m 640 misc/atuned.cnf $(DESTDIR)/etc/atuned/ + install -m 640 misc/engine.cnf $(DESTDIR)/etc/atuned/ +- install -m 640 misc/ui.cnf $(DESTDIR)/etc/atuned/ + install -m 640 rules/tuning/tuning_rules.grl $(DESTDIR)/etc/atuned/rules + install -m 640 misc/atune-engine.service $(SYSTEMDDIR) + install -m 640 database/atuned.db $(DESTDIR)/var/lib/atuned/ + install -m 640 misc/atune-adm $(DESTDIR)$(PREFIX)/share/bash-completion/completions/ +- install -m 640 misc/atune-ui.service $(SYSTEMDDIR) + \cp -rf analysis/* $(DESTDIR)$(PREFIX)/$(LIBEXEC)/atuned/analysis/ + chmod -R 750 $(DESTDIR)$(PREFIX)/$(LIBEXEC)/atuned/analysis/ + \cp -rf profiles/* $(DESTDIR)$(PREFIX)/lib/atuned/profiles/ +@@ -202,7 +199,6 @@ startup: + systemctl restart atune-rest + systemctl restart atuned + systemctl restart atune-engine +- systemctl restart atune-ui + + yaml-generator: + \cp -rf tuning/yamls/* $(DESTDIR)/etc/atuned/tuning +-- +2.27.0 + diff --git a/v1.0.0.tar.gz b/v1.2.0.tar.gz similarity index 71% rename from v1.0.0.tar.gz rename to v1.2.0.tar.gz index 36a9e77..6ff3f31 100644 Binary files a/v1.0.0.tar.gz and b/v1.2.0.tar.gz differ