Go to main content
Guía de administración de Oracle® ZFS Storage Appliance, versión OS8.7.0

Salir de la Vista de impresión

Actualización: Marzo de 2017
 
 

Uso de la función Lista

En un contexto con elementos secundarios dinámicos, puede resultar muy útil iterar entre esos elementos secundarios mediante programación. Para ello se puede utilizar la función list, que devuelve una matriz de elementos secundarios dinámicos.

  1. En el siguiente ejemplo, una secuencia de comandos itera todos los recursos compartidos de cada proyecto e imprime la cantidad de espacio consumido y el espacio disponible:
    script
           run('shares');
           projects = list();
    
           for (i = 0; i < projects.length; i++) {
                   run('select ' + projects[i]);
                   shares = list();
    
                   for (j = 0; j < shares.length; j++) {
                           run('select ' + shares[j]);
                           printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j],
                               get('space_data'), get('space_available'));
                           run('cd ..');
                   }
    
                   run('cd ..');
           }
  2. Esta es la salida de la ejecución de la secuencia de comandos, suponiendo que se haya guardado en un archivo llamado "space.aksh":
    % ssh root@koi < space.aksh
    Password: 
    admin/accounts 18432 266617007104
    admin/exports 18432 266617007104
    admin/primary 18432 266617007104
    admin/traffic 18432 266617007104
    admin/workflow 18432 266617007104
    aleventhal/hw_eng 18432 266617007104
    bcantrill/analytx 1073964032 266617007104
    bgregg/dashbd 18432 266617007104
    bgregg/filesys01 26112 107374156288
    bpijewski/access_ctrl 18432 266617007104
    ...
  3. Si se deseara una variante más "estética" (si bien sería más difícil desde el punto de vista de la programación), se puede analizar directamente la salida del comando get:
    script
           run('shares');
           projects = list();
    
           printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE');
    
           for (i = 0; i < projects.length; i++) {
                   run('select ' + projects[i]);
                   shares = list();
    
                   for (j = 0; j < shares.length; j++) {
                           run('select ' + shares[j]);
    
                           share = projects[i] + '/' + shares[j];
                           used = run('get space_data').split(/\s+/)[3];
                           avail = run('get space_available').split(/\s+/)[3];
    
                           printf('%-40s %-10s %-10s\n', share, used, avail);
                           run('cd ..');
                   }
    
                   run('cd ..');
           }
  4. Esta es la salida de la ejecución de esta nueva secuencia de comandos, suponiendo que se le asignó el nombre "prettyspace.aksh":
    % ssh root@koi < prettyspace.aksh
    Password:
    SHARE                                    USED       AVAILABLE 
    admin/accounts                           18K        248G      
    admin/exports                            18K        248G      
    admin/primary                            18K        248G      
    admin/traffic                            18K        248G      
    admin/workflow                           18K        248G      
    aleventhal/hw_eng                        18K        248G      
    bcantrill/analytx                        1.00G      248G      
    bgregg/dashbd                            18K        248G       
    bgregg/filesys01                         25.5K      100G      
    bpijewski/access_ctrl                    18K        248G      
    ...
  5. La función list admite los argumentos opcionales depth y filter.

    El formato es: list ([depth, [filter]]). El argumento depth se puede definir con un número. Cuanto mayor sea el número de depth, mayor será el nivel de detalle devuelto. El formato del argumento filter es {<prop1>:<val1>, <prop2>:<val2> ...}. Si se especifica filter, también se debe especificar depth.

    Uso y comportamiento de la entrada:

    • list(): devuelve solo nombres de nodos.

    • list(0): devuelve propiedades de nodos y solo nombres de elementos secundarios.

    • list(0, {kiosk_mode: true}): devuelve una lista filtrada para kiosk_mode true con nombres de elementos secundarios.

    • list(1): devuelve propiedades de nodos, nombres y propiedades de elementos secundarios, solo nombres de elementos terciarios.

    • list(1, {kiosk_mode: true}): devuelve una lista filtrada para kiosk_mode true con detalles hasta depth=1.

    • list(2): devuelve propiedades de nodos, nombres y propiedades de elementos secundarios y la salida de list(0) de elementos terciarios.

    • list(2, {fullname:'Super*', kiosk_mode: true}): devuelve una lista filtrada para fullname que contiene Super y kiosk_mode con el valor true con detalles hasta depth=2.

  6. En el siguiente ejemplo, se muestra la salida correspondiente a una lista con depth=2:

    La etiqueta name muestra el nombre del elemento de la lista (es decir, un nodo). La etiqueta properties muestra las propiedades del elemento de la lista. La etiqueta children muestra los elementos secundarios estáticos del elemento de la lista. La etiqueta list muestra los elementos secundarios dinámicos del elemento de la lista.

    script
            ("." to run)> dump(list(2));
            ("." to run)> .
    
            [{
                name: 'restuser',
                properties: {
                    kiosk_screen: 'status/dashboard',
                    kiosk_mode: false,
                    roles: ['basic'],
                    require_annotation: false,
                    initial_password: 'DummyPassword',
                    fullname: 'REST User',
                    logname: 'restuser'
                },
                children: [{
                    name: 'preferences',
                    properties: {
                        advanced_analytics: false,
                        session_timeout: 15,
                        login_screen: 'status/dashboard',
                        locale: 'C'
                    }
                }, {
                    name: 'exceptions',
                    list: [{
                        name: 'auth-000',
                        properties: {
                             allow_configure: false,
                             scope: 'alert'
                        }
                    }, {
                        name: 'auth-001',
                        properties: {
                             allow_workgroup: false,
                             allow_domain: false,
                             name: '*',
                             scope: 'ad'
                        } 
                    }]
                }]
            }]