systemctl daemon-reload
if [ $1 = 1 ]; then
# installation
- systemctl start security-manager.socket
- systemctl start security-manager.service
+ security-manager-cmd --init-db
+ systemctl start security-manager.service security-manager.socket
fi
if [ $1 = 2 ]; then
# update
- systemctl stop security-manager.socket
- systemctl stop security-manager.service
- systemctl start security-manager.socket
- systemctl start security-manager.service
+ systemctl stop security-manager.service security-manager.socket
+ security-manager-cmd --init-db
+ systemctl start security-manager.service security-manager.socket
fi
chsmack -a System %{TZ_SYS_DB}/.security-manager.db
# @(kernel thread) can get access to internet privilege
cyad --set-policy --bucket=MANIFESTS_GLOBAL --client="@" --user=* --privilege="http://tizen.org/privilege/internet" --type=ALLOW
+# Stop the service to prevent concurrent db access
+systemctl stop security-manager.service security-manager.socket \
+ || echo Failed to stop security-manager systemd service, continuing regardless
+
# Load privilege-group mappings
(
echo "BEGIN;"
done
echo "COMMIT;"
) | sqlite3 "$DB_FILE"
+
+# Start the service with the modified database
+systemctl start security-manager.service security-manager.socket \
+ || echo Failed to start security-manager systemd service, continuing regardless
#include <config.h>
#include <filesystem.h>
+#include <privilege_db.h>
namespace po = boost::program_options;
("manage-users,m", po::value<std::string>(), "add or remove user, parameter is either a/add or r/remove")
("manage-privilege,o", po::value<std::string>(), "allow or deny privilege, parameter is either a/allow or d/deny")
("backup,b", "make a backup of the database file")
+ ("init-db,d", "initialize the security-manager database as when running the manager")
;
return opts;
}
} else if (vm.count("backup")) {
if (SECURITY_MANAGER_SUCCESS == FS::overwriteFile(Config::privilegeDbPath, Config::privilegeDbFallbackPath))
return EXIT_SUCCESS;
+ } else if (vm.count("init-db")) {
+ SecurityManager::initDb();
+ return EXIT_SUCCESS;
} else {
std::cout << "No command argument was given." << std::endl;
usage(std::string(argv[0]));
void applyFallbackDb(DB::SqlConnection &conn, const std::string &dbPath, const std::string &roFallbackPath) {
if (SECURITY_MANAGER_SUCCESS != FS::overwriteFile(roFallbackPath, dbPath))
- throwDbInitEx("Error overwriting database with fallback: " + roFallbackPath);
+ throwDbInitEx("Error overwriting database " + dbPath + " with fallback: " + roFallbackPath);
if (SECURITY_MANAGER_SUCCESS != FS::truncateFile(genJournalPath(dbPath)))
throwDbInitEx("Error truncating journal");
tryCatchDbInit([&]{ connectMigrateVerify(conn, dbPath); });
}
+
+void initDb(DB::SqlConnection &conn, const std::string &path, const std::string &roFallbackPath) {
+ removeBrokenFlagFile(path);
+ if (!FS::fileStatus(path)) {
+ createBrokenFlagFile(path);
+ LogError("Database file " + path + " missing, attempting fallback");
+ applyFallbackDb(conn, path, roFallbackPath);
+ } else try {
+ connectMigrateVerify(conn, path);
+ } catch (DB::SqlConnection::Exception::Base &e) {
+ createBrokenFlagFile(path);
+ LogError("Database initialization error (" << e.DumpToString() << "), attempting fallback");
+ tryCatchDbInit([&]{ conn.Disconnect(); });
+ applyFallbackDb(conn, path, roFallbackPath);
+ }
+}
} //namespace
std::string genJournalPath(const std::string &dbPath) {
return dbPath + "-journal";
}
+void initDb() {
+ DB::SqlConnection conn;
+ initDb(conn, Config::privilegeDbPath, Config::privilegeDbFallbackPath);
+}
+
PrivilegeDb::PrivilegeDb()
: PrivilegeDb(Config::privilegeDbPath, Config::privilegeDbFallbackPath)
{
PrivilegeDb::PrivilegeDb(const std::string &path, const std::string &roFallbackPath)
{
- removeBrokenFlagFile(path);
- if (!FS::fileStatus(path)) {
- createBrokenFlagFile(path);
- LogError("Database file missing, attempting fallback");
- applyFallbackDb(mSqlConnection, path, roFallbackPath);
- } else try {
- connectMigrateVerify(mSqlConnection, path);
- } catch (DB::SqlConnection::Exception::Base &e) {
- createBrokenFlagFile(path);
- LogError("Database initialization error (" << e.DumpToString() << "), attempting fallback");
- tryCatchDbInit([&]{ mSqlConnection.Disconnect(); });
- applyFallbackDb(mSqlConnection, path, roFallbackPath);
- }
+ initDb(mSqlConnection, path, roFallbackPath);
tryCatchDbInit([&]{ initDataCommands(); });
}