2020-05-26 05:48:10 +02:00
|
|
|
// Package nfpm implements the Pipe interface providing nFPM bindings.
|
2018-02-17 16:16:06 +02:00
|
|
|
package nfpm
|
|
|
|
|
|
|
|
import (
|
2019-05-07 11:59:53 +02:00
|
|
|
"fmt"
|
2018-02-17 16:16:06 +02:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2020-11-05 23:47:55 +02:00
|
|
|
"strings"
|
2018-02-17 16:16:06 +02:00
|
|
|
|
|
|
|
"github.com/apex/log"
|
2020-12-24 04:07:48 +02:00
|
|
|
"github.com/goreleaser/nfpm/v2"
|
|
|
|
_ "github.com/goreleaser/nfpm/v2/apk" // blank import to register the format
|
|
|
|
_ "github.com/goreleaser/nfpm/v2/deb" // blank import to register the format
|
|
|
|
"github.com/goreleaser/nfpm/v2/files"
|
|
|
|
_ "github.com/goreleaser/nfpm/v2/rpm" // blank import to register the format
|
2019-12-27 19:51:40 +02:00
|
|
|
"github.com/imdario/mergo"
|
|
|
|
|
2018-02-17 16:16:06 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/artifact"
|
2020-12-24 04:07:48 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/deprecate"
|
2019-05-07 12:18:35 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/ids"
|
2018-02-17 16:16:06 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/linux"
|
2018-09-12 19:18:01 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/pipe"
|
2018-07-10 06:38:00 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/semerrgroup"
|
2018-07-09 05:47:30 +02:00
|
|
|
"github.com/goreleaser/goreleaser/internal/tmpl"
|
2018-08-15 04:50:20 +02:00
|
|
|
"github.com/goreleaser/goreleaser/pkg/config"
|
|
|
|
"github.com/goreleaser/goreleaser/pkg/context"
|
2018-02-17 16:16:06 +02:00
|
|
|
)
|
|
|
|
|
2021-03-09 12:57:43 +02:00
|
|
|
const defaultNameTemplate = "{{ .PackageName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}"
|
2018-02-17 16:16:06 +02:00
|
|
|
|
2020-05-26 05:48:10 +02:00
|
|
|
// Pipe for nfpm packaging.
|
2018-02-17 16:16:06 +02:00
|
|
|
type Pipe struct{}
|
|
|
|
|
|
|
|
func (Pipe) String() string {
|
2020-03-06 06:25:09 +02:00
|
|
|
return "linux packages"
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
|
|
|
|
2020-05-26 05:48:10 +02:00
|
|
|
// Default sets the pipe defaults.
|
2018-02-17 16:16:06 +02:00
|
|
|
func (Pipe) Default(ctx *context.Context) error {
|
2021-03-09 12:57:43 +02:00
|
|
|
ids := ids.New("nfpms")
|
2019-05-07 11:59:53 +02:00
|
|
|
for i := range ctx.Config.NFPMs {
|
2021-03-09 12:57:43 +02:00
|
|
|
fpm := &ctx.Config.NFPMs[i]
|
2019-05-07 12:18:35 +02:00
|
|
|
if fpm.ID == "" {
|
|
|
|
fpm.ID = "default"
|
|
|
|
}
|
2019-05-07 11:59:53 +02:00
|
|
|
if fpm.Bindir == "" {
|
|
|
|
fpm.Bindir = "/usr/local/bin"
|
|
|
|
}
|
2019-11-15 21:00:48 +02:00
|
|
|
if fpm.PackageName == "" {
|
|
|
|
fpm.PackageName = ctx.Config.ProjectName
|
|
|
|
}
|
|
|
|
if fpm.FileNameTemplate == "" {
|
|
|
|
fpm.FileNameTemplate = defaultNameTemplate
|
2019-05-07 11:59:53 +02:00
|
|
|
}
|
2020-12-24 04:07:48 +02:00
|
|
|
if len(fpm.Files) > 0 {
|
|
|
|
for src, dst := range fpm.Files {
|
|
|
|
fpm.Contents = append(fpm.Contents, &files.Content{
|
|
|
|
Source: src,
|
|
|
|
Destination: dst,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
deprecate.Notice(ctx, "nfpms.files")
|
|
|
|
}
|
|
|
|
if len(fpm.ConfigFiles) > 0 {
|
|
|
|
for src, dst := range fpm.ConfigFiles {
|
|
|
|
fpm.Contents = append(fpm.Contents, &files.Content{
|
|
|
|
Source: src,
|
|
|
|
Destination: dst,
|
|
|
|
Type: "config",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
deprecate.Notice(ctx, "nfpms.config_files")
|
|
|
|
}
|
|
|
|
if len(fpm.Symlinks) > 0 {
|
|
|
|
for src, dst := range fpm.Symlinks {
|
|
|
|
fpm.Contents = append(fpm.Contents, &files.Content{
|
|
|
|
Source: src,
|
|
|
|
Destination: dst,
|
|
|
|
Type: "symlink",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
deprecate.Notice(ctx, "nfpms.symlinks")
|
|
|
|
}
|
|
|
|
if len(fpm.RPM.GhostFiles) > 0 {
|
|
|
|
for _, dst := range fpm.RPM.GhostFiles {
|
|
|
|
fpm.Contents = append(fpm.Contents, &files.Content{
|
|
|
|
Destination: dst,
|
|
|
|
Type: "ghost",
|
|
|
|
Packager: "rpm",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
deprecate.Notice(ctx, "nfpms.rpm.ghost_files")
|
2019-05-07 11:59:53 +02:00
|
|
|
}
|
2020-12-24 04:07:48 +02:00
|
|
|
if len(fpm.RPM.ConfigNoReplaceFiles) > 0 {
|
|
|
|
for src, dst := range fpm.RPM.ConfigNoReplaceFiles {
|
|
|
|
fpm.Contents = append(fpm.Contents, &files.Content{
|
|
|
|
Source: src,
|
|
|
|
Destination: dst,
|
|
|
|
Type: "config|noreplace",
|
|
|
|
Packager: "rpm",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
deprecate.Notice(ctx, "nfpms.rpm.config_noreplace_files")
|
|
|
|
}
|
2020-12-28 19:40:23 +02:00
|
|
|
if fpm.Deb.VersionMetadata != "" {
|
|
|
|
deprecate.Notice(ctx, "nfpms.deb.version_metadata")
|
|
|
|
fpm.VersionMetadata = fpm.Deb.VersionMetadata
|
|
|
|
}
|
2020-12-24 04:07:48 +02:00
|
|
|
|
2019-05-07 11:59:53 +02:00
|
|
|
if len(fpm.Builds) == 0 {
|
|
|
|
for _, b := range ctx.Config.Builds {
|
|
|
|
fpm.Builds = append(fpm.Builds, b.ID)
|
|
|
|
}
|
|
|
|
}
|
2019-05-07 12:18:35 +02:00
|
|
|
ids.Inc(fpm.ID)
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
2019-05-07 12:18:35 +02:00
|
|
|
return ids.Validate()
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
|
|
|
|
2020-05-26 05:48:10 +02:00
|
|
|
// Run the pipe.
|
2018-02-17 16:16:06 +02:00
|
|
|
func (Pipe) Run(ctx *context.Context) error {
|
2019-05-07 11:59:53 +02:00
|
|
|
for _, nfpm := range ctx.Config.NFPMs {
|
|
|
|
if len(nfpm.Formats) == 0 {
|
2019-05-27 17:47:05 +02:00
|
|
|
// FIXME: this assumes other nfpm configs will fail too...
|
2019-05-07 11:59:53 +02:00
|
|
|
return pipe.Skip("no output formats configured")
|
|
|
|
}
|
|
|
|
if err := doRun(ctx, nfpm); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
2019-05-07 11:59:53 +02:00
|
|
|
return nil
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
|
|
|
|
2019-05-07 11:59:53 +02:00
|
|
|
func doRun(ctx *context.Context, fpm config.NFPM) error {
|
2021-03-09 12:57:43 +02:00
|
|
|
linuxBinaries := ctx.Artifacts.Filter(artifact.And(
|
2018-02-17 18:28:48 +02:00
|
|
|
artifact.ByType(artifact.Binary),
|
|
|
|
artifact.ByGoos("linux"),
|
2019-05-07 11:59:53 +02:00
|
|
|
artifact.ByIDs(fpm.Builds...),
|
2018-02-17 18:28:48 +02:00
|
|
|
)).GroupByPlatform()
|
2019-05-07 11:59:53 +02:00
|
|
|
if len(linuxBinaries) == 0 {
|
|
|
|
return fmt.Errorf("no linux binaries found for builds %v", fpm.Builds)
|
|
|
|
}
|
2021-03-09 12:57:43 +02:00
|
|
|
g := semerrgroup.New(ctx.Parallelism)
|
2019-05-07 11:59:53 +02:00
|
|
|
for _, format := range fpm.Formats {
|
2018-02-17 18:28:48 +02:00
|
|
|
for platform, artifacts := range linuxBinaries {
|
2018-02-17 16:16:06 +02:00
|
|
|
format := format
|
|
|
|
arch := linux.Arch(platform)
|
|
|
|
artifacts := artifacts
|
|
|
|
g.Go(func() error {
|
2019-05-07 11:59:53 +02:00
|
|
|
return create(ctx, fpm, format, arch, artifacts)
|
2018-02-17 16:16:06 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return g.Wait()
|
|
|
|
}
|
|
|
|
|
2019-05-07 11:59:53 +02:00
|
|
|
func mergeOverrides(fpm config.NFPM, format string) (*config.NFPMOverridables, error) {
|
2019-11-12 16:51:27 +02:00
|
|
|
var overridden config.NFPMOverridables
|
|
|
|
if err := mergo.Merge(&overridden, fpm.NFPMOverridables); err != nil {
|
2018-04-21 16:48:22 +02:00
|
|
|
return nil, err
|
|
|
|
}
|
2019-05-07 11:59:53 +02:00
|
|
|
perFormat, ok := fpm.Overrides[format]
|
2018-04-21 16:48:22 +02:00
|
|
|
if ok {
|
2019-11-12 16:51:27 +02:00
|
|
|
err := mergo.Merge(&overridden, perFormat, mergo.WithOverride)
|
2018-04-21 16:48:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
2019-11-12 16:51:27 +02:00
|
|
|
return &overridden, nil
|
2018-04-21 16:48:22 +02:00
|
|
|
}
|
|
|
|
|
2019-08-12 22:44:48 +02:00
|
|
|
func create(ctx *context.Context, fpm config.NFPM, format, arch string, binaries []*artifact.Artifact) error {
|
2019-11-12 16:51:27 +02:00
|
|
|
overridden, err := mergeOverrides(fpm, format)
|
2018-04-21 16:48:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2018-07-09 05:47:30 +02:00
|
|
|
name, err := tmpl.New(ctx).
|
2019-11-12 16:51:27 +02:00
|
|
|
WithArtifact(binaries[0], overridden.Replacements).
|
2020-03-22 18:54:47 +02:00
|
|
|
WithExtraFields(tmpl.Fields{
|
2021-03-09 12:57:43 +02:00
|
|
|
"Release": fpm.Release,
|
|
|
|
"Epoch": fpm.Epoch,
|
|
|
|
"PackageName": fpm.PackageName,
|
2020-03-22 18:54:47 +02:00
|
|
|
}).
|
2019-11-15 21:00:48 +02:00
|
|
|
Apply(overridden.FileNameTemplate)
|
2018-02-17 16:16:06 +02:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-12-24 04:07:48 +02:00
|
|
|
|
2021-03-09 12:57:43 +02:00
|
|
|
contents := append(files.Contents{}, overridden.Contents...)
|
2020-12-24 04:07:48 +02:00
|
|
|
|
2020-06-19 16:04:10 +02:00
|
|
|
// FPM meta package should not contain binaries at all
|
|
|
|
if !fpm.Meta {
|
2021-03-09 12:57:43 +02:00
|
|
|
log := log.WithField("package", name+"."+format).WithField("arch", arch)
|
2020-06-19 16:04:10 +02:00
|
|
|
for _, binary := range binaries {
|
|
|
|
src := binary.Path
|
|
|
|
dst := filepath.Join(fpm.Bindir, binary.Name)
|
|
|
|
log.WithField("src", src).WithField("dst", dst).Debug("adding binary to package")
|
2020-12-24 04:07:48 +02:00
|
|
|
contents = append(contents, &files.Content{
|
2021-03-09 23:16:54 +02:00
|
|
|
Source: filepath.ToSlash(src),
|
|
|
|
Destination: filepath.ToSlash(dst),
|
2020-12-24 04:07:48 +02:00
|
|
|
})
|
2020-06-19 16:04:10 +02:00
|
|
|
}
|
2018-02-17 20:51:18 +02:00
|
|
|
}
|
2020-12-24 04:07:48 +02:00
|
|
|
|
2020-12-30 14:23:14 +02:00
|
|
|
log.WithField("files", destinations(contents)).Debug("all archive files")
|
2018-02-17 16:16:06 +02:00
|
|
|
|
2021-03-09 12:57:43 +02:00
|
|
|
info := &nfpm.Info{
|
2020-12-28 19:40:23 +02:00
|
|
|
Arch: arch,
|
|
|
|
Platform: "linux",
|
|
|
|
Name: fpm.PackageName,
|
|
|
|
Version: ctx.Version,
|
2021-01-06 03:04:46 +02:00
|
|
|
Section: fpm.Section,
|
|
|
|
Priority: fpm.Priority,
|
2020-12-28 19:40:23 +02:00
|
|
|
Epoch: fpm.Epoch,
|
|
|
|
Release: fpm.Release,
|
|
|
|
Prerelease: fpm.Prerelease,
|
|
|
|
VersionMetadata: fpm.VersionMetadata,
|
|
|
|
Maintainer: fpm.Maintainer,
|
|
|
|
Description: fpm.Description,
|
|
|
|
Vendor: fpm.Vendor,
|
|
|
|
Homepage: fpm.Homepage,
|
|
|
|
License: fpm.License,
|
2018-04-19 05:01:51 +02:00
|
|
|
Overridables: nfpm.Overridables{
|
2019-11-12 16:51:27 +02:00
|
|
|
Conflicts: overridden.Conflicts,
|
|
|
|
Depends: overridden.Dependencies,
|
|
|
|
Recommends: overridden.Recommends,
|
|
|
|
Suggests: overridden.Suggests,
|
2020-11-06 20:17:08 +02:00
|
|
|
Replaces: overridden.Replaces,
|
2019-11-12 16:51:27 +02:00
|
|
|
EmptyFolders: overridden.EmptyFolders,
|
2020-12-24 04:07:48 +02:00
|
|
|
Contents: contents,
|
2018-04-19 05:01:51 +02:00
|
|
|
Scripts: nfpm.Scripts{
|
2019-11-12 16:51:27 +02:00
|
|
|
PreInstall: overridden.Scripts.PreInstall,
|
|
|
|
PostInstall: overridden.Scripts.PostInstall,
|
|
|
|
PreRemove: overridden.Scripts.PreRemove,
|
|
|
|
PostRemove: overridden.Scripts.PostRemove,
|
2018-04-19 05:01:51 +02:00
|
|
|
},
|
2020-11-05 23:47:55 +02:00
|
|
|
Deb: nfpm.Deb{
|
|
|
|
Scripts: nfpm.DebScripts{
|
|
|
|
Rules: overridden.Deb.Scripts.Rules,
|
|
|
|
Templates: overridden.Deb.Scripts.Templates,
|
|
|
|
},
|
|
|
|
Triggers: nfpm.DebTriggers{
|
|
|
|
Interest: overridden.Deb.Triggers.Interest,
|
|
|
|
InterestAwait: overridden.Deb.Triggers.InterestAwait,
|
|
|
|
InterestNoAwait: overridden.Deb.Triggers.InterestNoAwait,
|
|
|
|
Activate: overridden.Deb.Triggers.Activate,
|
|
|
|
ActivateAwait: overridden.Deb.Triggers.ActivateAwait,
|
|
|
|
ActivateNoAwait: overridden.Deb.Triggers.ActivateNoAwait,
|
|
|
|
},
|
2020-12-28 19:40:23 +02:00
|
|
|
Breaks: overridden.Deb.Breaks,
|
2020-11-05 23:47:55 +02:00
|
|
|
Signature: nfpm.DebSignature{
|
2021-02-10 20:43:17 +02:00
|
|
|
PackageSignature: nfpm.PackageSignature{
|
|
|
|
KeyFile: overridden.Deb.Signature.KeyFile,
|
|
|
|
KeyPassphrase: getPassphraseFromEnv(ctx, "DEB", fpm.ID),
|
|
|
|
},
|
|
|
|
Type: overridden.Deb.Signature.Type,
|
2020-11-05 23:47:55 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
RPM: nfpm.RPM{
|
2020-12-24 04:07:48 +02:00
|
|
|
Summary: overridden.RPM.Summary,
|
|
|
|
Group: overridden.RPM.Group,
|
|
|
|
Compression: overridden.RPM.Compression,
|
2020-11-05 23:47:55 +02:00
|
|
|
Signature: nfpm.RPMSignature{
|
2021-02-10 20:43:17 +02:00
|
|
|
PackageSignature: nfpm.PackageSignature{
|
|
|
|
KeyFile: overridden.RPM.Signature.KeyFile,
|
|
|
|
KeyPassphrase: getPassphraseFromEnv(ctx, "RPM", fpm.ID),
|
|
|
|
},
|
2020-11-05 23:47:55 +02:00
|
|
|
},
|
2021-04-28 15:01:03 +02:00
|
|
|
Scripts: nfpm.RPMScripts{
|
|
|
|
PreTrans: overridden.RPM.Scripts.PreTrans,
|
|
|
|
PostTrans: overridden.RPM.Scripts.PostTrans,
|
|
|
|
},
|
2020-11-05 23:47:55 +02:00
|
|
|
},
|
|
|
|
APK: nfpm.APK{
|
|
|
|
Signature: nfpm.APKSignature{
|
2021-02-10 20:43:17 +02:00
|
|
|
PackageSignature: nfpm.PackageSignature{
|
|
|
|
KeyFile: overridden.APK.Signature.KeyFile,
|
|
|
|
KeyPassphrase: getPassphraseFromEnv(ctx, "APK", fpm.ID),
|
|
|
|
},
|
|
|
|
KeyName: overridden.APK.Signature.KeyName,
|
2020-11-05 23:47:55 +02:00
|
|
|
},
|
|
|
|
},
|
2018-04-18 23:56:15 +02:00
|
|
|
},
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
2018-02-17 18:28:48 +02:00
|
|
|
|
2020-12-14 13:50:26 +02:00
|
|
|
if ctx.SkipSign {
|
|
|
|
info.APK.Signature = nfpm.APKSignature{}
|
|
|
|
info.RPM.Signature = nfpm.RPMSignature{}
|
|
|
|
info.Deb.Signature = nfpm.DebSignature{}
|
|
|
|
}
|
|
|
|
|
2018-04-06 02:34:25 +02:00
|
|
|
if err = nfpm.Validate(info); err != nil {
|
2020-09-21 19:47:51 +02:00
|
|
|
return fmt.Errorf("invalid nfpm config: %w", err)
|
2018-04-06 01:41:12 +02:00
|
|
|
}
|
|
|
|
|
2018-02-17 16:16:06 +02:00
|
|
|
packager, err := nfpm.Get(format)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2021-03-09 12:57:43 +02:00
|
|
|
path := filepath.Join(ctx.Config.Dist, name+"."+format)
|
2018-10-27 18:38:24 +02:00
|
|
|
log.WithField("file", path).Info("creating")
|
2018-02-17 16:16:06 +02:00
|
|
|
w, err := os.Create(path)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-05-26 05:48:10 +02:00
|
|
|
defer w.Close()
|
2018-02-17 16:16:06 +02:00
|
|
|
if err := packager.Package(nfpm.WithDefaults(info), w); err != nil {
|
2020-09-21 19:47:51 +02:00
|
|
|
return fmt.Errorf("nfpm failed: %w", err)
|
2018-02-17 16:16:06 +02:00
|
|
|
}
|
2018-02-17 18:28:48 +02:00
|
|
|
if err := w.Close(); err != nil {
|
2020-09-21 19:47:51 +02:00
|
|
|
return fmt.Errorf("could not close package file: %w", err)
|
2018-02-17 18:28:48 +02:00
|
|
|
}
|
2019-08-12 22:44:48 +02:00
|
|
|
ctx.Artifacts.Add(&artifact.Artifact{
|
2018-02-17 16:16:06 +02:00
|
|
|
Type: artifact.LinuxPackage,
|
|
|
|
Name: name + "." + format,
|
|
|
|
Path: path,
|
|
|
|
Goos: binaries[0].Goos,
|
|
|
|
Goarch: binaries[0].Goarch,
|
|
|
|
Goarm: binaries[0].Goarm,
|
2019-05-07 11:59:53 +02:00
|
|
|
Extra: map[string]interface{}{
|
|
|
|
"Builds": binaries,
|
2020-02-27 14:45:12 +02:00
|
|
|
"ID": fpm.ID,
|
2020-03-22 18:54:47 +02:00
|
|
|
"Format": format,
|
2020-12-24 04:07:48 +02:00
|
|
|
"Files": contents,
|
2019-05-07 11:59:53 +02:00
|
|
|
},
|
2018-02-17 16:16:06 +02:00
|
|
|
})
|
|
|
|
return nil
|
|
|
|
}
|
2020-11-05 23:47:55 +02:00
|
|
|
|
2020-12-30 14:23:14 +02:00
|
|
|
func destinations(contents files.Contents) []string {
|
2021-03-09 12:57:43 +02:00
|
|
|
result := make([]string, 0, len(contents))
|
2020-12-30 14:23:14 +02:00
|
|
|
for _, f := range contents {
|
|
|
|
result = append(result, f.Destination)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2020-11-05 23:47:55 +02:00
|
|
|
func getPassphraseFromEnv(ctx *context.Context, packager string, nfpmID string) string {
|
|
|
|
var passphrase string
|
|
|
|
|
|
|
|
nfpmID = strings.ToUpper(nfpmID)
|
|
|
|
packagerSpecificPassphrase := ctx.Env[fmt.Sprintf(
|
|
|
|
"NFPM_%s_%s_PASSPHRASE",
|
|
|
|
nfpmID,
|
|
|
|
packager,
|
|
|
|
)]
|
|
|
|
if packagerSpecificPassphrase != "" {
|
|
|
|
passphrase = packagerSpecificPassphrase
|
|
|
|
} else {
|
|
|
|
generalPassphrase := ctx.Env[fmt.Sprintf("NFPM_%s_PASSPHRASE", nfpmID)]
|
|
|
|
passphrase = generalPassphrase
|
|
|
|
}
|
|
|
|
|
|
|
|
return passphrase
|
|
|
|
}
|