Calamares::JobResult DummyCppJob::exec() { // Ported from dummypython QProcess::execute( "/bin/sh", QStringList() << "-c" << "touch ~/calamares-dummycpp" ); QString accumulator = QDateTime::currentDateTimeUtc().toString( Qt::ISODate ) + '\n'; accumulator += QStringLiteral( "Calamares version: " ) + CALAMARES_VERSION_SHORT + '\n'; accumulator += QStringLiteral( "This job's name: " ) + prettyName() + '\n'; accumulator += QStringLiteral( "Configuration map: %1\n" ).arg( variantMapToString( m_configurationMap ) ); accumulator += QStringLiteral( " *** globalstorage test ***\n" ); Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage(); accumulator += QStringLiteral( "lala: " ) + (globalStorage->contains( "lala" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; accumulator += QStringLiteral( "foo: " ) + (globalStorage->contains( "foo" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; accumulator += QStringLiteral( "count: " ) + QString::number( globalStorage->count() ) + '\n'; globalStorage->insert( "item2", "value2" ); globalStorage->insert( "item3", 3 ); accumulator += QStringLiteral( "keys: %1\n" ).arg( globalStorage->keys().join( ',' ) ); accumulator += QStringLiteral( "remove: %1\n" ).arg( QString::number( globalStorage->remove( "item2" ) ) ); accumulator += QStringLiteral( "values: %1 %2 %3\n" ).arg( globalStorage->value( "foo" ).toString(), globalStorage->value( "item2" ).toString(), globalStorage->value( "item3" ).toString() ); emit progress( 0.1 ); cDebug() << "[DUMMYCPP]: " << accumulator; globalStorage->debugDump(); emit progress( 0.5 ); QThread::sleep( 3 ); return Calamares::JobResult::ok(); }
QString atReplacements( QString s ) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QString root( "/" ); QString user; if ( gs && gs->contains( "rootMountPoint" ) ) root = gs->value( "rootMountPoint" ).toString(); if ( gs && gs->contains( "username" ) ) user = gs->value( "username" ).toString(); return s.replace( "@@ROOT@@", root ).replace( "@@USER@@", user ); }
static FileSystem::Type getDefaultFileSystemType() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); FileSystem::Type defaultFS = FileSystem::Ext4; if ( gs->contains( "defaultFileSystemType" ) ) { PartUtils::findFS( gs->value( "defaultFileSystemType" ).toString(), &defaultFS); if ( defaultFS == FileSystem::Unknown ) defaultFS = FileSystem::Ext4; } return defaultFS; }
QString targetPrefix() { if ( CalamaresUtils::System::instance()->doChroot() ) { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( gs && gs->contains( "rootMountPoint" ) ) { QString r = gs->value( "rootMountPoint" ).toString(); if ( !r.isEmpty() ) return r; else cDebug() << "RootMountPoint is empty"; } else { cDebug() << "No rootMountPoint defined, preserving files to '/'"; } } return QLatin1Literal( "/" ); }
Calamares::JobResult CreateUserJob::exec() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); QDir destDir( gs->value( "rootMountPoint" ).toString() ); if ( gs->contains( "sudoersGroup" ) && !gs->value( "sudoersGroup" ).toString().isEmpty() ) { QFileInfo sudoersFi( destDir.absoluteFilePath( "etc/sudoers.d/10-installer" ) ); if ( !sudoersFi.absoluteDir().exists() ) return Calamares::JobResult::error( tr( "Sudoers dir is not writable." ) ); QFile sudoersFile( sudoersFi.absoluteFilePath() ); if (!sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) return Calamares::JobResult::error( tr( "Cannot create sudoers file for writing." ) ); QString sudoersGroup = gs->value( "sudoersGroup" ).toString(); QTextStream sudoersOut( &sudoersFile ); sudoersOut << QString( "%%1 ALL=(ALL) ALL\n" ).arg( sudoersGroup ); if ( QProcess::execute( "chmod", { "440", sudoersFi.absoluteFilePath() } ) ) return Calamares::JobResult::error( tr( "Cannot chmod sudoers file." ) ); } QFileInfo groupsFi( destDir.absoluteFilePath( "etc/group" ) ); QFile groupsFile( groupsFi.absoluteFilePath() ); if ( !groupsFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) return Calamares::JobResult::error( tr( "Cannot open groups file for reading." ) ); QString groupsData = QString::fromLocal8Bit( groupsFile.readAll() ); QStringList groupsLines = groupsData.split( '\n' ); for ( QStringList::iterator it = groupsLines.begin(); it != groupsLines.end(); ++it ) { int indexOfFirstToDrop = it->indexOf( ':' ); it->truncate( indexOfFirstToDrop ); } foreach ( const QString& group, m_defaultGroups ) if ( !groupsLines.contains( group ) ) CalamaresUtils::System::instance()-> targetEnvCall( { "groupadd", group } ); QString defaultGroups = m_defaultGroups.join( ',' ); if ( m_autologin ) { QString autologinGroup; if ( gs->contains( "autologinGroup" ) && !gs->value( "autologinGroup" ).toString().isEmpty() ) autologinGroup = gs->value( "autologinGroup" ).toString(); else autologinGroup = QStringLiteral( "autologin" ); CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", autologinGroup } ); defaultGroups.append( QString( ",%1" ).arg( autologinGroup ) ); } int ec = CalamaresUtils::System::instance()-> targetEnvCall( { "useradd", "-m", "-s", "/bin/bash", "-U", "-G", defaultGroups, m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot create user %1." ) .arg( m_userName ), tr( "useradd terminated with error code %1." ) .arg( ec ) ); ec = CalamaresUtils::System::instance()->targetEnvCall( { "chfn", "-f", m_fullName, m_userName } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot set full name for user %1." ) .arg( m_userName ), tr( "chfn terminated with error code %1." ) .arg( ec ) ); ec = CalamaresUtils::System::instance()-> targetEnvCall( { "chown", "-R", QString( "%1:%2" ).arg( m_userName ) .arg( m_userName ), QString( "/home/%1" ).arg( m_userName ) } ); if ( ec ) return Calamares::JobResult::error( tr( "Cannot set home directory ownership for user %1." ) .arg( m_userName ), tr( "chown terminated with error code %1." ) .arg( ec ) ); return Calamares::JobResult::ok(); }
Calamares::JobResult CommandList::run() { QLatin1Literal rootMagic( "@@ROOT@@" ); QLatin1Literal userMagic( "@@USER@@" ); System::RunLocation location = m_doChroot ? System::RunLocation::RunInTarget : System::RunLocation::RunInHost; /* Figure out the replacement for @@ROOT@@ */ QString root = QStringLiteral( "/" ); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); bool needsRootSubstitution = findInCommands( *this, rootMagic ); if ( needsRootSubstitution && ( location == System::RunLocation::RunInHost ) ) { if ( !gs || !gs->contains( "rootMountPoint" ) ) { cError() << "No rootMountPoint defined."; return Calamares::JobResult::error( QCoreApplication::translate( "CommandList", "Could not run command." ), QCoreApplication::translate( "CommandList", "The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined." ) ); } root = gs->value( "rootMountPoint" ).toString(); } bool needsUserSubstitution = findInCommands( *this, userMagic ); if ( needsUserSubstitution && ( !gs || !gs->contains( "username" ) ) ) { cError() << "No username defined."; return Calamares::JobResult::error( QCoreApplication::translate( "CommandList", "Could not run command." ), QCoreApplication::translate( "CommandList", "The command needs to know the user's name, but no username is defined." ) ); } QString user = gs->value( "username" ).toString(); // may be blank if unset for ( CommandList::const_iterator i = cbegin(); i != cend(); ++i ) { QString processed_cmd = i->command(); processed_cmd.replace( rootMagic, root ).replace( userMagic, user ); bool suppress_result = false; if ( processed_cmd.startsWith( '-' ) ) { suppress_result = true; processed_cmd.remove( 0, 1 ); // Drop the - } QStringList shell_cmd { "/bin/sh", "-c" }; shell_cmd << processed_cmd; int timeout = i->timeout() >= 0 ? i->timeout() : m_timeout; ProcessResult r = System::runCommand( location, shell_cmd, QString(), QString(), timeout ); if ( r.getExitCode() != 0 ) { if ( suppress_result ) cDebug() << "Error code" << r.getExitCode() << "ignored by CommandList configuration."; else return r.explainProcess( processed_cmd, timeout ); } } return Calamares::JobResult::ok(); }