Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
f4fd369d
Unverified
提交
f4fd369d
authored
1月 02, 2018
作者:
Whyrusleeping
提交者:
GitHub
1月 02, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4195 from ipfs/feat/config-patch
config: command to apply profile after init
上级
f013a768
ac26cf19
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
292 行增加
和
37 行删除
+292
-37
init.go
cmd/ipfs/init.go
+1
-1
config.go
core/commands/config.go
+59
-0
config.md
docs/config.md
+40
-0
init.go
repo/config/init.go
+15
-11
profile.go
repo/config/profile.go
+75
-25
fsrepo.go
repo/fsrepo/fsrepo.go
+26
-0
mock.go
repo/mock.go
+4
-0
repo.go
repo/repo.go
+1
-0
t0021-config.sh
test/sharness/t0021-config.sh
+71
-0
没有找到文件。
cmd/ipfs/init.go
浏览文件 @
f4fd369d
...
...
@@ -160,7 +160,7 @@ func doInit(out io.Writer, repoRoot string, empty bool, nBitsForKeypair int, con
}
for
_
,
profile
:=
range
confProfiles
{
transformer
,
ok
:=
config
.
Config
Profiles
[
profile
]
transformer
,
ok
:=
config
.
Profiles
[
profile
]
if
!
ok
{
return
fmt
.
Errorf
(
"invalid configuration profile: %s"
,
profile
)
}
...
...
core/commands/config.go
浏览文件 @
f4fd369d
...
...
@@ -142,6 +142,7 @@ Set the value of the 'Datastore.Path' key:
"show"
:
configShowCmd
,
"edit"
:
configEditCmd
,
"replace"
:
configReplaceCmd
,
"profile"
:
configProfileCmd
,
},
}
...
...
@@ -293,6 +294,64 @@ can't be undone.
},
}
var
configProfileCmd
=
&
cmds
.
Command
{
Helptext
:
cmdkit
.
HelpText
{
Tagline
:
"Apply profiles to config."
,
},
Subcommands
:
map
[
string
]
*
cmds
.
Command
{
"apply"
:
configProfileApplyCmd
,
},
}
var
configProfileApplyCmd
=
&
cmds
.
Command
{
Helptext
:
cmdkit
.
HelpText
{
Tagline
:
"Apply profile to config."
,
},
Arguments
:
[]
cmdkit
.
Argument
{
cmdkit
.
StringArg
(
"profile"
,
true
,
false
,
"The profile to apply to the config."
),
},
Run
:
func
(
req
cmds
.
Request
,
res
cmds
.
Response
)
{
profile
,
ok
:=
config
.
Profiles
[
req
.
Arguments
()[
0
]]
if
!
ok
{
res
.
SetError
(
fmt
.
Errorf
(
"%s is not a profile"
,
req
.
Arguments
()[
0
]),
cmdkit
.
ErrNormal
)
return
}
err
:=
transformConfig
(
req
.
InvocContext
()
.
ConfigRoot
,
req
.
Arguments
()[
0
],
profile
)
if
err
!=
nil
{
res
.
SetError
(
err
,
cmdkit
.
ErrNormal
)
return
}
res
.
SetOutput
(
nil
)
},
}
func
transformConfig
(
configRoot
string
,
configName
string
,
transformer
config
.
Transformer
)
error
{
r
,
err
:=
fsrepo
.
Open
(
configRoot
)
if
err
!=
nil
{
return
err
}
defer
r
.
Close
()
cfg
,
err
:=
r
.
Config
()
if
err
!=
nil
{
return
err
}
err
=
transformer
(
cfg
)
if
err
!=
nil
{
return
err
}
_
,
err
=
r
.
BackupConfig
(
"pre-"
+
configName
+
"-"
)
if
err
!=
nil
{
return
err
}
return
r
.
SetConfig
(
cfg
)
}
func
getConfig
(
r
repo
.
Repo
,
key
string
)
(
*
ConfigField
,
error
)
{
value
,
err
:=
r
.
GetConfigKey
(
key
)
if
err
!=
nil
{
...
...
docs/config.md
浏览文件 @
f4fd369d
...
...
@@ -4,6 +4,46 @@ The go-ipfs config file is a json document. It is read once at node instantiatio
either for an offline command, or when starting the daemon. Commands that execute
on a running daemon do not read the config file at runtime.
#### Profiles
Configuration profiles allow to tweak configuration quickly. Profiles can be
applied with
`--profile`
flag to
`ipfs init`
or with
`ipfs config profile apply`
command. When a profile is applied a backup of the configuration file will
be created in $IPFS_PATH
Available profiles:
-
`server`
Recommended for nodes with public IPv4 address (servers, VPSes, etc.),
disables host and content discovery in local networks.
-
`local-discovery`
Sets default values to fields affected by
`server`
profile, enables
discovery in local networks.
-
`test`
Reduces external interference, useful for running ipfs in test environments.
Note that with these settings node won't be able to talk to the rest of the
network without manual bootstrap.
-
`default-networking`
Restores default network settings. Inverse profile of the
`test`
profile.
-
`badgerds`
Replaces default datastore configuration with experimental badger datastore.
If you apply this profile after
`ipfs init`
, you will need to convert your
datastore to the new configuration. You can do this using
[
ipfs-ds-convert
](
https://github.com/ipfs/ipfs-ds-convert
)
WARNING: badger datastore is experimental. Make sure to backup your data
frequently.
-
`default-datastore`
Restores default datastore configuration.
## Table of Contents
-
[
`Addresses`
](
#addresses
)
...
...
repo/config/init.go
浏览文件 @
f4fd369d
...
...
@@ -28,17 +28,7 @@ func Init(out io.Writer, nBitsForKeypair int) (*Config, error) {
// setup the node's default addresses.
// NOTE: two swarm listen addrs, one tcp, one utp.
Addresses
:
Addresses
{
Swarm
:
[]
string
{
"/ip4/0.0.0.0/tcp/4001"
,
// "/ip4/0.0.0.0/udp/4002/utp", // disabled for now.
"/ip6/::/tcp/4001"
,
},
Announce
:
[]
string
{},
NoAnnounce
:
[]
string
{},
API
:
"/ip4/127.0.0.1/tcp/5001"
,
Gateway
:
"/ip4/127.0.0.1/tcp/8080"
,
},
Addresses
:
addressesConfig
(),
Datastore
:
datastore
,
Bootstrap
:
BootstrapPeerStrings
(
bootstrapPeers
),
...
...
@@ -97,6 +87,20 @@ const DefaultConnMgrLowWater = 600
// grace period
const
DefaultConnMgrGracePeriod
=
time
.
Second
*
20
func
addressesConfig
()
Addresses
{
return
Addresses
{
Swarm
:
[]
string
{
"/ip4/0.0.0.0/tcp/4001"
,
// "/ip4/0.0.0.0/udp/4002/utp", // disabled for now.
"/ip6/::/tcp/4001"
,
},
Announce
:
[]
string
{},
NoAnnounce
:
[]
string
{},
API
:
"/ip4/127.0.0.1/tcp/5001"
,
Gateway
:
"/ip4/127.0.0.1/tcp/8080"
,
}
}
// DefaultDatastoreConfig is an internal function exported to aid in testing.
func
DefaultDatastoreConfig
()
Datastore
{
return
Datastore
{
...
...
repo/config/profile.go
浏览文件 @
f4fd369d
package
config
// ConfigProfiles is a map holding configuration transformers
var
ConfigProfiles
=
map
[
string
]
func
(
*
Config
)
error
{
"server"
:
func
(
c
*
Config
)
error
{
// Transformer is a function which takes configuration and applies some filter to it
type
Transformer
func
(
c
*
Config
)
error
// defaultServerFilters has a list of non-routable IPv4 prefixes
// according to http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
defaultServerFilters
:
=
[]
string
{
"/ip4/10.0.0.0/ipcidr/8"
,
"/ip4/100.64.0.0/ipcidr/10"
,
"/ip4/169.254.0.0/ipcidr/16"
,
"/ip4/172.16.0.0/ipcidr/12"
,
"/ip4/192.0.0.0/ipcidr/24"
,
"/ip4/192.0.0.0/ipcidr/29"
,
"/ip4/192.0.0.8/ipcidr/32"
,
"/ip4/192.0.0.170/ipcidr/32"
,
"/ip4/192.0.0.171/ipcidr/32"
,
"/ip4/192.0.2.0/ipcidr/24"
,
"/ip4/192.168.0.0/ipcidr/16"
,
"/ip4/198.18.0.0/ipcidr/15"
,
"/ip4/198.51.100.0/ipcidr/24"
,
"/ip4/203.0.113.0/ipcidr/24"
,
"/ip4/240.0.0.0/ipcidr/4"
,
}
// defaultServerFilters has a list of non-routable IPv4 prefixes
// according to http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
var
defaultServerFilters
=
[]
string
{
"/ip4/10.0.0.0/ipcidr/8"
,
"/ip4/100.64.0.0/ipcidr/10"
,
"/ip4/169.254.0.0/ipcidr/16"
,
"/ip4/172.16.0.0/ipcidr/12"
,
"/ip4/192.0.0.0/ipcidr/24"
,
"/ip4/192.0.0.0/ipcidr/29"
,
"/ip4/192.0.0.8/ipcidr/32"
,
"/ip4/192.0.0.170/ipcidr/32"
,
"/ip4/192.0.0.171/ipcidr/32"
,
"/ip4/192.0.2.0/ipcidr/24"
,
"/ip4/192.168.0.0/ipcidr/16"
,
"/ip4/198.18.0.0/ipcidr/15"
,
"/ip4/198.51.100.0/ipcidr/24"
,
"/ip4/203.0.113.0/ipcidr/24"
,
"/ip4/240.0.0.0/ipcidr/4"
,
}
c
.
Swarm
.
AddrFilters
=
append
(
c
.
Swarm
.
AddrFilters
,
defaultServerFilters
...
)
// Profiles is a map holding configuration transformers. Docs are in docs/config.md
var
Profiles
=
map
[
string
]
Transformer
{
"server"
:
func
(
c
*
Config
)
error
{
c
.
Addresses
.
NoAnnounce
=
appendSingle
(
c
.
Addresses
.
NoAnnounce
,
defaultServerFilters
)
c
.
Swarm
.
AddrFilters
=
appendSingle
(
c
.
Swarm
.
AddrFilters
,
defaultServerFilters
)
c
.
Discovery
.
MDNS
.
Enabled
=
false
return
nil
},
"local-discovery"
:
func
(
c
*
Config
)
error
{
c
.
Addresses
.
NoAnnounce
=
deleteEntries
(
c
.
Addresses
.
NoAnnounce
,
defaultServerFilters
)
c
.
Swarm
.
AddrFilters
=
deleteEntries
(
c
.
Swarm
.
AddrFilters
,
defaultServerFilters
)
c
.
Discovery
.
MDNS
.
Enabled
=
true
return
nil
},
"test"
:
func
(
c
*
Config
)
error
{
c
.
Addresses
.
API
=
"/ip4/127.0.0.1/tcp/0"
c
.
Addresses
.
Gateway
=
"/ip4/127.0.0.1/tcp/0"
c
.
Swarm
.
DisableNatPortMap
=
true
c
.
Addresses
.
Swarm
=
[]
string
{
"/ip4/127.0.0.1/tcp/0"
,
}
c
.
Swarm
.
DisableNatPortMap
=
true
c
.
Bootstrap
=
[]
string
{}
c
.
Discovery
.
MDNS
.
Enabled
=
false
return
nil
},
"default-networking"
:
func
(
c
*
Config
)
error
{
c
.
Addresses
=
addressesConfig
()
c
.
Swarm
.
DisableNatPortMap
=
false
c
.
Discovery
.
MDNS
.
Enabled
=
true
return
nil
},
"badgerds"
:
func
(
c
*
Config
)
error
{
c
.
Datastore
.
Spec
=
map
[
string
]
interface
{}{
"type"
:
"measure"
,
...
...
@@ -53,4 +69,38 @@ var ConfigProfiles = map[string]func(*Config) error{
}
return
nil
},
"default-datastore"
:
func
(
c
*
Config
)
error
{
c
.
Datastore
.
Spec
=
DefaultDatastoreConfig
()
.
Spec
return
nil
},
}
func
appendSingle
(
a
[]
string
,
b
[]
string
)
[]
string
{
m
:=
map
[
string
]
struct
{}{}
for
_
,
f
:=
range
a
{
m
[
f
]
=
struct
{}{}
}
for
_
,
f
:=
range
b
{
m
[
f
]
=
struct
{}{}
}
return
mapKeys
(
m
)
}
func
deleteEntries
(
arr
[]
string
,
del
[]
string
)
[]
string
{
m
:=
map
[
string
]
struct
{}{}
for
_
,
f
:=
range
arr
{
m
[
f
]
=
struct
{}{}
}
for
_
,
f
:=
range
del
{
delete
(
m
,
f
)
}
return
mapKeys
(
m
)
}
func
mapKeys
(
m
map
[
string
]
struct
{})
[]
string
{
out
:=
make
([]
string
,
0
,
len
(
m
))
for
f
:=
range
m
{
out
=
append
(
out
,
f
)
}
return
out
}
repo/fsrepo/fsrepo.go
浏览文件 @
f4fd369d
...
...
@@ -480,6 +480,32 @@ func (r *FSRepo) FileManager() *filestore.FileManager {
return
r
.
filemgr
}
func
(
r
*
FSRepo
)
BackupConfig
(
prefix
string
)
(
string
,
error
)
{
temp
,
err
:=
ioutil
.
TempFile
(
r
.
path
,
"config-"
+
prefix
)
if
err
!=
nil
{
return
""
,
err
}
defer
temp
.
Close
()
configFilename
,
err
:=
config
.
Filename
(
r
.
path
)
if
err
!=
nil
{
return
""
,
err
}
orig
,
err
:=
os
.
OpenFile
(
configFilename
,
os
.
O_RDONLY
,
0600
)
if
err
!=
nil
{
return
""
,
err
}
defer
orig
.
Close
()
_
,
err
=
io
.
Copy
(
temp
,
orig
)
if
err
!=
nil
{
return
""
,
err
}
return
orig
.
Name
(),
nil
}
// setConfigUnsynced is for private use.
func
(
r
*
FSRepo
)
setConfigUnsynced
(
updated
*
config
.
Config
)
error
{
configFilename
,
err
:=
config
.
Filename
(
r
.
path
)
...
...
repo/mock.go
浏览文件 @
f4fd369d
...
...
@@ -28,6 +28,10 @@ func (m *Mock) SetConfig(updated *config.Config) error {
return
nil
}
func
(
m
*
Mock
)
BackupConfig
(
prefix
string
)
(
string
,
error
)
{
return
""
,
errTODO
}
func
(
m
*
Mock
)
SetConfigKey
(
key
string
,
value
interface
{})
error
{
return
errTODO
}
...
...
repo/repo.go
浏览文件 @
f4fd369d
...
...
@@ -18,6 +18,7 @@ var (
type
Repo
interface
{
Config
()
(
*
config
.
Config
,
error
)
BackupConfig
(
prefix
string
)
(
string
,
error
)
SetConfig
(
*
config
.
Config
)
error
SetConfigKey
(
key
string
,
value
interface
{})
error
...
...
test/sharness/t0021-config.sh
浏览文件 @
f4fd369d
...
...
@@ -48,6 +48,33 @@ CONFIG_SET_JSON_TEST='{
}
}'
test_profile_apply_revert
()
{
profile
=
$1
inverse_profile
=
$2
test_expect_success
"save expected config"
'
ipfs config show >expected
'
test_expect_success
"'ipfs config profile apply
${
profile
}
' works"
'
ipfs config profile apply '
${
profile
}
'
'
test_expect_success
"profile
${
profile
}
changed something"
'
ipfs config show >actual &&
test_must_fail test_cmp expected actual
'
test_expect_success
"'ipfs config profile apply
${
inverse_profile
}
' works"
'
ipfs config profile apply '
${
inverse_profile
}
'
'
test_expect_success
"config is back to previous state after
${
inverse_profile
}
was applied"
'
ipfs config show >actual &&
test_cmp expected actual
'
}
test_config_cmd
()
{
test_config_cmd_set
"beep"
"boop"
test_config_cmd_set
"beep1"
"boop2"
...
...
@@ -151,6 +178,50 @@ test_config_cmd() {
echo "Error: setting private key with API is not supported" > replace_expected
test_cmp replace_out replace_expected
'
test_expect_success
"'ipfs config Swarm.AddrFilters' looks good"
'
ipfs config Swarm.AddrFilters > actual_config &&
test $(cat actual_config | wc -l) = 1
'
test_expect_success
"copy ipfs config"
'
cp "$IPFS_PATH/config" before_patch
'
test_expect_success
"'ipfs config profile apply server' works"
'
ipfs config profile apply server
'
test_expect_success
"backup was created and looks good"
'
test_cmp "$(find "$IPFS_PATH" -name "config-*")" before_patch
'
test_expect_success
"'ipfs config Swarm.AddrFilters' looks good with server profile"
'
ipfs config Swarm.AddrFilters > actual_config &&
test $(cat actual_config | wc -l) = 17
'
test_expect_success
"'ipfs config profile apply local-discovery' works"
'
ipfs config profile apply local-discovery
'
test_expect_success
"'ipfs config Swarm.AddrFilters' looks good with applied local-discovery profile"
'
ipfs config Swarm.AddrFilters > actual_config &&
test $(cat actual_config | wc -l) = 1
'
test_profile_apply_revert server local-discovery
# won't work as we already have this profile applied
# test_profile_apply_revert test
# won't work as it changes datastore definition, which makes ipfs not launch
# without converting first
# test_profile_apply_revert badgerds
test_expect_success
"cleanup config backups"
'
find "$IPFS_PATH" -name "config-*" -exec rm {} \;
'
}
test_init_ipfs
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论