kinetic-c  v0.12.0
Seagate Kinetic Protocol Client Library for C
kinetic_admin_client.c
Go to the documentation of this file.
1 /*
2 * kinetic-c
3 * Copyright (C) 2015 Seagate Technology.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20 
21 #include "kinetic_admin_client.h"
22 #include "kinetic_types_internal.h"
23 #include "kinetic_controller.h"
24 #include "kinetic_operation.h"
25 #include "kinetic_builder.h"
26 #include "kinetic_allocator.h"
27 #include "kinetic_auth.h"
28 #include "kinetic_device_info.h"
29 #include "kinetic_acl.h"
30 #include "kinetic_logger.h"
31 
32 #ifdef TEST
33 struct ACL *ACLs = NULL;
34 #endif
35 
37 {
38  return KineticClient_Init(config);
39 }
40 
41 void KineticAdminClient_Shutdown(KineticClient * const client)
42 {
43  KineticClient_Shutdown(client);
44 }
45 
47  KineticClient * const client, KineticSession** session)
48 {
49  return KineticClient_CreateSession(config, client, session);
50 }
51 
52 KineticStatus KineticAdminClient_DestroySession(KineticSession * const session)
53 {
54  return KineticClient_DestroySession(session);
55 }
56 
57 
58 KineticStatus KineticAdminClient_SetErasePin(KineticSession * const session,
59  ByteArray old_pin, ByteArray new_pin)
60 {
61  KineticStatus status;
62  status = KineticAuth_EnsureSslEnabled(&session->config);
63  if (status != KINETIC_STATUS_SUCCESS) {return status;}
64 
65  // Ensure PIN arrays have data if non-empty
66  if ((old_pin.len > 0 && old_pin.data == NULL) ||
67  (new_pin.len > 0 && new_pin.data == NULL)) {
69  }
70 
71  KineticOperation* operation = KineticAllocator_NewOperation(session);
72  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
73 
74  KineticBuilder_BuildSetPin(operation, old_pin, new_pin, false);
75  return KineticController_ExecuteOperation(operation, NULL);
76 }
77 
78 KineticStatus KineticAdminClient_SecureErase(KineticSession * const session,
79  ByteArray pin)
80 {
81  KINETIC_ASSERT(session != NULL);
82 
83  KineticStatus status;
84  status = KineticAuth_EnsureSslEnabled(&session->config);
85  if (status != KINETIC_STATUS_SUCCESS) { return status; }
86 
87  // Ensure PIN array has data if non-empty
88  if (pin.len > 0 && pin.data == NULL) {
90  }
91 
92  KineticOperation* operation = KineticAllocator_NewOperation(session);
93  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
94 
95  KineticBuilder_BuildErase(operation, true, &pin);
96  return KineticController_ExecuteOperation(operation, NULL);
97 }
98 
99 KineticStatus KineticAdminClient_InstantErase(KineticSession * const session,
100  ByteArray pin)
101 {
102  KINETIC_ASSERT(session != NULL);
103 
104  KineticStatus status;
105  status = KineticAuth_EnsureSslEnabled(&session->config);
106  if (status != KINETIC_STATUS_SUCCESS) {return status;}
107 
108  // Ensure PIN array has data if non-empty
109  if (pin.len > 0 && pin.data == NULL) {
111  }
112 
113  KineticOperation* operation = KineticAllocator_NewOperation(session);
114  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
115 
116  KineticBuilder_BuildErase(operation, false, &pin);
117  return KineticController_ExecuteOperation(operation, NULL);
118 }
119 
120 
121 KineticStatus KineticAdminClient_SetLockPin(KineticSession * const session,
122  ByteArray old_pin, ByteArray new_pin)
123 {
124  KineticStatus status;
125  status = KineticAuth_EnsureSslEnabled(&session->config);
126  if (status != KINETIC_STATUS_SUCCESS) {return status;}
127 
128  // Ensure PIN arrays have data if non-empty
129  if ((old_pin.len > 0 && old_pin.data == NULL) ||
130  (new_pin.len > 0 && new_pin.data == NULL)) {
132  }
133 
134  KineticOperation* operation = KineticAllocator_NewOperation(session);
135  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
136 
137  KineticBuilder_BuildSetPin(operation, old_pin, new_pin, true);
138  return KineticController_ExecuteOperation(operation, NULL);
139 }
140 
141 KineticStatus KineticAdminClient_LockDevice(KineticSession * const session,
142  ByteArray pin)
143 {
144  KINETIC_ASSERT(session != NULL);
145 
146  KineticStatus status;
147  status = KineticAuth_EnsureSslEnabled(&session->config);
148  if (status != KINETIC_STATUS_SUCCESS) {return status;}
149 
150  // Ensure PIN array has data if non-empty
151  if (pin.len > 0 && pin.data == NULL) {
153  }
154 
155  KineticOperation* operation = KineticAllocator_NewOperation(session);
156  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
157 
158  KineticBuilder_BuildLockUnlock(operation, true, &pin);
159  return KineticController_ExecuteOperation(operation, NULL);
160 }
161 
162 KineticStatus KineticAdminClient_UnlockDevice(KineticSession * const session,
163  ByteArray pin)
164 {
165  KINETIC_ASSERT(session != NULL);
166 
167  KineticStatus status;
168  status = KineticAuth_EnsureSslEnabled(&session->config);
169  if (status != KINETIC_STATUS_SUCCESS) {return status;}
170 
171  // Ensure PIN array has data if non-empty
172  if (pin.len > 0 && pin.data == NULL) {
174  }
175 
176  KineticOperation* operation = KineticAllocator_NewOperation(session);
177  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
178 
179  KineticBuilder_BuildLockUnlock(operation, false, &pin);
180  return KineticController_ExecuteOperation(operation, NULL);
181 }
182 
183 KineticStatus KineticAdminClient_GetLog(KineticSession * const session,
184  KineticLogInfo_Type type,
185  KineticLogInfo** info,
186  KineticCompletionClosure* closure)
187 {
188  KINETIC_ASSERT(session != NULL);
189  KINETIC_ASSERT(info != NULL);
190 
195  }
196 
197  KineticOperation* operation = KineticAllocator_NewOperation(session);
198  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
199 
200  // Initialize request
201  KineticBuilder_BuildGetLog(operation, protoType, BYTE_ARRAY_NONE, info);
202 
203  // Execute the operation
204  return KineticController_ExecuteOperation(operation, closure);
205 }
206 
208  ByteArray name,
209  KineticLogInfo** info,
210  KineticCompletionClosure* closure)
211 {
212  KINETIC_ASSERT(session != NULL);
213  KINETIC_ASSERT(info != NULL);
214 
215  KineticOperation* operation = KineticAllocator_NewOperation(session);
216  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
217 
218  // Initialize request
220 
221  // Execute the operation
222  return KineticController_ExecuteOperation(operation, closure);
223 }
224 
225 void KineticClient_FreeLogInfo(KineticSession * const session,
226  KineticLogInfo* info)
227 {
228  KINETIC_ASSERT(session != NULL);
229  if (info) { KineticLogInfo_Free(info); }
230 
231  /* The session is not currently used, but part of the API to allow
232  * a different memory management strategy. */
233  (void)session;
234 }
235 
237  int64_t version)
238 {
239  KINETIC_ASSERT(session != NULL);
240 
241  KineticOperation* operation = KineticAllocator_NewOperation(session);
242  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
243 
244  KineticBuilder_BuildSetClusterVersion(operation, version);
245  return KineticController_ExecuteOperation(operation, NULL);
246 }
247 
248 KineticStatus KineticAdminClient_SetACL(KineticSession * const session,
249  const char *ACLPath) {
250  KINETIC_ASSERT(session != NULL);
251  if (ACLPath == NULL) {
253  }
254 
255  #ifndef TEST
256  struct ACL *ACLs = NULL;
257  #endif
258  KineticACLLoadResult acl_res = KineticACL_LoadFromFile(ACLPath, &ACLs);
259  if (acl_res != ACL_OK) {
261  }
262 
263  KineticOperation* operation = KineticAllocator_NewOperation(session);
264  if (operation == NULL) {
265  printf("!operation\n");
267  }
268 
269  // Initialize request
270  KineticBuilder_BuildSetACL(operation, ACLs);
271  KineticStatus status = KineticController_ExecuteOperation(operation, NULL);
272 
273  return status;
274 }
275 
276 KineticStatus KineticAdminClient_UpdateFirmware(KineticSession * const session,
277  char const * const fw_path)
278 {
279  KINETIC_ASSERT(session != NULL);
280 
281  KineticOperation* operation = KineticAllocator_NewOperation(session);
282  if (operation == NULL) {return KINETIC_STATUS_MEMORY_ERROR;}
283 
284  KineticStatus status = KineticBuilder_BuildUpdateFirmware(operation, fw_path);
285  if (status != KINETIC_STATUS_SUCCESS) {
286  return status;
287  }
288 
289  return KineticController_ExecuteOperation(operation, NULL);
290 }
KineticStatus KineticBuilder_BuildLockUnlock(KineticOperation *const op, bool lock, ByteArray *pin)
Structure for handling generic arrays of bytes.
Definition: byte_array.h:34
KineticStatus KineticAdminClient_InstantErase(KineticSession *const session, ByteArray pin)
Executes an InstantErase operation to erase all data from the Kinetic device.
KineticStatus KineticBuilder_BuildSetACL(KineticOperation *const op, struct ACL *ACLs)
KineticStatus KineticAdminClient_SetLockPin(KineticSession *const session, ByteArray old_pin, ByteArray new_pin)
Sets the lock PIN of the Kinetic Device.
KineticStatus KineticBuilder_BuildGetLog(KineticOperation *const op, Com__Seagate__Kinetic__Proto__Command__GetLog__Type type, ByteArray name, KineticLogInfo **info)
Operation successful.
KineticStatus KineticClient_CreateSession(KineticSessionConfig *const config, KineticClient *const client, KineticSession **session)
Creates a session with the Kinetic Device per specified configuration.
KineticStatus KineticAdminClient_SecureErase(KineticSession *const session, ByteArray pin)
Executes a SecureErase command to erase all data from the Kinetic device.
Structure used to specify the configuration for a session.
Com__Seagate__Kinetic__Proto__Command__GetLog__Type KineticLogInfo_Type_to_Com__Seagate__Kinetic__Proto__Command__GetLog__Type(KineticLogInfo_Type type)
KineticStatus KineticAdminClient_LockDevice(KineticSession *const session, ByteArray pin)
Executes a LOCK operation to lock the Kinetic device.
KineticStatus KineticAdminClient_UnlockDevice(KineticSession *const session, ByteArray pin)
Executes an UNLOCK operation to unlock the Kinetic device.
KineticStatus KineticAdminClient_SetClusterVersion(KineticSession *const session, int64_t version)
Updates the cluster version of the Kinetic Device.
Something about the request is invalid.
KineticStatus KineticClient_DestroySession(KineticSession *const session)
Closes the connection to a host.
KineticStatus KineticAdminClient_CreateSession(KineticSessionConfig *const config, KineticClient *const client, KineticSession **session)
Creates a session with the Kinetic Device per specified configuration.
Failed allocating/deallocating memory.
KineticStatus KineticBuilder_BuildSetPin(KineticOperation *const op, ByteArray old_pin, ByteArray new_pin, bool lock)
The device log type specified was invalid.
Com__Seagate__Kinetic__Proto__Command__GetLog__Type
Definition: kinetic.pb-c.h:161
Closure which can be specified for operations which support asynchronous mode.
KineticStatus KineticBuilder_BuildUpdateFirmware(KineticOperation *const op, const char *fw_path)
KineticLogInfo_Type
Log info type.
A security operation failed due to bad ACL(s)
KineticStatus KineticAdminClient_GetLog(KineticSession *const session, KineticLogInfo_Type type, KineticLogInfo **info, KineticCompletionClosure *closure)
Executes a GETLOG operation to retrieve specific configuration and/or operational data from the Kinet...
Base log info structure which is allocated by client and passed to KineticAdminClient_GetLog.
#define KINETIC_ASSERT(cond)
void KineticAdminClient_Shutdown(KineticClient *const client)
Performs shutdown/cleanup of the kinetic-c client library.
KineticStatus KineticAdminClient_DestroySession(KineticSession *const session)
Closes the connection to a host.
KineticACLLoadResult
KineticStatus KineticAdminClient_SetErasePin(KineticSession *const session, ByteArray old_pin, ByteArray new_pin)
Sets the erase PIN of the Kinetic Device.
size_t len
Number of bytes in the data field.
Definition: byte_array.h:35
KineticStatus KineticAdminClient_GetDeviceSpecificLog(KineticSession *const session, ByteArray name, KineticLogInfo **info, KineticCompletionClosure *closure)
Executes a GETLOG operation to retrieve device-specific log info from the Kinetic Device via name/key...
Com__Seagate__Kinetic__Proto__Command__Security__ACL ** ACLs
ACL struct array.
#define BYTE_ARRAY_NONE
Convenience macro to represent an empty array with no data.
Definition: byte_array.h:40
KineticStatus KineticAuth_EnsureSslEnabled(KineticSessionConfig const *const config)
Definition: kinetic_auth.c:26
KineticACLLoadResult KineticACL_LoadFromFile(const char *path, struct ACL **instance)
Definition: kinetic_acl.c:74
KineticOperation * KineticAllocator_NewOperation(KineticSession *const session)
void KineticLogInfo_Free(KineticLogInfo *kdi)
KineticStatus KineticAdminClient_SetACL(KineticSession *const session, const char *ACLPath)
Executes a SECURITY operation, setting one or more ACLs.
An operation is missing a PIN.
uint8_t * data
Pointer to an allocated array of data bytes.
Definition: byte_array.h:36
KineticStatus KineticAdminClient_UpdateFirmware(KineticSession *const session, char const *const fw_path)
Executes a Firmware Download operation to update the firmware on the Kinetic device.
KineticStatus
Kinetic status codes.
KineticStatus KineticBuilder_BuildErase(KineticOperation *const op, bool secure_erase, ByteArray *pin)
Configuration values for the KineticClient connection.
void KineticClient_Shutdown(KineticClient *const client)
Performs shutdown/cleanup of the kinetic-c client library.
KineticClient * KineticClient_Init(KineticClientConfig *config)
Initializes the Kinetic API and configures logging.
KineticStatus KineticBuilder_BuildSetClusterVersion(KineticOperation *op, int64_t new_cluster_version)
KineticStatus KineticController_ExecuteOperation(KineticOperation *operation, KineticCompletionClosure *const closure)
KineticClient * KineticAdminClient_Init(KineticClientConfig *config)
Initializes the Kinetic Admin API and configures logging.
void KineticClient_FreeLogInfo(KineticSession *const session, KineticLogInfo *info)