Woof.LinuxAdmin 6.1.2

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Woof.LinuxAdmin --version 6.1.2                
NuGet\Install-Package Woof.LinuxAdmin -Version 6.1.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Woof.LinuxAdmin" Version="6.1.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Woof.LinuxAdmin --version 6.1.2                
#r "nuget: Woof.LinuxAdmin, 6.1.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Woof.LinuxAdmin as a Cake Addin
#addin nuget:?package=Woof.LinuxAdmin&version=6.1.2

// Install Woof.LinuxAdmin as a Cake Tool
#tool nuget:?package=Woof.LinuxAdmin&version=6.1.2                

Woof.LinuxAdmin

.NET extension created by CodeDog

Distributed under MIT License. (c)2021 by CodeDog, All rights reserved.


About

Some advanced application features require some system administration tasks to be performed before they can be used.

The common tasks are:

  • Installing and controlling system services,
  • Using per-user or per-system data protection,
  • Data protection key management,
  • System user management,
  • Application permission management.

When the code is executed with administrative privileges, it makes sense that it could configure the target system automatically without requiring much additional system administration.

As the .NET platform already contains most of the tools itself, they are currently available for Windows OS only. Woof.LinuxAdmin provides unified API for both Linux and Windows.

Linux user information, group information, file system entry information: they are all supported by .NET only partially, translated to their Windows equivalents.

Woof.LinuxAdmin provides native Linux types:

  • UserInfo,
  • GroupInfo,
  • StatInfo.

The types are fully managed ones, not directly compatible with the corresponding Linux kernel structures.

Linux file system entry binary mode IS identical with the uint type used in the kernel.

Of course all file system manipulation tools can operate both on single entries and entire directory trees.

To register, unregister or control system services use Woof.ServiceInstaller module. To manage protected or plain JSON configuration files use Woof.Config module. They alredy have Woof.LinuxAdmin dependency. It is necessary because both tasks require some target system configuration access.

They can be safely used both on Linux and Windows.

Design

The core of the library is Linux native Syscall class. It contains the signatures for libc system calls. There is a minimalistic set of features used, just to enable basic Linux file system operations.

Original naming convention is dropped for .NET naming and signatures style.

The managed functions sit in Linux static class.

There's also a FileSystem static class containing CopyDirectoryContent() helper.

For convenience, there is Shell class with Exec method to simplify executing shell commands and getting their output.

The functions mostly return bool values indicating that the operation was successful.

AddSystemUserAsync(), AddSystemGroupAsync() methods

The only asynchronous methods in Linux static class. They are asynchronous since they use shell to call useradd and groupadd.

Chmod(), ChmodR(), Chown(), ChownR()

Chmod changes permissions on a file system entry. You can provide permissions as follows:

  • octal string, like "664" (absolute read/write for user and group, read for others)
  • relative string, like "ug+rw,o-w", "+x" and so on,
  • binary - as uint Linux mode.

Conversions between string, uint and Permissions are made implicitly.

Special permission "X" also works, setting executable bit if the entry is a directory or has at least one executable bit set.

It is important, that the execute permissions cannot be set on unreadable entries. When the entry doesn't have a read permission for the specified target it's execute bit will not be set for that target.

Chown changes an owner of a file system entry.

To change permissions and / or owner for all entries in a directory including the directory itself use ChmodR() and ChownR() methods.

Other tools

For the administration it's useful to check if the program has administrative privileges. To do so use CurrentUser.IsAdmin property.

You can even check if the program was run on Linux with sudo command, and not from the root account, to do so get the CurrentUser.IsSudo property.

To get detailed information about the current Linux user use:

  • Linux.CurrentProcessUser,
  • CurrentUser.BehindSudo

It can be useful to access the user's Directory (Linux home).

Use StatInfo for detailed Linux file system entry properties, use UserInfo for detailed user information, user GroupInfo for detailed group information including its members.

Linux.HomeDirectory contains home directory of the current user, also in case if the user run the program with sudo.

You can also resolve paths containing ~ using the HomeDirectory property with Linux.ResolveUserPath().

On both Linux and Windows system you can execute shell commands in various ways.

You can get the commands output, ignore the output, throw on errors, ignore errors, execute both synchronously and asynchronously.

Just create ShellCommand instance and execute one of its methods.

You can also execute the shell commands using Process.Start() method since ShellCommand class is implictly convertible to ProcessStartInfo.

Performance hint

To set absolute permissions use octal strings (or binary) to skip calling stat on each entry.

Security

The package does not use unsafe code and no p/invoke implementation details are public. However, caution is advised when using Shell.ExecAsync, because when running on administrative account it gives the application the full control over the target system.

Compatibility

The package is compatible with .NET 5.0 or newer. Tested on Ubuntu 20 and Windows 11. In case of a compatibility issue - create an issue on GitHub.

This package is not compatible with MacOS. If the MacOS support is needed, please create an issue on GitHub.


Disclaimer

Woof Toolkit is a work in progress in constant development, however it's carefully maintained with production code quality.

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Woof.LinuxAdmin:

Package Downloads
Woof.ServiceInstaller

Registers and unregisters a project executable as either Windows Service or systemd deamon. Works both on Windows and Linux.

Woof.DataProtection.Linux

Provides data protection API for Linux.

GitHub repositories

This package is not used by any popular GitHub repositories.

FIX: I/O redirection issues, Windows cmd code page issue.