首页 Javascript 正文
356

NetSuite之sftp模块的使用

  • yiqingpeng
  • 2019-02-22
  • 0
  •  
NetSuite的sftp模块可以用来连接sftp服务器并上传文件,目前仅支持用户名+密码的认证方式。
密码字段必须通过form.credentialField生成PasswordGuid得到。

首先第一步,制作credential form交互页用来得到Password Guid,所以得写一个Suitelet类型的脚本。
/**
 *@NApiVersion 2.x
 *@NScriptType Suitelet
 *@Author Yi
 */
function isObject(mixed){
    return typeof mixed === 'object' && mixed !== null;
}

define(['N/runtime', 'N/ui/serverWidget'], 
     function(runtime, serverWidget){
         function debug(msg){
             log.debug({
                 title: 'Suitelet debug', 
                 details: isObject(msg) ? JSON.stringify(msg) : msg
             });
         }
         
         function createSftpConfigForm(){
         //构建配置项收集表单(sftp服务器地址+suitescript id),用于生成Credentail Guid
             var form = serverWidget.createForm({
                 title: 'Sftp configurations.'
             });
             var hostField = form.addField({
                 id: 'custfield_host_name', 
                 label: 'SFTP host names or IPs',
                 type: serverWidget.FieldType.TEXT
             }); //此字段用来收集sftp服务器的地址,可以是ip,也可以是domain.多个地址用逗号隔开
             hostField.maxLength = 256;
             hostField.isMandatory = true;
             
             var scriptIdsField = form.addField({
                 id: 'custfield_scriptids', 
                 label: 'Restrict to script IDs',
                 type: serverWidget.FieldType.TEXT
             });//GUID要在哪些suitescript中使用,则必须将那些scriptid(不是那个数字id,是可以自定义的那个)配置进来,多个用逗号分隔。
             scriptIdsField.maxLength = 256;
             scriptIdsField.isMandatory = true;
             
             var stepField = form.addField({
                 id: 'custfield_step', 
                 label: 'Step number', 
                 type: serverWidget.FieldType.TEXT
             });
             stepField.defaultValue = '1';
             stepField.updateDisplayType({
                 displayType: serverWidget.FieldDisplayType.HIDDEN
             });
             
             form.addSubmitButton({
                 label: 'Submit'
             });
             
             return form;
         }
         
         function createCredentialForm(serverWidget, scriptIds,  domains) {
             //构建凭据表单
             var form = serverWidget.createForm({
                 title: 'Creating SFTP Credential'
             });
             var credField = form.addCredentialField({
                 id: 'custfield_sftp_password_token', 
                 label: 'SFTP Password For EC2', 
                 restrictToScriptIds: scriptIds,  //e.g.['customscript147']
                 restrictToDomains: domains, //e.g.['22.123.11.23']
                 restrictToCurrentUser: false
             });
             credField.maxLength = 256;
             
             var stepField = form.addField({
                 id: 'custfield_step', 
                 label: 'Step number', 
                 type: serverWidget.FieldType.TEXT
             });
             stepField.defaultValue = '2';
             stepField.updateDisplayType({
                 displayType: serverWidget.FieldDisplayType.HIDDEN
             });
             
             form.addSubmitButton({
                 label: 'Submit'
             });
             
             return form;
         }
         
         function onRequest(context){
             var request = context.request;
             var response = context.response;
             
             try {
                 if (request.method === 'GET') {  
                     //build form
                     var form = createSftpConfigForm();
  
                     response.writePage(form);
                 }
                 
                 if (request.method === 'POST'){
                     var step = request.parameters.custfield_step;
                     
                     if (step == '1') {
                         var scriptIds = request.parameters.custfield_scriptids;
                         var domains = request.parameters.custfield_host_name;
                         
                         var form = createCredentialForm(
                             serverWidget, 
                             scriptIds.split(',').map(function (ele) { return new String(ele).trim()}), 
                             domains.split(',').map(function (ele) { return new String(ele).trim()})
                         );
                         response.writePage(form);
                     }
                     
                     if (step == '2') {
                         var passwordToken = request.parameters.custfield_sftp_password_token;
                         response.write(passwordToken);//这个就是要配置到sftp中的Password Guid.
                     }
                    
                 }
             } catch(e) {
                 debug(e);
                 response.write({
                     output: isObject(e) ? JSON.stringify(e) : e
                 });
             }
         }
         
         return {
             onRequest: onRequest
         };
     }
);
脚本写好之后,上传到file cabinet中,然后选择此file生成Scripting记录,再将此script生成Script Deployment. deploy之后,可以看到URL有一个链接, 访问此链接就可以通过输入参数(假设调用sftp的scriptid为customscript147,严格来说,调用sftp的script要先于此上传并生成scripting记录,以得到scriptid, 其PasswordGuid留空即可,等此步骤生成了Guid再填充进去。另外一个办法是先自定义一个合法的scriptid并指定给需要调用sftp的脚本)得到Password Guid, 复制此Guid, 以备接下来使用。

第二步,调用sftp脚本的编写
/**
 *@NApiVersion 2.x
 *@NScriptType Suitelet
 *@Author  Yi
 */
function isObject(mixed){
    return typeof mixed === 'object' && mixed !== null;
}

define(['N/runtime', 'N/file', 'N/sftp'], 
     function(runtime, file, sftp){
         function debug(msg){
             log.debug({
                 title: 'Suitelet debug', 
                 details: isObject(msg) ? JSON.stringify(msg) : msg
             });
         }
         
         const PASSWORD_GUID = 'aa033cac51ab479bb0cbf307f3af9d75';
         
         function transferFile(fileConfig, onError){
             try {
                 var sftpConfig = {
                     'host': '33.231.168.161', 
                     'user': 'nssftp', 
                     'guid': PASSWORD_GUID, //步骤一生成的
                     'port': 22, 
                     'dir' : 'shared' //sftp目录
                 };
                 var sftpHost = {
                     'hostKey': 'Ztb2Ii7TGy...m9', //ssh-keyscan -t rsa -p 22 33.231.168.161 , 注意aws入站规则要开放对外端口22才能执行成功
                     'hostKeyType': 'rsa'
                 };
                 var conn = sftp.createConnection({
                     username: sftpConfig.user, 
                     passwordGuid: sftpConfig.guid, 
                     url: sftpConfig.host, 
                     port: sftpConfig.port, 
                     directory: sftpConfig.dir, 
                     hostKey: sftpHost.hostKey, 
                     hostKeyType: sftpHost.hostKeyType
                 });
                 
                 conn.upload(fileConfig);
                 return true;
             } catch(e) {
                 typeof onError === 'function' && onError(e);
                 return false;
             }
         }
         
         function onRequest(context){
             var request = context.request;
             var response = context.response;
             try {
                 if (request.method === 'GET') {
                     var fileId = request.parameters.fileid ;
                     if (fileId > 0) {
                         var fileObj = file.load({id: fileId});
                         var result = transferFile({
                             filename: fileObj.name, 
                             file: fileObj, 
                             replaceExisting: true
                         }, function (e){
                             response.write(isObject(e) ? JSON.stringify(e) : e);
                         });
                         response.write(result ? 'OK' : 'ERROR');
                     }
                 } else {
                     response.write('method not handled.');
                 }
             } catch(e) {
                 debug(e);
                 response.write({
                     output: isObject(e) ? JSON.stringify(e) : e
                 });
             }
         }
         
         return {
             onRequest: onRequest
         };
     }
);
    

正在加载评论...