PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/@lerna/create-symlink

Просмотр файла: create-symlink.js

"use strict";

const cmdShim = require("cmd-shim");
const fs = require("fs-extra");
const log = require("npmlog");
const path = require("path");

module.exports.createSymlink = createSymlink;

function createSymlink(src, dest, type) {
  log.silly("createSymlink", [src, dest, type]);

  if (process.platform === "win32") {
    return createWindowsSymlink(src, dest, type);
  }

  return createPosixSymlink(src, dest, type);
}

function createSymbolicLink(src, dest, type) {
  log.silly("createSymbolicLink", [src, dest, type]);

  return fs
    .lstat(dest)
    .then(() => fs.unlink(dest))
    .catch(() => {
      /* nothing exists at destination */
    })
    .then(() => fs.symlink(src, dest, type));
}

function createPosixSymlink(src, dest, _type) {
  const type = _type === "exec" ? "file" : _type;
  const relativeSymlink = path.relative(path.dirname(dest), src);

  if (_type === "exec") {
    // If the src exists, create a real symlink.
    // If the src doesn't exist yet, create a shim shell script.
    return fs.pathExists(src).then((exists) => {
      if (exists) {
        return createSymbolicLink(relativeSymlink, dest, type).then(() => fs.chmod(src, 0o755));
      }

      return shShim(src, dest, type).then(() => fs.chmod(dest, 0o755));
    });
  }

  return createSymbolicLink(relativeSymlink, dest, type);
}

function createWindowsSymlink(src, dest, type) {
  if (type === "exec") {
    // If the src exists, shim directly.
    // If the src doesn't exist yet, create a temp src so cmd-shim doesn't explode.
    return fs.pathExists(src).then((exists) => {
      if (exists) {
        return cmdShim(src, dest);
      }

      return fs
        .outputFile(src, "")
        .then(() => cmdShim(src, dest))
        .then(
          // fs.remove() never rejects
          () => fs.remove(src),
          (err) =>
            fs.remove(src).then(() => {
              // clean up, but don't swallow error
              throw err;
            })
        );
    });
  }

  return createSymbolicLink(src, dest, type);
}

function shShim(src, dest, type) {
  log.silly("shShim", [src, dest, type]);

  const absTarget = path.resolve(path.dirname(dest), src);
  const scriptLines = ["#!/bin/sh", `chmod +x ${absTarget} && exec ${absTarget} "$@"`];

  return fs.writeFile(dest, scriptLines.join("\n"));
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!