xiongzhu há 4 anos atrás
pai
commit
cd494cf143
6 ficheiros alterados com 208 adições e 109 exclusões
  1. 131 97
      access.js
  2. 1 0
      config.json
  3. 43 4
      deploy.js
  4. 14 7
      servers.json
  5. 1 1
      sessionId
  6. 18 0
      upload.py

+ 131 - 97
access.js

@@ -134,7 +134,7 @@ const checkSessionId = () => {
     }
 };
 
-const getAccess = (dev) => {
+const getAccess = (server) => {
     return instance
         .post(
             config.accessUrl,
@@ -143,13 +143,13 @@ const getAccess = (dev) => {
                     resolution: "1159x897:maximize",
                     isDualAuth: false,
                     anyAccount: "admin",
-                    anyPassword: "yWfuA@4NTX!b#2kG",
+                    anyPassword: server.password,
                     recheckCode: "",
                 },
                 sessRemark: "",
                 account: "any",
                 proto: "sftp",
-                dev: dev,
+                dev: server.id,
             },
             {
                 headers: {
@@ -169,50 +169,55 @@ const getAccess = (dev) => {
         });
 };
 
-// const ls = spawn("sh", ["build.sh"], { cwd: config.projectDir });
+const build = () => {
+    return new Promise((resolve, reject) => {
+        const ls = spawn("sh", ["build.sh"], { cwd: config.projectDir });
 
-// ls.stdout.on("data", (data) => {
-//     process.stdout.write(data);
-// });
-
-// ls.stderr.on("data", (data) => {
-//     process.stderr.write(data);
-// });
+        ls.stdout.on("data", (data) => {
+            process.stdout.write(data);
+        });
 
-// ls.on("error", (error) => {
-//     console.log(`error: ${error.message}`);
-// });
+        ls.stderr.on("data", (data) => {
+            process.stderr.write(data);
+        });
 
-// ls.on("close", (code) => {
-//     console.log(`build finished with code ${code}`);
+        ls.on("error", (error) => {
+            console.log(`error: ${error.message}`);
+        });
 
-// });
-let multi = new Multiprogress(process.stdout);
-new Promise((resolve, reject) => {
-    checkSessionId()
-        .then(() => {
+        ls.on("close", (code) => {
+            console.log(`build finished with code ${code}`);
             resolve();
-        })
-        .catch(() => {
-            sessionId = null;
-            getSessionId().then(() => {
-                resolve();
-            });
         });
-}).then(() => {
-    upload(servers[0].id);
-    // upload(servers[5].id);
-    // upload(servers[6].id);
-});
-
-const upload = (dev) => {
-    return getAccess(dev).then((res) => {
-        console.log(res);
+    });
+};
+let multi = new Multiprogress(process.stdout);
+// build()
+Promise.resolve()
+    .then(() => {
+        return new Promise((resolve, reject) => {
+            checkSessionId()
+                .then(() => {
+                    resolve();
+                })
+                .catch(() => {
+                    sessionId = null;
+                    getSessionId().then(() => {
+                        resolve();
+                    });
+                });
+        });
+    })
+    .then(() => {
+        upload(servers[0]);
+        // upload(servers[5].id);
+        // upload(servers[6].id);
+    });
 
-        const buffer = Buffer.from(
-            res.url.match(/accessclient:\/\/(.*)/)[1],
-            "base64"
-        );
+const upload = async (server) => {
+    let { url } = await getAccess(server);
+    const buffer = Buffer.from(url.match(/accessclient:\/\/(.*)/)[1], "base64");
+    let accessJson = await new Promise((resolve, reject) => {
         unzip(buffer, (err, buffer) => {
             if (err) {
                 console.error("An error occurred:", err);
@@ -220,66 +225,95 @@ const upload = (dev) => {
             }
             let accessJson = JSON.parse(buffer.toString());
             console.log(accessJson);
+            resolve(accessJson);
+        });
+    });
 
-            const ssh = new NodeSSH();
+    // let file = "/Users/drew/Desktop/building3.tar.gz";
+    let file = path.resolve(config.projectDir, "build.tar.gz");
+    let stat = fs.statSync(file);
+    let bar = multi.newBar("  uploading [:bar] :rate/bps :percent :etas", {
+        complete: "=",
+        incomplete: " ",
+        width: 20,
+        total: stat.size,
+    });
+    return
 
-            ssh.connect({
-                host: accessJson.Host,
-                username: accessJson.User,
-                password: accessJson.PWD,
-            })
-                .then(() => {
-                    ssh.connection.on("error", (err) => {
-                        console.log("sftp err", err);
-                    });
-                    ssh.connection.sftp((err, sftp) => {
-                        if (err) throw err;
-                        // var stat = fs.statSync(
-                        //     path.resolve(config.projectDir, "build.tar.gz")
-                        // );
-                        var stat = fs.statSync(
-                            "/Users/drew/Desktop/DBQNL.jpeg"
-                        );
-                        let size = stat.size;
-                        let uploadedSize = 0;
-                        var bar = multi.newBar(
-                            "  uploading [:bar] :rate/bps :percent :etas",
-                            {
-                                complete: "=",
-                                incomplete: " ",
-                                width: 20,
-                                total: size,
-                            }
-                        );
-                        // let readStream = fs.createReadStream(
-                        //     path.resolve(config.projectDir, "build.tar.gz")
-                        // );
-                        let readStream = fs.createReadStream(
-                            "/Users/drew/Desktop/DBQNL.jpeg"
-                        );
-                        let writeStream = sftp.createWriteStream(
-                            "/home/admin/123.tar.gz"
-                        );
-                        readStream.on("data", function (buffer) {
-                            uploadedSize += buffer.length;
-                            bar.tick(buffer.length);
-                            if (uploadedSize === size) {
-                                console.log("finish");
-                                setTimeout(() => {
-                                    sftp.end();
-                                }, 400);
-                            }
-                        });
+    const ssh = new NodeSSH();
+    await ssh.connect({
+        host: accessJson.Host,
+        username: accessJson.User,
+        password: accessJson.PWD,
+    });
+    // await ssh.putFile(file, "/home/admin/build.tar.gz", null, {
+    //     concurrency: 1,
+    //     chunkSize: 3276800,
+    //     step: (total_transferred, chunk, total) => {
+    //         bar.tick(chunk);
+    //     },
+    // });
 
-                        // Some other events you might want for your code
-                        readStream.on("end", function () {});
-                        readStream.on("close", function () {});
-                        readStream.pipe(writeStream);
-                    });
-                })
-                .catch((e) => {
-                    console.log("err", e);
-                });
+    ssh.connection.sftp((err, sftp) => {
+        if (err) throw err;
+        let rs = fs.createReadStream(file);
+        let ws = sftp.createWriteStream("/home/admin/build.tar.gz");
+        rs.on("data", (buffer) => {
+            bar.tick(buffer.length);
         });
+        rs.on("close", () => {
+            console.log("stream close");
+        });
+        rs.on("end", () => {
+            console.log("stream end");
+        });
+        rs.pipe(ws);
     });
+
+    // let sftp = new SftpClient();
+    // await sftp.connect({
+    //     host: accessJson.Host,
+    //     username: accessJson.User,
+    //     password: accessJson.PWD,
+    // });
+    // await sftp.fastPut(file, "/home/admin/build.tar.gz", {
+    //     concurrency: 64, // integer. Number of concurrent reads
+    //     chunkSize: 32768, // integer. Size of each read in bytes
+    //     // mode: 0o755, // mixed. Integer or string representing the file mode to set
+    //     step: (total_transferred, chunk, total) => {
+    //         bar.tick(chunk);
+    //     },
+    // });
+    // console.log("finish");
+    // sftp.end();
+
+    // ssh = new NodeSSH();
+    // await ssh.connect({
+    //     host: config.ip,
+    //     username: `${config.username}/${server.ip}/any`,
+    //     password: config.password,
+    // });
+    // let shell = await ssh.requestShell();
+    // shell.on("close", () => {
+    //     console.log("Stream :: close");
+    // });
+    // shell.on("data", (data) => {
+    //     let str = data.toString();
+    //     process.stdout.write(data);
+    //     if (/^login\:/.test(str)) {
+    //         shell.write("admin\n");
+    //     }
+    //     if (/^admin@.*password:/.test(str)) {
+    //         shell.write(`${server.password}\n`);
+    //         setTimeout(() => {
+    //             shell.write("su root\n");
+    //             setTimeout(() => {
+    //                 shell.write(`${server.password}\n`);
+    //                 setTimeout(() => {
+    //                     shell.write("./deploy.sh\n");
+    //                 }, 100);
+    //             }, 100);
+    //         }, 100);
+    //     }
+    // });
 };

+ 1 - 0
config.json

@@ -1,4 +1,5 @@
 {
+    "ip": "10.5.17.151",
     "username": "swjmrhb_ggfw",
     "password": "EqRa6KSd2kF%C&mj",
     "loginUrl": "https://10.5.17.151/shterm/login",

+ 43 - 4
deploy.js

@@ -9,27 +9,59 @@ ssh.connect({
     host: "10.5.17.151",
     username: "swjmrhb_ggfw/10.4.115.9/any",
     password: "EqRa6KSd2kF%C&mj",
+    onKeyboardInteractive(
+        name,
+        instructions,
+        instructionsLang,
+        prompts,
+        finish
+    ) {
+        console.log("🔊🚀🚀🚀🔊 ~ RollbackCommand ~", prompts);
+        if (
+            prompts.length > 0 &&
+            prompts[0].prompt.toLowerCase().includes("password")
+        ) {
+            prompts([
+                {
+                    type: "password",
+                    name: "newPassword",
+                    message: `input the password of ${hostItem}:`,
+                },
+            ]).then(({ newPassword }) => {
+                finish([newPassword]);
+            });
+        }
+    },
 })
     .then(() => {
         return ssh.requestShell();
     })
     .then((stream) => {
         shell = stream;
-        stream
+        shell
             .on("close", () => {
                 console.log("Stream :: close");
                 conn.end();
             })
             .on("data", (data) => {
                 let str = data.toString();
-                console.log(str);
+                process.stdout.write(data);
                 if (/^login\:/.test(str)) {
                     console.log("enter name");
                     stream.write("admin\n");
                 }
                 if (/^admin@.*password:/.test(str)) {
                     console.log("enter password");
-                    stream.write("yWfuA@4NTX!b#2kG\n");
+                    shell.write("yWfuA@4NTX!b#2kG\n");
+                    setTimeout(() => {
+                        shell.write("su root\n");
+                        setTimeout(() => {
+                            shell.write("yWfuA@4NTX!b#2kG\n");
+                            setTimeout(() => {
+                                shell.write("./deploy.sh\n");
+                            }, 100);
+                        }, 100);
+                    }, 100);
                 }
             });
     })
@@ -62,5 +94,12 @@ vorpal.command("upload").action(function (args, callback) {
         }
     );
 });
-
+vorpal.command("ls").action(function (args, callback) {
+    ssh.execCommand("ls").then(function (result) {
+        console.log("STDOUT: " + result.stdout);
+        console.log("STDERR: " + result.stderr);
+        callback();
+    });
+    shell;
+});
 vorpal.delimiter("deploy$").show();

+ 14 - 7
servers.json

@@ -2,36 +2,43 @@
     {
         "name": "服务平台前端",
         "ip": "10.4.115.9",
-        "id": 6906
+        "id": 6906,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "服务平台后端",
         "ip": "10.4.115.10",
-        "id": 6907
+        "id": 6907,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "服务平台数据库",
         "ip": "10.4.115.11",
-        "id": 6908
+        "id": 6908,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "OA",
         "ip": "10.5.23.169",
-        "id": 6909
+        "id": 6909,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "服务平台管理后台",
         "ip": "10.5.23.170",
-        "id": 6910
+        "id": 6910,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "监控平台",
         "ip": "10.5.23.172",
-        "id": 6911
+        "id": 6911,
+        "password": "yWfuA@4NTX!b#2kG"
     },
     {
         "name": "内网数据库",
         "ip": "10.5.23.173",
-        "id": 6912
+        "id": 6912,
+        "password": "yWfuA@4NTX!b#2kG"
     }
 ]

+ 1 - 1
sessionId

@@ -1 +1 @@
-c437c426-a1a7-461c-ab67-d38151eafbb5
+9c15fcc0-780e-46a0-94c0-dbe2b1db191f

+ 18 - 0
upload.py

@@ -0,0 +1,18 @@
+import paramiko
+import os
+from tqdm import tqdm
+
+size = os.path.getsize("/Users/drew/Projects/Java/jmrh/build.tar.gz")
+pbar = tqdm(total=size)
+
+
+def uploadCallback(transferred, toBeTransferred):
+    pbar.n = transferred
+    pbar.update(n=0)
+
+
+handle = paramiko.Transport(("10.5.17.151", 22))
+handle.connect(username="swjmrhb_ggfw", password="OTP:zMNVLDOCXow0")
+sftp = paramiko.SFTPClient.from_transport(handle)
+sftp.put("/Users/drew/Projects/Java/jmrh/build.tar.gz",
+         "/home/admin/build.tar.gz", uploadCallback)