47cd7996 | 05-Oct-2022 |
John Wedig <johnwedig@google.com> |
Fix logic error for SecuredLocked EraseMethod
The handling for the SecuredLocked EraseMethod is missing a '!' operator. We want to lock the LUKS volume if it is NOT already locked.
Tested: Loaded e
Fix logic error for SecuredLocked EraseMethod
The handling for the SecuredLocked EraseMethod is missing a '!' operator. We want to lock the LUKS volume if it is NOT already locked.
Tested: Loaded eStoraged on a machine and exercised the SecuredLocked code path to confirm the expected behavior, i.e. lock if it's not already lock.
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: Iac55e56092cbef45e6212e1fa3b7a60ef8e2a60f
show more ...
|
8d5a3a07 | 29-Sep-2022 |
John Wedig <johnwedig@google.com> |
Implement the changePassword method
With this commit, it is now possible to change the password for the LUKS-encrypted volume, using the changePassword D-Bus method for eStoraged.
Tested: $ busctl
Implement the changePassword method
With this commit, it is now possible to change the password for the LUKS-encrypted volume, using the changePassword D-Bus method for eStoraged.
Tested: $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume FormatLuks ays 3 1 2 3 \ xyz.openbmc_project.Inventory.Item.Volume.FilesystemType.ext4 \ --timeout=60 $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume ChangePassword \ ayay 3 1 2 3 3 4 5 6 $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Lock Attempted to unlock using the old password. It failed as expected. $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Unlock ay 3 1 2 3 Unlocked with the new password $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Unlock ay 3 4 5 6
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: If1395fb04f51b1fb1a3d26731422d21476205207
show more ...
|
be47c8fe | 30-Sep-2022 |
John Wedig <johnwedig@google.com> |
Fix zero_test and pattern_test
The zero_test and pattern_test are failing to compile because some mocks are returning vectors instead of spans.
Signed-off-by: John Wedig <johnwedig@google.com> Chan
Fix zero_test and pattern_test
The zero_test and pattern_test are failing to compile because some mocks are returning vectors instead of spans.
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: Iaf8166f265ef6a67d96e1507abeaca47459e24d3
show more ...
|
da5e96a7 | 04-Aug-2022 |
Patrick Williams <patrick@stwcx.xyz> |
MAINTAINERS: remove file
The MAINTAINERS file is deprecated in favor of OWNERS.
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I04559762b08c5d6f5b4d7a1df9cd674653496ff9
|
b4838308 | 22-Jul-2022 |
John Wedig <johnwedig@google.com> |
Export the part number and serial number
This commit exposes the eMMC's part name and serial number over the appropriate D-Bus interface, so that it can be exposed over Redfish in bmcweb.
Tested: $
Export the part number and serial number
This commit exposes the eMMC's part name and serial number over the appropriate D-Bus interface, so that it can be exposed over Redfish in bmcweb.
Tested: $ busctl introspect xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 ... xyz.openbmc_project.Inventory.Decorator.Asset interface - - - .PartNumber property s "ABCDEF" emits-change .SerialNumber property s "123456abcd" emits-change ... $ wget -qO- http://localhost:80/redfish/v1/Chassis/DC_SCM/Drives/mmcblk0 { "@odata.id": "/redfish/v1/Chassis/DC_SCM/Drives/mmcblk0", "@odata.type": "#Drive.v1_7_0.Drive", "CapacityBytes": 15634268160, "Id": "mmcblk0", "Links": { "Chassis": { "@odata.id": "/redfish/v1/Chassis/DC_SCM" } }, "Name": "Name", "PartNumber": "ABCDEF", "PhysicalLocation": { "PartLocation": { "LocationType": "Embedded" } }, "SerialNumber": "123456abcd", "Status": { "State": "Enabled" } }
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: I1d17f08b99907620b5f2c73fdaeacc84950ce64e
show more ...
|
e3ef765d | 22-Jul-2022 |
Patrick Williams <patrick@stwcx.xyz> |
sdbusplus: use shorter type aliases
The sdbusplus headers provide shortened aliases for many types. Switch to using them to provide better code clarity and shorter lines. Possible replacements are
sdbusplus: use shorter type aliases
The sdbusplus headers provide shortened aliases for many types. Switch to using them to provide better code clarity and shorter lines. Possible replacements are for: * bus_t * exception_t * manager_t * match_t * message_t * object_t * slot_t
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I3e9d6194f8cc1399acb8afb4348409f4d9781fef
show more ...
|
3aadd815 | 22-Jul-2022 |
Patrick Williams <patrick@stwcx.xyz> |
OWNERS: switch 'matches' to 'matchers'
The original OWNERS template had a mistake which used 'matches' instead of the field supported by the Gerrit plugin 'matchers'. Update the OWNERS file to have
OWNERS: switch 'matches' to 'matchers'
The original OWNERS template had a mistake which used 'matches' instead of the field supported by the Gerrit plugin 'matchers'. Update the OWNERS file to have the correct field.
Signed-off-by: Patrick Williams <patrick@stwcx.xyz> Change-Id: I1275dc661e960493260d55944538e86b61ea1469
show more ...
|
49796415 | 22-Jun-2022 |
John Edward Broadbent <jebr@google.com> |
Update location interface
Before LocationCode was being set, but the bmcweb code used LocationType. This change makes eStorageD use LocationType, and not LocationCode.
Tested:
$ busctl introspect
Update location interface
Before LocationCode was being set, but the bmcweb code used LocationType. This change makes eStorageD use LocationType, and not LocationCode.
Tested:
$ busctl introspect xyz.openbmc_project.eStoraged /xyz/openbmc_project/inventory/storage/mmcblk0 NAME TYPE ... xyz.openbmc_project.Inventory.Connector.Embedded interface ...
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I3e077559fa00cccd8e0d4580fafadf4a2cdb40fd
show more ...
|
6771c691 | 22-Jun-2022 |
John Edward Broadbent <jebr@google.com> |
Update initial values for new CI
Tested: code builds, and passes unit test
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: Ib9080fc5b1aa1353a985f700d65e7a9694c07634 |
740e94bd | 10-Jun-2022 |
John Edward Broadbent <jebr@google.com> |
Add location interface
Tested: $busctl introspect xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 ... xyz.openbmc_project.Inventory.Decorator.LocationCode interface .
Add location interface
Tested: $busctl introspect xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 ... xyz.openbmc_project.Inventory.Decorator.LocationCode interface .LocationCode property s "Embedded" emits-change ...
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: Ib1c2177541de193c5930238958201ad26b38e7d2
show more ...
|
9e639820 | 10-Jun-2022 |
John Edward Broadbent <jebr@google.com> |
Update utils_test explicit unsigned literals
There exist a combination of gmock, and std::filesystem that creates an error of the from:
``` if (lhs == rhs) {
'const int' and 'const long long uns
Update utils_test explicit unsigned literals
There exist a combination of gmock, and std::filesystem that creates an error of the from:
``` if (lhs == rhs) {
'const int' and 'const long long unsigned int'
``` for the follow block ``` EXPECT_EQ(3, std::filesystem::remove_all("mmcblk0")); ```
We don't see it in CI testing, but we do see it in builds. Possibly an architecture related issue.
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I8170567494082914e338104e7e126b54d86ddc5e
show more ...
|
14aee774 | 20-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
Add Lock property to drives interface
This change adds the locked property, which is driven the same way the volumes lock property is driven.
Tested: busctl introspect xyz.openbmc_project.eStoraged
Add Lock property to drives interface
This change adds the locked property, which is driven the same way the volumes lock property is driven.
Tested: busctl introspect xyz.openbmc_project.eStoraged /xyz/openbmc_project/inventory/storage/mmcblk0 .Locked property b false emits-change busctl call xyz.openbmc_project.eStoraged /xyz/openbmc_project/inventory/storage/mmcblk0 xyz.openbmc_project.Inventory.Item.Volume Lock .Locked property b true emits-change
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I750def0fd02cdfc36c060d162ef70fed34fa46c8
show more ...
|
f78215fd | 07-Jun-2022 |
John Wedig <johnwedig@google.com> |
Fix code to search for MMC device
The findDevice() function is broken currently because it's looking for a device in sysfs with the name of mmcblk*. The problem is that the boot partitions are also
Fix code to search for MMC device
The findDevice() function is broken currently because it's looking for a device in sysfs with the name of mmcblk*. The problem is that the boot partitions are also showing up in sysfs (mmcblk0boot0 and mmcblk0boot1), and the findDevice() function is getting confused.
Instead of relying on the name of the device to find the MMC device, we now look at the following entry in sysfs, to make sure we found an MMC device:
/sys/block/<dev_name>/device/type
The contents of that file should be MMC.
Tested: Ran eStoraged on a machine to confirm that it created a D-Bus object with the mmcblk0 device, instead of mmcblk0boot0. $ busctl tree xyz.openbmc_project.eStoraged `-/xyz `-/xyz/openbmc_project `-/xyz/openbmc_project/inventory `-/xyz/openbmc_project/inventory/storage `-/xyz/openbmc_project/inventory/storage/mmcblk0
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: I786934fcdc950b55c62bc7e3784e29d5ba73099f
show more ...
|
91c1ec1b | 20-May-2022 |
John Edward Broadbent <jebr@google.com> |
Add DriveEncryptionState property
Tested: Verify the property is as expected (Encrypted). Then wipe the disk, and re-check the value to verify it is as expected (unknown).
$ busctl get-property xyz
Add DriveEncryptionState property
Tested: Verify the property is as expected (Encrypted). Then wipe the disk, and re-check the value to verify it is as expected (unknown).
$ busctl get-property xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Drive EncryptionStatus s \ "xyz.openbmc_project.Inventory.Item.Drive.DriveEncryptionState.Encrypted"
$ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Erase s \ xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.VendorSanitize
$ busctl get-property xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Drive EncryptionStatus s \ "xyz.openbmc_project.Inventory.Item.Drive.DriveEncryptionState.Unknown"
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I4abba7a1e7f047c481aaf4938b2b1e2b7d7ec6be
show more ...
|
4906f4ef | 28-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
span: switch to std
Reduce the dependency on stdplus' version of span now that we are using C++20 and use the one out of the STL instead.
See:https://gerrit.openbmc-project.xyz/c/openbmc/stdplus/+/
span: switch to std
Reduce the dependency on stdplus' version of span now that we are using C++20 and use the one out of the STL instead.
See:https://gerrit.openbmc-project.xyz/c/openbmc/stdplus/+/53308
Change-Id: I2a35670ab50c40fed093474c4986dd6d2cb79011 Signed-off-by: John Edward Broadbent <jebr@google.com>
show more ...
|
6c0d8ce1 | 22-Apr-2022 |
John Wedig <johnwedig@google.com> |
Add association between chassis and drive
This commit adds an association between the storage device ("drive") and the associated chassis. Specifically, the new association is the following: ["cha
Add association between chassis and drive
This commit adds an association between the storage device ("drive") and the associated chassis. Specifically, the new association is the following: ["chassis", "drive", <chassis_path>]
This association will be used in bmcweb to add Redfish links between drive and chassis.
Tested: $ busctl get-property xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Association.Definitions Associations $ busctl get-property xyz.openbmc_project.ObjectMapper \ /xyz/openbmc_project/inventory/system/board/dcscm/drive \ xyz.openbmc_project.Association endpoints $ busctl get-property xyz.openbmc_project.ObjectMapper \ /xyz/openbmc_project/inventory/storage/mmcblk0/chassis \ xyz.openbmc_project.Association endpoints
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: Ie21725e9ceb5134ac94854dcb06f3b86a48eeabd
show more ...
|
2f187348 | 20-Apr-2022 |
John Wedig <johnwedig@google.com> |
Add systemd service file
Add a systemd service file for eStoraged, so that it starts up automatically. Now that eStoraged can dynamically look for config objects and doesn't need a hard-coded device
Add systemd service file
Add a systemd service file for eStoraged, so that it starts up automatically. Now that eStoraged can dynamically look for config objects and doesn't need a hard-coded device filename, it makes sense to have a service file in this repo now.
Tested: Made some corresponding changes to the eStoraged recipe, then verified that eStoraged automatically starts up on a BMC when included in the image.
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: Id701bde62c2ca4206b980660340eec678e062ede
show more ...
|
d32b9667 | 13-Apr-2022 |
John Wedig <johnwedig@google.com> |
Initial integration with Entity Manager
This commit changes eStoraged so that it doesn't take a specific device as an argument. Instead, it looks for a config object from Entity Manager and creates
Initial integration with Entity Manager
This commit changes eStoraged so that it doesn't take a specific device as an argument. Instead, it looks for a config object from Entity Manager and creates a D-Bus object corresponding to the config object.
The config objects need to expose the following interface: "xyz.openbmc_project.Configuration.EmmcDevice"
To support more types of storage devices in the future, we can introduce a new interface for each one.
In addition, eStoraged currently only supports 1 eMMC device. If we want to support more than one in the future, we will need to add more information to the Entity Manager config, to distinguish between them.
Assuming the eMMC is located on a FRU-detectable board, an "Exposes" entry can be added to that board's Entity Manager config, for example: { "Name": "example_emmc", "Type": "EmmcDevice" }
Doing so will tell Entity Manager to create a config object with the EmmcDevice interface mentioned above. Then, eStoraged will find the config object with that interface and create its own D-Bus object that can be used to manage the eMMC.
Tested: Updated the Entity Manager config (as described above), started eStoraged, then tested most of its methods and properties using busctl. $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume FormatLuks ays 3 1 2 3 \ xyz.openbmc_project.Inventory.Item.Volume.FilesystemType.ext4 \ --timeout=60 $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Lock $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Unlock ay 3 1 2 3 $ busctl get-property xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Locked $ busctl get-property xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Drive Capacity $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Erase s \ xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.VerifyGeometry $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Erase s \ xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.LogicalOverWrite \ --timeout=1200 $ busctl call xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0 \ xyz.openbmc_project.Inventory.Item.Volume Erase s \ xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.LogicalVerify \ --timeout=1200
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: If137d02e185c366f4a1437076512b4883ba6d595
show more ...
|
fa5cb6f7 | 12-Apr-2022 |
John Wedig <johnwedig@google.com> |
Remove device name from D-Bus service name
When eStoraged gets integrated with entity manager, eStoraged could potentially be used to manage multiple storage devices. And we will want the different
Remove device name from D-Bus service name
When eStoraged gets integrated with entity manager, eStoraged could potentially be used to manage multiple storage devices. And we will want the different D-Bus objects to be under the same service name.
This commit removes the device name from the D-Bus service name, so that it can ultimately start managing multiple storage devices. This change has its own commit, since it breaks compatibility with existing client software.
Tested: $ busctl introspect xyz.openbmc_project.eStoraged \ /xyz/openbmc_project/inventory/storage/mmcblk0
Signed-off-by: John Wedig <johnwedig@google.com> Change-Id: I4a1606cbbe20fa97cee0fde81c8cf5731d71f8ee
show more ...
|
b2c86be3 | 15-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
Change ownership of handle to eStorageD object
Clients used to create both the CryptHandle and the eStorageD objects using the same information. Then the client would pass the CryptHandle into eStor
Change ownership of handle to eStorageD object
Clients used to create both the CryptHandle and the eStorageD objects using the same information. Then the client would pass the CryptHandle into eStorageD methods in order to perform crypto methods. This change creates the CryptHandle closer to where it is used. This makes the code simpler and easier to understand.
Tested: busctl call xyz.openbmc_project.eStoraged.mmcblk0 \ > /xyz/openbmc_project/inventory/storage/mmcblk0 \ > xyz.openbmc_project.Inventory.Item.Volume FormatLuks ays 3 1 2 3 \ > xyz.openbmc_project.Inventory.Item.Volume.FilesystemType.ext4 \ > --timeout=60
Change-Id: I276e97146f4498191eb19512bc244a1e8d9cd2cb Signed-off-by: John Edward Broadbent <jebr@google.com>
show more ...
|
28cc834c | 14-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
Add exception when constructor fails
We should fail as soon as we know the object had failed to init the cryptdevice correctly. There is no logic to compensate this type of failure.
Signed-off-by:
Add exception when constructor fails
We should fail as soon as we know the object had failed to init the cryptdevice correctly. There is no logic to compensate this type of failure.
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I4c4b3719840ef42d8ecf378410ff0788fb040b1a
show more ...
|
2b5454d3 | 14-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
fix error handling for CryptHandle.get
The old code calls CryptHandle once to make sure it is valid, then calls it again to use it.
Tested: busctl call xyz.openbmc_project.eStoraged.mmcblk0 \ > /
fix error handling for CryptHandle.get
The old code calls CryptHandle once to make sure it is valid, then calls it again to use it.
Tested: busctl call xyz.openbmc_project.eStoraged.mmcblk0 \ > /xyz/openbmc_project/inventory/storage/mmcblk0 \ > xyz.openbmc_project.Inventory.Item.Volume FormatLuks ays 3 1 2 3 \ > xyz.openbmc_project.Inventory.Item.Volume.FilesystemType.ext4 \ > --timeout=60
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: I21c02315c365e74ead3d0b5b2578c62503376756
show more ...
|
34a75f05 | 14-Apr-2022 |
John Edward Broadbent <jebr@google.com> |
Fix shadowed variable improperly scoped
These variables were outside of the function that used them. Every other function that set the "size" variable was shadowing the improperly scoped variables.
Fix shadowed variable improperly scoped
These variables were outside of the function that used them. Every other function that set the "size" variable was shadowing the improperly scoped variables.
Change-Id: I45b20606492987c7a09105c33847bc5b35b9e0ec Signed-off-by: John Edward Broadbent <jebr@google.com>
show more ...
|
d6071fc2 | 31-Mar-2022 |
John Edward Broadbent <jebr@google.com> |
Fix Short read/write issue
It was possible for "short" reads and writes to cause the pattern and zero steps to not work correctly. This change adds logic to deal with the short reads.
Tested: unit
Fix Short read/write issue
It was possible for "short" reads and writes to cause the pattern and zero steps to not work correctly. This change adds logic to deal with the short reads.
Tested: unit test and machine test root@bmc# time busctl call xyz.openbmc_project.eStoraged.mmcblk0 \ > /xyz/openbmc_project/inventory/storage/mmcblk0 \ > xyz.openbmc_project.Inventory.Item.Volume Erase s \ > xyz.openbmc_project.Inventory.Item.Volume.EraseMethod.ZeroOverWrite \ > --timeout=1200 real 6m0.815s user 0m0.010s sys 0m0.010s
Change-Id: If8df9bdba159a3bcfa77104a4c17b8d352794db2 Signed-off-by: John Edward Broadbent <jebr@google.com>
show more ...
|
5d799bb9 | 22-Mar-2022 |
John Edward Broadbent <jebr@google.com> |
Add lifetime property for drives interface
This will set the lifetime property when the eStoraged object is created. This change does not expect the lifetime to change.
Tested: busctl introspect x
Add lifetime property for drives interface
This will set the lifetime property when the eStoraged object is created. This change does not expect the lifetime to change.
Tested: busctl introspect xyz.openbmc_project.eStoraged.mmcblk0 /xyz/openbmc_project/inventory/storage/mmcblk0 NAME TYPE SIGNATURE RESULT/VALUE FLAGS org.freedesktop.DBus.Introspectable interface - - - .Introspect method - s - org.freedesktop.DBus.Peer interface - - - .GetMachineId method - s - .Ping method - - - org.freedesktop.DBus.Properties interface - - - .Get method ss v - .GetAll method s a{sv} - .Set method ssv - - .PropertiesChanged signal sa{sv}as - - xyz.openbmc_project.Inventory.Item.Drive interface - - - .Capacity property t (top secret) emits-change .PredictedMediaLifeLeftPercent property y 100 emits-change xyz.openbmc_project.Inventory.Item.Volume interface - - - .ChangePassword method ayay - - .Erase method s - - .FormatLuks method ays - - .Lock method - - - .Unlock method ay - -
Signed-off-by: John Edward Broadbent <jebr@google.com> Change-Id: Ifbbed7d81c55e3edbe519c2b1048b5d1731fbb0e
show more ...
|