{"action":"opened","number":3,"pull_request":{"url":"https://api.github.com/repos/selectel/pyxs/pulls/3","id":41509198,"html_url":"https://github.com/selectel/pyxs/pull/3","diff_url":"https://github.com/selectel/pyxs/pull/3.diff","patch_url":"https://github.com/selectel/pyxs/pull/3.patch","issue_url":"https://api.github.com/repos/selectel/pyxs/issues/3","number":3,"state":"open","locked":false,"title":"don't append NUL character to values written to xenstore","user":{"login":"agtucker","id":2468035,"avatar_url":"https://avatars.githubusercontent.com/u/2468035?v=3","gravatar_id":"","url":"https://api.github.com/users/agtucker","html_url":"https://github.com/agtucker","followers_url":"https://api.github.com/users/agtucker/followers","following_url":"https://api.github.com/users/agtucker/following{/other_user}","gists_url":"https://api.github.com/users/agtucker/gists{/gist_id}","starred_url":"https://api.github.com/users/agtucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agtucker/subscriptions","organizations_url":"https://api.github.com/users/agtucker/orgs","repos_url":"https://api.github.com/users/agtucker/repos","events_url":"https://api.github.com/users/agtucker/events{/privacy}","received_events_url":"https://api.github.com/users/agtucker/received_events","type":"User","site_admin":false},"body":"The XenStore protocol spec says that xenstore values don't\r\ncontain a trailing NUL ('\\x00') byte. The code in execute_command\r\nautomatically appends a NUL after every argument, which creates\r\nvalues in XenStore that include the NUL. This isn't compatible\r\nwith how the hypervisor and guest kernels use XenStore values\r\nand is also incompatible with the XenStore command line tools\r\n(e.g. xenstore-write).\r\n\r\nExample:\r\n\r\n% python\r\n>>> import pyxs\r\n>>> c = pyxs.Client()\r\n>>> c['pyxs'] = 'foo'\r\n>>>\r\n% xenstore-write xs foo\r\n% xenstore-read pyxs\r\nfoo\\000\r\n% xenstore-read xs\r\nfoo","created_at":"2015-08-03T20:59:24Z","updated_at":"2015-08-03T20:59:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/selectel/pyxs/pulls/3/commits","review_comments_url":"https://api.github.com/repos/selectel/pyxs/pulls/3/comments","review_comment_url":"https://api.github.com/repos/selectel/pyxs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/selectel/pyxs/issues/3/comments","statuses_url":"https://api.github.com/repos/selectel/pyxs/statuses/61d34edb6dd25527ab13c3378448c87cfbd51f13","head":{"label":"agtucker:write-nul-submit","ref":"write-nul-submit","sha":"61d34edb6dd25527ab13c3378448c87cfbd51f13","user":{"login":"agtucker","id":2468035,"avatar_url":"https://avatars.githubusercontent.com/u/2468035?v=3","gravatar_id":"","url":"https://api.github.com/users/agtucker","html_url":"https://github.com/agtucker","followers_url":"https://api.github.com/users/agtucker/followers","following_url":"https://api.github.com/users/agtucker/following{/other_user}","gists_url":"https://api.github.com/users/agtucker/gists{/gist_id}","starred_url":"https://api.github.com/users/agtucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agtucker/subscriptions","organizations_url":"https://api.github.com/users/agtucker/orgs","repos_url":"https://api.github.com/users/agtucker/repos","events_url":"https://api.github.com/users/agtucker/events{/privacy}","received_events_url":"https://api.github.com/users/agtucker/received_events","type":"User","site_admin":false},"repo":{"id":40140087,"name":"pyxs","full_name":"agtucker/pyxs","owner":{"login":"agtucker","id":2468035,"avatar_url":"https://avatars.githubusercontent.com/u/2468035?v=3","gravatar_id":"","url":"https://api.github.com/users/agtucker","html_url":"https://github.com/agtucker","followers_url":"https://api.github.com/users/agtucker/followers","following_url":"https://api.github.com/users/agtucker/following{/other_user}","gists_url":"https://api.github.com/users/agtucker/gists{/gist_id}","starred_url":"https://api.github.com/users/agtucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agtucker/subscriptions","organizations_url":"https://api.github.com/users/agtucker/orgs","repos_url":"https://api.github.com/users/agtucker/repos","events_url":"https://api.github.com/users/agtucker/events{/privacy}","received_events_url":"https://api.github.com/users/agtucker/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/agtucker/pyxs","description":"Pure Python bindings to XenStore","fork":true,"url":"https://api.github.com/repos/agtucker/pyxs","forks_url":"https://api.github.com/repos/agtucker/pyxs/forks","keys_url":"https://api.github.com/repos/agtucker/pyxs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/agtucker/pyxs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/agtucker/pyxs/teams","hooks_url":"https://api.github.com/repos/agtucker/pyxs/hooks","issue_events_url":"https://api.github.com/repos/agtucker/pyxs/issues/events{/number}","events_url":"https://api.github.com/repos/agtucker/pyxs/events","assignees_url":"https://api.github.com/repos/agtucker/pyxs/assignees{/user}","branches_url":"https://api.github.com/repos/agtucker/pyxs/branches{/branch}","tags_url":"https://api.github.com/repos/agtucker/pyxs/tags","blobs_url":"https://api.github.com/repos/agtucker/pyxs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/agtucker/pyxs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/agtucker/pyxs/git/refs{/sha}","trees_url":"https://api.github.com/repos/agtucker/pyxs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/agtucker/pyxs/statuses/{sha}","languages_url":"https://api.github.com/repos/agtucker/pyxs/languages","stargazers_url":"https://api.github.com/repos/agtucker/pyxs/stargazers","contributors_url":"https://api.github.com/repos/agtucker/pyxs/contributors","subscribers_url":"https://api.github.com/repos/agtucker/pyxs/subscribers","subscription_url":"https://api.github.com/repos/agtucker/pyxs/subscription","commits_url":"https://api.github.com/repos/agtucker/pyxs/commits{/sha}","git_commits_url":"https://api.github.com/repos/agtucker/pyxs/git/commits{/sha}","comments_url":"https://api.github.com/repos/agtucker/pyxs/comments{/number}","issue_comment_url":"https://api.github.com/repos/agtucker/pyxs/issues/comments{/number}","contents_url":"https://api.github.com/repos/agtucker/pyxs/contents/{+path}","compare_url":"https://api.github.com/repos/agtucker/pyxs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/agtucker/pyxs/merges","archive_url":"https://api.github.com/repos/agtucker/pyxs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/agtucker/pyxs/downloads","issues_url":"https://api.github.com/repos/agtucker/pyxs/issues{/number}","pulls_url":"https://api.github.com/repos/agtucker/pyxs/pulls{/number}","milestones_url":"https://api.github.com/repos/agtucker/pyxs/milestones{/number}","notifications_url":"https://api.github.com/repos/agtucker/pyxs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/agtucker/pyxs/labels{/name}","releases_url":"https://api.github.com/repos/agtucker/pyxs/releases{/id}","created_at":"2015-08-03T18:04:27Z","updated_at":"2015-08-03T18:04:27Z","pushed_at":"2015-08-03T20:57:55Z","git_url":"git://github.com/agtucker/pyxs.git","ssh_url":"git@github.com:agtucker/pyxs.git","clone_url":"https://github.com/agtucker/pyxs.git","svn_url":"https://github.com/agtucker/pyxs","homepage":"http://pyxs.readthedocs.org/","size":345,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"selectel:master","ref":"master","sha":"cd8ae2497aa8c30d0b18348745413ab1dd06f711","user":{"login":"selectel","id":804735,"avatar_url":"https://avatars.githubusercontent.com/u/804735?v=3","gravatar_id":"","url":"https://api.github.com/users/selectel","html_url":"https://github.com/selectel","followers_url":"https://api.github.com/users/selectel/followers","following_url":"https://api.github.com/users/selectel/following{/other_user}","gists_url":"https://api.github.com/users/selectel/gists{/gist_id}","starred_url":"https://api.github.com/users/selectel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/selectel/subscriptions","organizations_url":"https://api.github.com/users/selectel/orgs","repos_url":"https://api.github.com/users/selectel/repos","events_url":"https://api.github.com/users/selectel/events{/privacy}","received_events_url":"https://api.github.com/users/selectel/received_events","type":"Organization","site_admin":false},"repo":{"id":2987507,"name":"pyxs","full_name":"selectel/pyxs","owner":{"login":"selectel","id":804735,"avatar_url":"https://avatars.githubusercontent.com/u/804735?v=3","gravatar_id":"","url":"https://api.github.com/users/selectel","html_url":"https://github.com/selectel","followers_url":"https://api.github.com/users/selectel/followers","following_url":"https://api.github.com/users/selectel/following{/other_user}","gists_url":"https://api.github.com/users/selectel/gists{/gist_id}","starred_url":"https://api.github.com/users/selectel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/selectel/subscriptions","organizations_url":"https://api.github.com/users/selectel/orgs","repos_url":"https://api.github.com/users/selectel/repos","events_url":"https://api.github.com/users/selectel/events{/privacy}","received_events_url":"https://api.github.com/users/selectel/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/selectel/pyxs","description":"Pure Python bindings to XenStore","fork":false,"url":"https://api.github.com/repos/selectel/pyxs","forks_url":"https://api.github.com/repos/selectel/pyxs/forks","keys_url":"https://api.github.com/repos/selectel/pyxs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/selectel/pyxs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/selectel/pyxs/teams","hooks_url":"https://api.github.com/repos/selectel/pyxs/hooks","issue_events_url":"https://api.github.com/repos/selectel/pyxs/issues/events{/number}","events_url":"https://api.github.com/repos/selectel/pyxs/events","assignees_url":"https://api.github.com/repos/selectel/pyxs/assignees{/user}","branches_url":"https://api.github.com/repos/selectel/pyxs/branches{/branch}","tags_url":"https://api.github.com/repos/selectel/pyxs/tags","blobs_url":"https://api.github.com/repos/selectel/pyxs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/selectel/pyxs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/selectel/pyxs/git/refs{/sha}","trees_url":"https://api.github.com/repos/selectel/pyxs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/selectel/pyxs/statuses/{sha}","languages_url":"https://api.github.com/repos/selectel/pyxs/languages","stargazers_url":"https://api.github.com/repos/selectel/pyxs/stargazers","contributors_url":"https://api.github.com/repos/selectel/pyxs/contributors","subscribers_url":"https://api.github.com/repos/selectel/pyxs/subscribers","subscription_url":"https://api.github.com/repos/selectel/pyxs/subscription","commits_url":"https://api.github.com/repos/selectel/pyxs/commits{/sha}","git_commits_url":"https://api.github.com/repos/selectel/pyxs/git/commits{/sha}","comments_url":"https://api.github.com/repos/selectel/pyxs/comments{/number}","issue_comment_url":"https://api.github.com/repos/selectel/pyxs/issues/comments{/number}","contents_url":"https://api.github.com/repos/selectel/pyxs/contents/{+path}","compare_url":"https://api.github.com/repos/selectel/pyxs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/selectel/pyxs/merges","archive_url":"https://api.github.com/repos/selectel/pyxs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/selectel/pyxs/downloads","issues_url":"https://api.github.com/repos/selectel/pyxs/issues{/number}","pulls_url":"https://api.github.com/repos/selectel/pyxs/pulls{/number}","milestones_url":"https://api.github.com/repos/selectel/pyxs/milestones{/number}","notifications_url":"https://api.github.com/repos/selectel/pyxs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/selectel/pyxs/labels{/name}","releases_url":"https://api.github.com/repos/selectel/pyxs/releases{/id}","created_at":"2011-12-15T12:51:48Z","updated_at":"2014-11-28T02:37:30Z","pushed_at":"2015-06-03T20:55:36Z","git_url":"git://github.com/selectel/pyxs.git","ssh_url":"git@github.com:selectel/pyxs.git","clone_url":"https://github.com/selectel/pyxs.git","svn_url":"https://github.com/selectel/pyxs","homepage":"http://pyxs.readthedocs.org/","size":488,"stargazers_count":6,"watchers_count":6,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"open_issues_count":2,"forks":6,"open_issues":2,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/selectel/pyxs/pulls/3"},"html":{"href":"https://github.com/selectel/pyxs/pull/3"},"issue":{"href":"https://api.github.com/repos/selectel/pyxs/issues/3"},"comments":{"href":"https://api.github.com/repos/selectel/pyxs/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/selectel/pyxs/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/selectel/pyxs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/selectel/pyxs/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/selectel/pyxs/statuses/61d34edb6dd25527ab13c3378448c87cfbd51f13"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"commits":1,"additions":5,"deletions":1,"changed_files":1}}