1 /* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */
2 // Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3 // Use of this source code is governed by a apache 2.0 license that can be
4 // found in the LICENSE file.
10 #include <TTraceWrapper.h>
12 #include "common/installer/app_installer.h"
13 #include "common/installer_context.h"
14 #include "common/pkgmgr_interface.h"
15 #include "common/pkgmgr_signal.h"
16 #include "common/step/configuration/step_fail.h"
17 #include "common/utils/file_logbackend.h"
19 #include "common/step/backup/step_backup_icons.h"
20 #include "common/step/backup/step_backup_manifest.h"
21 #include "common/step/backup/step_copy_backup.h"
22 #include "common/step/configuration/step_block_cross_update.h"
23 #include "common/step/configuration/step_check_install_location.h"
24 #include "common/step/configuration/step_check_tizen_version.h"
25 #include "common/step/configuration/step_configure.h"
26 #include "common/step/configuration/step_parse_manifest.h"
27 #include "common/step/configuration/step_parse_preload.h"
28 #include "common/step/configuration/step_switch_readonly_mode.h"
29 #include "common/step/filesystem/step_acquire_external_storage.h"
30 #include "common/step/filesystem/step_change_ownership_and_permission.h"
31 #include "common/step/filesystem/step_copy.h"
32 #include "common/step/filesystem/step_copy_storage_directories.h"
33 #include "common/step/filesystem/step_copy_tep.h"
34 #include "common/step/filesystem/step_create_globalapp_symlinks.h"
35 #include "common/step/filesystem/step_create_icons.h"
36 #include "common/step/filesystem/step_create_storage_directories.h"
37 #include "common/step/filesystem/step_delta_patch.h"
38 #include "common/step/filesystem/step_disable_external_mount.h"
39 #include "common/step/filesystem/step_enable_external_mount.h"
40 #include "common/step/filesystem/step_migrate_legacy_external_image.h"
41 #include "common/step/filesystem/step_move_installed_storage.h"
42 #include "common/step/filesystem/step_optional_acquire_external_storage.h"
43 #include "common/step/filesystem/step_recover_change_owner.h"
44 #include "common/step/filesystem/step_recover_external_storage.h"
45 #include "common/step/filesystem/step_recover_files.h"
46 #include "common/step/filesystem/step_recover_globalapp_symlinks.h"
47 #include "common/step/filesystem/step_recover_icons.h"
48 #include "common/step/filesystem/step_recover_manifest.h"
49 #include "common/step/filesystem/step_recover_storage_directories.h"
50 #include "common/step/filesystem/step_remove_files.h"
51 #include "common/step/filesystem/step_remove_icons.h"
52 #include "common/step/filesystem/step_remove_globalapp_symlinks.h"
53 #include "common/step/filesystem/step_remove_per_user_storage_directories.h"
54 #include "common/step/filesystem/step_remove_temporary_directory.h"
55 #include "common/step/filesystem/step_remove_tep.h"
56 #include "common/step/filesystem/step_remove_user_data.h"
57 #include "common/step/filesystem/step_remove_zip_image.h"
58 #include "common/step/filesystem/step_unzip.h"
59 #include "common/step/filesystem/step_update_storage_directories.h"
60 #include "common/step/filesystem/step_update_tep.h"
61 #include "common/step/mount/step_check_mount_path.h"
62 #include "common/step/mount/step_mount_install.h"
63 #include "common/step/mount/step_mount_recover.h"
64 #include "common/step/mount/step_mount_unpacked.h"
65 #include "common/step/mount/step_mount_update.h"
66 #include "common/step/mount/step_unmount.h"
67 #include "common/step/pkgmgr/step_check_force_clean.h"
68 #include "common/step/pkgmgr/step_check_installable.h"
69 #include "common/step/pkgmgr/step_check_removable.h"
70 #include "common/step/pkgmgr/step_check_restriction.h"
71 #include "common/step/pkgmgr/step_check_upgradable.h"
72 #include "common/step/pkgmgr/step_kill_apps.h"
73 #include "common/step/pkgmgr/step_recover_application.h"
74 #include "common/step/pkgmgr/step_recover_parser_plugins.h"
75 #include "common/step/pkgmgr/step_register_app.h"
76 #include "common/step/pkgmgr/step_remove_manifest.h"
77 #include "common/step/pkgmgr/step_run_parser_plugins.h"
78 #include "common/step/pkgmgr/step_unregister_app.h"
79 #include "common/step/pkgmgr/step_update_app.h"
80 #include "common/step/pkgmgr/step_update_pkg_disable_info.h"
81 #include "common/step/rds/step_rds_modify.h"
82 #include "common/step/rds/step_rds_parse.h"
83 #include "common/step/recovery/step_create_recovery_file.h"
84 #include "common/step/recovery/step_open_recovery_file.h"
85 #include "common/step/security/step_check_old_certificate.h"
86 #include "common/step/security/step_get_privilege_level.h"
87 #include "common/step/security/step_privacy_privilege.h"
88 #include "common/step/security/step_recover_security.h"
89 #include "common/step/security/step_recover_trust_anchor.h"
90 #include "common/step/security/step_register_security.h"
91 #include "common/step/security/step_register_trust_anchor.h"
92 #include "common/step/security/step_revoke_security.h"
93 #include "common/step/security/step_revoke_trust_anchor.h"
94 #include "common/step/security/step_rollback_installation_security.h"
95 #include "common/step/security/step_signature.h"
96 #include "common/step/security/step_unregister_trust_anchor.h"
97 #include "common/step/security/step_update_security.h"
99 namespace ci = common_installer;
103 const unsigned kProgressRange = 100;
104 const char kLogFileName[] = LOGDIR"/app-installers.log";
105 const char kHistoryFileName[] = LOGDIR"/installation-history.log";
106 const int kLogRotationSize = 1024 * 256; // 256KB
107 const int kLogMaximumRotation = 3;
111 namespace common_installer {
113 AppInstaller::AppInstaller(const char* package_type, PkgMgrPtr pkgmgr)
114 : pkgmgr_(pkgmgr), context_(new InstallerContext()),
115 status_(Step::Status::OK), result_(Result::OK), index_(0) {
116 context_->pkg_type.set(package_type);
117 context_->installation_mode.set(pkgmgr->GetInstallationMode());
119 // pkgmgr signal should work only for online mode
120 // there is no one to receive it in offline mode
121 if (context_->installation_mode.get() == InstallationMode::ONLINE) {
122 pi_ = pkgmgr->CreatePkgmgrSignal();
126 AppInstaller::~AppInstaller() {
129 void AppInstaller::Init() {
130 // for multi installer
131 context_->index.set(index_);
132 pkgmgr_->SetAppQueryInterface(index_);
134 switch (pkgmgr_->GetRequestType(index_)) {
135 case RequestType::Install:
138 case RequestType::Update:
141 case RequestType::Uninstall:
144 case RequestType::Reinstall:
147 case RequestType::Delta:
150 case RequestType::Move:
153 case RequestType::Recovery:
156 case RequestType::MountInstall:
159 case RequestType::MountUpdate:
162 case RequestType::ManifestDirectInstall:
163 ManifestDirectInstallSteps();
165 case RequestType::ManifestDirectUpdate:
166 ManifestDirectUpdateSteps();
168 case RequestType::ManifestPartialInstall:
169 ManifestPartialInstallSteps();
171 case RequestType::ManifestPartialUpdate:
172 ManifestPartialUpdateSteps();
174 case RequestType::PartialUninstall:
175 PartialUninstallSteps();
177 case RequestType::ReadonlyUpdateInstall:
178 ReadonlyUpdateInstallSteps();
180 case RequestType::ReadonlyUpdateUninstall:
181 ReadonlyUpdateUninstallSteps();
183 case RequestType::EnablePkg:
186 case RequestType::DisablePkg:
189 case RequestType::MigrateExtImg:
190 MigrateExtImgSteps();
192 case RequestType::RecoverDB:
201 AppInstaller::Result AppInstaller::Run() {
203 if (it_ != steps_.end() && result_ == Result::ERROR) {
204 LOG(ERROR) << "Failure occurs in step: " << (*it_)->name();
211 if ((context_->installation_mode.get() == InstallationMode::OFFLINE) &&
212 (result_ == Result::ERROR)) {
213 std::fstream info_file("/tmp/.preload_install_error",
214 std::ios::out | std::ios::app);
215 info_file << context_->pkgid.get() << std::endl;
222 void AppInstaller::LogHistoryStart() {
223 std::shared_ptr<utils::FileLogBackend> history_logger =
224 std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
225 kHistoryFileName, kLogRotationSize, kLogMaximumRotation));
226 std::string history = context_->pkgid.get() + "|" +
227 GetRequestTypeString(context_->request_type.get()) + "|START";
228 history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
229 history_logger->WriteLogToFile();
232 void AppInstaller::LogHistoryEnd(bool success) {
233 std::shared_ptr<utils::FileLogBackend> history_logger =
234 std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
235 kHistoryFileName, kLogRotationSize, kLogMaximumRotation));
236 std::string history = context_->pkgid.get() + "|" +
237 GetRequestTypeString(context_->request_type.get());
239 history += "|SUCCESS";
242 history_logger->WriteLog(::utils::LogLevel::LOG_INFO, "", history);
243 history_logger->WriteLogToFile();
246 AppInstaller::Result AppInstaller::Process() {
250 std::shared_ptr<utils::FileLogBackend>(new utils::FileLogBackend(
251 kLogFileName, kLogRotationSize, kLogMaximumRotation));
252 ::utils::LogCore::GetCore().AddLogBackend(failure_logger_);
254 unsigned total_steps = steps_.size();
255 unsigned current_step = 1;
257 for (it_ = steps_.begin(); it_ != steps_.end(); ++it_, ++current_step) {
258 status_ = SafeExecute(*it_, &Step::precheck, "precheck");
259 if (status_ == Step::Status::OK)
260 status_ = SafeExecute(*it_, &Step::process, "process");
262 if (status_ != Step::Status::OK) {
263 if (status_ != Step::Status::RECOVERY_DONE) {
264 LOG(ERROR) << "Error during processing";
265 result_ = Result::ERROR;
269 SendProgress(current_step * kProgressRange / total_steps);
275 AppInstaller::Result AppInstaller::Undo() {
277 if (it_ == steps_.end())
279 if (SafeExecute(*it_, &Step::undo, "undo") != Step::Status::OK) {
280 LOG(ERROR) << "Error during undo operation(" << (*it_)->name()
281 << "), but continuing...";
282 result_ = Result::UNDO_ERROR;
284 } while (it_-- != steps_.begin());
286 failure_logger_->WriteLogToFile();
288 // Undo will be invoked when other installer fails when multi-install, but the
289 // status of current installer can be ok. We need to change this to proper
290 // error code to notify that entire installation was failed to listener.
291 // TODO(jeremy.jang): Need some other error for multi-install failure?
292 if (status_ == Step::Status::OK)
293 status_ = Step::Status::ERROR;
294 SendFinished(status_);
296 LogHistoryEnd(false);
301 AppInstaller::Result AppInstaller::Clean() {
302 const auto& recovery_file =
303 context_->recovery_info.get().recovery_file;
305 recovery_file->set_cleanup(true);
306 recovery_file->WriteAndCommitFileContent();
310 if (it_ == steps_.end())
312 if (SafeExecute(*it_, &Step::clean, "clean") != Step::Status::OK) {
313 LOG(ERROR) << "Error during clean operation(" << (*it_)->name() << ")";
314 result_ = Result::CLEANUP_ERROR;
317 } while (it_-- != steps_.begin());
319 SendFinished(status_);
326 void AppInstaller::InstallSteps() {
327 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
328 AddStep<ci::recovery::StepCreateRecoveryFile>();
329 AddStep<ci::filesystem::StepUnzip>();
330 AddStep<ci::configuration::StepParseManifest>(
331 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
332 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
333 AddStep<ci::configuration::StepCheckInstallLocation>();
334 AddStep<ci::pkgmgr::StepCheckInstallable>();
335 AddStep<ci::configuration::StepParsePreload>();
336 AddStep<ci::pkgmgr::StepCheckRestriction>();
337 AddStep<ci::configuration::StepCheckTizenVersion>();
338 AddStep<ci::security::StepSignature>(true);
339 AddStep<ci::security::StepRollbackInstallationSecurity>();
340 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
341 AddStep<ci::filesystem::StepAcquireExternalStorage>(false);
342 AddStep<ci::filesystem::StepCopy>();
343 AddStep<ci::filesystem::StepCopyTep>();
344 AddStep<ci::filesystem::StepCreateIcons>();
345 AddStep<ci::pkgmgr::StepRegisterApplication>();
346 AddStep<ci::security::StepRegisterTrustAnchor>(
347 ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
348 AddStep<ci::security::StepPrivacyPrivilege>(
349 ci::security::StepPrivacyPrivilege::ActionType::Install);
350 AddStep<ci::security::StepRegisterSecurity>();
351 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
352 AddStep<ci::filesystem::StepCreateStorageDirectories>();
353 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
354 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
357 void AppInstaller::UpdateSteps() {
358 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
359 AddStep<ci::recovery::StepCreateRecoveryFile>();
360 AddStep<ci::filesystem::StepUnzip>();
361 AddStep<ci::configuration::StepParseManifest>(
362 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
363 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
364 AddStep<ci::configuration::StepParseManifest>(
365 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
366 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
367 AddStep<ci::configuration::StepCheckInstallLocation>();
368 AddStep<ci::pkgmgr::StepCheckUpgradable>();
369 AddStep<ci::configuration::StepParsePreload>();
370 AddStep<ci::configuration::StepCheckTizenVersion>();
371 AddStep<ci::security::StepSignature>(true);
372 AddStep<ci::security::StepCheckOldCertificate>();
373 AddStep<ci::configuration::StepBlockCrossUpdate>();
374 AddStep<ci::pkgmgr::StepKillApps>();
375 AddStep<ci::backup::StepBackupManifest>();
376 AddStep<ci::backup::StepBackupIcons>();
377 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
378 AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
379 AddStep<ci::security::StepRevokeTrustAnchor>();
380 AddStep<ci::backup::StepCopyBackup>();
381 AddStep<ci::filesystem::StepUpdateTep>();
382 AddStep<ci::filesystem::StepCopyStorageDirectories>();
383 AddStep<ci::filesystem::StepCreateIcons>();
384 AddStep<ci::pkgmgr::StepUpdateApplication>();
385 AddStep<ci::security::StepRegisterTrustAnchor>(
386 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
387 AddStep<ci::security::StepPrivacyPrivilege>(
388 ci::security::StepPrivacyPrivilege::ActionType::Update);
389 AddStep<ci::security::StepUpdateSecurity>();
390 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
391 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
392 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
393 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
396 void AppInstaller::UninstallSteps() {
397 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
398 AddStep<ci::recovery::StepCreateRecoveryFile>();
399 AddStep<ci::pkgmgr::StepCheckRestriction>();
400 AddStep<ci::pkgmgr::StepCheckRemovable>();
401 AddStep<ci::pkgmgr::StepCheckForceClean>();
402 AddStep<ci::configuration::StepParseManifest>(
403 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
404 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
405 AddStep<ci::configuration::StepCheckInstallLocation>();
406 AddStep<ci::pkgmgr::StepKillApps>();
407 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Uninstall);
408 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
409 AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
410 AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
411 AddStep<ci::pkgmgr::StepUnregisterApplication>();
412 AddStep<ci::security::StepUnregisterTrustAnchor>();
413 AddStep<ci::security::StepPrivacyPrivilege>(
414 ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
415 AddStep<ci::filesystem::StepRemoveFiles>();
416 AddStep<ci::filesystem::StepRemoveZipImage>();
417 AddStep<ci::filesystem::StepRemoveIcons>();
418 AddStep<ci::filesystem::StepRemoveTep>();
419 AddStep<ci::security::StepRevokeSecurity>();
420 AddStep<ci::pkgmgr::StepRemoveManifest>();
423 void AppInstaller::ReinstallSteps() {
424 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
425 AddStep<ci::configuration::StepParseManifest>(
426 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
427 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
428 AddStep<ci::configuration::StepParseManifest>(
429 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
430 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
431 AddStep<ci::configuration::StepCheckInstallLocation>();
432 AddStep<ci::pkgmgr::StepCheckUpgradable>();
433 AddStep<ci::configuration::StepParsePreload>();
434 AddStep<ci::configuration::StepCheckTizenVersion>();
435 AddStep<ci::security::StepSignature>(true);
436 AddStep<ci::security::StepCheckOldCertificate>();
437 AddStep<ci::configuration::StepBlockCrossUpdate>();
438 AddStep<ci::pkgmgr::StepKillApps>();
439 AddStep<ci::backup::StepBackupManifest>();
440 AddStep<ci::backup::StepBackupIcons>();
441 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
442 AddStep<ci::security::StepRevokeTrustAnchor>();
443 AddStep<ci::rds::StepRDSParse>();
444 AddStep<ci::rds::StepRDSModify>();
445 AddStep<ci::filesystem::StepUpdateTep>();
446 AddStep<ci::filesystem::StepCreateIcons>();
447 AddStep<ci::pkgmgr::StepUpdateApplication>();
448 AddStep<ci::security::StepRegisterTrustAnchor>(
449 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
450 AddStep<ci::security::StepPrivacyPrivilege>(
451 ci::security::StepPrivacyPrivilege::ActionType::Update);
452 AddStep<ci::security::StepUpdateSecurity>();
453 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
454 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
455 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
456 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
459 void AppInstaller::DeltaSteps() {
460 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
461 AddStep<ci::recovery::StepCreateRecoveryFile>();
462 AddStep<ci::filesystem::StepUnzip>();
463 AddStep<ci::configuration::StepParseManifest>(
464 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
465 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
466 AddStep<ci::configuration::StepParseManifest>(
467 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
468 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
469 AddStep<ci::configuration::StepCheckInstallLocation>();
470 AddStep<ci::pkgmgr::StepCheckUpgradable>();
471 AddStep<ci::configuration::StepParsePreload>();
472 AddStep<ci::configuration::StepCheckTizenVersion>();
473 AddStep<ci::filesystem::StepEnableExternalMount>();
474 AddStep<ci::filesystem::StepDeltaPatch>();
475 AddStep<ci::filesystem::StepDisableExternalMount>();
476 AddStep<ci::security::StepSignature>(true);
477 AddStep<ci::security::StepCheckOldCertificate>();
478 AddStep<ci::configuration::StepBlockCrossUpdate>();
479 AddStep<ci::pkgmgr::StepKillApps>();
480 AddStep<ci::backup::StepBackupManifest>();
481 AddStep<ci::backup::StepBackupIcons>();
482 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
483 AddStep<ci::filesystem::StepAcquireExternalStorage>(true);
484 AddStep<ci::security::StepRevokeTrustAnchor>();
485 AddStep<ci::backup::StepCopyBackup>();
486 AddStep<ci::filesystem::StepUpdateTep>();
487 AddStep<ci::filesystem::StepCopyStorageDirectories>();
488 AddStep<ci::filesystem::StepCreateIcons>();
489 AddStep<ci::pkgmgr::StepUpdateApplication>();
490 AddStep<ci::security::StepRegisterTrustAnchor>(
491 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
492 AddStep<ci::security::StepPrivacyPrivilege>(
493 ci::security::StepPrivacyPrivilege::ActionType::Update);
494 AddStep<ci::security::StepUpdateSecurity>();
495 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
496 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
497 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
498 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
501 void AppInstaller::MoveSteps() {
502 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
503 AddStep<ci::pkgmgr::StepCheckRestriction>();
504 AddStep<ci::configuration::StepParseManifest>(
505 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
506 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
507 AddStep<ci::configuration::StepCheckInstallLocation>();
508 AddStep<ci::pkgmgr::StepKillApps>();
509 AddStep<ci::filesystem::StepMoveInstalledStorage>();
510 AddStep<ci::security::StepRegisterSecurity>();
513 void AppInstaller::RecoverySteps() {
514 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
515 AddStep<ci::recovery::StepOpenRecoveryFile>();
516 AddStep<ci::filesystem::StepRemoveTemporaryDirectory>();
517 AddStep<ci::configuration::StepParseManifest>(
518 ci::configuration::StepParseManifest::ManifestLocation::RECOVERY,
519 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
520 AddStep<ci::filesystem::StepRecoverIcons>();
521 AddStep<ci::pkgmgr::StepRecoverParserPlugin>();
522 AddStep<ci::filesystem::StepRecoverManifest>();
523 AddStep<ci::filesystem::StepRecoverExternalStorage>();
524 AddStep<ci::filesystem::StepRecoverStorageDirectories>();
525 AddStep<ci::filesystem::StepRecoverGlobalAppSymlinks>();
526 AddStep<ci::filesystem::StepRecoverFiles>();
527 AddStep<ci::mount::StepMountRecover>();
528 AddStep<ci::filesystem::StepRecoverChangeOwner>();
529 AddStep<ci::pkgmgr::StepRecoverApplication>();
530 AddStep<ci::security::StepRecoverTrustAnchor>();
531 AddStep<ci::security::StepRecoverSecurity>();
534 void AppInstaller::MountInstallSteps() {
535 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
536 AddStep<ci::recovery::StepCreateRecoveryFile>();
537 AddStep<ci::mount::StepMountUnpacked>();
538 AddStep<ci::configuration::StepParseManifest>(
539 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
540 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
541 AddStep<ci::configuration::StepCheckInstallLocation>();
542 AddStep<ci::pkgmgr::StepCheckInstallable>();
543 AddStep<ci::configuration::StepParsePreload>();
544 AddStep<ci::pkgmgr::StepCheckRestriction>();
545 AddStep<ci::configuration::StepCheckTizenVersion>();
546 AddStep<ci::security::StepSignature>(true);
547 AddStep<ci::security::StepRollbackInstallationSecurity>();
548 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
549 AddStep<ci::mount::StepMountInstall>();
550 AddStep<ci::filesystem::StepCopyTep>();
551 AddStep<ci::filesystem::StepCreateIcons>();
552 AddStep<ci::pkgmgr::StepRegisterApplication>();
553 AddStep<ci::security::StepRegisterTrustAnchor>(
554 ci::security::StepRegisterTrustAnchor::RegisterType::INSTALL);
555 AddStep<ci::security::StepPrivacyPrivilege>(
556 ci::security::StepPrivacyPrivilege::ActionType::Install);
557 AddStep<ci::security::StepRegisterSecurity>();
558 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
559 AddStep<ci::mount::StepUnmount>();
560 AddStep<ci::filesystem::StepCreateStorageDirectories>();
561 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
562 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
565 void AppInstaller::MountUpdateSteps() {
566 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
567 AddStep<ci::recovery::StepCreateRecoveryFile>();
568 AddStep<ci::mount::StepMountUnpacked>();
569 AddStep<ci::configuration::StepParseManifest>(
570 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
571 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
572 AddStep<ci::configuration::StepParseManifest>(
573 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
574 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
575 AddStep<ci::configuration::StepCheckInstallLocation>();
576 AddStep<ci::pkgmgr::StepCheckUpgradable>();
577 AddStep<ci::configuration::StepParsePreload>();
578 AddStep<ci::configuration::StepCheckTizenVersion>();
579 AddStep<ci::security::StepSignature>(true);
580 AddStep<ci::security::StepCheckOldCertificate>();
581 AddStep<ci::configuration::StepBlockCrossUpdate>();
582 AddStep<ci::security::StepRevokeTrustAnchor>();
583 AddStep<ci::pkgmgr::StepKillApps>();
584 AddStep<ci::backup::StepBackupManifest>();
585 AddStep<ci::backup::StepBackupIcons>();
586 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
587 AddStep<ci::mount::StepMountUpdate>();
588 AddStep<ci::filesystem::StepUpdateTep>();
589 AddStep<ci::filesystem::StepCreateIcons>();
590 AddStep<ci::pkgmgr::StepUpdateApplication>();
591 AddStep<ci::security::StepRegisterTrustAnchor>(
592 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
593 AddStep<ci::security::StepPrivacyPrivilege>(
594 ci::security::StepPrivacyPrivilege::ActionType::Update);
595 AddStep<ci::security::StepUpdateSecurity>();
596 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
597 AddStep<ci::mount::StepUnmount>();
598 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
599 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>(true);
600 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
603 void AppInstaller::ManifestDirectInstallSteps() {
604 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
605 AddStep<ci::configuration::StepParseManifest>(
606 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
607 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
608 AddStep<ci::pkgmgr::StepCheckInstallable>();
609 AddStep<ci::mount::StepCheckMountPath>();
610 AddStep<ci::configuration::StepParsePreload>();
611 AddStep<ci::configuration::StepCheckTizenVersion>();
612 AddStep<ci::security::StepSignature>(true);
613 AddStep<ci::security::StepRollbackInstallationSecurity>();
614 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
615 AddStep<ci::pkgmgr::StepRegisterApplication>();
616 AddStep<ci::security::StepRegisterTrustAnchor>(
617 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
618 AddStep<ci::security::StepPrivacyPrivilege>(
619 ci::security::StepPrivacyPrivilege::ActionType::Install);
620 AddStep<ci::security::StepRegisterSecurity>();
621 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
622 AddStep<ci::filesystem::StepCreateStorageDirectories>();
623 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
624 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
627 void AppInstaller::ManifestDirectUpdateSteps() {
628 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
629 AddStep<ci::configuration::StepParseManifest>(
630 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
631 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
632 AddStep<ci::pkgmgr::StepCheckUpgradable>();
633 AddStep<ci::mount::StepCheckMountPath>();
634 AddStep<ci::configuration::StepParsePreload>();
635 AddStep<ci::configuration::StepCheckTizenVersion>();
636 AddStep<ci::security::StepSignature>(true);
637 AddStep<ci::security::StepCheckOldCertificate>();
638 AddStep<ci::pkgmgr::StepKillApps>();
639 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
640 AddStep<ci::pkgmgr::StepUpdateApplication>();
641 AddStep<ci::security::StepRegisterTrustAnchor>(
642 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
643 AddStep<ci::security::StepPrivacyPrivilege>(
644 ci::security::StepPrivacyPrivilege::ActionType::Update);
645 AddStep<ci::security::StepRegisterSecurity>();
646 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
647 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
648 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
649 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
652 void AppInstaller::ManifestPartialInstallSteps() {
653 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
654 AddStep<ci::configuration::StepParseManifest>(
655 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
656 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
657 AddStep<ci::configuration::StepParsePreload>();
658 AddStep<ci::security::StepSignature>(false);
659 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
660 AddStep<ci::pkgmgr::StepRegisterApplication>();
661 AddStep<ci::security::StepRegisterTrustAnchor>(
662 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
663 AddStep<ci::security::StepPrivacyPrivilege>(
664 ci::security::StepPrivacyPrivilege::ActionType::Install);
665 AddStep<ci::security::StepRegisterSecurity>();
666 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Install);
667 AddStep<ci::filesystem::StepCreateStorageDirectories>();
668 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
671 void AppInstaller::ManifestPartialUpdateSteps() {
672 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
673 AddStep<ci::configuration::StepParseManifest>(
674 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
675 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
676 AddStep<ci::configuration::StepParsePreload>();
677 AddStep<ci::security::StepSignature>(false);
678 AddStep<ci::security::StepCheckOldCertificate>();
679 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
680 AddStep<ci::pkgmgr::StepKillApps>();
681 AddStep<ci::pkgmgr::StepUpdateApplication>();
682 AddStep<ci::security::StepRegisterTrustAnchor>(
683 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
684 AddStep<ci::security::StepPrivacyPrivilege>(
685 ci::security::StepPrivacyPrivilege::ActionType::Update);
686 AddStep<ci::security::StepRegisterSecurity>();
687 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
688 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
689 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
692 void AppInstaller::PartialUninstallSteps() {
693 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
694 AddStep<ci::pkgmgr::StepCheckRemovable>();
695 AddStep<ci::pkgmgr::StepCheckForceClean>();
696 AddStep<ci::configuration::StepParseManifest>(
697 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
698 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
699 AddStep<ci::configuration::StepCheckInstallLocation>();
700 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
701 AddStep<ci::filesystem::StepOptionalAcquireExternalStorage>();
702 AddStep<ci::filesystem::StepRemovePerUserStorageDirectories>();
703 AddStep<ci::pkgmgr::StepUnregisterApplication>();
704 AddStep<ci::security::StepUnregisterTrustAnchor>();
705 AddStep<ci::security::StepPrivacyPrivilege>(
706 ci::security::StepPrivacyPrivilege::ActionType::Uninstall);
707 AddStep<ci::security::StepRevokeSecurity>();
708 AddStep<ci::pkgmgr::StepRunParserPlugin>(
709 ci::Plugin::ActionType::Uninstall);
712 void AppInstaller::ReadonlyUpdateInstallSteps() {
713 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
714 AddStep<ci::recovery::StepCreateRecoveryFile>();
715 AddStep<ci::filesystem::StepUnzip>();
716 AddStep<ci::configuration::StepParseManifest>(
717 ci::configuration::StepParseManifest::ManifestLocation::PACKAGE,
718 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
719 AddStep<ci::configuration::StepSwitchReadonlyMode>();
720 AddStep<ci::configuration::StepParseManifest>(
721 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
722 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
723 AddStep<ci::configuration::StepSwitchReadonlyMode>();
724 AddStep<ci::configuration::StepCheckInstallLocation>();
725 AddStep<ci::pkgmgr::StepCheckUpgradable>();
726 AddStep<ci::configuration::StepParsePreload>();
727 AddStep<ci::configuration::StepCheckTizenVersion>();
728 AddStep<ci::security::StepSignature>(true);
729 AddStep<ci::security::StepCheckOldCertificate>();
730 AddStep<ci::configuration::StepBlockCrossUpdate>();
731 AddStep<ci::pkgmgr::StepKillApps>();
732 AddStep<ci::security::StepRevokeTrustAnchor>();
733 AddStep<ci::filesystem::StepCopy>();
734 AddStep<ci::filesystem::StepCopyTep>();
735 AddStep<ci::filesystem::StepCreateIcons>();
736 AddStep<ci::pkgmgr::StepUpdateApplication>();
737 AddStep<ci::security::StepRegisterTrustAnchor>(
738 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
739 AddStep<ci::security::StepPrivacyPrivilege>(
740 ci::security::StepPrivacyPrivilege::ActionType::Update);
741 AddStep<ci::security::StepUpdateSecurity>();
742 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
743 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
744 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
745 AddStep<ci::filesystem::StepCreateGlobalAppSymlinks>();
748 void AppInstaller::ReadonlyUpdateUninstallSteps() {
749 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
750 AddStep<ci::configuration::StepParseManifest>(
751 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
752 ci::configuration::StepParseManifest::StoreLocation::BACKUP);
753 AddStep<ci::configuration::StepSwitchReadonlyMode>();
754 AddStep<ci::configuration::StepParseManifest>(
755 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
756 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
757 AddStep<ci::pkgmgr::StepCheckUpgradable>();
758 AddStep<ci::configuration::StepParsePreload>();
759 AddStep<ci::security::StepSignature>(false);
760 AddStep<ci::configuration::StepSwitchReadonlyMode>();
761 AddStep<ci::pkgmgr::StepKillApps>();
762 AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
763 AddStep<ci::security::StepRevokeTrustAnchor>();
764 AddStep<ci::pkgmgr::StepUpdateApplication>();
765 AddStep<ci::security::StepRegisterTrustAnchor>(
766 ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
767 AddStep<ci::security::StepPrivacyPrivilege>(
768 ci::security::StepPrivacyPrivilege::ActionType::Update);
769 AddStep<ci::filesystem::StepRemoveFiles>();
770 AddStep<ci::filesystem::StepRemoveZipImage>();
771 AddStep<ci::filesystem::StepRemoveIcons>();
772 AddStep<ci::filesystem::StepRemoveTep>();
773 AddStep<ci::filesystem::StepRemoveUserData>();
774 AddStep<ci::configuration::StepSwitchReadonlyMode>();
775 AddStep<ci::security::StepUpdateSecurity>();
776 AddStep<ci::pkgmgr::StepRemoveManifest>();
777 AddStep<ci::pkgmgr::StepRunParserPlugin>(ci::Plugin::ActionType::Upgrade);
778 AddStep<ci::filesystem::StepUpdateStorageDirectories>();
781 void AppInstaller::DisablePkgSteps() {
782 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
783 AddStep<ci::configuration::StepParseManifest>(
784 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
785 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
786 AddStep<ci::pkgmgr::StepKillApps>();
787 AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
788 ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable);
789 AddStep<ci::pkgmgr::StepRunParserPlugin>(
790 ci::Plugin::ActionType::Uninstall);
793 void AppInstaller::EnablePkgSteps() {
794 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
795 AddStep<ci::configuration::StepParseManifest>(
796 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
797 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
798 AddStep<ci::pkgmgr::StepUpdatePkgDisableInfo>(
799 ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable);
800 AddStep<ci::pkgmgr::StepRunParserPlugin>(
801 ci::Plugin::ActionType::Install);
804 void AppInstaller::MigrateExtImgSteps() {
805 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
806 AddStep<ci::security::StepMigrateLegacyExtImage>();
807 AddStep<ci::filesystem::StepChangeOwnershipAndPermission>();
810 void AppInstaller::RecoverDBSteps() {
811 AddStep<ci::configuration::StepConfigure>(pkgmgr_);
812 AddStep<ci::configuration::StepParseManifest>(
813 ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
814 ci::configuration::StepParseManifest::StoreLocation::NORMAL);
815 AddStep<ci::pkgmgr::StepCheckInstallable>();
816 AddStep<ci::mount::StepCheckMountPath>();
817 AddStep<ci::configuration::StepParsePreload>();
818 AddStep<ci::security::StepGetPrivilegeLevel>();
819 AddStep<ci::pkgmgr::StepRegisterApplication>();
822 void AppInstaller::UnknownSteps() {
823 AddStep<configuration::StepFail>();
826 void AppInstaller::HandleStepError(Step::Status result,
827 const std::string& error) {
831 pi_->SendError(result, error, context_->pkg_type.get(),
832 context_->pkgid.get());
835 bool AppInstaller::SendStartIfNotSent(bool is_skippable) {
839 if (pi_->state() != PkgmgrSignal::State::NOT_SENT)
842 if (context_->pkgid.get().empty() && is_skippable)
845 // set request type before sending start signal
846 pi_->SetRequestType(context_->request_type.get());
847 pi_->SendStarted(context_->pkg_type.get(), context_->pkgid.get());
854 void AppInstaller::SendProgress(int progress) {
855 // send START signal as soon as possible if not sent
856 if (!SendStartIfNotSent(true))
859 // send installation progress
860 pi_->SendProgress(progress,
861 context_->pkg_type.get(), context_->pkgid.get());
864 void AppInstaller::SendFinished(Step::Status process_status) {
865 if (!SendStartIfNotSent(false))
868 pi_->SendFinished(process_status,
869 context_->pkg_type.get(),
870 context_->pkgid.get());
873 Step::Status AppInstaller::SafeExecute(std::unique_ptr<Step> const& step_ptr,
874 Step::Status (Step::*method)(),
876 Step::Status process_status = Step::Status::OK;
878 TTRACE(TTRACE_TAG_APP, "%s_%s", step_ptr->name(), name.c_str());
879 process_status = ((*step_ptr).*method)();
880 } catch (const std::exception& err) {
881 LOG(ERROR) << "Exception occurred in " << name.c_str() << "(): "
882 << err.what() << " in step: " << step_ptr->name();
883 process_status = Step::Status::ERROR;
885 return process_status;
888 } // namespace common_installer