Skip to content

Rewrite users service from ruby to rust#2937

Merged
mchf merged 21 commits intomasterfrom
users_service
Jan 13, 2026
Merged

Rewrite users service from ruby to rust#2937
mchf merged 21 commits intomasterfrom
users_service

Conversation

@mchf
Copy link
Copy Markdown
Contributor

@mchf mchf commented Dec 11, 2025

Problem

Current stable version of Agama is mixture of several languages and technologies. Users service was originally written in ruby. As we later on decided to prefer rust for various reasons, it makes sense to rewrite users service to rust.

Solution

This is initial PR for transition of users service to rust. Currently handles GET, PUT, PATCH /config and GET /proposal. However, no install action yet.

Testing

  • Tested manually

@mchf mchf force-pushed the users_service branch 3 times, most recently from a186334 to 4fb73c9 Compare December 16, 2025 12:43
@mchf mchf force-pushed the users_service branch 3 times, most recently from 09b2013 to f98a192 Compare January 6, 2026 18:13
@mchf
Copy link
Copy Markdown
Contributor Author

mchf commented Jan 8, 2026

Current state as a picture (curl -k -H @headers.txt -X GET $AGAMA_URL/api/v2/system):
agama-users
once I publish even set config message there will also appear password (with values {type: hashed} or {type: plain, value: "whatever set by user"}, field next to name or may be slightly different - until it is set to stone, it can vary ;-)

Copy link
Copy Markdown
Contributor

@imobachgs imobachgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The infrastructure of the service looks good, but the logic is wrong. Agama keeps the configuration for the first user (under the user key) and the root (using the root key). There is nothing like a list of users.

Additionally, it does not read the list of users from the underlying system. It just uses its own configuration.

Please, check User and root for further information about the format.

@mchf
Copy link
Copy Markdown
Contributor Author

mchf commented Jan 9, 2026

Set users config using query:

curl -X PATCH \
  -H @headers.txt \
  -H "Content-Type: application/json" \
  -d '{"update": {"product": { "id": "Tumbleweed" }, "users": { "users": { "user": { "fullName": "First User", "userName": "user", "password": "linux"}}}}}' \
  -k \
  $AGAMA_URL/api/v2/config

result:
agama-set_users-result

Query for reading the config was:

curl -k -H @headers.txt -X GET $AGAMA_URL/api/v2/config

@mchf
Copy link
Copy Markdown
Contributor Author

mchf commented Jan 9, 2026

Schema fixed to work with:

curl -X PATCH \
  -H @headers.txt \
  -H "Content-Type: application/json" \
  -d '{"update": {"product": { "id": "Tumbleweed" }, "user": { "fullName": "First User", "userName": "user", "password": "linux"}}}' \
  -k \
  $AGAMA_URL/api/v2/config

Get query on config answers with:

{"product":{"id":"Tumbleweed"},"user":{"fullName":"First User","password":"linux","hashedPassword":false,"userName":"user"}}

Copy link
Copy Markdown
Contributor

@imobachgs imobachgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now it is looking good. But, please, update the description (now it only handles the configuration). We can work on the remaining stuff on a separate PR.

@mchf mchf marked this pull request as ready for review January 9, 2026 18:15
@mchf mchf requested a review from imobachgs January 9, 2026 18:30
@mchf mchf force-pushed the users_service branch 2 times, most recently from b2dc51f to d848042 Compare January 9, 2026 19:14
@mchf
Copy link
Copy Markdown
Contributor Author

mchf commented Jan 9, 2026

Rebased on top of current api-v2 branch

@coveralls
Copy link
Copy Markdown

coveralls commented Jan 9, 2026

Coverage Status

coverage: 72.578%. remained the same
when pulling 5c863ff on users_service
into 11a30de on master.

@mchf mchf force-pushed the users_service branch 4 times, most recently from c3e82f3 to 212964c Compare January 11, 2026 19:17
@mchf mchf changed the base branch from api-v2 to master January 12, 2026 10:45
@mchf mchf force-pushed the users_service branch 2 times, most recently from d8fcf5f to 4a061ec Compare January 12, 2026 12:35
Copy link
Copy Markdown
Contributor

@imobachgs imobachgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still some confusion with UserSettings and Config. Please, check the comments.

@mchf mchf requested a review from imobachgs January 13, 2026 08:59
Copy link
Copy Markdown
Contributor

@imobachgs imobachgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, we are almost there. Just minor comments. Otherwise it is looking good :-)

@mchf mchf requested a review from imobachgs January 13, 2026 13:21
@mchf mchf merged commit 0ec2c64 into master Jan 13, 2026
15 checks passed
@mchf mchf deleted the users_service branch January 13, 2026 13:31
ancorgs added a commit that referenced this pull request Jan 14, 2026
## Problem

#2937 introduced a new API to configure authentication (root and the
first non-root user). But the web interface is still not adapted

## Solution

This adapts the web interface to use the new API.

It also adds a new entry about Authentication for the installation
summary, making it possible to reach the corresponding section of the
UI.

## Hack alert

To make sure the UI is refreshed after discarding the first user, the
page displaying that user gets the information from the proposal,
instead of getting it from the configuration.

Once config is fixed in the backend to also emit events on every change
that could be reverted. It is done in a separate commit so ease the
task.

## Bonus

This pull request also include fixes for RegistrationSummary and
StorageSumary

## Disclaimer

The `hasIssues` flag of `UsersSummary` is based on the existence of
issues in the scope. Currently such issues are only generated when the
service is started. If the configuration is then fixed (let's say a
password is set for root) and broken again (let's say the root password
is removed afterwards), then the issue will not be re-generated and the
interface will not display the corresponding warning icon.

That needs to be fixed in the backend.

## Testing

- Unit tests adapted. Unit tests that were commented out were brought
back to life.
- Tested manually

## Screenshots

<img width="1021" height="556" alt="users1b"
src="https://github.com/user-attachments/assets/a29019ae-5c5d-4504-be0e-c82cb2ac11c0"
/>

<img width="1017" height="575" alt="users2b"
src="https://github.com/user-attachments/assets/fc7d3aed-47ad-4f12-987c-d3ba7a606e28"
/>

<img width="479" height="674" alt="users-error"
src="https://github.com/user-attachments/assets/2b1e4a0a-e512-4ebd-bf5e-590ead4b5bf0"
/>
imobachgs added a commit that referenced this pull request Jan 14, 2026
## Problem

So far setting users configuration was re-implemented to rust
(#2937), but no data were
written.

## Solution

Implemented Install message handler in user's service


## Testing

- *Tested manually*

## TODO:
- ~~set user's details (like full name).~~
- ~~store ssh keys for root~~
@imobachgs imobachgs mentioned this pull request Jan 14, 2026
imobachgs added a commit that referenced this pull request Jan 14, 2026
@imobachgs imobachgs mentioned this pull request Mar 17, 2026
imobachgs added a commit that referenced this pull request Mar 17, 2026
Prepare to release version 19.

* #1829
* #2508
* #2772
* #2818
* #2826
* #2848
* #2860
* #2863
* #2864
* #2866
* #2867
* #2869
* #2870
* #2871
* #2872
* #2873
* #2874
* #2875
* #2876
* #2877
* #2880
* #2881
* #2882
* #2884
* #2885
* #2886
* #2891
* #2892
* #2893
* #2894
* #2895
* #2896
* #2897
* #2898
* #2899
* #2900
* #2901
* #2902
* #2903
* #2904
* #2908
* #2909
* #2910
* #2912
* #2913
* #2914
* #2915
* #2916
* #2917
* #2918
* #2920
* #2921
* #2923
* #2924
* #2926
* #2928
* #2929
* #2930
* #2933
* #2934
* #2935
* #2936
* #2937
* #2938
* #2939
* #2942
* #2943
* #2944
* #2945
* #2946
* #2947
* #2948
* #2949
* #2950
* #2951
* #2952
* #2954
* #2955
* #2956
* #2957
* #2958
* #2959
* #2960
* #2961
* #2963
* #2964
* #2965
* #2967
* #2968
* #2969
* #2970
* #2971
* #2972
* #2974
* #2975
* #2977
* #2978
* #2980
* #2981
* #2982
* #2983
* #2984
* #2988
* #2989
* #2990
* #2991
* #2992
* #2993
* #2994
* #2995
* #2996
* #2997
* #2998
* #2999
* #3000
* #3001
* #3002
* #3004
* #3005
* #3006
* #3007
* #3008
* #3009
* #3011
* #3012
* #3013
* #3014
* #3015
* #3016
* #3018
* #3019
* #3020
* #3021
* #3022
* #3023
* #3024
* #3025
* #3026
* #3027
* #3028
* #3029
* #3030
* #3031
* #3033
* #3034
* #3035
* #3036
* #3037
* #3039
* #3040
* #3041
* #3042
* #3043
* #3044
* #3045
* #3046
* #3047
* #3048
* #3049
* #3050
* #3051
* #3052
* #3053
* #3054
* #3055
* #3056
* #3057
* #3058
* #3060
* #3061
* #3062
* #3063
* #3064
* #3065
* #3066
* #3067
* #3068
* #3069
* #3070
* #3071
* #3072
* #3073
* #3074
* #3075
* #3076
* #3077
* #3078
* #3079
* #3086
* #3087
* #3088
* #3089
* #3090
* #3091
* #3092
* #3093
* #3094
* #3095
* #3096
* #3097
* #3098
* #3099
* #3100
* #3101
* #3102
* #3103
* #3104
* #3105
* #3106
* #3107
* #3108
* #3109
* #3110
* #3112
* #3113
* #3114
* #3115
* #3116
* #3117
* #3118
* #3119
* #3120
* #3122
* #3123
* #3124
* #3127
* #3128
* #3129
* #3130
* #3131
* #3133
* #3134
* #3135
* #3136
* #3137
* #3138
* #3139
* #3140
* #3141
* #3142
* #3143
* #3144
* #3145
* #3146
* #3147
* #3148
* #3149
* #3150
* #3151
* #3152
* #3153
* #3154
* #3155
* #3157
* #3158
* #3159
* #3160
* #3161
* #3162
* #3163
* #3164
* #3165
* #3166
* #3167
* #3168
* #3169
* #3170
* #3174
* #3175
* #3176
* #3177
* #3178
* #3179
* #3181
* #3182
* #3184
* #3185
* #3186
* #3188
* #3189
* #3190
* #3191
* #3192
* #3194
* #3195
* #3196
* #3197
* #3198
* #3199
* #3200
* #3201
* #3202
* #3203
* #3205
* #3206
* #3208
* #3209
* #3210
* #3213
* #3214
* #3215
* #3216
* #3217
* #3218
* #3219
* #3220
* #3222
* #3223
* #3224
* #3225
* #3226
* #3227
* #3228
* #3229
* #3230
* #3231
* #3232
* #3233
* #3234
* #3235
* #3236
* #3237
* #3238
* #3239
* #3240
* #3241
* #3242
* #3243
* #3244
* #3246
* #3247
* #3248
* #3250
* #3251
* #3252
* #3253
* #3254
* #3255
* #3256
* #3257
* #3258
* #3259
* #3260
* #3261
* #3262
* #3263
* #3265
* #3266
* #3267
* #3268
* #3269
* #3270
* #3271
* #3272
* #3273
* #3274
* #3275
* #3276
* #3277
* #3278
* #3279
* #3280
* #3281
* #3282
* #3283
* #3284
* #3285
* #3286
* #3287
* #3288
* #3289
* #3290
* #3291
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants