InPanel 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. inpanel/__init__.py +29 -0
  2. inpanel/acme.py +289 -0
  3. inpanel/aliyuncs.py +269 -0
  4. inpanel/app.py +514 -0
  5. inpanel/apt.py +223 -0
  6. inpanel/base.py +200 -0
  7. inpanel/config.py +139 -0
  8. inpanel/data/config.ini +29 -0
  9. inpanel/data/history +5 -0
  10. inpanel/data/runlogs.ini +12 -0
  11. inpanel/data/update_info.ini +4 -0
  12. inpanel/dnf.py +225 -0
  13. inpanel/lib/__init__.py +9 -0
  14. inpanel/lib/async_process.py +98 -0
  15. inpanel/lib/filelock.py +82 -0
  16. inpanel/lib/magic.py +233 -0
  17. inpanel/lib/pxssh.py +310 -0
  18. inpanel/lib/pyDes.py +867 -0
  19. inpanel/mod/__init__.py +0 -0
  20. inpanel/mod/apt.py +316 -0
  21. inpanel/mod/certificate.py +268 -0
  22. inpanel/mod/config.py +372 -0
  23. inpanel/mod/cron.py +315 -0
  24. inpanel/mod/disk.py +322 -0
  25. inpanel/mod/dnf.py +239 -0
  26. inpanel/mod/file.py +722 -0
  27. inpanel/mod/firewall.py +199 -0
  28. inpanel/mod/firewall_base.py +137 -0
  29. inpanel/mod/firewall_firewalld.py +170 -0
  30. inpanel/mod/firewall_iptables.py +176 -0
  31. inpanel/mod/firewall_macos.py +213 -0
  32. inpanel/mod/firewall_ufw.py +128 -0
  33. inpanel/mod/ftp.py +231 -0
  34. inpanel/mod/httpd.py +1205 -0
  35. inpanel/mod/lighttpd.py +26 -0
  36. inpanel/mod/login.py +98 -0
  37. inpanel/mod/mysql.py +577 -0
  38. inpanel/mod/named.py +26 -0
  39. inpanel/mod/nginx.py +2327 -0
  40. inpanel/mod/package.py +33 -0
  41. inpanel/mod/package_apt.py +62 -0
  42. inpanel/mod/package_base.py +77 -0
  43. inpanel/mod/package_dnf.py +62 -0
  44. inpanel/mod/package_map.py +366 -0
  45. inpanel/mod/package_yum.py +64 -0
  46. inpanel/mod/php.py +289 -0
  47. inpanel/mod/process.py +291 -0
  48. inpanel/mod/proftpd.py +26 -0
  49. inpanel/mod/pureftpd.py +26 -0
  50. inpanel/mod/query.py +108 -0
  51. inpanel/mod/server.py +1319 -0
  52. inpanel/mod/service.py +262 -0
  53. inpanel/mod/setting.py +228 -0
  54. inpanel/mod/shell.py +78 -0
  55. inpanel/mod/ssh.py +280 -0
  56. inpanel/mod/system.py +220 -0
  57. inpanel/mod/task.py +1337 -0
  58. inpanel/mod/ufw.py +14 -0
  59. inpanel/mod/user.py +306 -0
  60. inpanel/mod/vsftpd.py +67 -0
  61. inpanel/mod/yum.py +243 -0
  62. inpanel/plugins/__init__.py +10 -0
  63. inpanel/plugins/__pycache__/__init__.cpython-313.pyc +0 -0
  64. inpanel/plugins/acme/static/index.html +10 -0
  65. inpanel/plugins/acme/static/index.js +13 -0
  66. inpanel/plugins/shadowsocks-libev/__pycache__/info.cpython-313.pyc +0 -0
  67. inpanel/plugins/shadowsocks-libev/info.py +73 -0
  68. inpanel/plugins/shadowsocks-libev/static/index.html +70 -0
  69. inpanel/plugins/shadowsocks-libev/static/index.js +18 -0
  70. inpanel/public/css/global.css +138 -0
  71. inpanel/public/favicon.ico +0 -0
  72. inpanel/public/images/alipay.jpg +0 -0
  73. inpanel/public/images/loading.gif +0 -0
  74. inpanel/public/images/weixin.jpg +0 -0
  75. inpanel/public/index.html +94 -0
  76. inpanel/public/js/controllers/controllers.js +566 -0
  77. inpanel/public/js/controllers/database.js +590 -0
  78. inpanel/public/js/controllers/ecs.js +624 -0
  79. inpanel/public/js/controllers/file.js +940 -0
  80. inpanel/public/js/controllers/plugins.js +105 -0
  81. inpanel/public/js/controllers/service.js +1460 -0
  82. inpanel/public/js/controllers/site.js +1241 -0
  83. inpanel/public/js/controllers/utils.js +2319 -0
  84. inpanel/public/js/core.js +221 -0
  85. inpanel/public/js/directives.js +784 -0
  86. inpanel/public/js/filters.js +395 -0
  87. inpanel/public/js/services.js +257 -0
  88. inpanel/public/lib/angular/1.0.2/angular-resource.min.js +10 -0
  89. inpanel/public/lib/angular/1.0.2/angular.min.js +158 -0
  90. inpanel/public/lib/bootstrap/css/bootstrap-theme.css +587 -0
  91. inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +1 -0
  92. inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +6 -0
  93. inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +1 -0
  94. inpanel/public/lib/bootstrap/css/bootstrap.css +6757 -0
  95. inpanel/public/lib/bootstrap/css/bootstrap.css.map +1 -0
  96. inpanel/public/lib/bootstrap/css/bootstrap.min.css +6 -0
  97. inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +1 -0
  98. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  99. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +288 -0
  100. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  101. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  102. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  103. inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  104. inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  105. inpanel/public/lib/bootstrap/js/bootstrap.js +2377 -0
  106. inpanel/public/lib/bootstrap/js/bootstrap.min.js +7 -0
  107. inpanel/public/lib/bootstrap/js/npm.js +13 -0
  108. inpanel/public/lib/codemirror/codemirror-compressed.js +1 -0
  109. inpanel/public/lib/codemirror/codemirror.css +173 -0
  110. inpanel/public/lib/jquery/jquery-1.12.4.min.js +5 -0
  111. inpanel/public/lib/md5/md5.js +379 -0
  112. inpanel/public/lib/md5/md5.min.js +1 -0
  113. inpanel/public/partials/database/index.html +172 -0
  114. inpanel/public/partials/database/mysql/dbedit.html +462 -0
  115. inpanel/public/partials/database/mysql/dbnew.html +348 -0
  116. inpanel/public/partials/database/mysql/useredit.html +310 -0
  117. inpanel/public/partials/database/mysql/usernew.html +97 -0
  118. inpanel/public/partials/directives/message.html +20 -0
  119. inpanel/public/partials/directives/navbar.html +25 -0
  120. inpanel/public/partials/directives/selector.html +57 -0
  121. inpanel/public/partials/directives/srvbase.html +72 -0
  122. inpanel/public/partials/directives/srvext.html +34 -0
  123. inpanel/public/partials/directives/srvfile.html +23 -0
  124. inpanel/public/partials/directives/srvinstall.html +34 -0
  125. inpanel/public/partials/directives/srvlog.html +23 -0
  126. inpanel/public/partials/directives/srvminiop.html +28 -0
  127. inpanel/public/partials/directives/srvuninstall.html +38 -0
  128. inpanel/public/partials/directives/srvupdate.html +30 -0
  129. inpanel/public/partials/ecs/account.html +156 -0
  130. inpanel/public/partials/ecs/ecs.html +198 -0
  131. inpanel/public/partials/ecs/index.html +40 -0
  132. inpanel/public/partials/ecs/setings.html +459 -0
  133. inpanel/public/partials/file/file.html +501 -0
  134. inpanel/public/partials/file/trash.html +95 -0
  135. inpanel/public/partials/ftp.html +36 -0
  136. inpanel/public/partials/log.html +83 -0
  137. inpanel/public/partials/login.html +79 -0
  138. inpanel/public/partials/logout.html +22 -0
  139. inpanel/public/partials/main.html +534 -0
  140. inpanel/public/partials/plugins/index.html +55 -0
  141. inpanel/public/partials/plugins/plugins.html +13 -0
  142. inpanel/public/partials/secure.html +13 -0
  143. inpanel/public/partials/service/apache.html +147 -0
  144. inpanel/public/partials/service/cron.html +71 -0
  145. inpanel/public/partials/service/index.html +293 -0
  146. inpanel/public/partials/service/iptables.html +40 -0
  147. inpanel/public/partials/service/lighttpd.html +63 -0
  148. inpanel/public/partials/service/mariadb.html +113 -0
  149. inpanel/public/partials/service/memcache.html +36 -0
  150. inpanel/public/partials/service/minio.html +44 -0
  151. inpanel/public/partials/service/mongodb.html +44 -0
  152. inpanel/public/partials/service/mysql.html +113 -0
  153. inpanel/public/partials/service/named.html +61 -0
  154. inpanel/public/partials/service/nginx.html +296 -0
  155. inpanel/public/partials/service/ntp.html +40 -0
  156. inpanel/public/partials/service/php.html +250 -0
  157. inpanel/public/partials/service/proftpd.html +59 -0
  158. inpanel/public/partials/service/pureftpd.html +59 -0
  159. inpanel/public/partials/service/redis.html +40 -0
  160. inpanel/public/partials/service/samba.html +58 -0
  161. inpanel/public/partials/service/sendmail.html +40 -0
  162. inpanel/public/partials/service/ssh.html +186 -0
  163. inpanel/public/partials/service/tomcat.html +65 -0
  164. inpanel/public/partials/service/vsftpd.html +195 -0
  165. inpanel/public/partials/setting.html +299 -0
  166. inpanel/public/partials/site/apache/site.html +277 -0
  167. inpanel/public/partials/site/index.html +344 -0
  168. inpanel/public/partials/site/nginx/site.html +558 -0
  169. inpanel/public/partials/sorry.html +19 -0
  170. inpanel/public/partials/storage/autofm.html +103 -0
  171. inpanel/public/partials/storage/backup.html +42 -0
  172. inpanel/public/partials/storage/index.html +360 -0
  173. inpanel/public/partials/storage/migrate.html +93 -0
  174. inpanel/public/partials/storage/movedata.html +98 -0
  175. inpanel/public/partials/storage/remote.html +77 -0
  176. inpanel/public/partials/utils/cron.html +486 -0
  177. inpanel/public/partials/utils/firewall.html +266 -0
  178. inpanel/public/partials/utils/index.html +193 -0
  179. inpanel/public/partials/utils/network.html +118 -0
  180. inpanel/public/partials/utils/process.html +239 -0
  181. inpanel/public/partials/utils/repository.html +373 -0
  182. inpanel/public/partials/utils/shell.html +28 -0
  183. inpanel/public/partials/utils/ssl.html +319 -0
  184. inpanel/public/partials/utils/time.html +109 -0
  185. inpanel/public/partials/utils/user.html +359 -0
  186. inpanel/public/robots.txt +2 -0
  187. inpanel/remote.py +109 -0
  188. inpanel/templates/file/preview.html +34 -0
  189. inpanel/templates/index.html +93 -0
  190. inpanel/utils.py +282 -0
  191. inpanel/web.py +1811 -0
  192. inpanel/yum.py +756 -0
  193. inpanel-1.2.1.dist-info/METADATA +399 -0
  194. inpanel-1.2.1.dist-info/RECORD +198 -0
  195. inpanel-1.2.1.dist-info/WHEEL +5 -0
  196. inpanel-1.2.1.dist-info/entry_points.txt +2 -0
  197. inpanel-1.2.1.dist-info/licenses/LICENSE +30 -0
  198. inpanel-1.2.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,359 @@
1
+ <div navbar ng-init="currentItem='utils.user'"></div>
2
+ <div ng-show="!loaded">
3
+ <div loading></div>
4
+ </div>
5
+
6
+ <div id="main" ng-show="loaded" style="display:none">
7
+ <div class="module-header">
8
+ <h3>用户管理</h3>
9
+ </div>
10
+
11
+ <div class="tabbable">
12
+ <ul class="nav nav-tabs">
13
+ <li ng-class="'active' | iftrue:activeTabName=='user'"><a href="#user" ng-click="tab_sec('user')" data-toggle="tab">用户</a></li>
14
+ <li ng-class="'active' | iftrue:activeTabName=='group'"><a href="#group" ng-click="tab_sec('group')" data-toggle="tab">用户组</a></li>
15
+ <li class="pull-right" ng-show="activeTabName=='user'">
16
+ <button class="btn btn-default btn-sm" title="当前用户数量" ng-show="users && users.length">数量: {{users.length}}</button>
17
+ <div class="btn-group btn-group-sm">
18
+ <button class="btn btn-default" ng-click="loadUsers()" title="刷新用户列表"><i class="glyphicon glyphicon-refresh"></i></button>
19
+ <button class="btn btn-default" ng-click="useraddconfirm()" title="添加新用户"><i class="glyphicon glyphicon-plus"></i></button>
20
+ </div>
21
+ </li>
22
+ <li class="pull-right" ng-show="activeTabName=='group'">
23
+ <button class="btn btn-default btn-sm" title="当前用户组数量" ng-show="groups && groups.length">数量: {{groups.length}}</button>
24
+ <div class="btn-group btn-group-sm">
25
+ <button class="btn btn-default" ng-click="loadGroups()" title="刷新用户组列表"><i class="glyphicon glyphicon-refresh"></i></button>
26
+ <button class="btn btn-default" ng-click="groupaddconfirm()" title="添加新用户组"><i class="glyphicon glyphicon-plus"></i></button>
27
+ </div>
28
+ </li>
29
+ </ul>
30
+ <div class="tab-content">
31
+ <div class="tab-pane table-responsive" ng-class="'active' | iftrue:activeTabName=='user'" id="user" ng-init="loadUsers()">
32
+ <div ng-show="loading.user"><div waiting></div></div>
33
+ <table ng-hide="loading.user" class="table table-hover table-bordered table-condensed">
34
+ <thead>
35
+ <tr>
36
+ <th style="width:50px" class="text-right">ID</th>
37
+ <th style="width:40px">状态</th>
38
+ <th>用户名</th>
39
+ <th>备注</th>
40
+ <th>用户组</th>
41
+ <th>主目录</th>
42
+ <th>SHELL路径</th>
43
+ <th style="width:130px">操作</th>
44
+ </tr>
45
+ </thead>
46
+ <tbody>
47
+ <tr ng-repeat="user in users">
48
+ <td class="text-right">{{user.pw_uid}}</td>
49
+ <td ng-bind-html-unsafe="user.lock | user.lock"></td>
50
+ <td>{{user.pw_name}}</td>
51
+ <td>{{user.pw_gecos}}</td>
52
+ <td>{{user.pw_gname}}</td>
53
+ <td>{{user.pw_dir}}</td>
54
+ <td>{{user.pw_shell}}</td>
55
+ <td>
56
+ <button class="btn btn-default btn-xs" ng-click="usermodconfirm($index)">修改</button>
57
+ <button class="btn btn-default btn-xs" ng-click="userdelconfirm($index)">删除</button>
58
+ </td>
59
+ </tr>
60
+ </tbody>
61
+ </table>
62
+ </div>
63
+ <div class="tab-pane table-responsive" ng-class="'active' | iftrue:activeTabName=='group'" id="group" ng-init="loadGroups()">
64
+ <div ng-show="loading.group"><div waiting></div></div>
65
+ <table ng-hide="loading.group" class="table table-hover table-bordered table-condensed">
66
+ <thead>
67
+ <tr>
68
+ <th style="width:50px" class="text-right">ID</th>
69
+ <th>用户组</th>
70
+ <th>组成员</th>
71
+ <th style="width:260px">操作</th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <tr ng-repeat="group in groups">
76
+ <td class="text-right">{{group.gr_gid}}</td>
77
+ <td>{{group.gr_name}}</td>
78
+ <td><span ng-repeat="member in group.gr_mem">{{member}}<span ng-show="$index<group.gr_mem.length-1">, </span></span>
79
+ </td>
80
+ <td>
81
+ <button class="btn btn-default btn-xs" ng-click="groupmodconfirm($index)">修改</button>
82
+ <button class="btn btn-default btn-xs" ng-click="groupdelconfirm($index)">删除</button>
83
+ <button class="btn btn-default btn-xs" ng-click="groupmemsaddconfirm($index)">添加成员</button>
84
+ <button class="btn btn-default btn-xs" ng-click="groupmemsdelconfirm($index)" ng-disabled="group.gr_mem.length==0">删除成员</button>
85
+ </td>
86
+ </tr>
87
+ </tbody>
88
+ </table>
89
+ </div>
90
+ </div>
91
+ </div>
92
+
93
+ </div>
94
+
95
+ <div id="useraddconfirm" class="modal fade">
96
+ <div class="modal-dialog">
97
+ <div class="modal-content">
98
+ <div class="modal-header">
99
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
100
+ <h3 class="modal-title">添加新用户</h3>
101
+ </div>
102
+ <div class="modal-body">
103
+ <form class="form-horizontal" onsubmit="return false">
104
+ <div class="form-group form-inline">
105
+ <label class="col-sm-3 control-label">用户名:</label>
106
+ <div class="col-sm-9">
107
+ <input class="form-control" type="text" ng-model="curuser.pw_name">
108
+ </div>
109
+ </div>
110
+ <div class="form-group form-inline">
111
+ <label class="col-sm-3 control-label">备注:</label>
112
+ <div class="col-sm-9">
113
+ <input class="form-control" type="text" ng-model="curuser.pw_gecos">
114
+ </div>
115
+ </div>
116
+ <div class="form-group form-inline">
117
+ <label class="col-sm-3 control-label">用户组:</label>
118
+ <div class="col-sm-9">
119
+ <select class="form-control" ng-model="curuser.pw_gname" ng-options="group.gr_name as group.gr_name for group in groups"></select>
120
+ </div>
121
+ </div>
122
+ <div class="form-group form-inline">
123
+ <label class="col-sm-3 control-label">主目录:</label>
124
+ <div class="col-sm-9 checkbox">
125
+ <label>
126
+ <input type="checkbox" ng-model="curuser.createhome"> 是否创建主目录<span ng-show="curuser.pw_name"> /home/{{curuser.pw_name}}</span>?
127
+ </label>
128
+ </div>
129
+ </div>
130
+ <div class="form-group form-inline">
131
+ <label class="col-sm-3 control-label">SHELL路径:</label>
132
+ <div class="col-sm-9">
133
+ <input class="form-control" type="text" ng-model="curuser.pw_shell">
134
+ </div>
135
+ </div>
136
+ <div class="form-group form-inline">
137
+ <label class="col-sm-3 control-label">锁定帐户:</label>
138
+ <div class="col-sm-9 checkbox">
139
+ <label><input type="checkbox" ng-checked="curuser.lock"> 是否锁定该帐户?</label>
140
+ </div>
141
+ </div>
142
+ <div class="form-group form-inline">
143
+ <label class="col-sm-3 control-label" for="add_passwd">密码:</label>
144
+ <div class="col-sm-9">
145
+ <input class="form-control" type="password" id="add_passwd" ng-model="curuser.pw_passwd" placeholder="如不想设置密码,请留空" autocomplete="off">
146
+ </div>
147
+ </div>
148
+ <div class="form-group form-inline">
149
+ <label class="col-sm-3 control-label" for="add_passwdc">确认密码:</label>
150
+ <div class="col-sm-9">
151
+ <input class="form-control" type="password" id="add_passwdc" ng-model="curuser.pw_passwdc" placeholder="如不想设置密码,请留空" autocomplete="off">
152
+ </div>
153
+ </div>
154
+ </form>
155
+ </div>
156
+ <div class="modal-footer">
157
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
158
+ <button class="btn btn-primary" onclick="$('#useraddconfirm').modal('hide')" ng-click="useradd()">添加</button>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+ <div id="usermodconfirm" class="modal fade">
165
+ <div class="modal-dialog">
166
+ <div class="modal-content">
167
+ <div class="modal-header">
168
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
169
+ <h3 class="modal-title">修改用户 {{curuser.pw_name}}</h3>
170
+ </div>
171
+ <div class="modal-body">
172
+ <form class="form-horizontal" onsubmit="return false">
173
+ <div class="form-group form-inline">
174
+ <label class="col-sm-3 control-label">备注:</label>
175
+ <div class="col-sm-9">
176
+ <input class="form-control" type="text" ng-model="curuser.pw_gecos">
177
+ </div>
178
+ </div>
179
+ <div class="form-group form-inline">
180
+ <label class="col-sm-3 control-label">用户组:</label>
181
+ <div class="col-sm-9">
182
+ <select class="form-control" ng-model="curuser.pw_gname" ng-options="group.gr_name as group.gr_name for group in groups"></select>
183
+ </div>
184
+ </div>
185
+ <div class="form-group form-inline">
186
+ <label class="col-sm-3 control-label">主目录:</label>
187
+ <div class="col-sm-9">
188
+ <input class="form-control" type="text" ng-model="curuser.pw_dir">
189
+ </div>
190
+ </div>
191
+ <div class="form-group form-inline">
192
+ <label class="col-sm-3 control-label">SHELL路径:</label>
193
+ <div class="col-sm-9">
194
+ <input class="form-control" type="text" ng-model="curuser.pw_shell">
195
+ </div>
196
+ </div>
197
+ <div class="form-group form-inline">
198
+ <label class="col-sm-3 control-label">锁定帐户:</label>
199
+ <div class="col-sm-9 checkbox">
200
+ <label><input type="checkbox" ng-model="curuser.lock"> 是否锁定该帐户?</label>
201
+ </div>
202
+ </div>
203
+ <div class="form-group form-inline">
204
+ <label class="col-sm-3 control-label" for="mod_passwd">修改密码:</label>
205
+ <div class="col-sm-9">
206
+ <input class="form-control" type="password" id="mod_passwd" ng-model="curuser.pw_passwd" placeholder="如不想修改密码,请留空" autocomplete="off">
207
+ </div>
208
+ </div>
209
+ <div class="form-group form-inline">
210
+ <label class="col-sm-3 control-label" for="mod_passwdc">确认密码:</label>
211
+ <div class="col-sm-9">
212
+ <input class="form-control" type="password" id="mod_passwdc" ng-model="curuser.pw_passwdc" placeholder="如不想修改密码,请留空" autocomplete="off">
213
+ </div>
214
+ </div>
215
+ </form>
216
+ </div>
217
+ <div class="modal-footer">
218
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
219
+ <button class="btn btn-primary" onclick="$('#usermodconfirm').modal('hide')" ng-click="usermod()">确定</button>
220
+ </div>
221
+ </div>
222
+ </div>
223
+ </div>
224
+
225
+ <div id="userdelconfirm" class="modal fade">
226
+ <div class="modal-dialog">
227
+ <div class="modal-content">
228
+ <div class="modal-header">
229
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
230
+ <h3 class="modal-title">删除用户 {{curuser.pw_name}}</h3>
231
+ </div>
232
+ <div class="modal-body">
233
+ <p>确定要删除用户 {{curuser.pw_name}} 吗?</p>
234
+ </div>
235
+ <div class="modal-footer">
236
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
237
+ <button class="btn btn-danger" onclick="$('#userdelconfirm').modal('hide')" ng-click="userdel()">确认删除</button>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+
243
+ <div id="groupaddconfirm" class="modal fade">
244
+ <div class="modal-dialog">
245
+ <div class="modal-content">
246
+ <div class="modal-header">
247
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
248
+ <h3 class="modal-title">添加新用户组</h3>
249
+ </div>
250
+ <div class="modal-body">
251
+ <form class="form-horizontal" onsubmit="return false">
252
+ <div class="form-group form-inline">
253
+ <label class="col-sm-3 control-label">用户组名称:</label>
254
+ <div class="col-sm-9">
255
+ <input class="form-control" type="text" ng-model="curgrp_name">
256
+ </div>
257
+ </div>
258
+ </form>
259
+ </div>
260
+ <div class="modal-footer">
261
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
262
+ <button class="btn btn-primary" onclick="$('#groupaddconfirm').modal('hide')" ng-click="groupadd()">添加</button>
263
+ </div>
264
+ </div>
265
+ </div>
266
+ </div>
267
+
268
+ <div id="groupmodconfirm" class="modal fade">
269
+ <div class="modal-dialog">
270
+ <div class="modal-content">
271
+ <div class="modal-header">
272
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
273
+ <h3 class="modal-title">修改用户组 {{curgrp_name}}</h3>
274
+ </div>
275
+ <div class="modal-body">
276
+ <form class="form-horizontal" onsubmit="return false">
277
+ <div class="form-group form-inline">
278
+ <label class="col-sm-3 control-label">用户组名称:</label>
279
+ <div class="col-sm-9">
280
+ <input class="form-control" type="text" ng-model="curgrp_newname">
281
+ </div>
282
+ </div>
283
+ </form>
284
+ </div>
285
+ <div class="modal-footer">
286
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
287
+ <button class="btn btn-primary" onclick="$('#groupmodconfirm').modal('hide')" ng-click="groupmod()">修改</button>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </div>
292
+
293
+ <div id="groupdelconfirm" class="modal fade">
294
+ <div class="modal-dialog">
295
+ <div class="modal-content">
296
+ <div class="modal-header">
297
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
298
+ <h3 class="modal-title">删除用户组 {{curgrp_name}}</h3>
299
+ </div>
300
+ <div class="modal-body">
301
+ <p>确定要删除用户组 {{curgrp_name}} 吗?</p>
302
+ </div>
303
+ <div class="modal-footer">
304
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
305
+ <button class="btn btn-danger" onclick="$('#groupdelconfirm').modal('hide')" ng-click="groupdel()">确认删除</button>
306
+ </div>
307
+ </div>
308
+ </div>
309
+ </div>
310
+
311
+ <div id="groupmemsaddconfirm" class="modal fade">
312
+ <div class="modal-dialog">
313
+ <div class="modal-content">
314
+ <div class="modal-header">
315
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
316
+ <h3 class="modal-title">向组 {{curgrp_name}} 中添加成员</h3>
317
+ </div>
318
+ <div class="modal-body">
319
+ <form class="form-horizontal" onsubmit="return false">
320
+ <div class="form-group form-inline">
321
+ <label class="col-sm-3 control-label">要添加的成员:</label>
322
+ <div class="col-sm-9">
323
+ <select class="form-control" ng-model="curgrp_mem" ng-options="user.pw_name as user.pw_name for user in users"></select>
324
+ </div>
325
+ </div>
326
+ </form>
327
+ </div>
328
+ <div class="modal-footer">
329
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
330
+ <button class="btn btn-primary" onclick="$('#groupmemsaddconfirm').modal('hide')" ng-click="groupmemsadd()">确认添加</button>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ </div>
335
+
336
+ <div id="groupmemsdelconfirm" class="modal fade">
337
+ <div class="modal-dialog">
338
+ <div class="modal-content">
339
+ <div class="modal-header">
340
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
341
+ <h3 class="modal-title">删除组 {{curgrp_name}} 中的成员</h3>
342
+ </div>
343
+ <div class="modal-body">
344
+ <form class="form-horizontal" onsubmit="return false">
345
+ <div class="form-group form-inline">
346
+ <label class="col-sm-3 control-label">要删除的成员:</label>
347
+ <div class="col-sm-9">
348
+ <select class="form-control" ng-model="curgrp_mem" ng-options="member for member in curgrp_mems"></select>
349
+ </div>
350
+ </div>
351
+ </form>
352
+ </div>
353
+ <div class="modal-footer">
354
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
355
+ <button class="btn btn-danger" onclick="$('#groupmemsdelconfirm').modal('hide')" ng-click="groupmemsdel()">确认删除</button>
356
+ </div>
357
+ </div>
358
+ </div>
359
+ </div>
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow: /
inpanel/remote.py ADDED
@@ -0,0 +1,109 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (c) 2017-2026 Jackson Dou
4
+ # All rights reserved.
5
+ #
6
+ # InPanel is distributed under the terms of the (new) BSD License.
7
+ # The full license can be found in 'LICENSE'.
8
+
9
+ '''Package for InPanel operations for remote server.'''
10
+
11
+
12
+ import base64
13
+ import os
14
+ import shlex
15
+
16
+ from .lib import pxssh
17
+
18
+
19
+ def inpanel_install(ssh_ip, ssh_port, ssh_user, ssh_password, accesskey=None, inpanel_ip=None, inpanel_port=None):
20
+ '''Install InPanel on a remote server.'''
21
+ try:
22
+ s = pxssh.pxssh()
23
+ s.login(ssh_ip, ssh_user, ssh_password, port=ssh_port)
24
+ s.sendline('rm -f install.py')
25
+ s.prompt()
26
+ s.sendline('wget https://raw.githubusercontent.com/inpanel/inpanel/master/install.py')
27
+ s.prompt()
28
+ s.sendline('python install.py')
29
+ s.expect('INSTALL COMPLETED!')
30
+ s.sendcontrol('c') # don't set username and password
31
+ s.prompt()
32
+ s.sendline('rm -f install.py')
33
+ s.prompt()
34
+ s.sendline('/usr/bin/inpanel config loginlock on')
35
+ s.prompt()
36
+ if accesskey != None:
37
+ s.sendline('/usr/bin/inpanel config accesskey %s' % accesskey)
38
+ s.prompt()
39
+ s.sendline('/usr/bin/inpanel config accesskeyenable on')
40
+ s.prompt()
41
+ if inpanel_ip != None:
42
+ s.sendline('/usr/bin/inpanel config ip %s' % inpanel_ip)
43
+ s.prompt()
44
+ if inpanel_port != None:
45
+ s.sendline('/usr/bin/inpanel config port %s' % inpanel_port)
46
+ s.prompt()
47
+ s.sendline('service inpanel restart')
48
+ s.prompt()
49
+ s.logout()
50
+ return True
51
+ except pxssh.ExceptionPxssh:
52
+ return False
53
+
54
+
55
+ def inpanel_uninstall(ssh_ip, ssh_port, ssh_user, ssh_password):
56
+ '''Uninstall InPanel on a remote server.'''
57
+ try:
58
+ s = pxssh.pxssh()
59
+ s.login(ssh_ip, ssh_user, ssh_password, port=ssh_port)
60
+ s.sendline('service inpanel stop')
61
+ s.prompt()
62
+ s.sendline('rm -rf /usr/bin/inpanel /etc/init.d/inpanel')
63
+ s.prompt()
64
+ s.logout()
65
+ return True
66
+ except pxssh.ExceptionPxssh:
67
+ return False
68
+
69
+
70
+ def inpanel_config(ssh_ip, ssh_port, ssh_user, ssh_password, accesskey=None, accesskeyenable=None, username=None, password=None, loginlock=None, inpanel_ip=None, inpanel_port=None):
71
+ '''Update config on remote server.'''
72
+ try:
73
+ s = pxssh.pxssh()
74
+ s.login(ssh_ip, ssh_user, ssh_password, port=ssh_port)
75
+ s.sendline('service inpanel stop')
76
+ s.prompt()
77
+ if accesskey != None:
78
+ s.sendline('/usr/bin/inpanel config accesskey %s' % accesskey)
79
+ s.prompt()
80
+ if accesskeyenable != None:
81
+ s.sendline('/usr/bin/inpanel config accesskeyenable %s' % (accesskeyenable and 'on' or 'off'))
82
+ s.prompt()
83
+ if username != None:
84
+ s.sendline('/usr/bin/inpanel config username %s' % username)
85
+ s.prompt()
86
+ if password != None:
87
+ s.sendline('/usr/bin/inpanel config password %s' % password)
88
+ s.prompt()
89
+ if loginlock != None:
90
+ s.sendline('/usr/bin/inpanel config loginlock %s' % (loginlock and 'on' or 'off'))
91
+ s.prompt()
92
+ if inpanel_ip != None:
93
+ s.sendline('/usr/bin/inpanel config ip %s' % inpanel_ip)
94
+ s.prompt()
95
+ if inpanel_port != None:
96
+ s.sendline('/usr/bin/inpanel config port %s' % inpanel_port)
97
+ s.prompt()
98
+ s.logout()
99
+ return True
100
+ except:
101
+ return False
102
+
103
+
104
+ if __name__ == '__main__':
105
+ import pprint
106
+ pp = pprint.PrettyPrinter(indent=4)
107
+ #pp.pprint(install('42.121.98.82', '22', 'root', 'xx', '960BmT039ONbgV6NxGfeIQgOVQcRF7fHvthFPSmlq+c='))
108
+ #pp.pprint(uninstall('42.121.98.82', '22', 'root', 'xx'))
109
+ # pp.pprint(gen_accesskey())
@@ -0,0 +1,34 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <title>文件预览</title>
7
+ <meta name="renderer" content="webkit" />
8
+ <meta name="force-rendering" content="webkit" />
9
+ <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
+ <meta name="author" content="CROGRAM" />
12
+ <meta name="copyright" content="CROGRAM 程江科技" />
13
+ <meta name="description" content="开源Linux服务器管理面板" />
14
+ <meta name="keywords" content="InPanel, Linux, VPS, VPS Management, 开源, VPS管理面板, 开源Linux服务器管理面板" />
15
+ <style>
16
+ img {
17
+ max-width: 90%;
18
+ }
19
+ .text-center {
20
+ text-align: center;
21
+ }
22
+ </style>
23
+ </head>
24
+
25
+ <body>
26
+ <div class="container">
27
+ <!-- <div>文件类型:{{mtype}}</div> -->
28
+ <div class="text-center">
29
+ <img src="{{data}}">
30
+ </div>
31
+ </div>
32
+ </body>
33
+
34
+ </html>
@@ -0,0 +1,93 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN" ng-app="inpanel">
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <title ng-bind-template="{{ htmlTitle }} - InPanel">InPanel</title>
7
+ <meta name="renderer" content="webkit" />
8
+ <meta name="force-rendering" content="webkit" />
9
+ <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
+ <meta name="author" content="CROGRAM" />
12
+ <meta name="copyright" content="CROGRAM 程江科技" />
13
+ <meta name="description" content="开源Linux服务器管理面板" />
14
+ <meta name="keywords" content="InPanel, VPSMate, Linux, VPS, VPS Management, 开源, VPS管理面板, 开源Linux服务器管理面板" />
15
+ <link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
16
+ <!-- <link rel="stylesheet" href="lib/bootstrap/css/bootstrap-theme.min.css" /> -->
17
+ <link rel="stylesheet" href="lib/codemirror/codemirror.css" />
18
+ <link rel="stylesheet" href="{{static_url('css/global.css')}}" />
19
+ <script>
20
+ var releasetime = "{{ releasetime }}";
21
+ var location_path = location.pathname.replace(/(\s+)?\/$/, '');
22
+ var template_path = '{{ template_path }}';
23
+ </script>
24
+ </head>
25
+
26
+ <body>
27
+
28
+ <div message></div>
29
+
30
+ <div class="container" style="display:none" ng-show="navbar_loaded">
31
+ <div ng-view></div>
32
+ </div>
33
+
34
+ <div id="_authconfirm" class="modal fade" role="dialog">
35
+ <div class="modal-dialog" role="document">
36
+ <div class="modal-content">
37
+ <div class="modal-header">
38
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
39
+ <h3 class="modal-title">登录即将超时 !</h3>
40
+ </div>
41
+ <div class="modal-body">
42
+ <p>您的登录即将超时,是否保持登陆状态 ?</p>
43
+ </div>
44
+ <div class="modal-footer">
45
+ <a class="btn btn-default" data-dismiss="modal" aria-hidden="true" href="#/logout">退出登录</a>
46
+ <button class="btn btn-primary" onclick="$('#_authconfirm').modal('hide')" ng-click="_authrenew()">继续访问</button>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="footer-sticky" style="display:none" ng-show="navbar_loaded"></div>
53
+ <div class="footer" style="display:none" ng-show="navbar_loaded">
54
+ <div class="container">
55
+ <footer class="navbar navbar-default">
56
+ <div class="container-fluid">
57
+ <p class="navbar-text pull-left">
58
+ <span>Powered by <a href="http://inpanel.org" target="_blank">InPanel</a></span>
59
+ </p>
60
+ <p class="navbar-text pull-right">
61
+ <span><a href="http://crogram.org?utm_source=InPanel" target="_blank">程江科技</a></span>
62
+ </p>
63
+ </div>
64
+ </footer>
65
+ </div>
66
+ </div>
67
+
68
+ <div class="well" style="width:300px; margin:100px auto auto;" ng-show="!navbar_loaded"><img src="images/loading.gif" style="margin-right:5px"> 正在加载,请稍候...</div>
69
+
70
+ <script src="lib/angular/1.0.2/angular.min.js"></script>
71
+ <script src="lib/jquery/jquery-1.12.4.min.js"></script>
72
+ <script src="lib/bootstrap/js/bootstrap.min.js"></script>
73
+ <script src="lib/codemirror/codemirror-compressed.js"></script>
74
+ <script src="lib/md5/md5.min.js"></script>
75
+ <!-- <script src="js.min/app.js"></script> -->
76
+ <!-- Uncomment it in dev mode -->
77
+
78
+ <script src="{{static_url('js/core.js')}}"></script>
79
+ <script src="{{static_url('js/directives.js')}}"></script>
80
+ <script src="{{static_url('js/filters.js')}}"></script>
81
+ <script src="{{static_url('js/services.js')}}"></script>
82
+ <script src="{{static_url('js/controllers/controllers.js')}}"></script>
83
+ <script src="{{static_url('js/controllers/service.js')}}"></script>
84
+ <script src="{{static_url('js/controllers/file.js')}}"></script>
85
+ <script src="{{static_url('js/controllers/site.js')}}"></script>
86
+ <script src="{{static_url('js/controllers/ecs.js')}}"></script>
87
+ <script src="{{static_url('js/controllers/utils.js')}}"></script>
88
+ <script src="{{static_url('js/controllers/database.js')}}"></script>
89
+ <script src="{{static_url('js/controllers/plugins.js')}}"></script>
90
+
91
+ </body>
92
+
93
+ </html>