diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b61db0784..81b9143cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,6 @@ on: - 'mig/src/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' branches: - experimental - next @@ -53,7 +52,6 @@ on: - 'mig/src/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' branches: - experimental - next diff --git a/.github/workflows/python-c-ext-sanity-check.yml b/.github/workflows/python-c-ext-sanity-check.yml index e1deb9532..0c2f5996d 100644 --- a/.github/workflows/python-c-ext-sanity-check.yml +++ b/.github/workflows/python-c-ext-sanity-check.yml @@ -32,7 +32,6 @@ on: - 'mig/assets/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' - 'mig/src/lustreclient/**' - '**/*.py' - '**/*.js' @@ -61,7 +60,6 @@ on: - 'mig/assets/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' - 'mig/src/lustreclient/**' - '**/*.py' - '**/*.js' diff --git a/.github/workflows/python-sanity-check.yml b/.github/workflows/python-sanity-check.yml index a613051ca..bbd5e2013 100644 --- a/.github/workflows/python-sanity-check.yml +++ b/.github/workflows/python-sanity-check.yml @@ -27,7 +27,6 @@ on: - 'mig/assets/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' - 'mig/src/**' branches: - experimental @@ -54,7 +53,6 @@ on: - 'mig/assets/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' - 'mig/src/**' branches: - experimental diff --git a/.github/workflows/python-stylecheck.yml b/.github/workflows/python-stylecheck.yml index df57249a7..7216156cf 100644 --- a/.github/workflows/python-stylecheck.yml +++ b/.github/workflows/python-stylecheck.yml @@ -26,7 +26,6 @@ on: - 'mig/src/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' branches: - experimental - next @@ -53,7 +52,6 @@ on: - 'mig/src/**' - 'mig/apache/**' - 'mig/bin/**' - - 'mig/java-bin/**' branches: - experimental - next diff --git a/mig/assets/css/V3/ui.css b/mig/assets/css/V3/ui.css index 02cfb02b1..153a05cdf 100644 --- a/mig/assets/css/V3/ui.css +++ b/mig/assets/css/V3/ui.css @@ -1171,12 +1171,7 @@ background: url(/images/icons/java.png) left center no-repeat; background-size: 18px 18px; background-position: left center; } -.sandboxlink { - background: url('/images/icons/hourglass_go.png') no-repeat; - padding-left: 18px; - background-size: 18px 18px; - background-position: left center; -} + .createarchivelink, .doishowdetails { background-image: url('/images/icons/book_add.png'); background-repeat: no-repeat; diff --git a/mig/cgi-bin/sssadmin.py b/mig/cgi-bin/sssadmin.py deleted file mode 100755 index 1d69740da..000000000 --- a/mig/cgi-bin/sssadmin.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssadmin - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -from __future__ import absolute_import -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.sssadmin import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-bin/ssscreateimg.py b/mig/cgi-bin/ssscreateimg.py deleted file mode 100755 index e633addd6..000000000 --- a/mig/cgi-bin/ssscreateimg.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# ssscreateimg - Frontend to generating SSS sandbox image -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""Generate SSS image""" -from __future__ import absolute_import - -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.ssscreateimg import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-bin/sssfaq.py b/mig/cgi-bin/sssfaq.py deleted file mode 100755 index f1f4e9ca4..000000000 --- a/mig/cgi-bin/sssfaq.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssfaq - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -from __future__ import absolute_import -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.sssfaq import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-bin/ssslogin.py b/mig/cgi-bin/ssslogin.py deleted file mode 100755 index 3937a36e8..000000000 --- a/mig/cgi-bin/ssslogin.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# ssslogin - SSS sandbox entry point -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -from __future__ import absolute_import -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.ssslogin import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-bin/sssmonitor.py b/mig/cgi-bin/sssmonitor.py deleted file mode 100755 index 5468ec874..000000000 --- a/mig/cgi-bin/sssmonitor.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssmonitor - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -from __future__ import absolute_import -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.sssmonitor import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-sid/README.sandbox b/mig/cgi-sid/README.sandbox deleted file mode 100644 index f4d7263f0..000000000 --- a/mig/cgi-sid/README.sandbox +++ /dev/null @@ -1,6 +0,0 @@ -= SSS Sandbox links = -We are switching from the old sandbox_X.py script names to the new style compliatn sssX.py form but keep a few links to the old names to avoid breaking published and active links. -The SSS sandbox uses the old sandbox-getresourcescript.py in the image, so it it difficult to fix especially for existing sandboxes. -The old SSS login link is published in multiple locations, so we use a symlink to preserve the validity of the old URL. - -Once those issues have been permanently fixed, we can remove the legacy links. diff --git a/mig/cgi-sid/isjobactive.py b/mig/cgi-sid/isjobactive.py deleted file mode 100755 index d895335eb..000000000 --- a/mig/cgi-sid/isjobactive.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# isjobactive - sandbox job kill helper -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.isjobactive import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-sid/requestinteractivejob.py b/mig/cgi-sid/requestinteractivejob.py index ab57d804e..7ccfcf22e 100755 --- a/mig/cgi-sid/requestinteractivejob.py +++ b/mig/cgi-sid/requestinteractivejob.py @@ -54,7 +54,6 @@ def signature(): 'cputime': ['10000'], 'nodecount': ['1'], 'localjobname': [''], - 'sandboxkey': [''], 'execution_delay': ['0'], 'exe_pgid': ['0'], 'sessionid': [''], @@ -114,7 +113,6 @@ def signature(): cputime = accepted['cputime'][-1] nodecount = accepted['nodecount'][-1] localjobname = accepted['localjobname'][-1] -#sandboxkey = accepted['sandboxkey'][-1] execution_delay = accepted['execution_delay'][-1] #exe_pgid = accepted['exe_pgid'][-1] sessionid = accepted['sessionid'][-1] diff --git a/mig/cgi-sid/sandbox-getresourcescript.py b/mig/cgi-sid/sandbox-getresourcescript.py deleted file mode 120000 index 2e428fc05..000000000 --- a/mig/cgi-sid/sandbox-getresourcescript.py +++ /dev/null @@ -1 +0,0 @@ -sssgetresscript.py \ No newline at end of file diff --git a/mig/cgi-sid/sandbox_login.py b/mig/cgi-sid/sandbox_login.py deleted file mode 120000 index 9f7bec36a..000000000 --- a/mig/cgi-sid/sandbox_login.py +++ /dev/null @@ -1 +0,0 @@ -ssslogin.py \ No newline at end of file diff --git a/mig/cgi-sid/sandbox_users.pkl b/mig/cgi-sid/sandbox_users.pkl deleted file mode 100644 index fa6451aed..000000000 --- a/mig/cgi-sid/sandbox_users.pkl +++ /dev/null @@ -1,6422 +0,0 @@ -(dp0 -S'jnasser' -p1 -(S'nasser' -p2 -(lp3 -S'sandbox.633' -p4 -aS'sandbox.635' -p5 -atp6 -sS'skinfaxe2@stofanet.dk' -p7 -(S'nordvest5' -p8 -(lp9 -S'sandbox.153' -p10 -aS'sandbox.154' -p11 -aS'sandbox.155' -p12 -atp13 -sS'madsen' -p14 -(S'madsen' -p15 -(lp16 -S'sandbox.729' -p17 -atp18 -sS'moe2339' -p19 -(S'hesten' -p20 -(lp21 -S'sandbox.1233' -p22 -atp23 -sS'elisabeth' -p24 -(S'et-pogu' -p25 -(lp26 -S'sandbox.338' -p27 -atp28 -sS'Glizzard' -p29 -(S'infinity' -p30 -(lp31 -S'sandbox.636' -p32 -aS'sandbox.639' -p33 -aS'sandbox.865' -p34 -atp35 -sS'goredon' -p36 -(S'' -p37 -(lp38 -S'sandbox.1159' -p39 -atp40 -sS'romanbif' -p41 -(S'230687' -p42 -(lp43 -S'sandbox.584' -p44 -aS'sandbox.585' -p45 -atp46 -sS'wagener' -p47 -(S'140677' -p48 -(lp49 -S'sandbox.1252' -p50 -aS'sandbox.1257' -p51 -aS'sandbox.1259' -p52 -aS'sandbox.1260' -p53 -atp54 -sS'sune' -p55 -(S'5xfdg3' -p56 -(lp57 -tp58 -sS'Nightxeon' -p59 -(S'Jgohfhhd' -p60 -(lp61 -S'sandbox.604' -p62 -atp63 -sS'Rainbird' -p64 -(S'mensmentis' -p65 -(lp66 -S'sandbox.888' -p67 -aS'sandbox.892' -p68 -aS'sandbox.893' -p69 -aS'sandbox.894' -p70 -aS'sandbox.903' -p71 -aS'sandbox.907' -p72 -atp73 -sS'blackfly' -p74 -(S'trutta' -p75 -(lp76 -S'sandbox.342' -p77 -atp78 -sS'pytte' -p79 -(S'uodtovsc' -p80 -(lp81 -S'sandbox.1107' -p82 -aS'sandbox.1109' -p83 -aS'sandbox.1111' -p84 -atp85 -sS'phessellund' -p86 -(S'2507' -p87 -(lp88 -S'sandbox.1300' -p89 -atp90 -sS'cahy' -p91 -(S'Adadad10' -p92 -(lp93 -tp94 -sS'PrebenGeertsen' -p95 -(S'prebenergod' -p96 -(lp97 -S'sandbox.1313' -p98 -atp99 -sS'mortenfj' -p100 -(S'nisan500' -p101 -(lp102 -S'sandbox.1132' -p103 -atp104 -sS'hejzero' -p105 -(S'ken041117' -p106 -(lp107 -S'sandbox.829' -p108 -atp109 -sS'mwf' -p110 -(S'mastermf' -p111 -(lp112 -S'sandbox.686' -p113 -atp114 -sS'goffi' -p115 -(S'fluffy' -p116 -(lp117 -S'sandbox.1083' -p118 -atp119 -sS'tobiash' -p120 -(S'11t04b72h' -p121 -(lp122 -S'sandbox.763' -p123 -aS'sandbox.1027' -p124 -atp125 -sS'baddas' -p126 -(S'cool' -p127 -(lp128 -S'sandbox.946' -p129 -aS'sandbox.947' -p130 -atp131 -sS'Psycrow' -p132 -(S'rabo56' -p133 -(lp134 -S'sandbox.1164' -p135 -atp136 -sS'rto' -p137 -(S'240424' -p138 -(lp139 -S'sandbox.448' -p140 -aS'sandbox.477' -p141 -atp142 -sS'ptrier' -p143 -(S'2323' -p144 -(lp145 -S'sandbox.386' -p146 -atp147 -sS'egobent' -p148 -(S'121212' -p149 -(lp150 -S'sandbox.559' -p151 -atp152 -sS'isijakel' -p153 -(S'kiksekage' -p154 -(lp155 -S'sandbox.1210' -p156 -atp157 -sS'skovalf' -p158 -(S'nissen' -p159 -(lp160 -S'sandbox.851' -p161 -aS'sandbox.855' -p162 -aS'sandbox.881' -p163 -atp164 -sS'Zenzei' -p165 -(S'fisk1234' -p166 -(lp167 -S'sandbox.1275' -p168 -atp169 -sS'Brunuah' -p170 -(S'WHatever12' -p171 -(lp172 -S'sandbox.932' -p173 -aS'sandbox.933' -p174 -aS'sandbox.936' -p175 -aS'sandbox.940' -p176 -atp177 -sS'zhaitan' -p178 -(g37 -(lp179 -S'sandbox.1158' -p180 -atp181 -sS'tk3200' -p182 -(S'internet' -p183 -(lp184 -S'sandbox.1201' -p185 -atp186 -sS'bamstrup' -p187 -(S'blowme2' -p188 -(lp189 -S'sandbox.1226' -p190 -atp191 -sS'jespervogt' -p192 -(S'JVk473tv' -p193 -(lp194 -S'sandbox.1250' -p195 -atp196 -sS'Stoffer' -p197 -(S'hardcore' -p198 -(lp199 -S'sandbox.727' -p200 -atp201 -sS'Hagen' -p202 -(S'hagen' -p203 -(lp204 -S'sandbox.483' -p205 -atp206 -sS'kyster' -p207 -(S'hitman' -p208 -(lp209 -S'sandbox.1170' -p210 -atp211 -sS'Rottendk' -p212 -(S'okiehund' -p213 -(lp214 -tp215 -sS'somol' -p216 -(S'skovgade' -p217 -(lp218 -S'sandbox.223' -p219 -aS'sandbox.224' -p220 -atp221 -sS'ShamblerDK' -p222 -(S'iaml33t' -p223 -(lp224 -S'sandbox.552' -p225 -aS'sandbox.554' -p226 -atp227 -sS'jelahaha' -p228 -(S'alfalfa' -p229 -(lp230 -S'sandbox.1293' -p231 -atp232 -sS'Paul' -p233 -(S'3539jerk' -p234 -(lp235 -S'sandbox.922' -p236 -atp237 -sS'Panda' -p238 -(S'831015' -p239 -(lp240 -tp241 -sS'nickwyke' -p242 -(S'malawi' -p243 -(lp244 -S'sandbox.1069' -p245 -atp246 -sS'Ravenwood' -p247 -(S'qwert' -p248 -(lp249 -S'sandbox.1124' -p250 -aS'sandbox.1125' -p251 -atp252 -sS'Borch' -p253 -(S'1qaz2wsx' -p254 -(lp255 -S'sandbox.230' -p256 -atp257 -sS'Kejser' -p258 -(S'158630' -p259 -(lp260 -tp261 -sS'frej' -p262 -(S'color11' -p263 -(lp264 -S'sandbox.255' -p265 -atp266 -sS'Puppetmaster' -p267 -(S'netsrac' -p268 -(lp269 -S'sandbox.617' -p270 -atp271 -sS'jan@gsco.dk' -p272 -(S'98jan33' -p273 -(lp274 -S'sandbox.184' -p275 -atp276 -sS'SANDBOX_test' -p277 -(S'test' -p278 -(lp279 -tp280 -sS'burger' -p281 -(S'pope60' -p282 -(lp283 -tp284 -sS'aplarus' -p285 -(S'Apmilvus01' -p286 -(lp287 -S'sandbox.371' -p288 -aS'sandbox.372' -p289 -atp290 -sS'doktormadsen' -p291 -(S'cmersej' -p292 -(lp293 -S'sandbox.925' -p294 -atp295 -sS'neznerol' -p296 -(S'hund' -p297 -(lp298 -S'sandbox.186' -p299 -aS'sandbox.187' -p300 -atp301 -sS'YoBilee' -p302 -(S'jeghedderlarsen' -p303 -(lp304 -S'sandbox.645' -p305 -aS'sandbox.648' -p306 -aS'sandbox.649' -p307 -aS'sandbox.650' -p308 -aS'sandbox.735' -p309 -atp310 -sS'panda' -p311 -(S'831015' -p312 -(lp313 -S'sandbox.1115' -p314 -atp315 -sS'TACRO' -p316 -(S'TACRO' -p317 -(lp318 -S'sandbox.150' -p319 -aS'sandbox.161' -p320 -atp321 -sS'dusted' -p322 -(S'prettydarkness' -p323 -(lp324 -S'sandbox.695' -p325 -atp326 -sS'pokl' -p327 -(S'KlosterVej' -p328 -(lp329 -S'sandbox.1294' -p330 -aS'sandbox.1296' -p331 -atp332 -sS'RasH' -p333 -(S'pippip' -p334 -(lp335 -S'sandbox.773' -p336 -aS'sandbox.785' -p337 -atp338 -sS'LFCAR' -p339 -(S'wmclarw' -p340 -(lp341 -S'sandbox.1341' -p342 -atp343 -sS'UffeBang' -p344 -(S'Uf21fe45' -p345 -(lp346 -S'sandbox.1319' -p347 -aS'sandbox.1326' -p348 -aS'sandbox.1327' -p349 -atp350 -sS'Terrordan' -p351 -(S'andreas507' -p352 -(lp353 -S'sandbox.1050' -p354 -atp355 -sS'SnakeEye' -p356 -(S'120483' -p357 -(lp358 -S'sandbox.576' -p359 -aS'sandbox.577' -p360 -aS'sandbox.578' -p361 -aS'sandbox.579' -p362 -aS'sandbox.1169' -p363 -atp364 -sS'BazZerg' -p365 -(S'B8cuw6adrehofDv' -p366 -(lp367 -S'sandbox.837' -p368 -aS'sandbox.838' -p369 -aS'sandbox.841' -p370 -aS'sandbox.872' -p371 -atp372 -sS'floydian' -p373 -(S'oPFgCEpD' -p374 -(lp375 -S'sandbox.1329' -p376 -aS'sandbox.1340' -p377 -atp378 -sS'jacobvn' -p379 -(S'lene80' -p380 -(lp381 -S'sandbox.1336' -p382 -atp383 -sS'Benny' -p384 -(S'bsm1965' -p385 -(lp386 -S'sandbox.343' -p387 -atp388 -sS'jonas' -p389 -(S'sandboxpw' -p390 -(lp391 -S'sandbox.264' -p392 -aS'sandbox.265' -p393 -aS'sandbox.266' -p394 -aS'sandbox.267' -p395 -aS'sandbox.268' -p396 -aS'sandbox.269' -p397 -aS'sandbox.270' -p398 -aS'sandbox.271' -p399 -aS'sandbox.272' -p400 -aS'sandbox.273' -p401 -aS'sandbox.279' -p402 -aS'sandbox.283' -p403 -aS'sandbox.289' -p404 -aS'sandbox.290' -p405 -aS'sandbox.296' -p406 -aS'sandbox.299' -p407 -aS'sandbox.300' -p408 -aS'sandbox.301' -p409 -aS'sandbox.302' -p410 -aS'sandbox.303' -p411 -aS'sandbox.304' -p412 -aS'sandbox.305' -p413 -aS'sandbox.306' -p414 -aS'sandbox.307' -p415 -aS'sandbox.308' -p416 -aS'sandbox.310' -p417 -aS'sandbox.311' -p418 -aS'sandbox.316' -p419 -aS'sandbox.318' -p420 -aS'sandbox.321' -p421 -aS'sandbox.327' -p422 -aS'sandbox.498' -p423 -aS'sandbox.499' -p424 -aS'sandbox.500' -p425 -aS'sandbox.501' -p426 -aS'sandbox.502' -p427 -aS'sandbox.503' -p428 -aS'sandbox.504' -p429 -aS'sandbox.505' -p430 -aS'sandbox.506' -p431 -aS'sandbox.507' -p432 -aS'sandbox.508' -p433 -aS'sandbox.511' -p434 -aS'sandbox.512' -p435 -aS'sandbox.513' -p436 -aS'sandbox.514' -p437 -aS'sandbox.515' -p438 -aS'sandbox.516' -p439 -aS'sandbox.517' -p440 -aS'sandbox.518' -p441 -aS'sandbox.519' -p442 -aS'sandbox.520' -p443 -aS'sandbox.521' -p444 -aS'sandbox.522' -p445 -atp446 -sS'Mads' -p447 -(S'taager' -p448 -(lp449 -S'sandbox.451' -p450 -aS'sandbox.452' -p451 -aS'sandbox.453' -p452 -atp453 -sS'Skytrucker' -p454 -(S'noller23' -p455 -(lp456 -S'sandbox.1339' -p457 -atp458 -sS'gotdamn' -p459 -(S'2753' -p460 -(lp461 -S'sandbox.1140' -p462 -atp463 -sS'bpc2403' -p464 -(S'struck' -p465 -(lp466 -S'sandbox.1269' -p467 -aS'sandbox.1270' -p468 -atp469 -sS'rasmus' -p470 -(S'hen9lof1' -p471 -(lp472 -tp473 -sS'Pale2' -p474 -(S'4in14in1' -p475 -(lp476 -S'sandbox.587' -p477 -atp478 -sS'steffenthordal' -p479 -(S'skalsefterskole' -p480 -(lp481 -S'sandbox.181' -p482 -aS'sandbox.182' -p483 -atp484 -sS'PhonetiX' -p485 -(S'palle2' -p486 -(lp487 -S'sandbox.1184' -p488 -atp489 -sS'wiredsource' -p490 -(S'windows31' -p491 -(lp492 -S'sandbox.1095' -p493 -atp494 -sS'weblife' -p495 -(S'123456' -p496 -(lp497 -S'sandbox.1227' -p498 -atp499 -sS'Dkzoffy' -p500 -(S'Nicolai' -p501 -(lp502 -S'sandbox.1057' -p503 -atp504 -sS'perst' -p505 -(S'20072007' -p506 -(lp507 -S'sandbox.958' -p508 -aS'sandbox.959' -p509 -aS'sandbox.961' -p510 -atp511 -sS'Janski' -p512 -(S'12345' -p513 -(lp514 -tp515 -sS'hansh' -p516 -(S'andrik' -p517 -(lp518 -tp519 -sS'Pale' -p520 -(S'4in14in1' -p521 -(lp522 -S'sandbox.586' -p523 -atp524 -sS'HLA' -p525 -(S'sikkerhed' -p526 -(lp527 -S'sandbox.1291' -p528 -atp529 -sS'IRCMonkey' -p530 -(S'Felix.166' -p531 -(lp532 -S'sandbox.1290' -p533 -aS'sandbox.1366' -p534 -atp535 -sS'saunders' -p536 -(S'bjjtsalwp' -p537 -(lp538 -S'sandbox.291' -p539 -aS'sandbox.292' -p540 -aS'sandbox.293' -p541 -atp542 -sS'draconn' -p543 -(S'frank123' -p544 -(lp545 -S'sandbox.624' -p546 -atp547 -sS'klader' -p548 -(S'250395' -p549 -(lp550 -S'sandbox.1262' -p551 -atp552 -sS'MoMiMa' -p553 -(S'mm3390' -p554 -(lp555 -S'sandbox.1097' -p556 -atp557 -sS'MrHott' -p558 -(S'qwert' -p559 -(lp560 -S'sandbox.1034' -p561 -atp562 -sS'pjunge' -p563 -(S'mallejo1' -p564 -(lp565 -S'sandbox.1245' -p566 -atp567 -sS'Futugia' -p568 -(S'badboys9' -p569 -(lp570 -S'sandbox.1062' -p571 -atp572 -sS'taske' -p573 -(S'1306' -p574 -(lp575 -tp576 -sS'jsvarre' -p577 -(S'dean' -p578 -(lp579 -tp580 -sS'tbendsen' -p581 -(S'anne7GRY' -p582 -(lp583 -S'sandbox.411' -p584 -atp585 -sS'dims13' -p586 -(S'egu95b04' -p587 -(lp588 -S'sandbox.1089' -p589 -aS'sandbox.1090' -p590 -atp591 -sS'darkend666' -p592 -(S'wolf2630' -p593 -(lp594 -S'sandbox.1073' -p595 -aS'sandbox.1074' -p596 -aS'sandbox.1076' -p597 -atp598 -sS'ninas' -p599 -(S'chatcat' -p600 -(lp601 -S'sandbox.469' -p602 -atp603 -sS'tzv' -p604 -(S'matrix' -p605 -(lp606 -S'sandbox.603' -p607 -atp608 -sS'ulrikno' -p609 -(S'659954' -p610 -(lp611 -S'sandbox.845' -p612 -aS'sandbox.858' -p613 -atp614 -sS'JensBjerg' -p615 -(S'klostervej23' -p616 -(lp617 -S'sandbox.457' -p618 -atp619 -sS'templar' -p620 -(S'futte' -p621 -(lp622 -S'sandbox.1166' -p623 -atp624 -sS'mrask' -p625 -(S'kirsten' -p626 -(lp627 -S'sandbox.408' -p628 -atp629 -sS'cbroegger' -p630 -(S'dfgdfg' -p631 -(lp632 -S'sandbox.1049' -p633 -atp634 -sS'smoelbak' -p635 -(S'0111nanna' -p636 -(lp637 -S'sandbox.470' -p638 -atp639 -sS'ccc32023' -p640 -(S'1907791617' -p641 -(lp642 -S'sandbox.736' -p643 -atp644 -sS'mogenstjensen' -p645 -(S'sofus' -p646 -(lp647 -S'sandbox.476' -p648 -atp649 -sS'Guf' -p650 -(S'jldjld' -p651 -(lp652 -S'sandbox.180' -p653 -atp654 -sS'jmr' -p655 -(S'sofo1211' -p656 -(lp657 -S'sandbox.1353' -p658 -atp659 -sS'Spyd3R' -p660 -(S'hackie00' -p661 -(lp662 -S'sandbox.572' -p663 -aS'sandbox.574' -p664 -aS'sandbox.575' -p665 -aS'sandbox.930' -p666 -atp667 -sS'kulsukker' -p668 -(S'kulsukker' -p669 -(lp670 -S'sandbox.670' -p671 -aS'sandbox.775' -p672 -aS'sandbox.776' -p673 -atp674 -sS'ahlmann' -p675 -(S'M4wBACDf' -p676 -(lp677 -S'sandbox.952' -p678 -aS'sandbox.953' -p679 -aS'sandbox.957' -p680 -aS'sandbox.960' -p681 -aS'sandbox.962' -p682 -aS'sandbox.1168' -p683 -atp684 -sS'jmn' -p685 -(S'jmn' -p686 -(lp687 -S'sandbox.738' -p688 -atp689 -sS'magnumeinz' -p690 -(S'jn81grBH' -p691 -(lp692 -S'sandbox.609' -p693 -atp694 -sS'Charlatan' -p695 -(S'skinke' -p696 -(lp697 -tp698 -sS'larspolle' -p699 -(S'468gok' -p700 -(lp701 -S'sandbox.1055' -p702 -atp703 -sS'hola' -p704 -(S'holababy' -p705 -(lp706 -S'sandbox.456' -p707 -atp708 -sS'Andos' -p709 -(S'gresi99' -p710 -(lp711 -S'sandbox.620' -p712 -aS'sandbox.621' -p713 -aS'sandbox.622' -p714 -aS'sandbox.623' -p715 -aS'sandbox.625' -p716 -aS'sandbox.626' -p717 -aS'sandbox.627' -p718 -atp719 -sS'DoubleG' -p720 -(S'Maffy' -p721 -(lp722 -S'sandbox.784' -p723 -atp724 -sS'Matiz' -p725 -(S'aq321321' -p726 -(lp727 -S'sandbox.1075' -p728 -aS'sandbox.1077' -p729 -aS'sandbox.1078' -p730 -atp731 -sS'nina' -p732 -(S'chatcat' -p733 -(lp734 -S'sandbox.468' -p735 -atp736 -sS'110452' -p737 -(S'engparken' -p738 -(lp739 -S'sandbox.370' -p740 -atp741 -sS'Alaunus' -p742 -(S'240492' -p743 -(lp744 -S'sandbox.871' -p745 -atp746 -sS'NeoNmaN' -p747 -(S'2110851467' -p748 -(lp749 -S'sandbox.966' -p750 -aS'sandbox.968' -p751 -atp752 -sS'Viizard' -p753 -(S'minnie' -p754 -(lp755 -S'sandbox.883' -p756 -aS'sandbox.885' -p757 -aS'sandbox.886' -p758 -atp759 -sS'SBJDEVTEST' -p760 -(S'mju7ygv' -p761 -(lp762 -S'sandbox.409' -p763 -atp764 -sS'repox' -p765 -(S'j26211' -p766 -(lp767 -S'sandbox.977' -p768 -atp769 -sS'kroghet' -p770 -(S'moppet' -p771 -(lp772 -S'sandbox.1216' -p773 -aS'sandbox.1217' -p774 -atp775 -sS'amaragni' -p776 -(S'schultz' -p777 -(lp778 -S'sandbox.373' -p779 -aS'sandbox.374' -p780 -atp781 -sS'unkle' -p782 -(S'unkle' -p783 -(lp784 -S'sandbox.814' -p785 -atp786 -sS'FinAnd' -p787 -(S'3932289' -p788 -(lp789 -S'sandbox.1079' -p790 -atp791 -sS'Grith' -p792 -(S'zebra71' -p793 -(lp794 -S'sandbox.344' -p795 -aS'sandbox.345' -p796 -atp797 -sS'telver' -p798 -(S's23d4?h' -p799 -(lp800 -S'sandbox.421' -p801 -aS'sandbox.422' -p802 -atp803 -sS'Panteren' -p804 -(S'opus dei' -p805 -(lp806 -S'sandbox.1278' -p807 -atp808 -sS'soeby' -p809 -(S'hemmeligt' -p810 -(lp811 -S'sandbox.945' -p812 -atp813 -sS'hhh' -p814 -(S'zxcvbn' -p815 -(lp816 -S'sandbox.163' -p817 -aS'sandbox.164' -p818 -aS'sandbox.165' -p819 -aS'sandbox.166' -p820 -aS'sandbox.178' -p821 -atp822 -sS'arvox' -p823 -(S'd4d2FHR' -p824 -(lp825 -S'sandbox.1151' -p826 -aS'sandbox.1202' -p827 -atp828 -sS'hhl' -p829 -(S'hhlmigrid' -p830 -(lp831 -S'sandbox.341' -p832 -atp833 -sS'cornerrage' -p834 -(S'computer' -p835 -(lp836 -S'sandbox.944' -p837 -atp838 -sS'firewithin' -p839 -(S'kir-no-R' -p840 -(lp841 -S'sandbox.1141' -p842 -atp843 -sS'killerkaj' -p844 -(S'nille0208' -p845 -(lp846 -S'sandbox.194' -p847 -atp848 -sS'lkjonez' -p849 -(g37 -(lp850 -tp851 -sS'grosser' -p852 -(S'hejmeddig' -p853 -(lp854 -S'sandbox.1024' -p855 -atp856 -sS'hofman' -p857 -(S'020618' -p858 -(lp859 -S'sandbox.989' -p860 -aS'sandbox.991' -p861 -atp862 -sS'tiels' -p863 -(S'bridge2nk' -p864 -(lp865 -tp866 -sS'galle' -p867 -(S'migbelle0' -p868 -(lp869 -S'sandbox.543' -p870 -atp871 -sS'toubib' -p872 -(S'toubib' -p873 -(lp874 -S'sandbox.148' -p875 -atp876 -sS'flipperdk' -p877 -(S'rlhshgyp' -p878 -(lp879 -S'sandbox.549' -p880 -atp881 -sS'studiedata' -p882 -(S'qazwsx12' -p883 -(lp884 -S'sandbox.1191' -p885 -aS'sandbox.1192' -p886 -atp887 -sS'Jace' -p888 -(S'htmp5638' -p889 -(lp890 -S'sandbox.565' -p891 -aS'sandbox.1060' -p892 -aS'sandbox.1188' -p893 -atp894 -sS'Phill' -p895 -(S'klokke' -p896 -(lp897 -S'sandbox.824' -p898 -aS'sandbox.825' -p899 -atp900 -sS'tdel' -p901 -(S'pickme2' -p902 -(lp903 -S'sandbox.207' -p904 -aS'sandbox.208' -p905 -aS'sandbox.209' -p906 -atp907 -sS'jaandk' -p908 -(S'sprutso' -p909 -(lp910 -S'sandbox.748' -p911 -aS'sandbox.749' -p912 -aS'sandbox.750' -p913 -aS'sandbox.751' -p914 -aS'sandbox.753' -p915 -aS'sandbox.850' -p916 -atp917 -sS'Martin' -p918 -(S'qwerty' -p919 -(lp920 -S'sandbox.570' -p921 -aS'sandbox.571' -p922 -atp923 -sS'sippo' -p924 -(S'wonderloop' -p925 -(lp926 -S'sandbox.997' -p927 -aS'sandbox.998' -p928 -aS'sandbox.1004' -p929 -atp930 -sS'hawk' -p931 -(S'badehat' -p932 -(lp933 -S'sandbox.189' -p934 -atp935 -sS'meh2' -p936 -(S'manMail' -p937 -(lp938 -S'sandbox.231' -p939 -atp940 -sS'steinn' -p941 -(S'password' -p942 -(lp943 -S'sandbox.698' -p944 -atp945 -sS'alloc' -p946 -(S'26451079' -p947 -(lp948 -S'sandbox.924' -p949 -atp950 -sS'freebsdusr' -p951 -(S'3v3ry1' -p952 -(lp953 -S'sandbox.1232' -p954 -atp955 -sS'fritfald' -p956 -(S'comcom' -p957 -(lp958 -S'sandbox.1261' -p959 -atp960 -sS'Darkwing' -p961 -(S'code1435' -p962 -(lp963 -S'sandbox.652' -p964 -atp965 -sS'MichaelBerg' -p966 -(S'2011792351' -p967 -(lp968 -S'sandbox.1180' -p969 -atp970 -sS'wezter' -p971 -(S'020851p' -p972 -(lp973 -S'sandbox.1321' -p974 -atp975 -sS'martinm' -p976 -(S'skole' -p977 -(lp978 -S'sandbox.568' -p979 -aS'sandbox.569' -p980 -aS'sandbox.573' -p981 -atp982 -sS'Simonsen1988' -p983 -(S'15251' -p984 -(lp985 -S'sandbox.965' -p986 -atp987 -sS'benni' -p988 -(S'erikerik' -p989 -(lp990 -S'sandbox.1010' -p991 -aS'sandbox.1011' -p992 -aS'sandbox.1013' -p993 -aS'sandbox.1014' -p994 -aS'sandbox.1015' -p995 -aS'sandbox.1285' -p996 -atp997 -sS'sbtest' -p998 -(S'sbtest' -p999 -(lp1000 -S'sandbox.119' -p1001 -aS'sandbox.120' -p1002 -aS'sandbox.121' -p1003 -aS'sandbox.122' -p1004 -aS'sandbox.123' -p1005 -aS'sandbox.124' -p1006 -aS'sandbox.125' -p1007 -aS'sandbox.126' -p1008 -aS'sandbox.127' -p1009 -aS'sandbox.128' -p1010 -aS'sandbox.129' -p1011 -aS'sandbox.130' -p1012 -aS'sandbox.131' -p1013 -aS'sandbox.132' -p1014 -aS'sandbox.133' -p1015 -aS'sandbox.134' -p1016 -aS'sandbox.135' -p1017 -aS'sandbox.136' -p1018 -aS'sandbox.137' -p1019 -aS'sandbox.138' -p1020 -aS'sandbox.170' -p1021 -aS'sandbox.171' -p1022 -aS'sandbox.175' -p1023 -aS'sandbox.176' -p1024 -aS'sandbox.179' -p1025 -aS'sandbox.213' -p1026 -aS'sandbox.215' -p1027 -atp1028 -sS'pidoxx' -p1029 -(S'higher' -p1030 -(lp1031 -S'sandbox.755' -p1032 -atp1033 -sS'Nikke' -p1034 -(g37 -(lp1035 -S'sandbox.867' -p1036 -aS'sandbox.868' -p1037 -atp1038 -sS'Naughtydog' -p1039 -(S'exehxnjs' -p1040 -(lp1041 -S'sandbox.668' -p1042 -aS'sandbox.713' -p1043 -aS'sandbox.986' -p1044 -aS'sandbox.987' -p1045 -aS'sandbox.992' -p1046 -aS'sandbox.993' -p1047 -aS'sandbox.996' -p1048 -atp1049 -sS'MRap99' -p1050 -(S'alpo20' -p1051 -(lp1052 -S'sandbox.1282' -p1053 -atp1054 -sS'reptail' -p1055 -(S'xel46jem' -p1056 -(lp1057 -S'sandbox.754' -p1058 -atp1059 -sS'frelser' -p1060 -(S'27762411' -p1061 -(lp1062 -S'sandbox.999' -p1063 -aS'sandbox.1000' -p1064 -aS'sandbox.1001' -p1065 -aS'sandbox.1002' -p1066 -aS'sandbox.1006' -p1067 -aS'sandbox.1007' -p1068 -atp1069 -sS'cablecat' -p1070 -(S'sq28sq28' -p1071 -(lp1072 -S'sandbox.646' -p1073 -atp1074 -sS'Vildmand' -p1075 -(S'jhjjhj' -p1076 -(lp1077 -tp1078 -sS'LennyBoy' -p1079 -(S'ajr44evq' -p1080 -(lp1081 -S'sandbox.876' -p1082 -aS'sandbox.878' -p1083 -aS'sandbox.1063' -p1084 -atp1085 -sS'jh49' -p1086 -(S'efebongada' -p1087 -(lp1088 -S'sandbox.1307' -p1089 -aS'sandbox.1337' -p1090 -atp1091 -sS'alme1' -p1092 -(S'qcxnk1049' -p1093 -(lp1094 -S'sandbox.1315' -p1095 -atp1096 -sS'joha1712' -p1097 -(S'kodeord' -p1098 -(lp1099 -S'sandbox.1299' -p1100 -atp1101 -sS'webee' -p1102 -(S'khkhkh' -p1103 -(lp1104 -S'sandbox.1155' -p1105 -aS'sandbox.1156' -p1106 -atp1107 -sS'tlyngej' -p1108 -(S'77705555' -p1109 -(lp1110 -S'sandbox.1149' -p1111 -aS'sandbox.1153' -p1112 -aS'sandbox.1154' -p1113 -atp1114 -sS'tangot' -p1115 -(S'rudeskov' -p1116 -(lp1117 -S'sandbox.360' -p1118 -atp1119 -sS'emilbp' -p1120 -(S'NirQj9Fa' -p1121 -(lp1122 -S'sandbox.1118' -p1123 -atp1124 -sS'kunp20' -p1125 -(S'loiuloiu' -p1126 -(lp1127 -S'sandbox.149' -p1128 -atp1129 -sS'siegaard' -p1130 -(S'singapore' -p1131 -(lp1132 -S'sandbox.1276' -p1133 -atp1134 -sS'ppl2s' -p1135 -(S'12345r' -p1136 -(lp1137 -S'sandbox.1264' -p1138 -atp1139 -sS'Kardi' -p1140 -(S'bentmand' -p1141 -(lp1142 -S'sandbox.1211' -p1143 -aS'sandbox.1212' -p1144 -atp1145 -sS'weber' -p1146 -(S'rambO007' -p1147 -(lp1148 -S'sandbox.866' -p1149 -aS'sandbox.875' -p1150 -atp1151 -sS'runesvend' -p1152 -(S'irule123' -p1153 -(lp1154 -S'sandbox.1120' -p1155 -atp1156 -sS'Vejby' -p1157 -(S'Hcefafdp1337' -p1158 -(lp1159 -S'sandbox.767' -p1160 -aS'sandbox.768' -p1161 -atp1162 -sS'daffyMan' -p1163 -(S'Spasser112' -p1164 -(lp1165 -S'sandbox.815' -p1166 -atp1167 -sS'kky' -p1168 -(S'MiGkky' -p1169 -(lp1170 -S'sandbox.402' -p1171 -aS'sandbox.403' -p1172 -atp1173 -sS'mattiasg' -p1174 -(S'esselte' -p1175 -(lp1176 -S'sandbox.653' -p1177 -atp1178 -sS'twsvendsen' -p1179 -(S'julemand' -p1180 -(lp1181 -S'sandbox.464' -p1182 -aS'sandbox.465' -p1183 -aS'sandbox.485' -p1184 -aS'sandbox.487' -p1185 -aS'sandbox.488' -p1186 -aS'sandbox.489' -p1187 -aS'sandbox.490' -p1188 -aS'sandbox.491' -p1189 -atp1190 -sS'tssn' -p1191 -(S'steffen31' -p1192 -(lp1193 -S'sandbox.642' -p1194 -aS'sandbox.657' -p1195 -aS'sandbox.659' -p1196 -aS'sandbox.720' -p1197 -atp1198 -sS'bolden' -p1199 -(S'select' -p1200 -(lp1201 -S'sandbox.813' -p1202 -atp1203 -sS'FeZtAr' -p1204 -(S'100786' -p1205 -(lp1206 -S'sandbox.1274' -p1207 -atp1208 -sS'magrdk' -p1209 -(S'2144452927' -p1210 -(lp1211 -S'sandbox.1297' -p1212 -aS'sandbox.1298' -p1213 -atp1214 -sS'masterx' -p1215 -(S'dakidaki' -p1216 -(lp1217 -tp1218 -sS'cichos' -p1219 -(S'lanilani' -p1220 -(lp1221 -S'sandbox.1317' -p1222 -atp1223 -sS'bono' -p1224 -(S'achtung' -p1225 -(lp1226 -S'sandbox.210' -p1227 -aS'sandbox.211' -p1228 -aS'sandbox.212' -p1229 -atp1230 -sS'trine333' -p1231 -(S'trine333' -p1232 -(lp1233 -S'sandbox.443' -p1234 -atp1235 -sS'Ottzen' -p1236 -(S'eimies' -p1237 -(lp1238 -S'sandbox.937' -p1239 -atp1240 -sS'bursty' -p1241 -(S'osttso' -p1242 -(lp1243 -S'sandbox.712' -p1244 -aS'sandbox.737' -p1245 -atp1246 -sS'deathtrap' -p1247 -(S'Kuq2914txJ5' -p1248 -(lp1249 -S'sandbox.1288' -p1250 -aS'sandbox.1304' -p1251 -aS'sandbox.1309' -p1252 -aS'sandbox.1310' -p1253 -aS'sandbox.1361' -p1254 -aS'sandbox.1376' -p1255 -aS'sandbox.1377' -p1256 -aS'sandbox.1378' -p1257 -aS'sandbox.1379' -p1258 -aS'sandbox.1380' -p1259 -aS'sandbox.1381' -p1260 -aS'sandbox.1382' -p1261 -atp1262 -sS'vidas' -p1263 -(S'screwman' -p1264 -(lp1265 -S'sandbox.533' -p1266 -atp1267 -sS'faetter' -p1268 -(S'agnus30' -p1269 -(lp1270 -S'sandbox.663' -p1271 -aS'sandbox.666' -p1272 -atp1273 -sS'lauer1000' -p1274 -(S'mediator' -p1275 -(lp1276 -S'sandbox.1167' -p1277 -atp1278 -sS'mdh' -p1279 -(S'qmla49za' -p1280 -(lp1281 -S'sandbox.361' -p1282 -atp1283 -sS'mdsloop' -p1284 -(S'65416541' -p1285 -(lp1286 -S'sandbox.1102' -p1287 -atp1288 -sS'andcor' -p1289 -(S'mankere' -p1290 -(lp1291 -S'sandbox.884' -p1292 -atp1293 -sS'jaws' -p1294 -(S'bachpwd' -p1295 -(lp1296 -S'sandbox.197' -p1297 -atp1298 -sS'abildgaard' -p1299 -(S'dikdik99' -p1300 -(lp1301 -S'sandbox.667' -p1302 -atp1303 -sS'regta' -p1304 -(S'dd' -p1305 -(lp1306 -S'sandbox.564' -p1307 -atp1308 -sS'JunkStar' -p1309 -(S'junkie2000' -p1310 -(lp1311 -S'sandbox.756' -p1312 -atp1313 -sS'jaycedk' -p1314 -(S'minus1' -p1315 -(lp1316 -S'sandbox.860' -p1317 -aS'sandbox.862' -p1318 -aS'sandbox.870' -p1319 -aS'sandbox.874' -p1320 -aS'sandbox.879' -p1321 -atp1322 -sS'larchdk' -p1323 -(S'augustin' -p1324 -(lp1325 -S'sandbox.441' -p1326 -atp1327 -sS'Mille' -p1328 -(S'80898089' -p1329 -(lp1330 -S'sandbox.151' -p1331 -aS'sandbox.152' -p1332 -atp1333 -sS'fjellerup' -p1334 -(S'xnfsrr' -p1335 -(lp1336 -S'sandbox.826' -p1337 -aS'sandbox.827' -p1338 -atp1339 -sS'BrianDemant' -p1340 -(S'ic248w' -p1341 -(lp1342 -S'sandbox.206' -p1343 -atp1344 -sS'kenj' -p1345 -(S'mig' -p1346 -(lp1347 -S'sandbox.560' -p1348 -aS'sandbox.561' -p1349 -atp1350 -sS'larsros' -p1351 -(S'lars0505' -p1352 -(lp1353 -S'sandbox.1352' -p1354 -atp1355 -sS'iznobad' -p1356 -(S'Syv7Tre3' -p1357 -(lp1358 -S'sandbox.1197' -p1359 -aS'sandbox.1198' -p1360 -atp1361 -sS'Holm' -p1362 -(S'skafl' -p1363 -(lp1364 -tp1365 -sS'daniel' -p1366 -(S'daniel' -p1367 -(lp1368 -tp1369 -sS'dsi' -p1370 -(S'dsi' -p1371 -(lp1372 -S'sandbox.438' -p1373 -atp1374 -sS'saxifrage' -p1375 -(S'dddgek' -p1376 -(lp1377 -S'sandbox.537' -p1378 -atp1379 -sS'vinter' -p1380 -(S'test' -p1381 -(lp1382 -S'sandbox.329' -p1383 -aS'sandbox.330' -p1384 -atp1385 -sS'Azick' -p1386 -(S'janjan' -p1387 -(lp1388 -S'sandbox.1265' -p1389 -aS'sandbox.1266' -p1390 -atp1391 -sS'scumbag' -p1392 -(S'kakk21ll' -p1393 -(lp1394 -S'sandbox.1064' -p1395 -atp1396 -sS'unnamet' -p1397 -(S'opkals' -p1398 -(lp1399 -S'sandbox.791' -p1400 -atp1401 -sS'VaNGoGO' -p1402 -(S'4X25KZ' -p1403 -(lp1404 -S'sandbox.672' -p1405 -atp1406 -sS'boobo' -p1407 -(S'hhels' -p1408 -(lp1409 -S'sandbox.582' -p1410 -atp1411 -sS'Phylock' -p1412 -(S'5cAjmP' -p1413 -(lp1414 -S'sandbox.747' -p1415 -aS'sandbox.752' -p1416 -atp1417 -sS'Fatboy213' -p1418 -(S'uganda1984' -p1419 -(lp1420 -tp1421 -sS'zigelation' -p1422 -(S'qweasd' -p1423 -(lp1424 -tp1425 -sS'silverwolf' -p1426 -(S'matias99' -p1427 -(lp1428 -S'sandbox.684' -p1429 -atp1430 -sS'rexcmrex' -p1431 -(S'cmrexdcr' -p1432 -(lp1433 -S'sandbox.220' -p1434 -atp1435 -sS'clauska' -p1436 -(S'qo1xoXGp' -p1437 -(lp1438 -S'sandbox.1204' -p1439 -atp1440 -sS'the1bean' -p1441 -(S'goldwing' -p1442 -(lp1443 -S'sandbox.644' -p1444 -atp1445 -sS'45xl22' -p1446 -(S'P4Z2bt' -p1447 -(lp1448 -S'sandbox.1251' -p1449 -atp1450 -sS'renec' -p1451 -(S'Deedls2#' -p1452 -(lp1453 -S'sandbox.658' -p1454 -aS'sandbox.664' -p1455 -atp1456 -sS'elprickio' -p1457 -(S'asroma' -p1458 -(lp1459 -S'sandbox.1246' -p1460 -aS'sandbox.1247' -p1461 -atp1462 -sS'Bjeldbak' -p1463 -(S'sempai' -p1464 -(lp1465 -S'sandbox.1244' -p1466 -atp1467 -sS'klafbang' -p1468 -(S'jaqmd12' -p1469 -(lp1470 -S'sandbox.314' -p1471 -atp1472 -sS'duskeren' -p1473 -(S'zaggazagga' -p1474 -(lp1475 -S'sandbox.1061' -p1476 -atp1477 -sS'Xalion' -p1478 -(S'mamfaa' -p1479 -(lp1480 -S'sandbox.1105' -p1481 -atp1482 -sS'Nicoolai' -p1483 -(S'fuckass' -p1484 -(lp1485 -S'sandbox.954' -p1486 -atp1487 -sS'chickenthief' -p1488 -(S'kihasek' -p1489 -(lp1490 -S'sandbox.1311' -p1491 -atp1492 -sS'n00b' -p1493 -(S'n00b12' -p1494 -(lp1495 -S'sandbox.810' -p1496 -atp1497 -sS'McM' -p1498 -(S'frederikandreas' -p1499 -(lp1500 -S'sandbox.615' -p1501 -aS'sandbox.616' -p1502 -atp1503 -sS'Duo' -p1504 -(S'duo' -p1505 -(lp1506 -S'sandbox.482' -p1507 -atp1508 -sS'beeboman' -p1509 -(g37 -(lp1510 -S'sandbox.583' -p1511 -atp1512 -sS'Adamite' -p1513 -(S'BugOff' -p1514 -(lp1515 -tp1516 -sS'svendemil' -p1517 -(S'svendemil' -p1518 -(lp1519 -S'sandbox.629' -p1520 -atp1521 -sS'andeniel' -p1522 -(S'fishwish' -p1523 -(lp1524 -S'sandbox.1308' -p1525 -atp1526 -sS'peterdv' -p1527 -(S'peterdvd' -p1528 -(lp1529 -S'sandbox.218' -p1530 -atp1531 -sS'hehe' -p1532 -(S'hehe' -p1533 -(lp1534 -tp1535 -sS'Basoda' -p1536 -(S'jubile' -p1537 -(lp1538 -S'sandbox.1127' -p1539 -aS'sandbox.1128' -p1540 -atp1541 -sS'Kakaokongen' -p1542 -(S'NuggaPower' -p1543 -(lp1544 -S'sandbox.605' -p1545 -atp1546 -sS'alltho6' -p1547 -(S'science' -p1548 -(lp1549 -S'sandbox.1058' -p1550 -atp1551 -sS'djcappy' -p1552 -(S'CASP2391' -p1553 -(lp1554 -S'sandbox.843' -p1555 -aS'sandbox.844' -p1556 -atp1557 -sS'OBenned' -p1558 -(S'2jrwvx2v' -p1559 -(lp1560 -S'sandbox.1119' -p1561 -atp1562 -sS'Seatech' -p1563 -(S'eHR0FDZB' -p1564 -(lp1565 -S'sandbox.1277' -p1566 -atp1567 -sS'nrostgaard' -p1568 -(S'jahojegs' -p1569 -(lp1570 -S'sandbox.339' -p1571 -atp1572 -sS'hotel' -p1573 -(S'hotel' -p1574 -(lp1575 -S'sandbox.214' -p1576 -atp1577 -sS'rogm' -p1578 -(S'bryllup' -p1579 -(lp1580 -S'sandbox.492' -p1581 -atp1582 -sS'chrolle' -p1583 -(S'pingo9' -p1584 -(lp1585 -S'sandbox.679' -p1586 -aS'sandbox.680' -p1587 -atp1588 -sS'esha' -p1589 -(S'2448' -p1590 -(lp1591 -S'sandbox.742' -p1592 -aS'sandbox.743' -p1593 -aS'sandbox.746' -p1594 -atp1595 -sS'pnj' -p1596 -(S'40414949' -p1597 -(lp1598 -S'sandbox.1071' -p1599 -aS'sandbox.1072' -p1600 -atp1601 -sS'martinlaugesen' -p1602 -(S'9155' -p1603 -(lp1604 -S'sandbox.1287' -p1605 -atp1606 -sS'Kurt' -p1607 -(S'10331241' -p1608 -(lp1609 -S'sandbox.1322' -p1610 -atp1611 -sS'than' -p1612 -(S'saport' -p1613 -(lp1614 -S'sandbox.1334' -p1615 -aS'sandbox.1335' -p1616 -atp1617 -sS'hitachi' -p1618 -(S'tissot' -p1619 -(lp1620 -S'sandbox.1342' -p1621 -atp1622 -sS'kjandersen' -p1623 -(S'kjandersen' -p1624 -(lp1625 -S'sandbox.1231' -p1626 -atp1627 -sS'piil' -p1628 -(S'dolken' -p1629 -(lp1630 -S'sandbox.493' -p1631 -atp1632 -sS'Lassedk' -p1633 -(S'solb\xe6nk67' -p1634 -(lp1635 -S'sandbox.466' -p1636 -atp1637 -sS'buch78' -p1638 -(S'han16sen' -p1639 -(lp1640 -S'sandbox.588' -p1641 -aS'sandbox.589' -p1642 -aS'sandbox.590' -p1643 -aS'sandbox.591' -p1644 -aS'sandbox.592' -p1645 -aS'sandbox.593' -p1646 -aS'sandbox.596' -p1647 -aS'sandbox.598' -p1648 -atp1649 -sS'lbp' -p1650 -(S'bp' -p1651 -(lp1652 -tp1653 -sS'telli' -p1654 -(S'yellow123' -p1655 -(lp1656 -tp1657 -sS'saf' -p1658 -(S'dd' -p1659 -(lp1660 -S'sandbox.779' -p1661 -aS'sandbox.782' -p1662 -aS'sandbox.793' -p1663 -aS'sandbox.799' -p1664 -aS'sandbox.1012' -p1665 -aS'sandbox.1018' -p1666 -aS'sandbox.1025' -p1667 -aS'sandbox.1026' -p1668 -aS'sandbox.1028' -p1669 -aS'sandbox.1030' -p1670 -aS'sandbox.1031' -p1671 -aS'sandbox.1037' -p1672 -aS'sandbox.1081' -p1673 -aS'sandbox.1082' -p1674 -atp1675 -sS'lessarh' -p1676 -(S'tis2gange' -p1677 -(lp1678 -S'sandbox.975' -p1679 -aS'sandbox.976' -p1680 -atp1681 -sS'rlasse' -p1682 -(S'1kk1ss' -p1683 -(lp1684 -S'sandbox.463' -p1685 -aS'sandbox.467' -p1686 -atp1687 -sS'ras' -p1688 -(S'ras' -p1689 -(lp1690 -S'sandbox.104' -p1691 -aS'sandbox.105' -p1692 -aS'sandbox.106' -p1693 -aS'sandbox.107' -p1694 -aS'sandbox.108' -p1695 -aS'sandbox.109' -p1696 -aS'sandbox.110' -p1697 -aS'sandbox.111' -p1698 -aS'sandbox.112' -p1699 -aS'sandbox.113' -p1700 -aS'sandbox.114' -p1701 -aS'sandbox.115' -p1702 -aS'sandbox.116' -p1703 -aS'sandbox.117' -p1704 -aS'sandbox.118' -p1705 -aS'sandbox.225' -p1706 -aS'sandbox.227' -p1707 -aS'sandbox.228' -p1708 -aS'sandbox.229' -p1709 -aS'sandbox.232' -p1710 -aS'sandbox.233' -p1711 -aS'sandbox.234' -p1712 -aS'sandbox.235' -p1713 -aS'sandbox.236' -p1714 -aS'sandbox.237' -p1715 -aS'sandbox.238' -p1716 -aS'sandbox.239' -p1717 -aS'sandbox.240' -p1718 -aS'sandbox.241' -p1719 -aS'sandbox.242' -p1720 -aS'sandbox.243' -p1721 -aS'sandbox.244' -p1722 -aS'sandbox.245' -p1723 -aS'sandbox.246' -p1724 -aS'sandbox.247' -p1725 -aS'sandbox.248' -p1726 -aS'sandbox.249' -p1727 -aS'sandbox.250' -p1728 -aS'sandbox.251' -p1729 -aS'sandbox.252' -p1730 -aS'sandbox.253' -p1731 -aS'sandbox.254' -p1732 -aS'sandbox.256' -p1733 -aS'sandbox.257' -p1734 -aS'sandbox.258' -p1735 -aS'sandbox.259' -p1736 -aS'sandbox.260' -p1737 -aS'sandbox.261' -p1738 -aS'sandbox.262' -p1739 -aS'sandbox.263' -p1740 -aS'sandbox.274' -p1741 -aS'sandbox.275' -p1742 -aS'sandbox.276' -p1743 -aS'sandbox.277' -p1744 -aS'sandbox.278' -p1745 -aS'sandbox.280' -p1746 -aS'sandbox.281' -p1747 -aS'sandbox.282' -p1748 -aS'sandbox.284' -p1749 -aS'sandbox.285' -p1750 -aS'sandbox.286' -p1751 -aS'sandbox.287' -p1752 -aS'sandbox.288' -p1753 -aS'sandbox.294' -p1754 -aS'sandbox.295' -p1755 -aS'sandbox.297' -p1756 -aS'sandbox.298' -p1757 -aS'sandbox.309' -p1758 -aS'sandbox.317' -p1759 -aS'sandbox.319' -p1760 -aS'sandbox.320' -p1761 -aS'sandbox.322' -p1762 -aS'sandbox.323' -p1763 -aS'sandbox.331' -p1764 -aS'sandbox.336' -p1765 -aS'sandbox.351' -p1766 -aS'sandbox.352' -p1767 -aS'sandbox.359' -p1768 -aS'sandbox.377' -p1769 -aS'sandbox.378' -p1770 -aS'sandbox.390' -p1771 -aS'sandbox.394' -p1772 -aS'sandbox.395' -p1773 -aS'sandbox.396' -p1774 -aS'sandbox.397' -p1775 -aS'sandbox.399' -p1776 -aS'sandbox.439' -p1777 -aS'sandbox.450' -p1778 -aS'sandbox.458' -p1779 -aS'sandbox.459' -p1780 -aS'sandbox.460' -p1781 -aS'sandbox.461' -p1782 -aS'sandbox.472' -p1783 -aS'sandbox.473' -p1784 -aS'sandbox.474' -p1785 -aS'sandbox.475' -p1786 -aS'sandbox.478' -p1787 -aS'sandbox.484' -p1788 -aS'sandbox.486' -p1789 -aS'sandbox.525' -p1790 -aS'sandbox.526' -p1791 -aS'sandbox.527' -p1792 -aS'sandbox.528' -p1793 -aS'sandbox.529' -p1794 -aS'sandbox.530' -p1795 -aS'sandbox.531' -p1796 -aS'sandbox.534' -p1797 -aS'sandbox.535' -p1798 -aS'sandbox.536' -p1799 -aS'sandbox.780' -p1800 -aS'sandbox.781' -p1801 -aS'sandbox.783' -p1802 -aS'sandbox.786' -p1803 -aS'sandbox.788' -p1804 -aS'sandbox.792' -p1805 -aS'sandbox.794' -p1806 -aS'sandbox.798' -p1807 -atp1808 -sS'timmisch' -p1809 -(S'trille' -p1810 -(lp1811 -S'sandbox.419' -p1812 -atp1813 -sS'Cral' -p1814 -(S'Nitram' -p1815 -(lp1816 -S'sandbox.1098' -p1817 -aS'sandbox.1099' -p1818 -atp1819 -sS'keisen' -p1820 -(S'keisen' -p1821 -(lp1822 -S'sandbox.1241' -p1823 -aS'sandbox.1242' -p1824 -aS'sandbox.1243' -p1825 -atp1826 -sS'mortendb' -p1827 -(S'powertoy' -p1828 -(lp1829 -S'sandbox.562' -p1830 -atp1831 -sS'Elkoremarr' -p1832 -(S'12qwaszx' -p1833 -(lp1834 -S'sandbox.831' -p1835 -atp1836 -sS'GetWell' -p1837 -(S'FriskFisk67' -p1838 -(lp1839 -S'sandbox.1150' -p1840 -aS'sandbox.1162' -p1841 -atp1842 -sS'min' -p1843 -(S'min011090' -p1844 -(lp1845 -S'sandbox.1338' -p1846 -atp1847 -sS'mie' -p1848 -(S'1977' -p1849 -(lp1850 -S'sandbox.440' -p1851 -atp1852 -sS'tomasd' -p1853 -(S'spark500' -p1854 -(lp1855 -S'sandbox.610' -p1856 -atp1857 -sS'henne' -p1858 -(S'xlafd' -p1859 -(lp1860 -S'sandbox.612' -p1861 -aS'sandbox.613' -p1862 -aS'sandbox.614' -p1863 -atp1864 -sS'liv' -p1865 -(S'pippin' -p1866 -(lp1867 -S'sandbox.328' -p1868 -atp1869 -sS'CoB' -p1870 -(S'LaMoxo0she' -p1871 -(lp1872 -S'sandbox.891' -p1873 -aS'sandbox.895' -p1874 -aS'sandbox.896' -p1875 -aS'sandbox.897' -p1876 -aS'sandbox.898' -p1877 -aS'sandbox.899' -p1878 -aS'sandbox.900' -p1879 -aS'sandbox.901' -p1880 -aS'sandbox.902' -p1881 -aS'sandbox.904' -p1882 -aS'sandbox.905' -p1883 -aS'sandbox.910' -p1884 -aS'sandbox.913' -p1885 -atp1886 -sS'nbhansen' -p1887 -(S'br0dersen' -p1888 -(lp1889 -S'sandbox.918' -p1890 -aS'sandbox.923' -p1891 -atp1892 -sS'ulrichlandbo' -p1893 -(S'1jensulla1' -p1894 -(lp1895 -S'sandbox.1108' -p1896 -aS'sandbox.1110' -p1897 -atp1898 -sS'frydkjaer' -p1899 -(S'stable' -p1900 -(lp1901 -S'sandbox.1117' -p1902 -atp1903 -sS'norman' -p1904 -(S'husbbkwq' -p1905 -(lp1906 -S'sandbox.1094' -p1907 -atp1908 -sS'trille' -p1909 -(S'andrik' -p1910 -(lp1911 -S'sandbox.722' -p1912 -atp1913 -sS'hazel' -p1914 -(S'velopung' -p1915 -(lp1916 -S'sandbox.942' -p1917 -atp1918 -sS'jsj' -p1919 -(S'hedder' -p1920 -(lp1921 -S'sandbox.1043' -p1922 -atp1923 -sS'bsm' -p1924 -(S'bsm' -p1925 -(lp1926 -S'sandbox.444' -p1927 -atp1928 -sS'mortenh' -p1929 -(S'manMail' -p1930 -(lp1931 -S'sandbox.495' -p1932 -aS'sandbox.496' -p1933 -aS'sandbox.497' -p1934 -aS'sandbox.509' -p1935 -aS'sandbox.510' -p1936 -aS'sandbox.523' -p1937 -aS'sandbox.524' -p1938 -atp1939 -sS'flemming' -p1940 -(S'billammm' -p1941 -(lp1942 -S'sandbox.1318' -p1943 -atp1944 -sS'Clemmensen' -p1945 -(S'Lotto222' -p1946 -(lp1947 -tp1948 -sS'leg3nd' -p1949 -(S'gerfin' -p1950 -(lp1951 -S'sandbox.1218' -p1952 -atp1953 -sS'rommesdk' -p1954 -(S'4302' -p1955 -(lp1956 -S'sandbox.921' -p1957 -atp1958 -sS'porotnikoff' -p1959 -(S'sonja1510' -p1960 -(lp1961 -S'sandbox.167' -p1962 -aS'sandbox.168' -p1963 -aS'sandbox.172' -p1964 -atp1965 -sS'bjornbak' -p1966 -(S'netopia' -p1967 -(lp1968 -S'sandbox.654' -p1969 -atp1970 -sS'kcseh' -p1971 -(S'Koden1' -p1972 -(lp1973 -S'sandbox.1209' -p1974 -atp1975 -sS'nazul' -p1976 -(S'qaz2411' -p1977 -(lp1978 -S'sandbox.1190' -p1979 -aS'sandbox.1193' -p1980 -aS'sandbox.1194' -p1981 -atp1982 -sS'Brainiac' -p1983 -(S'Paperboy' -p1984 -(lp1985 -S'sandbox.909' -p1986 -atp1987 -sS'RBu' -p1988 -(S'd7pk8123' -p1989 -(lp1990 -S'sandbox.1039' -p1991 -atp1992 -sS'Freakzter' -p1993 -(S'thebombs' -p1994 -(lp1995 -S'sandbox.1020' -p1996 -aS'sandbox.1116' -p1997 -atp1998 -sS'lene2' -p1999 -(S'lene2' -p2000 -(lp2001 -S'sandbox.425' -p2002 -atp2003 -sS'miltersen' -p2004 -(S'pakopako' -p2005 -(lp2006 -S'sandbox.185' -p2007 -atp2008 -sS'janmol' -p2009 -(S'statoil' -p2010 -(lp2011 -S'sandbox.362' -p2012 -atp2013 -sS'lpk' -p2014 -(S'iligccph' -p2015 -(lp2016 -S'sandbox.417' -p2017 -aS'sandbox.418' -p2018 -atp2019 -sS'gafkhan' -p2020 -(S'sony' -p2021 -(lp2022 -S'sandbox.859' -p2023 -aS'sandbox.939' -p2024 -atp2025 -sS'xcitedk' -p2026 -(S'861841' -p2027 -(lp2028 -S'sandbox.689' -p2029 -aS'sandbox.690' -p2030 -aS'sandbox.691' -p2031 -atp2032 -sS'jannicks' -p2033 -(S'tango6' -p2034 -(lp2035 -S'sandbox.447' -p2036 -atp2037 -sS'smeaGOLL' -p2038 -(S'smeaGOLL2003' -p2039 -(lp2040 -S'sandbox.1234' -p2041 -atp2042 -sS'romhn' -p2043 -(S'smedjen' -p2044 -(lp2045 -S'sandbox.442' -p2046 -atp2047 -sS'jefferyLogan' -p2048 -(S'bukbuk' -p2049 -(lp2050 -S'sandbox.1174' -p2051 -aS'sandbox.1175' -p2052 -aS'sandbox.1176' -p2053 -atp2054 -sS'XenoBIT' -p2055 -(S'Factor05' -p2056 -(lp2057 -S'sandbox.1165' -p2058 -atp2059 -sS'madsOne' -p2060 -(S'vfffvff1' -p2061 -(lp2062 -S'sandbox.1019' -p2063 -atp2064 -sS'abodilsen' -p2065 -(S'Postkasse' -p2066 -(lp2067 -S'sandbox.971' -p2068 -aS'sandbox.972' -p2069 -aS'sandbox.1114' -p2070 -atp2071 -sS'Mivia' -p2072 -(S'Bimse' -p2073 -(lp2074 -S'sandbox.1088' -p2075 -atp2076 -sS'nicondk' -p2077 -(S'170485' -p2078 -(lp2079 -S'sandbox.1136' -p2080 -atp2081 -sS'reallife' -p2082 -(S'123456' -p2083 -(lp2084 -S'sandbox.1228' -p2085 -aS'sandbox.1229' -p2086 -atp2087 -sS'Alrekr' -p2088 -(S'jbiBpR11' -p2089 -(lp2090 -S'sandbox.926' -p2091 -aS'sandbox.927' -p2092 -aS'sandbox.928' -p2093 -aS'sandbox.934' -p2094 -aS'sandbox.1092' -p2095 -atp2096 -sS'DonLobster' -p2097 -(S'w3lld0ne' -p2098 -(lp2099 -S'sandbox.800' -p2100 -atp2101 -sS'slow' -p2102 -(S'audislow' -p2103 -(lp2104 -S'sandbox.1130' -p2105 -atp2106 -sS'Grom' -p2107 -(S'hendrix' -p2108 -(lp2109 -S'sandbox.1289' -p2110 -atp2111 -sS'Blazix' -p2112 -(S'0503872323' -p2113 -(lp2114 -S'sandbox.1142' -p2115 -atp2116 -sS'corydoras' -p2117 -(S'mistercandy' -p2118 -(lp2119 -S'sandbox.369' -p2120 -atp2121 -sS'rash' -p2122 -(S'pippip' -p2123 -(lp2124 -S'sandbox.601' -p2125 -atp2126 -sS'lilleloppen' -p2127 -(S'lilleloppen' -p2128 -(lp2129 -S'sandbox.611' -p2130 -aS'sandbox.830' -p2131 -aS'sandbox.839' -p2132 -atp2133 -sS'ckref' -p2134 -(S'Live_mig7' -p2135 -(lp2136 -S'sandbox.640' -p2137 -aS'sandbox.641' -p2138 -atp2139 -sS'ossi' -p2140 -(S'ossi' -p2141 -(lp2142 -S'sandbox.1144' -p2143 -atp2144 -sS'hauge' -p2145 -(S'jql7ui' -p2146 -(lp2147 -S'sandbox.979' -p2148 -atp2149 -sS'kadara' -p2150 -(S'mads1337' -p2151 -(lp2152 -S'sandbox.705' -p2153 -aS'sandbox.706' -p2154 -aS'sandbox.707' -p2155 -aS'sandbox.708' -p2156 -aS'sandbox.711' -p2157 -atp2158 -sS'reggol' -p2159 -(S'sk99sv' -p2160 -(lp2161 -S'sandbox.681' -p2162 -atp2163 -sS'zacker' -p2164 -(S'zackers' -p2165 -(lp2166 -S'sandbox.1137' -p2167 -atp2168 -sS'Holger' -p2169 -(S'19lkj75' -p2170 -(lp2171 -S'sandbox.1171' -p2172 -atp2173 -sS'Daduck' -p2174 -(S'jja2661' -p2175 -(lp2176 -S'sandbox.1325' -p2177 -atp2178 -sS'Glizz' -p2179 -(S'infinity' -p2180 -(lp2181 -S'sandbox.863' -p2182 -atp2183 -sS'jlerscreen' -p2184 -(S'mig' -p2185 -(lp2186 -S'sandbox.405' -p2187 -atp2188 -sS'bonde' -p2189 -(S'peter' -p2190 -(lp2191 -S'sandbox.764' -p2192 -aS'sandbox.766' -p2193 -aS'sandbox.770' -p2194 -aS'sandbox.948' -p2195 -atp2196 -sS'bean' -p2197 -(S'goldwing' -p2198 -(lp2199 -S'sandbox.634' -p2200 -aS'sandbox.637' -p2201 -atp2202 -sS'Rahab' -p2203 -(S'290379' -p2204 -(lp2205 -S'sandbox.1152' -p2206 -atp2207 -sS'CrallinZki' -p2208 -(S'mcitoijk' -p2209 -(lp2210 -S'sandbox.683' -p2211 -atp2212 -sS'zrock' -p2213 -(S'em24pleh' -p2214 -(lp2215 -S'sandbox.363' -p2216 -aS'sandbox.364' -p2217 -atp2218 -sS'alme3' -p2219 -(S'qcxnk1049' -p2220 -(lp2221 -S'sandbox.1369' -p2222 -atp2223 -sS'skimo' -p2224 -(S'fragler' -p2225 -(lp2226 -S'sandbox.1022' -p2227 -atp2228 -sS'mailund' -p2229 -(S'Design/CPN' -p2230 -(lp2231 -S'sandbox.313' -p2232 -aS'sandbox.315' -p2233 -atp2234 -sS'explodedk' -p2235 -(S'hte88tcp' -p2236 -(lp2237 -S'sandbox.731' -p2238 -aS'sandbox.732' -p2239 -atp2240 -sS'semanta' -p2241 -(S'5000' -p2242 -(lp2243 -S'sandbox.325' -p2244 -atp2245 -sS'gbj' -p2246 -(S'jak11bit' -p2247 -(lp2248 -S'sandbox.1104' -p2249 -atp2250 -sS'madsmh' -p2251 -(S'Shee3ben' -p2252 -(lp2253 -S'sandbox.1330' -p2254 -aS'sandbox.1332' -p2255 -aS'sandbox.1333' -p2256 -atp2257 -sS'SuneN' -p2258 -(S'1914' -p2259 -(lp2260 -S'sandbox.1065' -p2261 -aS'sandbox.1066' -p2262 -aS'sandbox.1067' -p2263 -aS'sandbox.1068' -p2264 -atp2265 -sS'jnielsen20' -p2266 -(S'140188' -p2267 -(lp2268 -S'sandbox.820' -p2269 -atp2270 -sS'k1mz3' -p2271 -(S'daufavcfckgwrhq' -p2272 -(lp2273 -S'sandbox.1205' -p2274 -aS'sandbox.1206' -p2275 -aS'sandbox.1208' -p2276 -aS'sandbox.1219' -p2277 -aS'sandbox.1222' -p2278 -aS'sandbox.1223' -p2279 -atp2280 -sS'Backfixer' -p2281 -(S'certinA' -p2282 -(lp2283 -S'sandbox.1367' -p2284 -atp2285 -sS'beebo' -p2286 -(S'snabelaf' -p2287 -(lp2288 -S'sandbox.580' -p2289 -aS'sandbox.581' -p2290 -atp2291 -sS'pvn' -p2292 -(S'bummer' -p2293 -(lp2294 -S'sandbox.162' -p2295 -aS'sandbox.169' -p2296 -atp2297 -sS'pisarm' -p2298 -(S'ingi2mig' -p2299 -(lp2300 -S'sandbox.795' -p2301 -aS'sandbox.797' -p2302 -atp2303 -sS'lenau' -p2304 -(S'12345' -p2305 -(lp2306 -S'sandbox.920' -p2307 -atp2308 -sS'mads1' -p2309 -(S'vfffvff1' -p2310 -(lp2311 -S'sandbox.835' -p2312 -atp2313 -sS'petm' -p2314 -(S'falkush' -p2315 -(lp2316 -S'sandbox.1359' -p2317 -atp2318 -sS'Lonewind' -p2319 -(S'l0tt0k4j' -p2320 -(lp2321 -S'sandbox.1272' -p2322 -aS'sandbox.1273' -p2323 -atp2324 -sS'kjeldholm' -p2325 -(S'oz1ccm' -p2326 -(lp2327 -S'sandbox.1364' -p2328 -atp2329 -sS'Lange' -p2330 -(S'opus dei' -p2331 -(lp2332 -S'sandbox.188' -p2333 -atp2334 -sS'guldhammer' -p2335 -(S'tobias6615' -p2336 -(lp2337 -S'sandbox.846' -p2338 -aS'sandbox.847' -p2339 -aS'sandbox.852' -p2340 -atp2341 -sS'hlintrup' -p2342 -(S'VMf5inga' -p2343 -(lp2344 -S'sandbox.981' -p2345 -aS'sandbox.982' -p2346 -aS'sandbox.984' -p2347 -aS'sandbox.988' -p2348 -aS'sandbox.1041' -p2349 -aS'sandbox.1214' -p2350 -aS'sandbox.1215' -p2351 -atp2352 -sS'testbruger1' -p2353 -(S'testy1' -p2354 -(lp2355 -S'sandbox.196' -p2356 -aS'sandbox.198' -p2357 -atp2358 -sS'tux' -p2359 -(S'jqntkvak' -p2360 -(lp2361 -S'sandbox.772' -p2362 -atp2363 -sS'bitmatic' -p2364 -(S'eldrad' -p2365 -(lp2366 -S'sandbox.553' -p2367 -atp2368 -sS'JPAG' -p2369 -(S'jalle123' -p2370 -(lp2371 -S'sandbox.950' -p2372 -atp2373 -sS'astroturf' -p2374 -(S'12345678' -p2375 -(lp2376 -S'sandbox.985' -p2377 -aS'sandbox.990' -p2378 -atp2379 -sS'valkin' -p2380 -(S'gdshj2339' -p2381 -(lp2382 -S'sandbox.606' -p2383 -aS'sandbox.607' -p2384 -atp2385 -sS'caag' -p2386 -(S'snia' -p2387 -(lp2388 -S'sandbox.1362' -p2389 -atp2390 -sS'swiff' -p2391 -(S'pringles' -p2392 -(lp2393 -tp2394 -sS'meh' -p2395 -(S'manmail' -p2396 -(lp2397 -S'sandbox.226' -p2398 -atp2399 -sS'lamah' -p2400 -(S'29641363' -p2401 -(lp2402 -S'sandbox.546' -p2403 -atp2404 -sS'Tezla' -p2405 -(S'skrammel' -p2406 -(lp2407 -S'sandbox.880' -p2408 -aS'sandbox.887' -p2409 -atp2410 -sS'jon' -p2411 -(S'hestepik' -p2412 -(lp2413 -S'sandbox.935' -p2414 -aS'sandbox.938' -p2415 -atp2416 -sS'thenick' -p2417 -(S'000000' -p2418 -(lp2419 -S'sandbox.1179' -p2420 -atp2421 -sS'trumpf' -p2422 -(S'neilsen' -p2423 -(lp2424 -S'sandbox.1221' -p2425 -atp2426 -sS'JesperHansen' -p2427 -(S'Oersted99' -p2428 -(lp2429 -tp2430 -sS'SorteBen' -p2431 -(S'satyricon' -p2432 -(lp2433 -tp2434 -sS'kongen' -p2435 -(S'kongentokoa28739649' -p2436 -(lp2437 -S'sandbox.821' -p2438 -aS'sandbox.822' -p2439 -aS'sandbox.833' -p2440 -atp2441 -sS'galadriel' -p2442 -(S'AGPALLITIT' -p2443 -(lp2444 -S'sandbox.387' -p2445 -atp2446 -sS'kyhl' -p2447 -(S'28804' -p2448 -(lp2449 -S'sandbox.723' -p2450 -aS'sandbox.725' -p2451 -aS'sandbox.730' -p2452 -atp2453 -sS'ANJ' -p2454 -(S'MEMORY' -p2455 -(lp2456 -S'sandbox.1383' -p2457 -atp2458 -sS'rygaard' -p2459 -(S'5000' -p2460 -(lp2461 -S'sandbox.335' -p2462 -atp2463 -sS'diskill' -p2464 -(S'sdu' -p2465 -(lp2466 -S'sandbox.1085' -p2467 -atp2468 -sS'L1nK' -p2469 -(S'wanderer' -p2470 -(lp2471 -S'sandbox.632' -p2472 -atp2473 -sS'Roflpopz' -p2474 -(S'mike12' -p2475 -(lp2476 -S'sandbox.676' -p2477 -aS'sandbox.677' -p2478 -aS'sandbox.678' -p2479 -atp2480 -sS'mikkelbaekgaard' -p2481 -(S'kf18brvst' -p2482 -(lp2483 -S'sandbox.340' -p2484 -atp2485 -sS'Coolbombom' -p2486 -(S'Ma10nique' -p2487 -(lp2488 -S'sandbox.1182' -p2489 -aS'sandbox.1183' -p2490 -atp2491 -sS'burhan' -p2492 -(S'198383' -p2493 -(lp2494 -S'sandbox.963' -p2495 -aS'sandbox.964' -p2496 -aS'sandbox.967' -p2497 -aS'sandbox.969' -p2498 -aS'sandbox.970' -p2499 -atp2500 -sS'mikkidk' -p2501 -(S'mikkimikki' -p2502 -(lp2503 -S'sandbox.567' -p2504 -atp2505 -sS'kurosawa' -p2506 -(S'superman' -p2507 -(lp2508 -S'sandbox.661' -p2509 -atp2510 -sS'syska' -p2511 -(S'flyttekasse' -p2512 -(lp2513 -S'sandbox.1093' -p2514 -atp2515 -sS'hoeiby' -p2516 -(S'passsat99' -p2517 -(lp2518 -S'sandbox.1346' -p2519 -aS'sandbox.1347' -p2520 -aS'sandbox.1348' -p2521 -aS'sandbox.1349' -p2522 -aS'sandbox.1350' -p2523 -atp2524 -sS'fjolle' -p2525 -(S'thefool' -p2526 -(lp2527 -S'sandbox.685' -p2528 -atp2529 -sS'BKJan' -p2530 -(S'hanhund' -p2531 -(lp2532 -S'sandbox.1056' -p2533 -atp2534 -sS'pihl' -p2535 -(S'150479' -p2536 -(lp2537 -S'sandbox.420' -p2538 -atp2539 -sS'Engelsby' -p2540 -(S'1141' -p2541 -(lp2542 -S'sandbox.1237' -p2543 -atp2544 -sS'jzip' -p2545 -(S'katrine99' -p2546 -(lp2547 -S'sandbox.1368' -p2548 -atp2549 -sS'LarsBoJensen' -p2550 -(S'mig larsBaap' -p2551 -(lp2552 -S'sandbox.392' -p2553 -aS'sandbox.401' -p2554 -atp2555 -sS'behrox' -p2556 -(S'musik' -p2557 -(lp2558 -S'sandbox.915' -p2559 -atp2560 -sS'Henrik' -p2561 -(S'overlund' -p2562 -(lp2563 -S'sandbox.1160' -p2564 -atp2565 -sS'SethEnoch' -p2566 -(S'1337' -p2567 -(lp2568 -S'sandbox.656' -p2569 -atp2570 -sS'xaw' -p2571 -(S'leet' -p2572 -(lp2573 -S'sandbox.1087' -p2574 -atp2575 -sS'Ufarlig' -p2576 -(S'23041989' -p2577 -(lp2578 -S'sandbox.715' -p2579 -aS'sandbox.717' -p2580 -aS'sandbox.718' -p2581 -aS'sandbox.724' -p2582 -atp2583 -sS'bjarnewarming' -p2584 -(S'5900ida' -p2585 -(lp2586 -tp2587 -sS'1707jw' -p2588 -(S'jorgen09' -p2589 -(lp2590 -S'sandbox.383' -p2591 -atp2592 -sS'Faldsled' -p2593 -(S'strandparken21' -p2594 -(lp2595 -S'sandbox.882' -p2596 -atp2597 -sS'Dragoe' -p2598 -(S'dfu65gcn' -p2599 -(lp2600 -tp2601 -sS'spiril' -p2602 -(S'haugaard' -p2603 -(lp2604 -S'sandbox.890' -p2605 -atp2606 -sS'opmxopmx' -p2607 -(S'Opmxopmx1' -p2608 -(lp2609 -S'sandbox.1283' -p2610 -aS'sandbox.1284' -p2611 -atp2612 -sS'yusuf' -p2613 -(S'584001565' -p2614 -(lp2615 -S'sandbox.857' -p2616 -aS'sandbox.861' -p2617 -atp2618 -sS'Hugin777' -p2619 -(S'ozwix' -p2620 -(lp2621 -tp2622 -sS'beckholm' -p2623 -(S'beckholm' -p2624 -(lp2625 -S'sandbox.406' -p2626 -atp2627 -sS'gummianden' -p2628 -(S'290883' -p2629 -(lp2630 -S'sandbox.974' -p2631 -atp2632 -sS'Flasher' -p2633 -(S'fredes' -p2634 -(lp2635 -S'sandbox.1045' -p2636 -atp2637 -sS'IkeDK' -p2638 -(S'waccoracco' -p2639 -(lp2640 -S'sandbox.1086' -p2641 -atp2642 -sS'mdw007dk' -p2643 -(S'kolde100' -p2644 -(lp2645 -S'sandbox.673' -p2646 -aS'sandbox.674' -p2647 -atp2648 -sS'runo18' -p2649 -(S'gdi0553S' -p2650 -(lp2651 -S'sandbox.539' -p2652 -atp2653 -sS'Kenneth' -p2654 -(S'Bergen05' -p2655 -(lp2656 -S'sandbox.1305' -p2657 -aS'sandbox.1351' -p2658 -aS'sandbox.1370' -p2659 -aS'sandbox.1371' -p2660 -aS'sandbox.1372' -p2661 -atp2662 -sS'bjarne' -p2663 -(S'ssspw' -p2664 -(lp2665 -S'sandbox.324' -p2666 -atp2667 -sS'Ketil' -p2668 -(S'q6ws3km4' -p2669 -(lp2670 -S'sandbox.547' -p2671 -atp2672 -sS'KinCaid' -p2673 -(S'rodman' -p2674 -(lp2675 -S'sandbox.744' -p2676 -aS'sandbox.745' -p2677 -atp2678 -sS'a68254' -p2679 -(S'1802732437c' -p2680 -(lp2681 -S'sandbox.326' -p2682 -atp2683 -sS'Lonkarr' -p2684 -(S'eisman' -p2685 -(lp2686 -S'sandbox.733' -p2687 -aS'sandbox.734' -p2688 -atp2689 -sS'zadorr' -p2690 -(S'asfrraje010872' -p2691 -(lp2692 -tp2693 -sS'siliankaas' -p2694 -(S'snapscan' -p2695 -(lp2696 -S'sandbox.643' -p2697 -aS'sandbox.665' -p2698 -aS'sandbox.669' -p2699 -aS'sandbox.675' -p2700 -atp2701 -sS'test11' -p2702 -(S'test11' -p2703 -(lp2704 -S'sandbox.177' -p2705 -atp2706 -sS'line2399' -p2707 -(S'ElskerWD' -p2708 -(lp2709 -S'sandbox.407' -p2710 -atp2711 -sS'lkfeddersen' -p2712 -(S'240598' -p2713 -(lp2714 -S'sandbox.1017' -p2715 -atp2716 -sS'test14' -p2717 -(S'test14' -p2718 -(lp2719 -S'sandbox.801' -p2720 -atp2721 -sS'Laz116' -p2722 -(S'lifeisking' -p2723 -(lp2724 -S'sandbox.1091' -p2725 -atp2726 -sS'skotty' -p2727 -(S'kult2459' -p2728 -(lp2729 -S'sandbox.694' -p2730 -atp2731 -sS'kyp33' -p2732 -(S'ngug2455' -p2733 -(lp2734 -S'sandbox.811' -p2735 -aS'sandbox.812' -p2736 -aS'sandbox.832' -p2737 -aS'sandbox.840' -p2738 -atp2739 -sS'nilsy' -p2740 -(S'daniel' -p2741 -(lp2742 -tp2743 -sS'gregersk' -p2744 -(S'svin' -p2745 -(lp2746 -S'sandbox.1173' -p2747 -aS'sandbox.1177' -p2748 -aS'sandbox.1178' -p2749 -aS'sandbox.1195' -p2750 -aS'sandbox.1196' -p2751 -atp2752 -sS'jp1406' -p2753 -(S'migrid/*-1234' -p2754 -(lp2755 -S'sandbox.1354' -p2756 -aS'sandbox.1355' -p2757 -aS'sandbox.1356' -p2758 -aS'sandbox.1358' -p2759 -atp2760 -sS'pinky' -p2761 -(S'brain' -p2762 -(lp2763 -S'sandbox.532' -p2764 -atp2765 -sS'star85' -p2766 -(S'star10' -p2767 -(lp2768 -S'sandbox.555' -p2769 -atp2770 -sS'karstn' -p2771 -(S'njn67kex' -p2772 -(lp2773 -S'sandbox.693' -p2774 -aS'sandbox.699' -p2775 -atp2776 -sS'sauer' -p2777 -(S'sauer86' -p2778 -(lp2779 -S'sandbox.548' -p2780 -atp2781 -sS'pepa' -p2782 -(S'pepa8000' -p2783 -(lp2784 -S'sandbox.1253' -p2785 -aS'sandbox.1254' -p2786 -aS'sandbox.1256' -p2787 -aS'sandbox.1263' -p2788 -atp2789 -sS'kurt' -p2790 -(S'10331241' -p2791 -(lp2792 -S'sandbox.1323' -p2793 -atp2794 -sS'Holgersen' -p2795 -(S'19lkj75' -p2796 -(lp2797 -tp2798 -sS'zeon' -p2799 -(S'kj8733cik' -p2800 -(lp2801 -S'sandbox.566' -p2802 -atp2803 -sS'Umulius' -p2804 -(S'Emil1700' -p2805 -(lp2806 -tp2807 -sS'Springer' -p2808 -(S'modalle' -p2809 -(lp2810 -S'sandbox.757' -p2811 -aS'sandbox.760' -p2812 -aS'sandbox.765' -p2813 -aS'sandbox.771' -p2814 -aS'sandbox.774' -p2815 -atp2816 -sS'morten' -p2817 -(S'morten' -p2818 -(lp2819 -S'sandbox.1157' -p2820 -atp2821 -sS'keddes' -p2822 -(S'1234' -p2823 -(lp2824 -S'sandbox.1145' -p2825 -aS'sandbox.1146' -p2826 -atp2827 -sS'hunterkil' -p2828 -(S'hejhej' -p2829 -(lp2830 -S'sandbox.877' -p2831 -atp2832 -sS'Perus' -p2833 -(S'november' -p2834 -(lp2835 -S'sandbox.1320' -p2836 -atp2837 -sS'kim' -p2838 -(S'nessumsar1975' -p2839 -(lp2840 -S'sandbox.1135' -p2841 -atp2842 -sS'motten' -p2843 -(S'morten' -p2844 -(lp2845 -S'sandbox.873' -p2846 -atp2847 -sS'hans' -p2848 -(S'flapore' -p2849 -(lp2850 -S'sandbox.358' -p2851 -atp2852 -sS'MartinGroenbaek' -p2853 -(S'samtron75e' -p2854 -(lp2855 -tp2856 -sS'WolfAngel' -p2857 -(S'wakka' -p2858 -(lp2859 -S'sandbox.1003' -p2860 -aS'sandbox.1005' -p2861 -aS'sandbox.1008' -p2862 -atp2863 -sS'kornum' -p2864 -(S'alfred' -p2865 -(lp2866 -S'sandbox.350' -p2867 -atp2868 -sS'metheon' -p2869 -(S'wast3land' -p2870 -(lp2871 -S'sandbox.563' -p2872 -atp2873 -sS'jonkni' -p2874 -(S'eknyk48' -p2875 -(lp2876 -S'sandbox.455' -p2877 -atp2878 -sS'Sengir' -p2879 -(S'action' -p2880 -(lp2881 -S'sandbox.1181' -p2882 -atp2883 -sS'alme' -p2884 -(S'qcxnk1049' -p2885 -(lp2886 -S'sandbox.1314' -p2887 -atp2888 -sS'finnlarsen' -p2889 -(S'findus41' -p2890 -(lp2891 -S'sandbox.471' -p2892 -atp2893 -sS'Silverknight' -p2894 -(S'glasvej24' -p2895 -(lp2896 -S'sandbox.726' -p2897 -aS'sandbox.728' -p2898 -atp2899 -sS'flyingfly' -p2900 -(S'ecvgbwd' -p2901 -(lp2902 -S'sandbox.808' -p2903 -atp2904 -sS'karlerik' -p2905 -(S'xkarlerik9' -p2906 -(lp2907 -S'sandbox.191' -p2908 -atp2909 -sS'witfelt' -p2910 -(S'alfred' -p2911 -(lp2912 -S'sandbox.355' -p2913 -aS'sandbox.356' -p2914 -aS'sandbox.357' -p2915 -aS'sandbox.385' -p2916 -atp2917 -sS'grugel' -p2918 -(S'lepracon' -p2919 -(lp2920 -S'sandbox.1148' -p2921 -atp2922 -sS'Cactus' -p2923 -(S'Forsk!' -p2924 -(lp2925 -tp2926 -sS'ramos111' -p2927 -(S'ramsoe22' -p2928 -(lp2929 -S'sandbox.1331' -p2930 -atp2931 -sS'test2' -p2932 -(S'test2' -p2933 -(lp2934 -S'sandbox.391' -p2935 -aS'sandbox.393' -p2936 -aS'sandbox.398' -p2937 -aS'sandbox.400' -p2938 -aS'sandbox.423' -p2939 -aS'sandbox.424' -p2940 -aS'sandbox.426' -p2941 -aS'sandbox.427' -p2942 -aS'sandbox.428' -p2943 -aS'sandbox.429' -p2944 -aS'sandbox.430' -p2945 -aS'sandbox.431' -p2946 -aS'sandbox.432' -p2947 -aS'sandbox.433' -p2948 -aS'sandbox.434' -p2949 -aS'sandbox.435' -p2950 -aS'sandbox.436' -p2951 -aS'sandbox.437' -p2952 -aS'sandbox.545' -p2953 -aS'sandbox.1029' -p2954 -aS'sandbox.1032' -p2955 -aS'sandbox.1033' -p2956 -aS'sandbox.1035' -p2957 -aS'sandbox.1036' -p2958 -aS'sandbox.1038' -p2959 -aS'sandbox.1040' -p2960 -aS'sandbox.1046' -p2961 -aS'sandbox.1047' -p2962 -aS'sandbox.1048' -p2963 -aS'sandbox.1225' -p2964 -aS'sandbox.1255' -p2965 -aS'sandbox.1258' -p2966 -aS'sandbox.1267' -p2967 -aS'sandbox.1271' -p2968 -atp2969 -sS'hdamtoft' -p2970 -(S'sarah1008' -p2971 -(lp2972 -S'sandbox.955' -p2973 -atp2974 -sS'Ebbe' -p2975 -(S'otsbli' -p2976 -(lp2977 -S'sandbox.479' -p2978 -atp2979 -sS'Pind' -p2980 -(S'qsdf4161' -p2981 -(lp2982 -S'sandbox.687' -p2983 -aS'sandbox.688' -p2984 -aS'sandbox.692' -p2985 -atp2986 -sS'gauroman' -p2987 -(S'anne123' -p2988 -(lp2989 -S'sandbox.911' -p2990 -atp2991 -sS'EssE' -p2992 -(S'copyright' -p2993 -(lp2994 -S'sandbox.1009' -p2995 -atp2996 -sS'ps3' -p2997 -(S'ps3' -p2998 -(lp2999 -tp3000 -sS'ellebab' -p3001 -(S'ellebab' -p3002 -(lp3003 -S'sandbox.709' -p3004 -atp3005 -sS'haj' -p3006 -(S'kerberus' -p3007 -(lp3008 -S'sandbox.1363' -p3009 -atp3010 -sS'KokAmok' -p3011 -(S'mariannepigen' -p3012 -(lp3013 -S'sandbox.1070' -p3014 -atp3015 -sS'mogens' -p3016 -(S'86654266' -p3017 -(lp3018 -S'sandbox.1147' -p3019 -atp3020 -sS'Hydrasil' -p3021 -(S'nevermore' -p3022 -(lp3023 -S'sandbox.647' -p3024 -aS'sandbox.655' -p3025 -aS'sandbox.662' -p3026 -atp3027 -sS'heimdaldk' -p3028 -(S'fnb3139' -p3029 -(lp3030 -S'sandbox.1080' -p3031 -atp3032 -sS'hessellund' -p3033 -(S'2507' -p3034 -(lp3035 -S'sandbox.1292' -p3036 -atp3037 -sS'adf' -p3038 -(S'dfs' -p3039 -(lp3040 -S'sandbox.1121' -p3041 -atp3042 -sS'kucza' -p3043 -(S'ethooPiroo' -p3044 -(lp3045 -S'sandbox.1054' -p3046 -atp3047 -sS'bng' -p3048 -(S'siemens' -p3049 -(lp3050 -S'sandbox.1207' -p3051 -atp3052 -sS'ptravn' -p3053 -(S'kulsukker07' -p3054 -(lp3055 -S'sandbox.777' -p3056 -aS'sandbox.778' -p3057 -atp3058 -sS'perolsen' -p3059 -(S'assweet' -p3060 -(lp3061 -S'sandbox.1249' -p3062 -atp3063 -sS'jesper' -p3064 -(S'beatrice' -p3065 -(lp3066 -S'sandbox.158' -p3067 -atp3068 -sS'HolTaa' -p3069 -(S'Vienna' -p3070 -(lp3071 -S'sandbox.1279' -p3072 -atp3073 -sS'AlteredSoul' -p3074 -(S'lexmark' -p3075 -(lp3076 -S'sandbox.551' -p3077 -atp3078 -sS'GeneralBobo' -p3079 -(S'area51' -p3080 -(lp3081 -S'sandbox.557' -p3082 -aS'sandbox.558' -p3083 -atp3084 -sS'jclarsen' -p3085 -(S'jamosat140' -p3086 -(lp3087 -S'sandbox.608' -p3088 -atp3089 -sS'qwe' -p3090 -(S'adg' -p3091 -(lp3092 -tp3093 -sS'likb' -p3094 -(S'likb1830' -p3095 -(lp3096 -S'sandbox.1268' -p3097 -atp3098 -sS'jannis' -p3099 -(S'fotini' -p3100 -(lp3101 -S'sandbox.221' -p3102 -aS'sandbox.222' -p3103 -atp3104 -sS'Fynsk' -p3105 -(S'gubbi' -p3106 -(lp3107 -S'sandbox.1123' -p3108 -aS'sandbox.1126' -p3109 -atp3110 -sS'corydora' -p3111 -(S'iijphl' -p3112 -(lp3113 -S'sandbox.375' -p3114 -atp3115 -sS'moa' -p3116 -(S'Zaio69' -p3117 -(lp3118 -S'sandbox.480' -p3119 -atp3120 -sS'wdkstni' -p3121 -(S'steen123' -p3122 -(lp3123 -S'sandbox.1281' -p3124 -atp3125 -sS'lundsoe4' -p3126 -(S'dafaja' -p3127 -(lp3128 -S'sandbox.1286' -p3129 -aS'sandbox.1324' -p3130 -atp3131 -sS'DonVang' -p3132 -(S'051173' -p3133 -(lp3134 -S'sandbox.853' -p3135 -atp3136 -sS'christine' -p3137 -(S'080669' -p3138 -(lp3139 -S'sandbox.347' -p3140 -aS'sandbox.348' -p3141 -aS'sandbox.349' -p3142 -atp3143 -sS'tgc' -p3144 -(S'fister' -p3145 -(lp3146 -S'sandbox.1220' -p3147 -atp3148 -sS'torbens' -p3149 -(S'lockmenow' -p3150 -(lp3151 -S'sandbox.1122' -p3152 -atp3153 -sS'plokke' -p3154 -(S'prutstar' -p3155 -(lp3156 -S'sandbox.1133' -p3157 -aS'sandbox.1139' -p3158 -atp3159 -sS'khybel' -p3160 -(S'transmogryf' -p3161 -(lp3162 -S'sandbox.1301' -p3163 -aS'sandbox.1302' -p3164 -aS'sandbox.1303' -p3165 -aS'sandbox.1312' -p3166 -atp3167 -sS'martinmilter' -p3168 -(S'sullaco' -p3169 -(lp3170 -S'sandbox.1129' -p3171 -atp3172 -sS'keke' -p3173 -(S'qk89dtxe' -p3174 -(lp3175 -S'sandbox.978' -p3176 -aS'sandbox.980' -p3177 -atp3178 -sS'mediaos' -p3179 -(S'salling1' -p3180 -(lp3181 -S'sandbox.628' -p3182 -atp3183 -sS'koralvej' -p3184 -(S'zaxscd10' -p3185 -(lp3186 -S'sandbox.412' -p3187 -aS'sandbox.413' -p3188 -aS'sandbox.414' -p3189 -atp3190 -sS'CaTTeN' -p3191 -(S'Force306' -p3192 -(lp3193 -S'sandbox.739' -p3194 -aS'sandbox.740' -p3195 -aS'sandbox.741' -p3196 -atp3197 -sS'grue' -p3198 -(S'grue2083' -p3199 -(lp3200 -S'sandbox.761' -p3201 -atp3202 -sS'yonanu' -p3203 -(S'bastard' -p3204 -(lp3205 -S'sandbox.192' -p3206 -atp3207 -sS'lundbymads' -p3208 -(S'astrid' -p3209 -(lp3210 -S'sandbox.494' -p3211 -atp3212 -sS'Jydskatomkraft' -p3213 -(S'julemand' -p3214 -(lp3215 -S'sandbox.556' -p3216 -atp3217 -sS'ole' -p3218 -(S'123456' -p3219 -(lp3220 -S'sandbox.381' -p3221 -atp3222 -sS'spongebob' -p3223 -(S'perlange' -p3224 -(lp3225 -S'sandbox.346' -p3226 -atp3227 -sS'oln' -p3228 -(S'olnsimac' -p3229 -(lp3230 -S'sandbox.1240' -p3231 -atp3232 -sS'flundsten' -p3233 -(S'flundsten' -p3234 -(lp3235 -S'sandbox.183' -p3236 -atp3237 -sS'Chewy' -p3238 -(S'7278' -p3239 -(lp3240 -S'sandbox.842' -p3241 -aS'sandbox.849' -p3242 -aS'sandbox.1103' -p3243 -atp3244 -sS'thesky' -p3245 -(S'mikael' -p3246 -(lp3247 -S'sandbox.602' -p3248 -atp3249 -sS'sommer' -p3250 -(S'sg4we3101msat' -p3251 -(lp3252 -S'sandbox.160' -p3253 -atp3254 -sS'tva' -p3255 -(S'kagemac' -p3256 -(lp3257 -S'sandbox.446' -p3258 -atp3259 -sS'sakjack' -p3260 -(S'wecotravel37' -p3261 -(lp3262 -S'sandbox.983' -p3263 -atp3264 -sS'jgh' -p3265 -(S'Oersted99' -p3266 -(lp3267 -S'sandbox.481' -p3268 -atp3269 -sS'Poker' -p3270 -(S'Gode12sven' -p3271 -(lp3272 -S'sandbox.1131' -p3273 -atp3274 -sS'markpp' -p3275 -(S'60115284' -p3276 -(lp3277 -S'sandbox.848' -p3278 -aS'sandbox.854' -p3279 -aS'sandbox.856' -p3280 -aS'sandbox.864' -p3281 -atp3282 -sS'Nanosoft' -p3283 -(S'8niina3' -p3284 -(lp3285 -S'sandbox.1186' -p3286 -atp3287 -sS'bentn' -p3288 -(S't\xf8nnesgade' -p3289 -(lp3290 -S'sandbox.638' -p3291 -atp3292 -sS'erlingeybye' -p3293 -(S'15203994' -p3294 -(lp3295 -S'sandbox.1023' -p3296 -atp3297 -sS'Thalanthas' -p3298 -(S'ostereje' -p3299 -(lp3300 -S'sandbox.804' -p3301 -aS'sandbox.806' -p3302 -aS'sandbox.809' -p3303 -atp3304 -sS'birdlike' -p3305 -(S'birdlike' -p3306 -(lp3307 -S'sandbox.1328' -p3308 -atp3309 -sS'smsbuller' -p3310 -(S'07041963' -p3311 -(lp3312 -S'sandbox.1280' -p3313 -atp3314 -sS'Lex' -p3315 -(S'bmsa50DK' -p3316 -(lp3317 -S'sandbox.1343' -p3318 -aS'sandbox.1344' -p3319 -aS'sandbox.1345' -p3320 -atp3321 -sS'roht' -p3322 -(S'9488' -p3323 -(lp3324 -S'sandbox.1316' -p3325 -atp3326 -sS'Kirsten' -p3327 -(S'p3034h' -p3328 -(lp3329 -S'sandbox.1360' -p3330 -atp3331 -sS'Floppo' -p3332 -(S'oppolf' -p3333 -(lp3334 -S'sandbox.219' -p3335 -atp3336 -sS'tmo' -p3337 -(S'bAlAtOn' -p3338 -(lp3339 -S'sandbox.365' -p3340 -aS'sandbox.366' -p3341 -aS'sandbox.367' -p3342 -aS'sandbox.368' -p3343 -atp3344 -sS'Snol' -p3345 -(S'Digger' -p3346 -(lp3347 -S'sandbox.714' -p3348 -aS'sandbox.716' -p3349 -aS'sandbox.721' -p3350 -atp3351 -sS'cga' -p3352 -(S'89574825' -p3353 -(lp3354 -S'sandbox.817' -p3355 -atp3356 -sS'Anders' -p3357 -(S'connect' -p3358 -(lp3359 -S'sandbox.1084' -p3360 -atp3361 -sS'theabh' -p3362 -(S'eksakt' -p3363 -(lp3364 -S'sandbox.538' -p3365 -atp3366 -sS'saxo' -p3367 -(S'xago1511' -p3368 -(lp3369 -S'sandbox.1213' -p3370 -atp3371 -sS'runep' -p3372 -(S'distributed' -p3373 -(lp3374 -S'sandbox.1059' -p3375 -atp3376 -sS'stemann' -p3377 -(S'Sputnik98' -p3378 -(lp3379 -S'sandbox.1365' -p3380 -atp3381 -sS'kagehat' -p3382 -(S'runelax' -p3383 -(lp3384 -S'sandbox.912' -p3385 -aS'sandbox.916' -p3386 -aS'sandbox.917' -p3387 -aS'sandbox.919' -p3388 -atp3389 -sS'roschnowski' -p3390 -(S'M1GS5S' -p3391 -(lp3392 -S'sandbox.1096' -p3393 -atp3394 -sS'ozorgnax' -p3395 -(S'fisse' -p3396 -(lp3397 -S'sandbox.1163' -p3398 -atp3399 -sS'Jada' -p3400 -(S'111111' -p3401 -(lp3402 -S'sandbox.1161' -p3403 -atp3404 -sS'luckyboy' -p3405 -(S'hulemand' -p3406 -(lp3407 -S'sandbox.200' -p3408 -aS'sandbox.201' -p3409 -aS'sandbox.202' -p3410 -aS'sandbox.203' -p3411 -aS'sandbox.204' -p3412 -aS'sandbox.205' -p3413 -atp3414 -sS'nardus' -p3415 -(S'kristian1979' -p3416 -(lp3417 -S'sandbox.156' -p3418 -atp3419 -sS'Wolfhagen' -p3420 -(S'wolfhagen1' -p3421 -(lp3422 -S'sandbox.550' -p3423 -aS'sandbox.949' -p3424 -aS'sandbox.951' -p3425 -atp3426 -sS'skarpkant' -p3427 -(S'John1432' -p3428 -(lp3429 -S'sandbox.1203' -p3430 -atp3431 -sS'gertsen' -p3432 -(S'busblock' -p3433 -(lp3434 -S'sandbox.828' -p3435 -atp3436 -sS'dormann' -p3437 -(S'dormann77' -p3438 -(lp3439 -S'sandbox.1112' -p3440 -atp3441 -sS'attermann' -p3442 -(S'vagn16' -p3443 -(lp3444 -S'sandbox.193' -p3445 -atp3446 -sS'strib' -p3447 -(S'807088' -p3448 -(lp3449 -S'sandbox.1042' -p3450 -atp3451 -sS'bkb18371' -p3452 -(S'LasVegas1' -p3453 -(lp3454 -S'sandbox.1295' -p3455 -atp3456 -sS'mbe' -p3457 -(S'navigati' -p3458 -(lp3459 -S'sandbox.787' -p3460 -aS'sandbox.1224' -p3461 -atp3462 -sS'jens' -p3463 -(S'neilsen' -p3464 -(lp3465 -S'sandbox.1138' -p3466 -atp3467 -sS'jumpin' -p3468 -(S'Jumpin67' -p3469 -(lp3470 -S'sandbox.1106' -p3471 -atp3472 -sS'mras' -p3473 -(S'hejhej' -p3474 -(lp3475 -S'sandbox.216' -p3476 -aS'sandbox.217' -p3477 -atp3478 -sS'Duze' -p3479 -(S'dgndozer' -p3480 -(lp3481 -S'sandbox.696' -p3482 -aS'sandbox.700' -p3483 -aS'sandbox.702' -p3484 -aS'sandbox.703' -p3485 -aS'sandbox.704' -p3486 -aS'sandbox.719' -p3487 -atp3488 -sS'arvid' -p3489 -(S'sfinx' -p3490 -(lp3491 -S'sandbox.190' -p3492 -atp3493 -sS'Henning' -p3494 -(S'1respeKt' -p3495 -(lp3496 -S'sandbox.462' -p3497 -atp3498 -sS'claus' -p3499 -(S'claus' -p3500 -(lp3501 -S'sandbox.1172' -p3502 -atp3503 -sS'jascca' -p3504 -(S'cola2510' -p3505 -(lp3506 -S'sandbox.758' -p3507 -aS'sandbox.759' -p3508 -atp3509 -sS'DeNovell' -p3510 -(S'cure4me' -p3511 -(lp3512 -S'sandbox.660' -p3513 -aS'sandbox.671' -p3514 -aS'sandbox.1100' -p3515 -atp3516 -sS'henriktest2' -p3517 -(S'abc' -p3518 -(lp3519 -tp3520 -sS'rals' -p3521 -(S'poweriddqd' -p3522 -(lp3523 -S'sandbox.619' -p3524 -atp3525 -sS'mkn' -p3526 -(S'lollopopz' -p3527 -(lp3528 -S'sandbox.1051' -p3529 -aS'sandbox.1052' -p3530 -aS'sandbox.1053' -p3531 -atp3532 -sS'andersov' -p3533 -(S'subscure' -p3534 -(lp3535 -S'sandbox.630' -p3536 -atp3537 -sS'Flemming' -p3538 -(S'BjorgHilde' -p3539 -(lp3540 -S'sandbox.376' -p3541 -atp3542 -sS'lowfire' -p3543 -(S'ermelund' -p3544 -(lp3545 -S'sandbox.1189' -p3546 -atp3547 -sS'hatchetman' -p3548 -(S'f2b5zt8' -p3549 -(lp3550 -S'sandbox.594' -p3551 -atp3552 -sS'Barnabas' -p3553 -(S'landrover' -p3554 -(lp3555 -S'sandbox.1248' -p3556 -atp3557 -sS'Zigma' -p3558 -(S'brucelee' -p3559 -(lp3560 -S'sandbox.1113' -p3561 -atp3562 -sS'henriktest' -p3563 -(S'abc' -p3564 -(lp3565 -S'sandbox.651' -p3566 -atp3567 -sS'jakhamp' -p3568 -(S'us2yt424' -p3569 -(lp3570 -S'sandbox.816' -p3571 -atp3572 -sS'christofferdall' -p3573 -(S'hannibal' -p3574 -(lp3575 -S'sandbox.1373' -p3576 -aS'sandbox.1374' -p3577 -aS'sandbox.1375' -p3578 -atp3579 -sS'thufir' -p3580 -(S'it29hs' -p3581 -(lp3582 -S'sandbox.595' -p3583 -aS'sandbox.597' -p3584 -aS'sandbox.599' -p3585 -aS'sandbox.600' -p3586 -atp3587 -sS'nueaf' -p3588 -(S'aakkmm' -p3589 -(lp3590 -S'sandbox.1200' -p3591 -atp3592 -sS'kkkvist' -p3593 -(S'KKKvist2007' -p3594 -(lp3595 -S'sandbox.379' -p3596 -aS'sandbox.380' -p3597 -atp3598 -sS'perhand' -p3599 -(S'skopje99' -p3600 -(lp3601 -S'sandbox.973' -p3602 -atp3603 -sS'tower48' -p3604 -(S'yowerbar' -p3605 -(lp3606 -S'sandbox.388' -p3607 -atp3608 -sS'snhdk' -p3609 -(S'snh3307' -p3610 -(lp3611 -S'sandbox.1238' -p3612 -aS'sandbox.1239' -p3613 -atp3614 -sS'Sergenten' -p3615 -(S'04081985' -p3616 -(lp3617 -S'sandbox.994' -p3618 -aS'sandbox.995' -p3619 -atp3620 -sS'jensbjerg' -p3621 -(S'klostervej23' -p3622 -(lp3623 -S'sandbox.454' -p3624 -atp3625 -sS'Eddie' -p3626 -(S'dickeeier' -p3627 -(lp3628 -S'sandbox.682' -p3629 -atp3630 -sS'mads' -p3631 -(S'mads' -p3632 -(lp3633 -S'sandbox.544' -p3634 -atp3635 -sS'jorgen09' -p3636 -(S'1707jw' -p3637 -(lp3638 -S'sandbox.382' -p3639 -aS'sandbox.384' -p3640 -atp3641 -sS'flarup' -p3642 -(S'flarup' -p3643 -(lp3644 -S'sandbox.834' -p3645 -aS'sandbox.836' -p3646 -aS'sandbox.929' -p3647 -aS'sandbox.931' -p3648 -aS'sandbox.1143' -p3649 -atp3650 -sS'Rehr' -p3651 -(S'M1GRu13Z' -p3652 -(lp3653 -tp3654 -sS'rvj' -p3655 -(S'Idkfaso2' -p3656 -(lp3657 -S'sandbox.1199' -p3658 -atp3659 -sS'pernille' -p3660 -(S'mogens' -p3661 -(lp3662 -S'sandbox.333' -p3663 -aS'sandbox.334' -p3664 -atp3665 -sS'cbm' -p3666 -(S'jegersej' -p3667 -(lp3668 -S'sandbox.889' -p3669 -aS'sandbox.1101' -p3670 -atp3671 -sS'lisbeth' -p3672 -(S'mogens' -p3673 -(lp3674 -S'sandbox.332' -p3675 -atp3676 -sS'stufkan' -p3677 -(S'stuf1109' -p3678 -(lp3679 -S'sandbox.818' -p3680 -aS'sandbox.819' -p3681 -atp3682 -sS'kgepel' -p3683 -(S'bm75hrgo' -p3684 -(lp3685 -S'sandbox.389' -p3686 -atp3687 -sS'Ferdinand' -p3688 -(S'aqqalukse4318' -p3689 -(lp3690 -tp3691 -sS'BMB2503' -p3692 -(S'2503' -p3693 -(lp3694 -S'sandbox.337' -p3695 -atp3696 -sS'erbofloe' -p3697 -(S'erbofloe' -p3698 -(lp3699 -S'sandbox.1044' -p3700 -atp3701 -sS'ToxDK' -p3702 -(S'mmouse' -p3703 -(lp3704 -S'sandbox.906' -p3705 -aS'sandbox.908' -p3706 -atp3707 -sS'djpede' -p3708 -(S'nintendo' -p3709 -(lp3710 -S'sandbox.1230' -p3711 -atp3712 -sS'Cuebid' -p3713 -(S'gt9x97' -p3714 -(lp3715 -S'sandbox.173' -p3716 -aS'sandbox.174' -p3717 -atp3718 -sS'ulrik77' -p3719 -(S'kisser' -p3720 -(lp3721 -S'sandbox.914' -p3722 -atp3723 -sS'KFAnd' -p3724 -(S'62680805' -p3725 -(lp3726 -S'sandbox.956' -p3727 -aS'sandbox.1021' -p3728 -atp3729 -sS'ferrari' -p3730 -(S'nemt' -p3731 -(lp3732 -S'sandbox.312' -p3733 -atp3734 -sS'camillabrodersen' -p3735 -(S'church' -p3736 -(lp3737 -S'sandbox.404' -p3738 -atp3739 -sS'Kcseh' -p3740 -(S'Koden1' -p3741 -(lp3742 -S'sandbox.541' -p3743 -aS'sandbox.542' -p3744 -atp3745 -sS'denedes' -p3746 -(S'permand' -p3747 -(lp3748 -S'sandbox.618' -p3749 -atp3750 -sS'lene' -p3751 -(S'lene' -p3752 -(lp3753 -S'sandbox.415' -p3754 -aS'sandbox.416' -p3755 -atp3756 -sS'Newon3s' -p3757 -(S'helms1' -p3758 -(lp3759 -S'sandbox.1016' -p3760 -atp3761 -sS'phengelholm' -p3762 -(S'jeabpgkpf' -p3763 -(lp3764 -S'sandbox.159' -p3765 -atp3766 -sS'dragnes' -p3767 -(S'Whatever12' -p3768 -(lp3769 -S'sandbox.943' -p3770 -atp3771 -sS'Kristoffer' -p3772 -(S'pentagon2' -p3773 -(lp3774 -S'sandbox.540' -p3775 -atp3776 -sS'Sbrlpf' -p3777 -(S'Aragon2' -p3778 -(lp3779 -S'sandbox.410' -p3780 -atp3781 -sS'drodcon' -p3782 -(S'conny2349' -p3783 -(lp3784 -S'sandbox.157' -p3785 -atp3786 -sS'piamarialie' -p3787 -(S'lie1974' -p3788 -(lp3789 -S'sandbox.353' -p3790 -aS'sandbox.354' -p3791 -atp3792 -sS'martin' -p3793 -(S'1141' -p3794 -(lp3795 -S'sandbox.1235' -p3796 -aS'sandbox.1236' -p3797 -atp3798 -sS'cpx' -p3799 -(S'tilde90' -p3800 -(lp3801 -tp3802 -sS'ottokat' -p3803 -(S'martha' -p3804 -(lp3805 -tp3806 -sS'donoester' -p3807 -(S'7913b1l1st' -p3808 -(lp3809 -S'sandbox.803' -p3810 -aS'sandbox.805' -p3811 -aS'sandbox.807' -p3812 -aS'sandbox.1134' -p3813 -atp3814 -sS'Scott' -p3815 -(S'08107777' -p3816 -(lp3817 -S'sandbox.631' -p3818 -atp3819 -sS'hertzum' -p3820 -(S'4m420n45' -p3821 -(lp3822 -S'sandbox.445' -p3823 -aS'sandbox.449' -p3824 -atp3825 -sS'nuuk' -p3826 -(S'klasse' -p3827 -(lp3828 -S'sandbox.697' -p3829 -aS'sandbox.701' -p3830 -aS'sandbox.1357' -p3831 -atp3832 -sS'hstidsen' -p3833 -(S'gedetybo' -p3834 -(lp3835 -S'sandbox.869' -p3836 -aS'sandbox.1185' -p3837 -aS'sandbox.1187' -p3838 -atp3839 -sS'Turner' -p3840 -(S'7517' -p3841 -(lp3842 -S'sandbox.789' -p3843 -aS'sandbox.790' -p3844 -atp3845 -sS'dezaud' -p3846 -(S'dezaud' -p3847 -(lp3848 -S'sandbox.796' -p3849 -aS'sandbox.802' -p3850 -aS'sandbox.823' -p3851 -atp3852 -sS'lysningen' -p3853 -(S'oy29537' -p3854 -(lp3855 -S'sandbox.1306' -p3856 -atp3857 -s. \ No newline at end of file diff --git a/mig/cgi-sid/sssadmin.py b/mig/cgi-sid/sssadmin.py deleted file mode 120000 index db40de67a..000000000 --- a/mig/cgi-sid/sssadmin.py +++ /dev/null @@ -1 +0,0 @@ -../cgi-bin/sssadmin.py \ No newline at end of file diff --git a/mig/cgi-sid/ssscreateimg.py b/mig/cgi-sid/ssscreateimg.py deleted file mode 120000 index e8645f3fd..000000000 --- a/mig/cgi-sid/ssscreateimg.py +++ /dev/null @@ -1 +0,0 @@ -../cgi-bin/ssscreateimg.py \ No newline at end of file diff --git a/mig/cgi-sid/sssfaq.py b/mig/cgi-sid/sssfaq.py deleted file mode 120000 index f53b82780..000000000 --- a/mig/cgi-sid/sssfaq.py +++ /dev/null @@ -1 +0,0 @@ -../cgi-bin/sssfaq.py \ No newline at end of file diff --git a/mig/cgi-sid/sssgetresscript.py b/mig/cgi-sid/sssgetresscript.py deleted file mode 100755 index 0ad7fa4c6..000000000 --- a/mig/cgi-sid/sssgetresscript.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssgetresscript - download current resource script for SSS sandboxes -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import cgi -import cgitb -# cgitb.enable() - -from mig.shared.functionality.sssgetresscript import main -from mig.shared.cgiscriptstub import run_cgi_script_possibly_with_cert - -run_cgi_script_possibly_with_cert(main) diff --git a/mig/cgi-sid/ssslogin.py b/mig/cgi-sid/ssslogin.py deleted file mode 120000 index 05ee80251..000000000 --- a/mig/cgi-sid/ssslogin.py +++ /dev/null @@ -1 +0,0 @@ -../cgi-bin/ssslogin.py \ No newline at end of file diff --git a/mig/cgi-sid/sssmonitor.py b/mig/cgi-sid/sssmonitor.py deleted file mode 120000 index ba2897f31..000000000 --- a/mig/cgi-sid/sssmonitor.py +++ /dev/null @@ -1 +0,0 @@ -../cgi-bin/sssmonitor.py \ No newline at end of file diff --git a/mig/images/bluesky.css b/mig/images/bluesky.css index 0174c5c99..93bad61b9 100644 --- a/mig/images/bluesky.css +++ b/mig/images/bluesky.css @@ -306,12 +306,6 @@ table.people { padding: 2px; text-align: left; } -table.sandboxlogintext { - width: 80%; -} -table.sandboxlogin {} -table.sandboxinfo {} -table.sandboxcreateimg {} table.downloads { @@ -673,10 +667,7 @@ table.liveio table { background: url('/images/icons/computer.png') no-repeat; padding-left: 18px; } -.sandboxlink { - background: url('/images/icons/hourglass_go.png') no-repeat; - padding-left: 18px; -} + .danishlink { background: url('/images/crystal-icons/unknown.png') no-repeat; padding-left: 18px; @@ -786,10 +777,7 @@ table.liveio table { background: url('/images/icons/computer.png') no-repeat; padding-left: 18px; } -.sandboxres { - background: url('/images/icons/box.png') no-repeat; - padding-left: 18px; -} + .sendemaillink { background: url('/images/icons/email_protocol.png') no-repeat; padding-left: 18px; diff --git a/mig/images/default.css b/mig/images/default.css index 16e6f49e5..0b85c2486 100644 --- a/mig/images/default.css +++ b/mig/images/default.css @@ -234,12 +234,6 @@ table.forum { padding: 2px; text-align: left; } -table.sandboxlogintext { - width: 80%; -} -table.sandboxlogin {} -table.sandboxinfo {} -table.sandboxcreateimg {} /* Make sure that e.g. wide CodeMirror instances don't overflow table width */ table.fixedlayout { @@ -1143,10 +1137,7 @@ div.archive pre { background: url('/images/icons/computer.png') no-repeat; padding-left: 18px; } -.sandboxlink { - background: url('/images/icons/hourglass_go.png') no-repeat; - padding-left: 18px; -} + .createarchivelink, .doishowdetails { background-image: url('/images/icons/book_add.png'); background-repeat: no-repeat; @@ -1396,10 +1387,7 @@ a:hover.settingsbutton { background: url('/images/icons/computer.png') no-repeat; padding-left: 18px; } -.sandboxres { - background: url('/images/icons/box.png') no-repeat; - padding-left: 18px; -} + .sendemaillink { background: url('/images/icons/email_protocol.png') no-repeat; padding-left: 18px; diff --git a/mig/images/js/jquery.ajaxhelpers.js b/mig/images/js/jquery.ajaxhelpers.js index 35d003201..9ef2036e5 100644 --- a/mig/images/js/jquery.ajaxhelpers.js +++ b/mig/images/js/jquery.ajaxhelpers.js @@ -690,9 +690,6 @@ function ajax_resman(caching) { ownerlink = format_link(resource.resownerlink); } res_type = "real"; - if (resource.SANDBOX) { - res_type = 'sandbox'; - } res_hint = 'class="'+res_type+'res iconspace iconleftpad" title="'+res_type+ ' resource"'; rte_hint = center_class+' title="'+ diff --git a/mig/install/MiGserver-template.conf b/mig/install/MiGserver-template.conf index 4ebf51355..229f4d417 100644 --- a/mig/install/MiGserver-template.conf +++ b/mig/install/MiGserver-template.conf @@ -83,10 +83,8 @@ mig_path = __MIG_CODE__ mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ jupyter_mount_files_dir = %(state_path)s/jupyter_mount_files/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ @@ -169,8 +167,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/combined.pem server_key = %(certs_path)s/combined.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_public_url = __PUBLIC_URL__ migserver_public_alias_url = __PUBLIC_ALIAS_URL__ @@ -668,8 +664,6 @@ permanent_freeze = __PERMANENT_FREEZE__ # Delay before frozen archives are expected to hit tape (e.g. 5m, 4d or 2w). # Leave unset or empty if no tape archiving is available. freeze_to_tape = __FREEZE_TO_TAPE__ -# Enable sandbox resources (SSS) -enable_sandboxes = __ENABLE_SANDBOXES__ # Enable Jupyter integration - requires a remote Jupyter server configured to # allow our users to connect and then integrates mount of user home there enable_jupyter = __ENABLE_JUPYTER__ diff --git a/mig/install/generateconfs.py b/mig/install/generateconfs.py index 6bca13de5..bb7dde1b2 100755 --- a/mig/install/generateconfs.py +++ b/mig/install/generateconfs.py @@ -278,7 +278,6 @@ def main(argv, _generate_confs=generate_confs, _print=print): 'enable_accounting', 'enable_transfers', 'enable_freeze', - 'enable_sandboxes', 'enable_jupyter', 'enable_cloud', 'enable_gdp', diff --git a/mig/install/grid.dk-config/MiGserver.conf.in b/mig/install/grid.dk-config/MiGserver.conf.in index 9e0121114..b2f618763 100644 --- a/mig/install/grid.dk-config/MiGserver.conf.in +++ b/mig/install/grid.dk-config/MiGserver.conf.in @@ -21,10 +21,8 @@ mig_path = __MIG_HOME__ mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ re_pending_dir = %(state_path)s/re_pending/ @@ -53,8 +51,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/MiGservercert.pem server_key = %(certs_path)s/MiGserverkey.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_http_url = http://%(server_fqdn)s:__HTTP_PORT__ backup_http_urls = diff --git a/mig/java-bin/README b/mig/java-bin/README deleted file mode 100644 index 14251feba..000000000 --- a/mig/java-bin/README +++ /dev/null @@ -1 +0,0 @@ -The contents of this folder is by the java sandbox resources. diff --git a/mig/mig-xsss/data/activeresources.dat b/mig/mig-xsss/data/activeresources.dat deleted file mode 100644 index 357f2d86d..000000000 --- a/mig/mig-xsss/data/activeresources.dat +++ /dev/null @@ -1,33 +0,0 @@ -abigail.imada.sdu.dk -amneris.imada.sdu.dk -arabella.imada.sdu.dk -carmen.imada.sdu.dk -dido.imada.sdu.dk -elvira.imada.sdu.dk -erda.imada.sdu.dk -euridike.imada.sdu.dk -fidelio.imada.sdu.dk -gogol.imada.sdu.dk -gutrune.imada.sdu.dk -hymer.imada.sdu.dk -iokaste.imada.sdu.dk -isolde.imada.sdu.dk -iphigenia.imada.sdu.dk -jenufa.imada.sdu.dk -konstanze.imada.sdu.dk -lucretia.imada.sdu.dk -lucia.imada.sdu.dk -lui.imada.sdu.dk -manon.imada.sdu.dk -maria.imada.sdu.dk -mimi.imada.sdu.dk -musetta.imada.sdu.dk -nedda.imada.sdu.dk -orpheo.imada.sdu.dk -papagena.imada.sdu.dk -rosina.imada.sdu.dk -santuzza.imada.sdu.dk -sieglinde.imada.sdu.dk -wellgunde.imada.sdu.dk -woglinde.imada.sdu.dk -zaira.imada.sdu.dk diff --git a/mig/mig-xsss/docs/INSTALL.readme b/mig/mig-xsss/docs/INSTALL.readme deleted file mode 100755 index d1d3cfe56..000000000 --- a/mig/mig-xsss/docs/INSTALL.readme +++ /dev/null @@ -1,73 +0,0 @@ -Requirements: - -xscreensaver (http://www.jwz.org/xscreensaver) -python (http://www.python.org) - -Step 1: -Make sure python is executable from '/usr/bin' - -Step 2: -Make sure xscreensaver-command is executable from '/usr/X11R6/bin' - -Step 3: -tar xvfz mig_xsss_release.tgz -C /usr/local - -Contents: -mig_xsss/docs/INSTALL.readme ( This file ) -mig_xsss/docs/mig_xsss/docs/resource.config.sample ( Sample of a MiG SSS ressorce configuration file ) -mih_xsss/docs/xscreensaver_gdm.readme ( Configuration of the xscreensaver with gdm ) -mig_xsss/log ( Used to place activation log of the screensaver ) -mig_xsss/data/weekdict.dat ( Contains estimates of the amount of time the screensaver is going to be active, when activated ) -mig_xsss/data/activeresources.dat ( If the hostname of the current machine is present in this file, MiG SSS is started when 'mig_xsss.sh start' is executed ) -mig_xsss/mig_xsss.sh ( Initscript which is going to be executed at boottime ) -mig_xsss/mig_xsss.py ( Main program that uses the xscreensaver application to detect when the screensaver is activated/deactivated ) -mig_xsss/jobexecuter.py ( Manages execution and killing of the MiG jobs ) -mig_xsss/jobmanager.py ( Manages logging of screensaver activations, and calculations of new estimates of the time the screensaver going to be active. ) -mig_xsss_execution_script.sh ( Helper script used by jobexecuter.py when executing MiG jobs ) -mig_xsss/start_resource_frontend.sh ( MiG script used to start MiG frontend node ) -mig_xsss/start_resource_exe.sh ( MiG script used to start the execution of a MiG job ) - -Step 4: -Configure the MiG SSS resource at the corresponding MiG server, an example -of an MiG SSS resource configuration file can be found at -mig_xsss/docs/resource.config.sample - -It's crucial for the MiG SSS application to work that the '#continuous' parameter is set -to 'false' and the '#start_exe' parameter only chmod's the -'master_node_script_exe.sh' file and doesn't invoke an execution of it. - -Refer to the MiG resource configuration manual for general information -about configuring a MiG resource. - -Step 5: -The resource must have the MiG resource administration certificate in it's -root's homedir, as it's nessesary for the resource to have access to start and stop -both the frontend and executing part of MiG. - -Step 6: -A user named 'mig_sss' has to be created on the resource and subdirectories named 'mig_frontend' and -'mig_exe' must be created in the users homedir. -In both subdirectories a directory named 'hostname.domainname:identifier' must be created. -Where identifier is 0 as default, check the MiG resource documentation for -further details. - -If the frontend node is choosen to be a machine different from the MiG SSS -resource, the 'mig_frontend' directory can be ommitted. - -Step 7: -Make sure the resource's 'hostname.domainname' is present in the file 'mig_xsss/data/activeresources.dat' - -Step 8: -Link 'mig_xsss/mig_xsss.sh' to your default runlevel to make sure MiG SSS -gets started at bootup and stopped at shutdown. - -If the resource is not it's own frontend node, uncomment line 46-49 and -line 53 in 'mig_xsss/mig_xsss.sh' - -Step 9: -Configure the xscreensaver to be started at the login manager, -for setup with the gdm login manager see 'mig_xsss/docs/xscreensaver_gdm.readme'. -The setup for the loginmanagers xdm and kdm is simulare. - -Step 10: -reboot, and wait for the screensaver to activate. diff --git a/mig/mig-xsss/docs/resource.config.sample b/mig/mig-xsss/docs/resource.config.sample deleted file mode 100755 index cc2271479..000000000 --- a/mig/mig-xsss/docs/resource.config.sample +++ /dev/null @@ -1,54 +0,0 @@ -::MIGUSER:: -mig_sss - -::HOSTURL:: -hostname.domainname - -::RESOURCEHOME:: -/home/mig_sss/mig_frontend/hostname.domainname.0 - -::SCRIPTLANGUAGE:: -sh - -::MEMORY:: -256 - -::DISK:: -10 - -::CPUCOUNT:: -1 - -::NODECOUNT:: -1 - -::ARCHITECTURE:: -i386 - -::RUNTIMEENVIRONMENT:: -name: POVRAY3.1 -name: SCREENSAVER - -::HOSTKEY:: -hostname.domainname,ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAqER1aI8QQr8EceykPYl9gS79Xe2H5YSNmhuaZQuAwf6KUAFRAi3A7yvRBXvZS1IPrIg1axc71AyJvozcnGDPUrT52ayufB8lYHGh1ZXD+sNw32elFnZAf/jSSAdT3dlf+lHXOIW+hxXcgm3sE3MIpNg0akI/hbA0YUKyUoXmRVE= - -::FRONTENDNODE:: -hostname - -::FRONTENDLOG:: -/home/mig_sss/mig_frontend/hostname.domainname.0/frontendlog - -::EXECONFIG:: -exe #name -1 #nodecount -100 #cputime -"nice -19" #prepend_execute -/home/mig_sss/mig_exe/hostname.domainname.0/exehostlog #exehostlog -/home/mig_sss/mig_exe/hostname.domainname.0/joblog #joblog -mig_sss #execution_user -host #execution_node -/home/mig_sss/mig_exe/hostname.domainname.0/ #execution_dir -cd /home/mig_sss/mig_exe/hostname.domainname.0/; chmod 700 master_node_script_exe.sh #start_exe -not available #status_exe -pkill -9 master #stop_exe -False #continuous diff --git a/mig/mig-xsss/docs/xscreensaver_gdm.readme b/mig/mig-xsss/docs/xscreensaver_gdm.readme deleted file mode 100644 index 1f61dd463..000000000 --- a/mig/mig-xsss/docs/xscreensaver_gdm.readme +++ /dev/null @@ -1,34 +0,0 @@ -1) -Edit the file '/etc/X11/gdm/Init/Default' - -Add the following lines to the bottom of the file, just above the line containing 'exit 0' - -/usr/X11R6/bin/xscreensaver-command -exit -sudo -u gdm /usr/X11R6/bin/xscreensaver -nosplash & - -2) -Edit the file '/etc/X11/gdm/Xsession' - -Add the following lines to the top of the file - -/usr/X11R6/bin/xscreensaver-command -exit -/usr/X11R6/bin/xscreensaver -nosplash & - -Second line is only added if the xscreensaver is to be startet as the user logges in - -3) -Be sure user gdm has homedir '/var/lib/gdm' - -Change dir to '/var/lib/gdm' - -do: - -'ln -s :0.Xauth .Xauthority' - -To make sure gdm user has access to the display. - -4) Setup a .xscreensaver file in '/var/lib/gdm' - which will be the config file for the screensaver - when the loginscreen is active. - -5) restart gdm diff --git a/mig/mig-xsss/get_resource_pgid.sh b/mig/mig-xsss/get_resource_pgid.sh deleted file mode 100755 index d567a7321..000000000 --- a/mig/mig-xsss/get_resource_pgid.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -function get_resource_pgid(){ - unique_resource_name="$1" - exe_name="$2" - - if [ "$exe_name" == "" ]; then - type="FE" - else - type="EXE" - fi - - # Uncomment to debug - # DEBUG_PREFIX="echo " - - cmd="${DEBUG_PREFIX}curl" - # Specify password without making it visible in process - # list (e.g. 'ps awwx') - - $cmd \ - --insecure \ - --cert $certfile \ - --key $key \ - --pass `awk '/pass/ {print $2}' $MiGuserconf` \ - --url "$migserver/cgi-bin/get_resource_pgid?unique_resource_name=$unique_resource_name&exe_name=$exe_name&type=$type" -} - -function usage(){ - echo "Usage..." - echo "get_resource_pgid.sh unique_resource_name [exe_name]" - echo "Example: get_resource_pgid.sh dido.imada.sdu.dk.0 exe" -} - - - -######## -# Main # -######## -MiGuserconf=~/.MiG/MiGuser.conf -if [ ! -r $MiGuserconf ]; then - echo "get_resource_pgid.sh requires a readable configuration in $MiGuserconf" - usage - exit 1 -fi -migserver=`awk '/migserver/ {print $2}' $MiGuserconf` -certfile=`awk '/certfile/ {print $2}' $MiGuserconf` -key=`awk '/key/ {print $2}' $MiGuserconf` -if [ $# -eq 1 ]; then - get_resource_pgid $1 "" -elif [ $# -eq 2 ]; then - get_resource_pgid $1 $2 -else - usage - exit 1 -fi - diff --git a/mig/mig-xsss/jobexecuter.py b/mig/mig-xsss/jobexecuter.py deleted file mode 100755 index f25d46377..000000000 --- a/mig/mig-xsss/jobexecuter.py +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# jobexecuter - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import sys -import os -import time -import math -import fcntl - -# MiG XSSS imports - -import jobmanager -import logger - -# Omregner fra minutter til MiG cputid - - -def getMigCpuTimeFactor(): - return 60 - - -def getStatusFileName(param_sPGIDFILE, pid): - return "%s.%s.status" % (param_sPGIDFILE, pid) - - -def writeScreensaverStatus(status, param_sPGIDFILE, pid): - fh = open(getStatusFileName(param_sPGIDFILE, pid), 'w') - fcntl.flock(fh.fileno(), fcntl.LOCK_EX) - fh.write(status + '\n') - fcntl.flock(fh.fileno(), fcntl.LOCK_UN) - fh.close() - - -def getScreensaverStatus(param_sPGIDFILE, pid): - status_filename = getStatusFileName(param_sPGIDFILE, pid) - - fh = open(status_filename, 'r') - fcntl.flock(fh.fileno(), fcntl.LOCK_EX) - status = fh.readline().strip().strip('\n') - fcntl.flock(fh.fileno(), fcntl.LOCK_UN) - fh.close() - - logger.write('PID: %s status: %s' % (os.getpid(), status)) - - if 'deactivated' != status: - screensaver_status = 0 - else: - screensaver_status = 1 - - return screensaver_status - - -def startJob(param_tActivatedTime, param_sPGIDFILE): - iPID = os.fork() - - if iPID == 0: - - # child process - become leader of new process group that won't be - # killed by killall -g - - os.setpgrp() - return iPID - else: - - # print "pid: ", pid - # print "pgrp:", os.getpgrp() - - writeScreensaverStatus('activated', param_sPGIDFILE, - os.getpid()) - logger.write('PID: %s spawned.' % os.getpid()) - - # If file exists, we are waiting for the killJob to terminate - # as there can be only one active screensaver at a time - - while os.path.exists(param_sPGIDFILE): - logger.write( - "PID: %r exists, which means there is an active MiG SSS job." % - param_sPGIDFILE) - time.sleep(10) - - fh = open(param_sPGIDFILE, 'w') - fcntl.flock(fh.fileno(), fcntl.LOCK_EX) - fh.write("%s\n" % os.getpid()) - fcntl.flock(fh.fileno(), fcntl.LOCK_UN) - fh.close() - - tActivatedTime = param_tActivatedTime - iExpectedActiveMinutes = \ - jobmanager.getExpectedActiveMinutes(tActivatedTime) - - logger.write('PID: %s iExpectedActiveMinutes: %s' % - (os.getpid(), iExpectedActiveMinutes)) - - while True: - iElapsedTime = 0 - - # Keep requesting MiG jobs as long as we are expected to be on screensaver.... .... - - while iElapsedTime < iExpectedActiveMinutes: - - # We keep punking MiG server for a job, until we get one OR the expected time on screensaver has elapsed. - - status = 1 - while 0 != status and iElapsedTime\ - < iExpectedActiveMinutes: - - # If the screensaver is deactivated, the MiG job has been killed, - # and therefore this procces has no further purpose in life. - - screensaver_status = \ - getScreensaverStatus(param_sPGIDFILE, - os.getpid()) - if 0 != screensaver_status: - logger.write( - 'PID: %s Screensaver deactivated, terminating this process' % os.getpid()) - status_file = \ - getStatusFileName(param_sPGIDFILE, - os.getpid()) - if os.path.exists(status_file): - os.remove(status_file) - return iPID - - iMaxExecutionTime = (iExpectedActiveMinutes - - iElapsedTime) * getMigCpuTimeFactor() - logger.write('PID: %s requesting MiG job, iMaxExecutionTime: %s' % ( - os.getpid(), iMaxExecutionTime)) - - fd = os.popen('./mig_xsss_start_resource_exe.sh %d' % - int(math.floor(iMaxExecutionTime))) - exit_code = fd.readline().strip().strip('\n') - if exit_code.isdigit(): - status = int(exit_code) - logger.write( - "PID: %s './mig_xsss_start_resource_exe.sh' executed OK" % os.getpid()) - else: - status = 1 - - # Log output from execution - - log_str = exit_code + '\n'\ - + logger.get_output(fd) - - logger.write( - "PID: %s './mig_xsss_start_resource_exe.sh' execution FAILED:\n%s" % (os.getpid(), log_str)) - fd.close() - - time.sleep(60) - - tCurrentTime = jobmanager.getTimeTuppel() - iElapsedTime = \ - jobmanager.getTimeDiff(tActivatedTime, - tCurrentTime) - - # If we got a MiG job, get the pgid of it. - - if 0 == status: - - # Get pgid of the MiG job, this is done to get the PGID once and for all - # instead of retrieveing it from the MiG server everytime it is needed. - # We Keep punking MiG server until we the pgid - # or the expected time on screensaver has elapsed. - - pgid = -1 - while -1 == pgid and iElapsedTime\ - < iExpectedActiveMinutes: - - # If the screensaver is deactivated, the MiG job has been killed, - # and therefore this procces has no further purpose in life. - - screensaver_status = \ - getScreensaverStatus(param_sPGIDFILE, - os.getpid()) - if 0 != screensaver_status: - logger.write( - 'PID: %s Screensaver deactivated, terminating this process' % os.getpid()) - status_file = \ - getStatusFileName(param_sPGIDFILE, - os.getpid()) - if os.path.exists(status_file): - os.remove(status_file) - return iPID - - fd = os.popen('./mig_xsss_get_resource_pgid.sh') - exit_code = fd.readline().strip().strip('\n') - if exit_code.isdigit(): - status = int(exit_code) - else: - status = 1 - - readline = fd.readline().strip().strip('\n') - - # Log execution status - - if 0 != status or not readline.isdigit()\ - and 'starting' != readline: - log_str = exit_code + '\n' + readline + '\n'\ - + logger.get_output(fd) - - logger.write('PID: %s ERROR getting pgid:\n%s' % ( - os.getpid(), log_str)) - else: - logger.write('PID: %s getpgid status: %s pgid: %s' % ( - os.getpid(), status, readline)) - fd.close() - - if 0 == status: - if readline.isdigit(): - pgid = int(readline) - elif 'starting' != readline: - break - - time.sleep(60) - - tCurrentTime = jobmanager.getTimeTuppel() - iElapsedTime = \ - jobmanager.getTimeDiff(tActivatedTime, - tCurrentTime) - - # If we got the pgid, wee keep looping until this job is done, - # or the screensaver has been deactivated - - if -1 != pgid: - while 1: - - # If the screensaver is deactivated, the MiG job has been killed, - # and therefore this procces has no further purpose in life. - - screensaver_status = \ - getScreensaverStatus(param_sPGIDFILE, - os.getpid()) - if 0 != screensaver_status: - logger.write( - 'PID: %s Screensaver deactivated, terminating this process' % os.getpid()) - status_file = \ - getStatusFileName(param_sPGIDFILE, - os.getpid()) - if os.path.exists(status_file): - os.remove(status_file) - return iPID - - fd = \ - os.popen( - './mig_xsss_get_pgid_count.sh %d' % pgid) - num_of_migjob_process = \ - int(fd.readline().strip().strip('\n')) - fd.close() - - logger.write('PID: %s Found: %s running MiG processes with PGID: %s' % ( - os.getpid(), num_of_migjob_process, pgid)) - - # If the MiG job has terminated, request a new one. - - if 0 == num_of_migjob_process: - logger.write( - 'PID: %s Job finished, request a new one.' % os.getpid()) - break - - time.sleep(60) - logger.write('PID: %s waking up.' % os.getpid()) - - tCurrentTime = jobmanager.getTimeTuppel() - iElapsedTime = jobmanager.getTimeDiff(tActivatedTime, - tCurrentTime) - logger.write('PID: %s iElapsedTime: %s' % - (os.getpid(), iElapsedTime)) - - # Expected Time elapsed, sleep expected minutes, - # and then start over again. - - logger.write( - 'PID: %s Sleeping: %s secs before requesting new job.' % (os.getpid(), iExpectedActiveMinutes * 60)) - time.sleep(iExpectedActiveMinutes * 60) - - # We have been active for iExpectedActiveMinutes*2, - # set iExpectedActiveMinutes to that amount, - # Thereby we double iExpectedActiveMinutes for each loop - - iExpectedActiveMinutes = iExpectedActiveMinutes * 2 - logger.write('PID: %s New ExpectedActiveMinutes: %s' % - (os.getpid(), iExpectedActiveMinutes)) - - # Get the time that we are reactivated - - tActivatedTime = jobmanager.getTimeTuppel() - - # We never end here as it is right now - # Job finished, remove param_sPGIDFILE. - - if os.path.exists(param_sPGIDFILE): - os.remove(param_sPGIDFILE) - return iPID - - -def killJob(param_sPGIDFILE): - - # If file does not exists, we are waiting for the startJob - # to create the file, as the screensaver must be active, - # before it can be deactivated. - - while not os.path.exists(param_sPGIDFILE): - logger.write("Waiting for file: '" + param_sPGIDFILE - + "' to be created") - time.sleep(10) - - fh = open(param_sPGIDFILE, 'r') - pid = int(fh.readline().strip().strip('\n')) - fh.close() - - writeScreensaverStatus('deactivated', param_sPGIDFILE, pid) - - if os.path.exists(param_sPGIDFILE): - os.remove(param_sPGIDFILE) - - fd = os.popen('./mig_xsss_stop_resource_exe.sh ') - exit_code = fd.readline().strip().strip('\n') - fd.close() - - logger.write('PID: %s deactivated, resource stop status: %s' % - (pid, exit_code)) - - -# Main only for test - - -def main(): - sPIDFile = '/tmp/_MiG_SSS_GPID' - - killJob(sPIDFile) - time.sleep(5) - - iPID = os.fork() - if iPID == 0: - while True: - startJob('./xeyes.sh', sPIDFile) - time.sleep(5) - killJob(sPIDFile) - time.sleep(5) - - -if __name__ == '__main__': - main() diff --git a/mig/mig-xsss/jobmanager.py b/mig/mig-xsss/jobmanager.py deleted file mode 100755 index 0ca53f77e..000000000 --- a/mig/mig-xsss/jobmanager.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# jobmanager - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import time -import pickle -import os - -G_WEEKDICTFILE = './data/weekdict.dat' -G_ACTIVELOGFILE = './log/active' - -# Returns Tuppel of the form: ("Year", "Month", "MonthDay", "WeekNr", "WeekDay", "Hour", "Minutes") - - -def getTimeTuppel(): - - year = time.strftime('%Y', time.localtime()) - month = time.strftime('%m', time.localtime()) - monthday = time.strftime('%d', time.localtime()) - weeknr = time.strftime('%U', time.localtime()) - weekday = time.strftime('%w', time.localtime()) - hour = time.strftime('%H', time.localtime()) - minutes = time.strftime('%M', time.localtime()) - - return ( - year, - month, - monthday, - weeknr, - weekday, - hour, - minutes, - ) - - -# Get the dictionary with estimated times - - -def getWeekDict(): - input = open(G_WEEKDICTFILE, 'r') - weekDict = pickle.load(input) - input.close() - - return weekDict - - -# Write the dictionary with estimated times - - -def writeWeekDict(param_WeekDict): - output = open(G_WEEKDICTFILE, 'w') - pickle.dump(param_WeekDict, output) - output.close() - - -# Log when screensaver was activited, -# how long it was expected to be active and how long it actually was active. -# log syntax: YEAR MONTH MONTHDAY WEEKNR WEEKDAY HOURS MINUTES ACTIVE_MINUTES EXPECTED_ACTIVE_MINUTES - - -def writeActiveLog(param_tStartTime, param_iNumOfMinutes, - param_iExpectedTime): - logline = '' + param_tStartTime[0] + '\t' + param_tStartTime[1]\ - + '\t' + param_tStartTime[2] + '\t' + param_tStartTime[3]\ - + '\t' + param_tStartTime[4] + '\t' + param_tStartTime[5]\ - + '\t' + param_tStartTime[6] + '\t' + "%s" % param_iNumOfMinutes \ - + '\t' + "%s" % param_iExpectedTime + '\n' - - output = open(G_ACTIVELOGFILE, 'a') - output.write(logline) - output.close() - - -# Returns the expected number of minutes screensaver will -# be active. -# -# param_tActivated[4]: Weekday -# param_tActivated[5]: Hour - - -def getExpectedActiveMinutes(param_tActivated): - weekDict = getWeekDict() - - return weekDict[int(param_tActivated[4])][int(param_tActivated[5])] - - -# Get the timedifference in minutes betewen the -# timetuppel param_tStartTime and param_tEndTime - - -def getTimeDiff(param_tStartTime, param_tEndTime): - - iNumOfWeeks = int(param_tEndTime[3]) - int(param_tStartTime[3]) - iNumOfDays = int(param_tEndTime[4]) - int(param_tStartTime[4]) - iNumOfHours = int(param_tEndTime[5]) - int(param_tStartTime[5]) - iNumOfMinutes = int(param_tEndTime[6]) - int(param_tStartTime[6]) - - if iNumOfWeeks < 0: - iNumOfWeeks = 53 + iNumOfWeeks - - if iNumOfDays < 0: - iNumOfWeeks = iNumOfWeeks - 1 - iNumOfDays = 7 + iNumOfDays - - if iNumOfHours < 0: - iNumOfDays = iNumOfDays - 1 - iNumOfHours = 24 + iNumOfHours - - if iNumOfMinutes < 0: - iNumOfHours = iNumOfHours - 1 - iNumOfMinutes = 60 + iNumOfMinutes - - iNumOfMinutes = ((iNumOfWeeks * 7 + iNumOfDays) * 24 + iNumOfHours)\ - * 60 + iNumOfMinutes - - return iNumOfMinutes - - -# Log the time the screensaver has been active - - -def logTimeActive(param_tActivated, param_tDeActivated, - param_fExpectedTimeFactor): - - iNumOfMinutes = getTimeDiff(param_tActivated, param_tDeActivated) - - weekDict = getWeekDict() - - iLastExpectedTime = \ - weekDict[int(param_tActivated[4])][int(param_tActivated[5])] - - writeActiveLog(param_tActivated, iNumOfMinutes, iLastExpectedTime) - - iThisExpectedTime = param_fExpectedTimeFactor * iNumOfMinutes + (1 - - param_fExpectedTimeFactor) * iLastExpectedTime - - weekDict[int(param_tActivated[4])][int(param_tActivated[5])] = \ - iThisExpectedTime - - writeWeekDict(weekDict) diff --git a/mig/mig-xsss/logger.py b/mig/mig-xsss/logger.py deleted file mode 100755 index 2d08ea4da..000000000 --- a/mig/mig-xsss/logger.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# logger - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import os -from datetime import datetime - -LOGFILE = './log/debug.log' - - -def get_output(fd): - output = '' - try: - output = '' - readline = fd.readline() - while len(readline) > 0: - output = output + readline - readline = fd.readline() - except: - - # Couldnt read fd - - output = 'N/A' - - return output - - -def getLogTimeStr(): - log_time = datetime.now() - log_time_str = "%s-" % log_time.year - if log_time.month < 10: - log_time_str += '0' - log_time_str += "%d-" % log_time.month - if log_time.day < 10: - log_time_str += '0' - log_time_str += "%s " % log_time.day - if log_time.hour < 10: - log_time_str += '0' - log_time_str += "%d:" % log_time.hour - if log_time.minute < 10: - log_time_str += '0' - log_time_str += "%d:" % log_time.minute - if log_time.second < 10: - log_time_str += '0' - log_time_str += "%d" % log_time.second - return log_time_str - - -def write(param_sLogEntry): - if os.path.exists(LOGFILE): - fh = open(LOGFILE, 'a') - else: - fh = open(LOGFILE, 'w') - fh.write('%s -> %s\n' % (getLogTimeStr(), param_sLogEntry)) - fh.close() - - -# Main only for debug -# def main(): -# write( "this is a log string") - -# if __name__ == '__main__' : main() diff --git a/mig/mig-xsss/mig_xsss.py b/mig/mig-xsss/mig_xsss.py deleted file mode 100755 index ef864443d..000000000 --- a/mig/mig-xsss/mig_xsss.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# mig_xsss - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -import os -import sys -import time - -# MiG SSS imports - -import jobmanager -import jobexecuter -import logger - -G_EXPECTED_TIME_FACTOR = 0.10 -G_XSCREENSAVER_COMMAND = '/usr/X11R6/bin/xscreensaver-command -watch' - -G_PGIDFILE = '/tmp/mig_xsss_job.gpid' - - -def SSS(): - - # xscreensaver-command -watch dies when user logs out - # and xscreensaver is respawned as nobody, - # therefore we loop forever, to make sure its respawned. - - while 1: - bScreenSaverActive = 0 - - logger.write("Waiting 60 secs before staring: '" - + G_XSCREENSAVER_COMMAND + "'") - time.sleep(60) - - fd = os.popen(G_XSCREENSAVER_COMMAND) - xscreensaver_output = fd.readline() - while len(xscreensaver_output) != 0: - - # writeToLog( "xscreensaver-command -watch: " + str ) - - if (xscreensaver_output[0:5] == 'BLANK' - or xscreensaver_output[0:4] == 'LOCK') \ - and bScreenSaverActive == 0: - - # writeToLog("ACTIVATED") - - bScreenSaverActive = 1 - tActivatedTime = jobmanager.getTimeTuppel() - - pid = jobexecuter.startJob(tActivatedTime, G_PGIDFILE) - - if 0 != pid: - os._exit(0) - elif xscreensaver_output[0:7] == 'UNBLANK'\ - and bScreenSaverActive == 1: - - # writeToLog("DEACTIVATED") - - bScreenSaverActive = 0 - tDeActivatedTime = jobmanager.getTimeTuppel() - jobexecuter.killJob(G_PGIDFILE) - - jobmanager.logTimeActive(tActivatedTime, - tDeActivatedTime, G_EXPECTED_TIME_FACTOR) - - xscreensaver_output = fd.readline() - - logger.write("'" + G_XSCREENSAVER_COMMAND + "' <- DIED!.") - - -def main(): - - # Remove previous logfile, if exists. - - if os.path.exists(logger.LOGFILE): - os.remove(logger.LOGFILE) - - iPID = os.fork() - if iPID == 0: - - # We want to get our own processgroup, - # such that it is possible to kill us by GID, - # without killing others in our original group..... - - os.setpgrp() - - SSS() - - -if __name__ == '__main__': - main() diff --git a/mig/mig-xsss/mig_xsss.sh b/mig/mig-xsss/mig_xsss.sh deleted file mode 100755 index 1eaced868..000000000 --- a/mig/mig-xsss/mig_xsss.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# Setting MIG_HOST, some gives full hostname -# others gives only machinename - -SHELL="/bin/bash" -DEFAULT_PIPE="2>/dev/null 1>/dev/null" - -if [ `hostname | grep -c "\."` -eq 0 ]; then - MIG_HOST="`hostname`" -else - MIG_HOST="`hostname | awk -F '.' '{print $1}'`" -fi - -MIG_DOMAIN="`domainname`" - -MIG_FQDN="$MIG_HOST.$MIG_DOMAIN" -MIG_HOST_IDENTIFIER="0" - -MIG_FRONTEND_PATH="/usr/local/mig_xsss" -MIG_FRONTEND_SCRIPT_STOP="stop_resource_frontend.sh $MIG_FQDN.$MIG_HOST_IDENTIFIER" -MIG_FRONTEND_SCRIPT_START="start_resource_frontend.sh $MIG_FQDN.$MIG_HOST_IDENTIFIER" -MIG_EXE_SCRIPT_STOP="stop_resource_exe.sh $MIG_FQDN.$MIG_HOST_IDENTIFIER $MIG_HOST" - -PYTHON_INTERPRETER="/usr/bin/python" -MIG_XSSS_PATH="/usr/local/mig_xsss" -MIG_XSSS="mig_xsss.py" -MIG_XSSS_COMMAND="$PYTHON_INTERPRETER ./$MIG_XSSS" - -MIG_PID_FILE="/tmp/mig_xsss_job.gpid" - -XSCREENSAVER_COMMAND="/usr/X11R6/bin/xscreensaver-command -watch" - -# Exports is nessesay for start at bootup. -export DISPLAY=":0.0" - -# XAUTHORITY only nessesary for usage with gdm. -export XAUTHORITY="/var/lib/gdm/:0.Xauth" -# For debug -#export XAUTHORITY="/home/rehr/.Xauthority" - -# If this is not an active mig_xsss resource, quit. -MIG_ACTIVE_RESOURCES="/usr/local/mig_xsss/data/activeresources.dat" -activeResource="`cat $MIG_ACTIVE_RESOURCES | grep -wc "$MIG_FQDN"`" -if [ $activeResource -eq 0 ]; then - echo "" - echo "'$MIG_FQDN' is _NOT_ an active mig_xsss resource." - echo "'$0 $1' _NOT_ executet!" - echo "" - exit 0 -fi - -case "$1" in - start) - echo "Starting mig_xsss at '$MIG_HOST.$MIG_DOMAIN'" - - # Start MiG frontend - cd $MIG_FRONTEND_PATH - $SHELL -c "./$MIG_FRONTEND_SCRIPT_STOP $DEFAULT_PIPE" - frontendStartet="`./$MIG_FRONTEND_SCRIPT_START 2>/dev/null | grep -wc 'frontend_script.sh started'`" - - if [ $frontendStartet -eq 1 ]; then - # Start MiG XSSS - cd $MIG_XSSS_PATH - $SHELL -c "$MIG_XSSS_COMMAND $DEFAULT_PIPE &" - fi - ;; - stop) - echo "Stopping mig_xsss at '$MIG_HOST.$MIG_DOMAIN'" - - # Kill mig_xsss - $SHELL -c "kill -9 `ps aux | grep "$MIG_XSSS_COMMAND" | awk '{print $2}'` $DEFAULT_PIPE" - $SHELL -c "kill -9 `ps aux | grep "$XSCREENSAVER_COMMAND" | awk '{print $2}'` $DEFAULT_PIPE" - - # Kill running mig_job - cd $MIG_XSSS_PATH - $SHELL -c "./$MIG_EXE_SCRIPT_STOP $DEFAULT_PIPE" - - # Remove MiG pid_files - $SHELL -c "rm -f ${MIG_PID_FILE}* $DEFAULT_PIPE" - - # Kill MiG frontend script - cd $MIG_FRONTEND_PATH - $SHELL -c "./$MIG_FRONTEND_SCRIPT_STOP $DEFAULT_PIPE" - ;; - restart) - $0 stop - sleep 5 - $0 start - ;; - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 -esac - -exit 0 - diff --git a/mig/mig-xsss/mig_xsss_get_pgid_count.sh b/mig/mig-xsss/mig_xsss_get_pgid_count.sh deleted file mode 100755 index 784d53628..000000000 --- a/mig/mig-xsss/mig_xsss_get_pgid_count.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -MIG_USER="mig_sss" - -pgid_list=`ps -u $MIG_USER -o pgid=` -count=0 -for i in $pgid_list; do - if [ $i -eq $1 ]; then - count="$[$count+1]" - fi -done -echo $count diff --git a/mig/mig-xsss/mig_xsss_get_resource_pgid.sh b/mig/mig-xsss/mig_xsss_get_resource_pgid.sh deleted file mode 100755 index 3bed04a12..000000000 --- a/mig/mig-xsss/mig_xsss_get_resource_pgid.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Setting MIG_HOST, some gives full hostname -# others gives only machinename -if [ `hostname | grep -c "\."` -eq 0 ]; then - MIG_HOST="`hostname`" -else - MIG_HOST="`hostname | awk -F '.' '{print $1}'`" -fi - -MIG_DOMAIN="`domainname`" -MIG_HOST_IDENTIFIER="0" -MIG_RESOURCE_PATH="/usr/local/mig_xsss" -MIG_RESOURCE_GET_PGID="./get_resource_pgid.sh" - -cd $MIG_RESOURCE_PATH -$MIG_RESOURCE_GET_PGID $MIG_HOST.$MIG_DOMAIN.$MIG_HOST_IDENTIFIER $MIG_HOST 2>/dev/null - diff --git a/mig/mig-xsss/mig_xsss_start_resource_exe.sh b/mig/mig-xsss/mig_xsss_start_resource_exe.sh deleted file mode 100755 index 35685a860..000000000 --- a/mig/mig-xsss/mig_xsss_start_resource_exe.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Setting MIG_HOST, some gives full hostname -# others gives only machinename -if [ `hostname | grep -c "\."` -eq 0 ]; then - MIG_HOST="`hostname`" -else - MIG_HOST="`hostname | awk -F '.' '{print $1}'`" -fi - -MIG_DOMAIN="`domainname`" -MIG_HOST_IDENTIFIER="0" -MIG_RESOURCE_PATH="/usr/local/mig_xsss" -MIG_RESOURCE_START_EXE="./start_resource_exe.sh" - -cd $MIG_RESOURCE_PATH -$MIG_RESOURCE_START_EXE $MIG_HOST.$MIG_DOMAIN.$MIG_HOST_IDENTIFIER $MIG_HOST $1 2>/dev/null - diff --git a/mig/mig-xsss/mig_xsss_stop_resource_exe.sh b/mig/mig-xsss/mig_xsss_stop_resource_exe.sh deleted file mode 100755 index bf373dc81..000000000 --- a/mig/mig-xsss/mig_xsss_stop_resource_exe.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Setting MIG_HOST, some gives full hostname -# others gives only machinename -if [ `hostname | grep -c "\."` -eq 0 ]; then - MIG_HOST="`hostname`" -else - MIG_HOST="`hostname | awk -F '.' '{print $1}'`" -fi - -MIG_DOMAIN="`domainname`" -MIG_HOST_IDENTIFIER="0" -MIG_RESOURCE_PATH="/usr/local/mig_xsss" -MIG_RESOURCE_STOP_EXE="./stop_resource_exe.sh" - -cd $MIG_RESOURCE_PATH -$MIG_RESOURCE_STOP_EXE $MIG_HOST.$MIG_DOMAIN.$MIG_HOST_IDENTIFIER $MIG_HOST 2>/dev/null diff --git a/mig/mig-xsss/start_resource_exe.sh b/mig/mig-xsss/start_resource_exe.sh deleted file mode 100755 index 7caef821d..000000000 --- a/mig/mig-xsss/start_resource_exe.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh -function start_resource_exe(){ - unique_resource_name="$1" - exe_name="$2" - if [ $# -eq 3 ]; then - cputime="&cputime=$3" - fi - - # Uncomment to debug - # DEBUG_PREFIX="echo " - - cmd="${DEBUG_PREFIX}curl" - # Specify password without making it visible in process - # list (e.g. 'ps awwx') - - $cmd \ - --insecure \ - --cert $certfile \ - --key $key \ - --pass `awk '/pass/ {print $2}' $MiGuserconf` \ - --url "$migserver/cgi-bin/startexe.py?unique_resource_name=$unique_resource_name&exe_name=$exe_name$cputime" -} - -function usage(){ - echo "Usage..." - echo "start_resource_exe.sh unique_resource_name exe_name [cputime]" - echo "Example: start_resource_exe.sh dido.imada.sdu.dk.0 exe" -} - - - -######## -# Main # -######## -MiGuserconf=~/.MiG/MiGuser.conf -if [ ! -r $MiGuserconf ]; then - echo "start_resource_exe.sh requires a readable configuration in $MiGuserconf" - usage - exit 1 -fi -migserver=`awk '/migserver/ {print $2}' $MiGuserconf` -certfile=`awk '/certfile/ {print $2}' $MiGuserconf` -key=`awk '/key/ {print $2}' $MiGuserconf` - -if [ $# -eq 2 ]; then - start_resource_exe $1 $2 -elif [ $# -eq 3 ]; then - start_resource_exe $1 $2 $3 -else - usage - exit 1 -fi - diff --git a/mig/mig-xsss/start_resource_frontend.sh b/mig/mig-xsss/start_resource_frontend.sh deleted file mode 100755 index 4caa6f443..000000000 --- a/mig/mig-xsss/start_resource_frontend.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -function start_resource_frontend(){ - unique_resource_name="$1" - # Uncomment to debug - # DEBUG_PREFIX="echo " - - cmd="${DEBUG_PREFIX}curl" - # Specify password without making it visible in process - # list (e.g. 'ps awwx') - - $cmd \ - --insecure \ - --cert $certfile \ - --key $key \ - --pass `awk '/pass/ {print $2}' $MiGuserconf` \ - --url "$migserver/cgi-bin/startfe.py?unique_resource_name=$unique_resource_name" -} - - -function usage(){ - echo "Usage..." - echo "start_resource_frontend.sh unique_resource_name" - echo "Example: start_resource_frontend.sh dido.imada.sdu.dk.0" -} - - - -######## -# Main # -######## -MiGuserconf=~/.MiG/MiGuser.conf -if [ ! -r $MiGuserconf ]; then - echo "start_resource_frontend.sh requires a readable configuration in $MiGuserconf" - usage - exit 1 -fi -migserver=`awk '/migserver/ {print $2}' $MiGuserconf` -certfile=`awk '/certfile/ {print $2}' $MiGuserconf` -key=`awk '/key/ {print $2}' $MiGuserconf` -if [ $# -eq 1 ]; then - start_resource_frontend $1 -else - usage - exit 1 -fi - diff --git a/mig/mig-xsss/stop_resource_exe.sh b/mig/mig-xsss/stop_resource_exe.sh deleted file mode 100755 index 982c0daf7..000000000 --- a/mig/mig-xsss/stop_resource_exe.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -function stop_resource_exe(){ - unique_resource_name="$1" - exe_name="$2" - # Uncomment to debug - # DEBUG_PREFIX="echo " - - cmd="${DEBUG_PREFIX}curl" - # Specify password without making it visible in process - # list (e.g. 'ps awwx') - - $cmd \ - --insecure \ - --cert $certfile \ - --key $key \ - --pass `awk '/pass/ {print $2}' $MiGuserconf` \ - --url "$migserver/cgi-bin/stopexe.py?unique_resource_name=$unique_resource_name&exe_name=$exe_name" -} - -function usage(){ - echo "Usage..." - echo "stop_resource_exe.sh unique_resource_name exe_name" - echo "Example: stop_resource_exe.sh dido.imada.sdu.dk.0 exe" -} - - - -######## -# Main # -######## -MiGuserconf=~/.MiG/MiGuser.conf -if [ ! -r $MiGuserconf ]; then - echo "stop_resource_exe.sh requires a readable configuration in $MiGuserconf" - usage - exit 1 -fi -migserver=`awk '/migserver/ {print $2}' $MiGuserconf` -certfile=`awk '/certfile/ {print $2}' $MiGuserconf` -key=`awk '/key/ {print $2}' $MiGuserconf` -if [ $# -eq 2 ]; then - stop_resource_exe $1 $2 -else - usage - exit 1 -fi - diff --git a/mig/mig-xsss/stop_resource_frontend.sh b/mig/mig-xsss/stop_resource_frontend.sh deleted file mode 100755 index 5801c9db3..000000000 --- a/mig/mig-xsss/stop_resource_frontend.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -function stop_resource_frontend(){ - unique_resource_name="$1" - # Uncomment to debug - # DEBUG_PREFIX="echo " - - cmd="${DEBUG_PREFIX}curl" - # Specify password without making it visible in process - # list (e.g. 'ps awwx') - - $cmd \ - --insecure \ - --cert $certfile \ - --key $key \ - --pass `awk '/pass/ {print $2}' $MiGuserconf` \ - --url "$migserver/cgi-bin/stopfe.py?unique_resource_name=$unique_resource_name" -} - - - -function usage(){ - echo "Usage..." - echo "stop_resource_frontend.sh unique_resource_name" - echo "Example: stop_resource_frontend.sh dido.imada.sdu.dk.0" -} - - - -######## -# Main # -######## -MiGuserconf=~/.MiG/MiGuser.conf -if [ ! -r $MiGuserconf ]; then - echo "stop_resource_frontend.sh requires a readable configuration in $MiGuserconf" - usage - exit 1 -fi -migserver=`awk '/migserver/ {print $2}' $MiGuserconf` -certfile=`awk '/certfile/ {print $2}' $MiGuserconf` -key=`awk '/key/ {print $2}' $MiGuserconf` -if [ $# -eq 1 ]; then - stop_resource_frontend $1 -else - usage - exit 1 -fi - diff --git a/mig/mig-xsss/test b/mig/mig-xsss/test deleted file mode 100644 index 83261b6b7..000000000 --- a/mig/mig-xsss/test +++ /dev/null @@ -1 +0,0 @@ -indhold diff --git a/mig/mig-xsss/update_mig_xsss b/mig/mig-xsss/update_mig_xsss deleted file mode 100755 index 1717aa94c..000000000 --- a/mig/mig-xsss/update_mig_xsss +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -rm -f /usr/local/mig_xsss/*.py -rm -f /usr/local/mig_xsss/*.sh -rm -f /etc/imada/scripts/mig_xsss.sh - -cp /tmp/mig_xsss/*.py /usr/local/mig_xsss -cp /tmp/mig_xsss/*.sh /usr/local/mig_xsss -cp /tmp/mig_xsss/mig_xsss.sh /etc/imada/scripts - -chmod 700 /usr/local/mig_xsss/*.py -chmod 700 /usr/local/mig_xsss/*.sh -chmod 700 /etc/imada/scripts/mig_xsss.sh - diff --git a/mig/resource/frontend_script.sh b/mig/resource/frontend_script.sh index 2e7dca198..9555daea3 100644 --- a/mig/resource/frontend_script.sh +++ b/mig/resource/frontend_script.sh @@ -1,14 +1,5 @@ echo "`date`: starting" >> $frontendlog -# Make sure sandboxes use the current MiG server when booted next time. -# This is a workaround after our server migration, so that existing -# images can continue working as long as we redirect or proxy sandboxes -# to the new server at least once. - -if [ $sandbox -eq 1 ]; then - echo $migserver > /opt/mig/etc/serverfile -fi - # $Revision: 2580 $ clean_command="rm -f" @@ -21,12 +12,6 @@ end_marker="### END OF SCRIPT ###" clean_up_counter=0 # Clean up after this many loops (with 2 second idle sleep this is less than once a day) clean_up_interval=43200 -# Timeout for sandboxes is checked by frontend -# Don't check for timeout to often - interval is number of loops (> 1s each) -# The initial value is 60 for responsiveness, but as sandbox resources increase -# in numbers the timeout_interval should be increased. -sandbox_timeout_counter=0 -sandbox_timeout_interval=60 send_pgid() { type=$1 @@ -187,12 +172,6 @@ request_job() { execution_delay="$5" exe_pgid="$6" - # if sandbox also send sandboxkey - #sandboxkey_string="" - #if [ $sandbox -eq 1 ]; then - #sandboxkey_string="\&\;sandboxkey=${sandboxkey}" - #fi - # request a new job, and check a number of times if it is received. If not a # request is sent again retry_counter=0 @@ -200,33 +179,10 @@ request_job() { while [ 1 ]; do retry_counter=$((retry_counter+1)) # TODO: can we supply ca-cert to avoid insecure here? - curl --location --insecure --stderr $curllog --connect-timeout $contimeout -m $contimeout $migserver/cgi-sid/requestnewjob?exe=${exe}\&\;unique_resource_name=${unique_resource_name}\&\;cputime=${cputime}\&\;nodecount=${nodecount}\&\;sandboxkey=${sandboxkey}\&\;localjobname=${localjobname}\&\;execution_delay=${execution_delay}\&\;exe_pgid=${exe_pgid} 1>> $frontendlog 2>> $frontendlog + curl --location --insecure --stderr $curllog --connect-timeout $contimeout -m $contimeout $migserver/cgi-sid/requestnewjob?exe=${exe}\&\;unique_resource_name=${unique_resource_name}\&\;cputime=${cputime}\&\;nodecount=${nodecount}\&\;localjobname=${localjobname}\&\;execution_delay=${execution_delay}\&\;exe_pgid=${exe_pgid} 1>> $frontendlog 2>> $frontendlog retval=$? echo "a new job ${exe} ${nodecount} ${cputime} ${localjobname} ${execution_delay} ${exe_pgid} was requested ($retval)" 1>> $frontendlog 2>> $frontendlog - - if [ $sandbox -eq 1 ]; then - getinputfiles_retry=0 - getinputfiles_max_retries=5 - while [ ! -f ${localjobname}.getinputfiles ] && \ - [ $getinputfiles_retry -lt $getinputfiles_max_retries ]; do - curl --location --fail --insecure --stderr $curllog --connect-timeout $contimeout -m $contimeout $migserver/sid_redirect/${localjobname}.getinputfiles -o ${localjobname}.getinputfiles 1>> $frontendlog 2>> $frontendlog - retval=$? - # Loop until .getinputfiles is ready, curl returns 0, - # --fail must be set on curl command to do this, see - # man curl - if [ "$retval" -ne "0" ]; then - getinputfiles_retry=$((getinputfiles_retry+1)) - ${clean_command} ${localjobname}.getinputfiles - echo ".getinputfiles script _NOT_ received yet ($retval)! (${getinputfiles_retry}/${getinputfiles_max_retries})" 1>> $frontendlog 2>> $frontendlog - sleep 5 - fi - done - if [ $getinputfiles_retry -eq $getinputfiles_max_retries ]; then - echo "No more request retries left!" 1>> $frontendlog 2>> $frontendlog - return 1 - fi - fi - + # loop until new job exists or timeout is reached counter=0 while [ 1 ]; do @@ -255,79 +211,15 @@ request_job() { return 0 } -sandbox_stop_exe() { - # Find newest job_dir, and generete list of old job_dirs - # NOTE: Sandboxes only has one executionnode, if that's changed, - # we must find and check a newest jobdir for each executionnode - newest_job_dir="" - job_clean_list="" - for job_dir in job-dir_*; do - if [ -z $newest_job_dir ] || [ $job_dir -nt $newest_job_dir ]; then - newest_job_dir=$job_dir - job_clean_list="$job_clean_list $job_dir" - fi - done - - localjobname=${newest_job_dir#job-dir_} - if [ ! -f ${localjobname}.jobdone ] && \ - [ -f ${newest_job_dir}/${localjobname}.iosessionid ] && \ - [ -f ${newest_job_dir}/${localjobname}.executionnode ]; then - iosessionid=`cat ${newest_job_dir}/${localjobname}.iosessionid 2>> $frontendlog` - execution_node=`awk '/execution_node/ {ORS=" " ; for(field=2;field> $frontendlog` - retval=$? - if [ $retval -eq 0 ] &&\ - [ ${status:0:1} -eq 1 ]; then - stop_command=`echo ${status:2} | awk -F'stop_command: ' '{print $2}'` - if [ ! -z "$stop_command" ]; then - # Execute stop command - $stop_command 1>> $frontendlog 2>> $frontendlog - retval=$? - echo "sandbox_stop_exe: (${stop_command}) of job ($localjobname) returned (${retval})" 1>> $frontendlog 2>> $frontendlog - - # Cleanup files for the killed job and jobs older than the killed job - if [ $retval -eq 0 ]; then - for job_dir_clean in $job_clean_list; do - localjobname_clean=${job_dir_clean#job-dir_} - - # Remove EXE jobdir - ${clean_recursive} ${copy_execution_prefix}${execution_dir}/${job_dir_clean} 1>> $frontendlog 2>> $frontendlog - - # Remove run_handle_updates - $clean_command ${copy_execution_prefix}${execution_dir}/run_handle_updates.${localjobname_clean}\ - 1>> $frontendlog 2>> $frontendlog - - # Remove FE jobdir - ${clean_recursive} $job_dir_clean 1>> $frontendlog 2>> $frontendlog - - # Remove jobdone, we can't trust it at this stage - ${clean_command} ${localjobname_clean}.jobdone 1>> $frontendlog 2>> $frontendlog - - echo "sandbox_stop_exe: Job ($localjobname_clean) was cleand up" 1>> $frontendlog 2>> $frontendlog - sync_clean ${localjobname_clean}.jobdone - done - fi - fi - fi - fi -} - ### MAIN ### # Send the frontend ProcessGroupID to the MiG server. pid=$$ pgid=`ps -o pgid= -p $pid` -# Sandboxes don't send pgid -if [ $sandbox -eq 0 ]; then - send_pgid "FE" $pgid - retval=$? - if [ $retval -ne 0 ]; then - exit 1 - fi +send_pgid "FE" $pgid +retval=$? +if [ $retval -ne 0 ]; then + exit 1 fi # Loop through job handling forever @@ -661,7 +553,7 @@ while [ 1 ]; do #echo "making directory job-dir_$localjobname" 1>> $frontendlog 2>> $frontendlog mkdir job-dir_$localjobname 1>> $frontendlog 2>> $frontendlog - # Write execution_node to job_dir (This used by sandbox timeout/kill) + # Write execution_node to job_dir echo "execution_node ${execution_node}" 1> job-dir_${localjobname}/${localjobname}.executionnode 2>> $frontendlog echo "$end_marker" >> job-dir_${localjobname}/${localjobname}.executionnode sync_complete job-dir_${localjobname}/${localjobname}.executionnode @@ -750,13 +642,6 @@ while [ 1 ]; do for i in "$inputfiles"; do sync_clean $i done - if [ $sandbox -eq 1 ]; then - chown -R ${execution_user}:${execution_user} ${execution_dir}/job-dir_${localjobname} - chown_ret=$? - if [ $chown_ret -ne 0 ]; then - echo "chown failed" 1>> $frontendlog 2>> $frontendlog - fi - fi break else # continue until succesful @@ -813,7 +698,6 @@ while [ 1 ]; do if [ $clean_up_counter -gt $clean_up_interval ]; then # Age clean up internal files after 30 days to avoid errors piling up. # This should never replace server initiated job clean up with privacy in mind. - # NB: We must use "find -mtime" here for sandbox resource to work. echo "cleaning up old files" 1>> $frontendlog 2>> $frontendlog for extension in givejob inputfiles_available getinputfiles sendoutputfiles job jobdone FAILED; do for old_file in `find . -name "*.${extension}" -mtime +30| xargs`; do @@ -838,16 +722,6 @@ while [ 1 ]; do clean_up_counter=$((clean_up_counter+1)) fi - # Sandbox job cancel/timeout - if [ $sandbox -eq 1 ]; then - if [ $sandbox_timeout_counter -gt $sandbox_timeout_interval ]; then - sandbox_stop_exe - sandbox_timeout_counter=0 - else - sandbox_timeout_counter=$((sandbox_timeout_counter+1)) - fi - fi - # Slow down sleep 4 diff --git a/mig/server/MiGserver-localhost.conf b/mig/server/MiGserver-localhost.conf index 0cfb7c6dd..1fc751e65 100644 --- a/mig/server/MiGserver-localhost.conf +++ b/mig/server/MiGserver-localhost.conf @@ -37,10 +37,8 @@ mig_path = %(install_path)s/mig mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ re_pending_dir = %(state_path)s/re_pending/ @@ -86,8 +84,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/MiGservercert.pem server_key = %(certs_path)s/MiGserverkey.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_http_url = http://localhost migserver_https_cert_url = https://localhost @@ -284,7 +280,6 @@ user_menu = wshell migadmin #short_title = MiG #external_doc = http://code.google.com/p/migrid/wiki/FrontPage #enable_griddk = False -enable_sandboxes = True enable_sftp = True enable_davs = True enable_ftps = True @@ -350,7 +345,7 @@ enable_suggest = False job_cond_red = EXECUTABLES INPUTFILES REGISTERED SEEN_WITHIN_X skip_validation = resource_seen_within_hours = 24 -job_cond_green = ARCHITECTURE PLATFORM RUNTIMEENVIRONMENT VERIFYFILES VGRID SANDBOX +job_cond_green = ARCHITECTURE PLATFORM RUNTIMEENVIRONMENT VERIFYFILES VGRID job_cond_yellow = DISK MEMORY CPUTIME job_cond_orange = CPUCOUNT NODECOUNT suggest_threshold = GREEN diff --git a/mig/server/bestfitscheduler.py b/mig/server/bestfitscheduler.py index 8245147c2..58dfd8fa3 100644 --- a/mig/server/bestfitscheduler.py +++ b/mig/server/bestfitscheduler.py @@ -77,12 +77,6 @@ def fitness(self, job, resource_conf): prio_mult) job_fitness += fit_rate * prio_mult - # Ordinary resources should avoid sandbox jobs unless there are no - # other suitable jobs around - - if resource_conf.get('SANDBOX', False) != job.get('SANDBOX', False): - job_fitness *= 0.0001 - self.logger.debug('fitness: %f', job_fitness) return job_fitness @@ -116,6 +110,7 @@ def schedule(self, resource_conf, must_match={}): best_job = None best_fitness = 0.0 + best_i = 0 for i in range(0, qlen): job = self.job_queue.get_job(i) diff --git a/mig/server/genjobscriptjava.py b/mig/server/genjobscriptjava.py deleted file mode 100644 index 861eecffb..000000000 --- a/mig/server/genjobscriptjava.py +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# genjobscriptjava - helpers for jvm jobs -# Copyright (C) 2003-2014 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""In java the script is just a configuration file for telling -the remote java mechanism where to retrieve the executable - and corresponding files. -""" -from __future__ import absolute_import - -from builtins import object -from mig.shared.defaults import job_output_dir - - -class GenJobScriptJava(object): - - def __init__( - self, - job_dictionary, - resource_config, - https_sid_url, - localjobnam, - filename_without_ext, - ): - - global job_dict - job_dict = job_dictionary - global resource_conf - resource_conf = resource_config - global https_sid_url_arg - https_sid_url_arg = https_sid_url - global filename_without_extension - filename_without_extension = filename_without_ext - global localjobname - localjobname = localjobnam - - def comment(self, string): - return '# ' + string + '\n' - - def script_init(self): - """Initialize script""" - - init = \ - '''# Java resource configuration file -# -# --- BEGIN_HEADER --- -# -# ??? - one of the java helper files used on resources -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -''' - init = init + 'mig_session_id: ' + job_dict['SESSIONID']\ - + '\n' - init = init + 'mig_iosession_id: ' + job_dict['IOSESSIONID']\ - + '\n' - init = init + 'job_id: ' + job_dict['JOB_ID'] + '\n' - return init - - def print_start(self, name='job'): - return 'info: Starting new %s with JOB_ID: %s\n' % (name, - job_dict['JOB_ID']) - - def create_files(self, files): - """Create supplied files""" - - return '' - - def init_status(self): - return '' - - def init_io_log(self): - return '' - - def log_io_status(self, io_type, result='ret'): - return '' - - def create_job_directory(self): - return '' - - def cd_to_job_directory(self): - return '' - - def get_input_files(self, result='get_input_status'): - return '' - - def get_special_input_files(self, result='get_special_status'): - return '' - - def generate_input_filelist(self, result='generate_input_filelist'): - return '' - - def generate_output_filelists(self, user_cert, - result='generate_output_filelists'): - return '' - - def get_executables(self, result='get_executables_status'): - cmd = '' - for executables in job_dict['EXECUTABLES']: - parts = executables.split() - mig_server_filename = "%s" % parts[0] - cmd += 'executables: ' + '/sid_redirect/'\ - + mig_server_filename + '\n' - - return cmd - - def get_io_files(self, result='get_io_status'): - return '' - - def generate_iosessionid_file(self, - result='generate_iosessionid_file'): - return '' - - def generate_mountsshprivatekey_file(self, - result='generate__mountsshprivatekey_file'): - return '' - - def generate_mountsshknownhosts_file(self, - result='generate_mountsshknownhosts_file'): - return '' - - def chmod_executables(self, result='chmod_status'): - return '' - - def set_core_environments(self): - return '' - - def set_environments(self, result='env_result'): - return '' - - def set_limits(self): - """Set local resource limits to prevent fork bombs, OOM and such""" - return '' - - def set_runtime_environments(self, resource_runtimeenvironment, - result='re_result'): - return '' - - def mount(self, login, host, port, status='umount_status'): - return '' - - def execute(self, pretext, posttext): - cmd = '' - for exe in job_dict['EXECUTE']: - cmd += 'execute: ' + exe + '\n' - - return cmd - - def umount(self, status='umount_status'): - return '' - - def output_files_missing(self, result='missing_counter'): - return '' - - def send_output_files(self, result='send_output_status'): - return '' - - def send_io_files(self, result='send_io_status'): - cmd = '' - - cmd += 'stdout: ' + https_sid_url_arg\ - + '/sid_redirect/' + job_dict['SESSIONID'] + '/'\ - + job_output_dir + '/' + job_dict['JOB_ID'] + '/'\ - + job_dict['JOB_ID'] + '.stdout\n' - cmd += 'stderr: ' + https_sid_url_arg\ - + '/sid_redirect/' + job_dict['SESSIONID'] + '/'\ - + job_output_dir + '/' + job_dict['JOB_ID'] + '/'\ - + job_dict['JOB_ID'] + '.stderr\n' - cmd += 'io-status: ' + https_sid_url_arg\ - + '/sid_redirect/' + job_dict['SESSIONID'] + '/'\ - + job_output_dir + '/' + job_dict['JOB_ID'] + '/'\ - + job_dict['JOB_ID'] + '.io-status\n' - return cmd - - def send_status_files(self, files, result='send_status_status'): - cmd = '' - for name in files: - if name.count('status') > 0: - cmd += 'status: ' + https_sid_url_arg\ - + '/sid_redirect/' + job_dict['SESSIONID'] + '/'\ - + job_output_dir + '/' + job_dict['JOB_ID'] + '/'\ - + name + '\n' - return cmd - - def save_status(self, result='ret'): - return '' - - def total_status(self, variables, result='total_status'): - return '' - - def print_on_error( - self, - result='ret', - successcode='0', - msg='ERROR: unexpected exit code!', - ): - - return '' - - def log_on_error( - self, - resilt='ret', - successcode='0', - msg='ERROR: unexpected exit code!', - ): - - return '' - - def exit_on_error( - self, - result='ret', - successcode='0', - exitcode='$ret', - ): - - return '' - - def exit_script(self, exitcode='0', name=''): - return '' - - def clean_up(self): - return '' diff --git a/mig/server/grid_script.py b/mig/server/grid_script.py index fb403f7f7..bad321ccd 100755 --- a/mig/server/grid_script.py +++ b/mig/server/grid_script.py @@ -523,8 +523,6 @@ def graceful_shutdown(): % unique_resource_name) continue - sandboxed = resource_config.get('SANDBOX', False) - # Write the PGID of EXE to PGID file (status, msg) = put_exe_pgid( @@ -533,7 +531,6 @@ def graceful_shutdown(): exe, exe_pgid, logger, - sandboxed, ) if status: logger.info(msg) @@ -1357,29 +1354,28 @@ def graceful_shutdown(): ): logger.error('could not clean up MiG server') - if not resource_config.get('SANDBOX', False): - logger.info( - 'Killing running job with atomic_resource_exe_restart') - (status, msg) = \ - atomic_resource_exe_restart(unique_resource_name, - exe, configuration, logger) - - if status: - logger.info('atomic_resource_exe_restart ok: res %s:%s' - % (unique_resource_name, exe)) - else: - logger.error( - 'atomic_resource_exe_restart FAILED: %s res %s:%s' - % (msg, unique_resource_name, exe)) - - # kill_job_by_exe_restart(unique_resource_name, exe, - # configuration, logger) - # Make sure we do not loose exes even if restart fails - - retry_message = 'RESTARTEXEFAILED %s %s %s\n'\ - % (unique_resource_name, exe, job_id) - send_message_to_grid_script(retry_message, logger, - configuration) + logger.info( + 'Killing running job with atomic_resource_exe_restart') + (status, msg) = \ + atomic_resource_exe_restart(unique_resource_name, + exe, configuration, logger) + + if status: + logger.info('atomic_resource_exe_restart ok: res %s:%s' + % (unique_resource_name, exe)) + else: + logger.error( + 'atomic_resource_exe_restart FAILED: %s res %s:%s' + % (msg, unique_resource_name, exe)) + + # kill_job_by_exe_restart(unique_resource_name, exe, + # configuration, logger) + # Make sure we do not loose exes even if restart fails + + retry_message = 'RESTARTEXEFAILED %s %s %s\n'\ + % (unique_resource_name, exe, job_id) + send_message_to_grid_script(retry_message, logger, + configuration) elif cap_line.find('JOBTIMEOUT') == 0: print(cap_line) @@ -1463,34 +1459,30 @@ def graceful_shutdown(): logger, ) - # Restart non-sandbox resources for all timed out jobs - - if not resource_config.get('SANDBOX', False): + # TODO: atomic_resource_exe_restart is not always effective + # The imada resources have been seen to hang in wait for input + # files loop across an atomic_resource_exe_restart run + # (server PGID was 'starting'). + + (status, msg) = \ + atomic_resource_exe_restart(unique_resource_name, + exe, configuration, logger) + if status: + logger.info('atomic_resource_exe_restart ok: res %s:%s' + % (unique_resource_name, exe)) + else: + logger.error( + 'atomic_resource_exe_restart FAILED: %s, res %s:%s' + % (msg, unique_resource_name, exe)) - # TODO: atomic_resource_exe_restart is not always effective - # The imada resources have been seen to hang in wait for input - # files loop across an atomic_resource_exe_restart run - # (server PGID was 'starting'). + # Make sure we do not loose exes even if restart fails - (status, msg) = \ - atomic_resource_exe_restart(unique_resource_name, - exe, configuration, logger) - if status: - logger.info('atomic_resource_exe_restart ok: res %s:%s' - % (unique_resource_name, exe)) - else: - logger.error( - 'atomic_resource_exe_restart FAILED: %s, res %s:%s' - % (msg, unique_resource_name, exe)) - - # Make sure we do not loose exes even if restart fails - - retry_message = 'RESTARTEXEFAILED %s %s %s\n'\ - % (unique_resource_name, exe_name, - job_dict['JOB_ID']) - send_message_to_grid_script(retry_message, logger, - configuration) - logger.info('requested restart exe retry attempt') + retry_message = 'RESTARTEXEFAILED %s %s %s\n'\ + % (unique_resource_name, exe_name, + job_dict['JOB_ID']) + send_message_to_grid_script(retry_message, logger, + configuration) + logger.info('requested restart exe retry attempt') elif cap_line.find('JOBQUEUEINFO') == 0: details = linelist[1:] diff --git a/mig/server/grid_sshmux.py b/mig/server/grid_sshmux.py index 4b1b98cb7..5d5ed447a 100755 --- a/mig/server/grid_sshmux.py +++ b/mig/server/grid_sshmux.py @@ -41,7 +41,6 @@ import threading from time import sleep -from mig.shared.base import sandbox_resource from mig.shared.conf import get_resource_configuration, \ get_configuration_object from mig.shared.logger import daemon_logger, register_hangup_handler @@ -153,8 +152,6 @@ def graceful_shutdown(signum, frame): if not os.path.isdir(res_dir): continue dir_name = os.path.basename(res_dir) - if sandbox_resource(dir_name): - continue try: (status, res_conf) = \ get_resource_configuration(configuration.resource_home, diff --git a/mig/server/jobscriptgenerator.py b/mig/server/jobscriptgenerator.py index 0efe85771..e7da7c2c9 100644 --- a/mig/server/jobscriptgenerator.py +++ b/mig/server/jobscriptgenerator.py @@ -4,7 +4,7 @@ # --- BEGIN_HEADER --- # # jobscriptgenerator - dynamically generate job script right before job handout -# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter +# Copyright (C) 2003-2026 The MiG Project by the Science HPC Center at UCPH # # This file is part of MiG. # @@ -38,7 +38,6 @@ from mig.server import genjobscriptpython from mig.server import genjobscriptsh -from mig.server import genjobscriptjava from mig.shared.base import client_id_dir, hexlify from mig.shared.defaults import session_id_bytes, maxfill_fields, keyword_all from mig.shared.fileio import write_file, pickle, make_symlink @@ -330,31 +329,6 @@ def create_job_script( inputfiles_path = path_without_extension + '.getinputfiles' - # hack to ensure that a resource has a sandbox keyword - - if resource_config.get('SANDBOX', False): - - # Move file to webserver_home for download as we can't push it to - # sandboxes - - try: - - # RA TODO: change download filename to something that - # includes sessionid - - webserver_path = os.path.join(configuration.webserver_home, - localjobname + '.getinputfiles') - os.rename(inputfiles_path, webserver_path) - - except Exception as err: - msg = "File '%s' was not copied to the webserver home." % \ - inputfiles_path - print('\nERROR: ' + "%s" % (err)) - logger.error(msg) - return (None, msg) - - return (job_dict, 'OK') - # Copy file to the resource if not copy_file_to_resource(inputfiles_path, @@ -410,11 +384,6 @@ def gen_job_script( localjobname, path_without_extension, ) - elif script_language == 'java': - generator = genjobscriptjava.GenJobScriptJava( - job_dictionary, resource_config, - configuration.migserver_https_sid_url, - localjobname, path_without_extension) else: print('Unknown script language! (is in configuration but not in ' + 'jobscriptgenerator) %s ' % script_language) diff --git a/mig/server/sandbox_list_users.py b/mig/server/sandbox_list_users.py deleted file mode 100755 index 03b1c1be4..000000000 --- a/mig/server/sandbox_list_users.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sandbox_list_users - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""List sandbox users and print total number of registered users""" -from __future__ import print_function -from __future__ import absolute_import - -import os -import sys - -from mig.shared.conf import get_configuration_object -from mig.shared.serial import load - -configuration = get_configuration_object() - -sandboxdb_file = configuration.sandbox_home + os.sep\ - + 'sandbox_users.pkl' - -userdb = None -if not os.path.isfile(sandboxdb_file): - print('%s is not an existing file!' % sandboxdb_file) - sys.exit(1) - -try: - userdb = load(sandboxdb_file) -except Exception as exc: - print('Exception reading %s, (%s)' % (sandboxdb_file, exc)) -user_count = 0 - -for (key, value) in userdb.items(): - print(key, ':', value) - user_count += 1 - -print('Total number of registered users: %d' % user_count) diff --git a/mig/server/sandbox_remove_user.py b/mig/server/sandbox_remove_user.py deleted file mode 100644 index c76cf0572..000000000 --- a/mig/server/sandbox_remove_user.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sandbox_remove_user - [insert a few words of module description on this line] -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - - -"""This script removes a given sandbox user from the user list""" -from __future__ import print_function -from __future__ import absolute_import - -import sys -import os - -from mig.shared.serial import load, dump -from mig.shared.conf import get_configuration_object - -configuration = get_configuration_object() - -sandboxdb_file = configuration.sandbox_home + os.sep\ - + 'sandbox_users.pkl' - -PW = 0 -RESOURCES = 1 - -try: - username = sys.argv[1] -except: - print('You must specify a username.') - sys.exit(1) - -# Load the user file - -userdb = load(sandboxdb_file) - -if username in userdb: - - # Open the user file in write-mode - this deletes the file! - - del userdb[username] - dump(userdb, sandboxdb_file) - print('Username %s has now been deleted!' % username) -else: - print('Sorry, username does not exist: %s' % username) - sys.exit(0) diff --git a/mig/server/scheduler.py b/mig/server/scheduler.py index 10fbaf404..40911614c 100644 --- a/mig/server/scheduler.py +++ b/mig/server/scheduler.py @@ -1227,27 +1227,6 @@ def job_fits_resource(self, job, res): self.logger.info('job_fits_resource: %s of job does not fit resource (%s, %s)' % (attr, job[attr], res[attr])) return False - if attr == 'SANDBOX': - - # self.logger.info("SANDBOX") - # hack to ensure that a resource has a sandbox keyword - - if attr not in res: - res[attr] = False - - # do not schedule non-sandbox jobs on a sandbox resource - - if not job[attr] and res[attr]: - - # job is not allowed to run in a sandbox resource - self.logger.info( - "job is not allowed to run on a sandbox resource") - return False - - # sandbox jobs on non-sandbox resources are ok, however - - # self.logger.info("SANDBOX DONE") - if attr == 'PLATFORM': # Default value for PLATFORM is the empty string diff --git a/mig/shared/base.py b/mig/shared/base.py index bea87d67c..6926c5c9b 100644 --- a/mig/shared/base.py +++ b/mig/shared/base.py @@ -41,7 +41,7 @@ # IMPORTANT: do not import any other MiG modules here - to avoid import loops from mig.shared.defaults import default_str_coding, default_fs_coding, \ - keyword_all, keyword_auto, sandbox_names, _user_invisible_files, \ + keyword_all, keyword_auto, _user_invisible_files, \ _user_invisible_dirs, _vgrid_xgi_scripts, cert_field_order, csrf_field, \ gdp_distinguished_field, valid_gdp_auth_scripts, valid_gdp_anon_scripts, \ STR_KIND, FS_KIND, AUTH_OPENID_V2, AUTH_OPENID_CONNECT, AUTH_CERTIFICATE, \ @@ -332,12 +332,6 @@ def canonical_user_with_peers(configuration, user_dict, limit_fields): return canonical -def sandbox_resource(unique_resource_name): - """Returns boolean indicating if the resource is a sandbox""" - fqdn = unique_resource_name.rsplit('.', 1)[0] - return fqdn in sandbox_names - - def invisible_file(filename): """Returns boolean indicating if the file with filename is among restricted files to completely hide. Such files can not safely be removed or modified diff --git a/mig/shared/configuration.py b/mig/shared/configuration.py index b64d7af86..b66f2eea6 100644 --- a/mig/shared/configuration.py +++ b/mig/shared/configuration.py @@ -252,8 +252,6 @@ def fix_missing(config_file, verbose=True): 'server_cert': '~/certs/cert.pem', 'server_key': '~/certs/key.pem', 'ca_cert': '~/certs/ca.pem', - 'sss_home': '~/state/sss_home/', - 'sandbox_home': '~/state/sandbox_home', 'freeze_home': '~/state/freeze_home', 'freeze_tape': '~/state/freeze_tape', 'sharelink_home': '~/state/sharelink_home', @@ -263,7 +261,6 @@ def fix_missing(config_file, verbose=True): 'quota_home': '~/state/quota_home/', 'accounting_home': '~/state/accounting_home/', 'public_key_file': '', - 'javabin_home': '~/mig/java-bin', 'events_home': '~/state/events_home/', 'twofactor_home': '~/state/twofactor_home/', 'gdp_home': '~/state/gdp_home/', @@ -395,7 +392,7 @@ def fix_missing(config_file, verbose=True): feasibility_section = {'resource_seen_within_hours': '24', 'skip_validation': '', 'job_cond_green': 'ARCHITECTURE PLATFORM \ - RUNTIMEENVIRONMENT VERIFYFILES VGRID SANDBOX', + RUNTIMEENVIRONMENT VERIFYFILES VGRID', 'job_cond_yellow': 'DISK MEMORY CPUTIME', 'job_cond_orange': 'CPUCOUNT NODECOUNT', 'job_cond_red': 'EXECUTABLES INPUTFILES REGISTERED \ @@ -516,12 +513,9 @@ def get(self, *args, **kwargs): 'user_db_home': '', 'user_cache': '', 'user_messages': '', - 'sss_home': '', - 'sandbox_home': '', 'freeze_home': '', 'freeze_tape': '', 'sharelink_home': '', - 'javabin_home': '', 'events_home': '', 'twofactor_home': '', 'gdp_home': '', @@ -732,7 +726,7 @@ def get(self, *args, **kwargs): 'resource_seen_within_hours': 24, 'skip_validation': [], 'job_cond_green': ['ARCHITECTURE', 'PLATFORM', 'RUNTIMEENVIRONMENT', - 'VERIFYFILES', 'VGRID', 'SANDBOX'], + 'VERIFYFILES', 'VGRID'], 'job_cond_yellow': ['DISK', 'MEMORY', 'CPUTIME'], 'job_cond_orange': ['CPUCOUNT', 'NODECOUNT'], 'job_cond_red': ['EXECUTABLES', 'INPUTFILES', 'REGISTERED', 'SEEN_WITHIN_X'], @@ -1144,12 +1138,6 @@ def reload_config(self, verbose, skip_log=False, disable_auth_log=False, else: self.mig_code_base = os.path.dirname( self.mig_server_home.rstrip(os.sep)) - if config.has_option('GLOBAL', 'sss_home'): - self.sss_home = config.get('GLOBAL', 'sss_home') - if config.has_option('GLOBAL', 'sandbox_home'): - self.sandbox_home = config.get('GLOBAL', 'sandbox_home') - if config.has_option('GLOBAL', 'javabin_home'): - self.javabin_home = config.get('GLOBAL', 'javabin_home') if config.has_option('GLOBAL', 'events_home'): self.events_home = config.get('GLOBAL', 'events_home') if config.has_option('GLOBAL', 'twofactor_home'): @@ -2170,11 +2158,6 @@ def reload_config(self, verbose, skip_log=False, disable_auth_log=False, 'SITE', 'enable_griddk') else: self.site_enable_griddk = False - if config.has_option('SITE', 'enable_sandboxes'): - self.site_enable_sandboxes = config.getboolean( - 'SITE', 'enable_sandboxes') - else: - self.site_enable_sandboxes = False if config.has_option('SITE', 'enable_freeze'): self.site_enable_freeze = config.getboolean( 'SITE', 'enable_freeze') @@ -2575,7 +2558,6 @@ def reload_config(self, verbose, skip_log=False, disable_auth_log=False, self.site_enable_jobs = False self.site_enable_live_jobs = False self.site_enable_sshmux = False - self.site_enable_sandboxes = False # NOTE: every operation must be clearly logged with explicit actor # so at least analyse thoroughly before GDP-enabling these. self.site_enable_crontab = False diff --git a/mig/shared/defaults.py b/mig/shared/defaults.py index ef03aace5..d6899fd90 100644 --- a/mig/shared/defaults.py +++ b/mig/shared/defaults.py @@ -115,8 +115,6 @@ valid_filter_methods = ['', 'skip', 'hexlify'] -sandbox_names = ['sandbox'] - email_keyword_list = ['mail', 'email'] pending_states = ['PARSE', 'QUEUED', 'EXECUTING', 'RETRY', 'FROZEN'] diff --git a/mig/shared/functionality/isjobactive.py b/mig/shared/functionality/isjobactive.py deleted file mode 100644 index 259cde147..000000000 --- a/mig/shared/functionality/isjobactive.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# isjobactive - Check if sandbox job is still active -# Copyright (C) 2003-2009 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This is a job kill helper for sandboxes""" -from __future__ import absolute_import - -import os - -from mig.shared import returnvalues -from mig.shared.functional import validate_input -from mig.shared.init import initialize_main_variables -from mig.shared.resadm import get_sandbox_exe_stop_command - - -def signature(): - """Signature of the main function""" - - defaults = {'iosessionid': [None], 'sandboxkey': [None], - 'exe_name': [None]} - return ['text', defaults] - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, op_title=False, - op_menu=client_id) - - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - iosessionid = accepted['iosessionid'][-1] - sandboxkey = accepted['sandboxkey'][-1] - exe_name = accepted['exe_name'][-1] - - status = returnvalues.OK - - # Web format for cert access and no header for SID access - if client_id: - output_objects.append({'object_type': 'title', 'text' - : 'SSS job activity checker'}) - output_objects.append({'object_type': 'header', 'text' - : 'SSS job activity checker'}) - else: - output_objects.append({'object_type': 'start'}) - - # check that the job exists, iosessionid is ok (does symlink exist?) - - if iosessionid and os.path.islink(configuration.webserver_home - + iosessionid): - msg = 'jobactive' - else: - if sandboxkey and exe_name: - (result, msg) = \ - get_sandbox_exe_stop_command(configuration.sandbox_home, - sandboxkey, exe_name, logger) - if result: - msg = 'stop_command: %s' % msg - else: - msg = 'jobinactive' - status = returnvalues.ERROR - - # Status code line followed by raw output - if not client_id: - output_objects.append({'object_type': 'script_status', 'text': ''}) - output_objects.append({'object_type': 'binary', 'data': '%s' % status[0]}) - output_objects.append({'object_type': 'binary', 'data': msg}) - return (output_objects, status) - - diff --git a/mig/shared/functionality/requestnewjob.py b/mig/shared/functionality/requestnewjob.py index 4723d6905..ec8d868f6 100644 --- a/mig/shared/functionality/requestnewjob.py +++ b/mig/shared/functionality/requestnewjob.py @@ -50,7 +50,7 @@ def signature(): defaults = {'unique_resource_name': REJECT_UNSET, 'exe': REJECT_UNSET, 'cputime': ['10000'], - 'nodecount': ['1'], 'localjobname': REJECT_UNSET, 'sandboxkey': [''], + 'nodecount': ['1'], 'localjobname': REJECT_UNSET, 'execution_delay': ['0'], 'exe_pgid': ['0']} return ['text', defaults] @@ -79,7 +79,6 @@ def main(client_id, user_arguments_dict): cputime = int(accepted['cputime'][-1]) nodecount = int(accepted['nodecount'][-1]) localjobname = accepted['localjobname'][-1] - sandboxkey = accepted['sandboxkey'][-1] execution_delay = int(accepted['execution_delay'][-1]) exe_pgid = int(accepted['exe_pgid'][-1]) @@ -130,22 +129,6 @@ def main(client_id, user_arguments_dict): 'invalid request new job source'}) return (output_objects, returnvalues.CLIENT_ERROR) - if resource_conf.get('SANDBOX', False): - if sandboxkey == '': - logger.error("Missing sandboxkey for sandbox resource: %s" % - unique_resource_name) - output_objects.append( - {'object_type': 'error_text', 'text': - 'sandbox must set sandboxkey in job requests!'}) - return (output_objects, returnvalues.CLIENT_ERROR) - # resource is a sandbox and a sandboxkey was received - if resource_conf['SANDBOXKEY'] != sandboxkey: - logger.error("Incorrect sandboxkey for sandbox resource: %s : %s" - % (unique_resource_name, sandboxkey)) - output_objects.append({'object_type': 'error_text', 'text': - 'sandbox provided an invalid sandboxkey!'}) - return (output_objects, returnvalues.CLIENT_ERROR) - # TODO: add full session ID check here # If the server is under heavy usage, requestjobs might come too fast and @@ -256,7 +239,7 @@ def main(client_id, user_arguments_dict): output_objects.append( {'object_type': 'text', 'text': 'REQUESTNEWJOB OK. The job will ' - 'be sent to the resource: %s.%s %s %s (sandboxkey: %s)' + 'be sent to the resource: %s.%s %s %s' % (unique_resource_name, exe, exe_pgid, - os.getenv('REMOTE_ADDR'), sandboxkey)}) + os.getenv('REMOTE_ADDR'))}) return (output_objects, status) diff --git a/mig/shared/functionality/resadmin.py b/mig/shared/functionality/resadmin.py index 4cc377fb3..98567e4e2 100755 --- a/mig/shared/functionality/resadmin.py +++ b/mig/shared/functionality/resadmin.py @@ -39,7 +39,7 @@ from mig.shared import returnvalues from mig.shared.accessrequests import list_access_requests, load_access_request, \ build_accessrequestitem_object -from mig.shared.base import sandbox_resource, hexlify +from mig.shared.base import hexlify from mig.shared.defaults import default_pager_entries, csrf_field from mig.shared.functional import validate_input_and_cert from mig.shared.handlers import get_csrf_limit, make_csrf_token @@ -583,8 +583,6 @@ def main(client_id, user_arguments_dict): owned = 0 res_map = get_resource_map(configuration) for unique_resource_name in res_map: - if sandbox_resource(unique_resource_name): - continue owner_list = res_map[unique_resource_name][OWNERS] resource_config = res_map[unique_resource_name][CONF] visible_res_name = res_map[unique_resource_name][RESID] diff --git a/mig/shared/functionality/resman.py b/mig/shared/functionality/resman.py index 8bcb097ef..9496857a9 100644 --- a/mig/shared/functionality/resman.py +++ b/mig/shared/functionality/resman.py @@ -32,7 +32,6 @@ import time from mig.shared import returnvalues -from mig.shared.base import sandbox_resource from mig.shared.defaults import default_pager_entries, csrf_field from mig.shared.functional import validate_input_and_cert from mig.shared.handlers import get_csrf_limit, make_csrf_token @@ -51,8 +50,7 @@ def signature(): """Signature of the main function""" - defaults = {'show_sandboxes': ['false'], 'operation': ['show'], - 'caching': ['false']} + defaults = {'operation': ['show'], 'caching': ['false']} return ['resources', defaults] @@ -76,7 +74,6 @@ def main(client_id, user_arguments_dict): if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) - show_sandboxes = (accepted['show_sandboxes'][-1] != 'false') operation = accepted['operation'][-1] caching = (accepted['caching'][-1].lower() in ('true', 'yes')) @@ -172,7 +169,7 @@ def main(client_id, user_arguments_dict): # Iterate through resources and show management for each one requested fields = ['PUBLICNAME', 'NODECOUNT', 'CPUCOUNT', 'MEMORY', 'DISK', - 'ARCHITECTURE', 'SANDBOX', 'RUNTIMEENVIRONMENT'] + 'ARCHITECTURE', 'RUNTIMEENVIRONMENT'] # NOTE: only resources that user is allowed to access are listed. # Resource with neither exes nor stores are not shown to anyone @@ -184,8 +181,6 @@ def main(client_id, user_arguments_dict): if visible_res_name in anon_map: unique_resource_name = anon_map[visible_res_name] - if not show_sandboxes and sandbox_resource(unique_resource_name): - continue res_obj = {'object_type': 'resource', 'name': visible_res_name} # NOTE: res may not yet have been added to res_map here @@ -264,23 +259,6 @@ def main(client_id, user_arguments_dict): 'resources': resources}) if operation in show_operations: - if configuration.site_enable_sandboxes: - if show_sandboxes: - output_objects.append({'object_type': 'link', - 'destination': '?show_sandboxes=false', - 'class': 'removeitemlink iconspace', - 'title': 'Hide sandbox resources', - 'text': 'Exclude sandbox resources', - }) - - else: - output_objects.append({'object_type': 'link', - 'destination': '?show_sandboxes=true', - 'class': 'additemlink iconspace', - 'title': 'Show sandbox resources', - 'text': 'Include sandbox resources', - }) - output_objects.append( {'object_type': 'sectionheader', 'text': 'Resource Status'}) output_objects.append({'object_type': 'text', @@ -305,20 +283,11 @@ def main(client_id, user_arguments_dict): output_objects.append({'object_type': 'link', 'destination': 'resedit.py', 'class': 'addlink iconspace', - 'title': 'Show sandbox resources', + 'title': 'Create resource', 'text': 'Create a new %s resource' % configuration.short_title, }) output_objects.append({'object_type': 'sectionheader', 'text': ''}) - if configuration.site_enable_sandboxes: - output_objects.append({ - 'object_type': 'link', - 'destination': 'ssslogin.py', - 'class': 'adminlink iconspace', - 'title': 'Administrate and monitor your sandbox resources', - 'text': 'Administrate %s sandbox resources' % - configuration.short_title}) - logger.info("%s %s end for %s" % (op_name, operation, client_id)) return (output_objects, status) diff --git a/mig/shared/functionality/showstats.py b/mig/shared/functionality/showstats.py index a8b895db2..d78f06406 100644 --- a/mig/shared/functionality/showstats.py +++ b/mig/shared/functionality/showstats.py @@ -316,32 +316,6 @@ def main(client_id, user_arguments_dict): keys = set([date[-1] for date in lookupdict]) datarows = [] - # machine view should present only a sum of all "sandbox" resources. - # We sum all matching machines in all fields - if display == 'machine': - sums = [[((d, 'sandbox (sum)'), - dict([(n, 0) for n in table_names]))] - for d in dates] - - def concat(l1, l2): return l1+l2 - sumdict = dict(reduce(concat, sums)) - - new_keys = [] - for k in keys: - if re.match("sandbox", k): - new_keys.append('sandbox (sum)') - for d in dates: - if (d, k) in lookupdict: - for n in table_names: - sumdict[(d, 'sandbox (sum)') - ][n] += lookupdict[(d, k)][n] - del lookupdict[(d, k)] - else: - new_keys.append(k) - - lookupdict = dict(list(lookupdict.items()) + list(sumdict.items())) - keys = list(set(new_keys)) - # keys should be shortened, especially only use the CN part of # user DNs. This will be called when building data rows def short_key(key_part): @@ -361,10 +335,6 @@ def short_key(key_part): # (not mere membership, since everybody is Generic-member) def key_to_show(key): if display == 'machine': - # these are members of Generic, so show them (sum. see above) - if re.match("sandbox", key): - return True - # Problem: this function returned True for Generic! (bug) is_res_list = [vgrid.vgrid_is_resource(n, key, configuration) for n in my_vgrids] diff --git a/mig/shared/functionality/sssadmin.py b/mig/shared/functionality/sssadmin.py deleted file mode 100755 index 193822c46..000000000 --- a/mig/shared/functionality/sssadmin.py +++ /dev/null @@ -1,427 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssadmin - SSS sandbox generator and monitor for individual users -# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This script allows users to administrate their sandboxes""" - -from __future__ import absolute_import - -import datetime - -from mig.shared import returnvalues -from mig.shared.defaults import default_vgrid, csrf_field -from mig.shared.functional import validate_input, REJECT_UNSET -from mig.shared.gridstat import GridStat -from mig.shared.handlers import get_csrf_limit, safe_handler, make_csrf_token -from mig.shared.init import initialize_main_variables -from mig.shared.sandbox import load_sandbox_db, save_sandbox_db - -# sandbox db has the format: {username: (password, [list_of_resources])} - -PW, RESOURCES = 0, 1 - - -def signature(): - """Signature of the main function""" - defaults = { - 'username': REJECT_UNSET, - 'password': REJECT_UNSET, - 'newuser': ['off'], - 'expert': ['false'], - } - return ['html_form', defaults] - - -def print_hd_selection(): - """Returns html section where a user chooses disc space""" - html = """ - - How much disc space can you allow the sandbox to use? - - - -""" - return html - - -def print_net_selection(): - """Returns html section where a user chooses max download and upload speed""" - html = """ - - What is the max download/upload bandwidth in kB/s you will allow -the sandbox to use? - - - -""" - return html - - -def print_mem_selection(): - """Prints html section where a user amount of physical memory""" - html = """ - - How much physical memory does your PC have? - - -""" - return html - - -def print_os_selection(): - """Prints html section where a user chooses which OS he uses""" - html = """ - - Which operating system are you using? - - -""" - return html - - -def print_windows_solution_selection(): - """Prints html section where a user chooses whether he wants - the screensaver or the windows service model""" - html = """ - - If Windows, do you want the screensaver or the service model? If -unsure, choose screensaver - - -""" - return html - - -def print_expert_settings(configuration, display): - """Prints html section where a user chooses whether he wants - the advanced settings like image format and vgrid""" - if display: - html = """ - - Which kind of disk image would you like? - - - - Which %(_label)s do you want the sandbox to work for? - - - -""" % {'default_vgrid': default_vgrid, - '_label': configuration.site_vgrid_label} - else: - html = """ - - - - - - -""" % {'default_vgrid': default_vgrid} - return html - - -def count_jobs(grid_stat, resource_name): - """Counts number of jobs executed by given resource""" - - # grid_stat.update() - - value = grid_stat.get_value(grid_stat.RESOURCE_TOTAL, - resource_name, 'FINISHED') - return value - - -def sum_walltime(grid_stat, resource_name): - """Sum total walltime used by jobs executed by given resource""" - - # grid_stat.update() - - value = grid_stat.get_value(grid_stat.RESOURCE_TOTAL, - resource_name, 'USED_WALLTIME') - return value - - -def show_download(configuration, userdb, user, passwd, expert): - """Shows download form""" - - # Download sandbox section - - form_method = 'post' - csrf_limit = get_csrf_limit(configuration) - fill_helpers = { - 'user': user, - 'passwd': passwd, - 'toggle_expert': not expert, - 'form_method': form_method, - 'csrf_field': csrf_field, - 'csrf_limit': csrf_limit - } - target_op = 'ssscreateimg' - csrf_token = make_csrf_token(configuration, form_method, target_op, user, - csrf_limit) - fill_helpers.update({'target_op': target_op, 'csrf_token': csrf_token}) - - html = """ -
- - - - - -""" % fill_helpers - - html += print_hd_selection() - html += print_mem_selection() - html += print_net_selection() - html += print_os_selection() - html += print_windows_solution_selection() - html += print_expert_settings(configuration, expert) - - html += """ - - - -""" % fill_helpers - html += """ - - - - -
- Download New Sandbox -
- - -
Press 'Submit' to download - please note that it may take up -to 2 minutes to generate your sandbox -
-
-
-""" - target_op = 'sssadmin' - csrf_token = make_csrf_token(configuration, form_method, target_op, user, - csrf_limit) - fill_helpers.update({'target_op': target_op, 'csrf_token': csrf_token}) - - html += """ - - - - -
- Advanced users may want to fine tune the sandbox to download by -switching to expert mode: -
- - - - - -
-
-""" % fill_helpers - return html - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, - op_menu=client_id) - output_objects.append( - {'object_type': 'header', 'text': - 'Personal Sandbox Administration and Monitor'}) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, - allow_rejects=False) - if not validate_status: - output_objects.append( - {'object_type': 'link', 'destination': 'ssslogin.py', 'text': - 'Retry login'}) - return (accepted, returnvalues.CLIENT_ERROR) - - username = accepted['username'][-1].strip() - password = accepted['password'][-1].strip() - newuser = accepted['newuser'][-1].strip() - expert_string = accepted['expert'][-1].strip() - expert = False - if 'true' == expert_string.lower(): - expert = True - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - # Load the user DB - - try: - userdb = load_sandbox_db(configuration) - except IOError: - - # First time - create empty dict - - userdb = {} - except Exception as exc: - output_objects.append({'object_type': 'error_text', 'text': - 'Could not read sandbox database!'}) - logger.error("failed reading sandbox database: %s" % exc) - return (output_objects, returnvalues.SYSTEM_ERROR) - - grid_stat = GridStat(configuration, logger) - - # If it's a new user, check that the username is free - - if newuser == 'on': - if not safe_handler(configuration, 'post', op_name, client_id, - get_csrf_limit(configuration), accepted): - output_objects.append( - {'object_type': 'error_text', 'text': '''Only accepting -CSRF-filtered POST requests to prevent unintended updates'''}) - return (output_objects, returnvalues.CLIENT_ERROR) - - if username in userdb: - output_objects.append( - {'object_type': 'error_text', 'text': - 'Username is already taken - please try again with another...' - }) - output_objects.append({'object_type': 'link', 'destination': - 'ssslogin.py', 'text': 'Retry login' - }) - return (output_objects, returnvalues.CLIENT_ERROR) - elif len(username) < 3: - - # print "Back" - - output_objects.append( - {'object_type': 'error_text', 'text': - 'Please choose a username with 3 or more characters.' - }) - output_objects.append({'object_type': 'link', 'destination': - 'ssslogin.py', 'text': 'Retry login' - }) - return (output_objects, returnvalues.CLIENT_ERROR) - else: - - # print "Back" - # Create new user with empty resource list - - try: - newuser = {username: (password, [])} - userdb.update(newuser) - save_sandbox_db(userdb, configuration) - except Exception as exc: - output_objects.append( - {'object_type': 'error_text', 'text': - 'Could not save your user in the user database!'}) - logger.error('failed to save %r in database: %s' % (username, - exc)) - return (output_objects, returnvalues.SYSTEM_ERROR) - output_objects.append( - {'object_type': 'text', 'text': 'User created!'}) - - # Existing or just created user: check that username and password is correct - - if username not in userdb: - output_objects.append({'object_type': 'error_text', 'text': - 'Wrong username - please try again...' - }) - output_objects.append({'object_type': 'link', 'destination': - 'ssslogin.py', 'text': 'Retry login' - }) - return (output_objects, returnvalues.CLIENT_ERROR) - elif userdb[username][PW] != password: - output_objects.append({'object_type': 'error_text', 'text': - 'Wrong password - please try again...' - }) - output_objects.append({'object_type': 'link', 'destination': - 'ssslogin.py', 'text': 'Retry login' - }) - return (output_objects, returnvalues.CLIENT_ERROR) - else: - - # Resource Monitor Section - # Time stamp - - msg = "Your SSS sandbox resources and their individual job statistics" - output_objects.append({'object_type': 'text', 'text': msg}) - now = datetime.datetime.now() - output_objects.append( - {'object_type': 'text', 'text': 'Updated on %s' % now}) - - sandboxinfos = [] - for resource in userdb[username][RESOURCES]: - sandboxinfo = {'object_type': 'sandboxinfo'} - sandboxinfo['username'] = username - sandboxinfo['resource'] = resource - sandboxinfo['jobs'] = count_jobs(grid_stat, resource) - sandboxinfo['walltime'] = sum_walltime(grid_stat, resource) - sandboxinfos.append(sandboxinfo) - - output_objects.append( - {'object_type': 'sandboxinfos', 'sandboxinfos': sandboxinfos}) - - output_objects.append({'object_type': 'html_form', 'text': '
'}) - output_objects.append({'object_type': 'html_form', 'text': - show_download(configuration, userdb, username, - password, expert)}) - output_objects.append({'object_type': 'text', 'text': """ -If you run into any problems, please contact the %s site support (%s)""" % - (configuration.short_title, - configuration.support_email)}) - - return (output_objects, returnvalues.OK) diff --git a/mig/shared/functionality/ssscreateimg.py b/mig/shared/functionality/ssscreateimg.py deleted file mode 100644 index 18ed810ec..000000000 --- a/mig/shared/functionality/ssscreateimg.py +++ /dev/null @@ -1,466 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# ssscreateimg - Back end to SSS zip generator -# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This script generates a sandbox image""" - -from __future__ import absolute_import - -from builtins import range -import os -import time -import tempfile -import shutil -import fcntl - -from mig.shared import resadm, returnvalues -from mig.shared.base import hexlify -from mig.shared.conf import get_resource_configuration, get_resource_exe -from mig.shared.defaults import default_vgrid -from mig.shared.fileio import make_symlink, write_zipfile, copy -from mig.shared.functional import validate_input, REJECT_UNSET -from mig.shared.handlers import safe_handler, get_csrf_limit -from mig.shared.init import initialize_main_variables -from mig.shared.sandbox import load_sandbox_db, save_sandbox_db, \ - create_sss_resource -from mig.shared.safeeval import subprocess_call -from mig.shared.vgridaccess import get_vgrid_map_vgrids - -# sandbox db has the format: {username: (password, [list_of_resources])} - -PW, RESOURCES = 0, 1 - - -def signature(): - """Signature of the main function""" - - defaults = {'username': REJECT_UNSET, - 'password': REJECT_UNSET, - 'hd_size': REJECT_UNSET, - 'image_format': ['raw'], - 'net_bw': REJECT_UNSET, - 'memory': REJECT_UNSET, - 'operating_system': [''], - 'win_solution': [''], - 'vgrid': [default_vgrid]} - return ['zip', defaults] - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, - op_menu=client_id) - output_objects.append({'object_type': 'header', 'text': '%s Screen Saver Sandbox Download' % - configuration.short_title}) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - username = accepted['username'][-1] - password = accepted['password'][-1] - hd_size = accepted['hd_size'][-1] - image_format = accepted['image_format'][-1] - net_bw = accepted['net_bw'][-1] - memory = accepted['memory'][-1] - operating_system = accepted['operating_system'][-1] - win_solution = accepted['win_solution'][-1] - vgrid_list = accepted['vgrid'] - cputime = 1000000 - sandboxkey = hexlify(os.urandom(32)) - ip_address = 'UNKNOWN' - if 'REMOTE_ADDR' in os.environ: - ip_address = os.environ['REMOTE_ADDR'] - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - if not safe_handler(configuration, 'post', op_name, username, - get_csrf_limit(configuration), accepted): - output_objects.append( - {'object_type': 'error_text', 'text': '''Only accepting -CSRF-filtered POST requests to prevent unintended updates''' - }) - return (output_objects, returnvalues.CLIENT_ERROR) - - # check that requested image format is valid - - if not image_format in ['raw', 'qcow', 'cow', 'qcow2', 'vmdk']: - output_objects.append({'object_type': 'error_text', 'text': - 'Unsupported image format: %s' % image_format}) - return (output_objects, returnvalues.CLIENT_ERROR) - - # check that requested vgrids are valid - anybody can offer their sandbox - # for a vgrid but it is still left to the vgrid owners to explicitly - # accept all resources - - all_vgrids = get_vgrid_map_vgrids(configuration) - for vgrid in vgrid_list: - if not vgrid in all_vgrids: - output_objects.append({'object_type': 'error_text', 'text': - 'Failed to validate %s %s: %s' - % (configuration.site_vgrid_label, vgrid, - all_vgrids)}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # Load the user file - - try: - userdb = load_sandbox_db(configuration) - except Exception as exc: - output_objects.append({'object_type': 'error_text', 'text': - 'Failed to read login info!'}) - logger.error("loading sandbox db failed: %s" % exc) - return (output_objects, returnvalues.SYSTEM_ERROR) - - if username not in userdb or userdb[username][PW] != password: - output_objects.append( - {'object_type': 'error_text', 'text': - 'Wrong username or password - please try again...' - }) - output_objects.append( - {'object_type': 'link', 'destination': 'ssslogin.py', 'text': - 'Retry login'}) - return (output_objects, returnvalues.CLIENT_ERROR) - - # provide a resource name - - resource_name = 'sandbox' - - logger.info('''Generating %s linux sandbox dist with hd size %s and mem -%s for user %s from %s running OS %s ....''' % (configuration.short_title, - hd_size, memory, username, - ip_address, operating_system)) - - (create_status, unique_host_name) = create_sss_resource( - sandboxkey, cputime, memory, hd_size, net_bw, vgrid_list, - configuration, logger) - if create_status: - logger.info('Created sandbox resource configuration') - else: - output_objects.append({'object_type': 'error_text', 'text': - unique_host_name}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - host_url, resource_identifier = unique_host_name.rsplit('.', 1) - - # add the resource to the list of the users resources - - userdb[username][1].append(unique_host_name) - - try: - save_sandbox_db(userdb, configuration) - except Exception as exc: - output_objects.append({'object_type': 'error_text', 'text': - 'Could not update sandbox database!'}) - logger.error('save sandbox db for %s update failed: %s' % (username, - exc)) - return (output_objects, returnvalues.SYSTEM_ERROR) - - logger.debug('building resource specific files for %s' - % unique_host_name) - - # create sandboxlink - - sandbox_link = configuration.sandbox_home + sandboxkey - resource_path = os.path.abspath(configuration.resource_home - + unique_host_name) - make_symlink(resource_path, sandbox_link, logger) - - # change dir to sss_home - - old_path = os.getcwd() - - # log_dir = "log/" - - # read pickled resource conf file (needed to create - # master_node_script.sh) - - msg = '' - (status, resource_config) = \ - get_resource_configuration(configuration.resource_home, - unique_host_name, logger) - logger.debug('got resource conf %s' % resource_config) - if not resource_config: - output_objects.append({'object_type': 'error_text', 'text': - "No resouce_config for: %r" % unique_host_name}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # read pickled exe conf file (needed to create master_node_script.sh) - - (status, exe) = get_resource_exe(resource_config, 'localhost', logger) - if not exe: - output_objects.append({'object_type': 'error_text', 'text': - "No 'localhost' EXE config for: %r" % - unique_host_name}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - resource_dir = os.path.join(configuration.resource_home, unique_host_name) - - # create master_node_script - - try: - - # Securely open a temporary file in resource_dir - - (master_node_script_file, mns_fname) = \ - tempfile.mkstemp(dir=resource_dir, - text=True) - (master_status, msg) = resadm.fill_master_node_script( - master_node_script_file, resource_config, exe, 1000) - if not master_status: - output_objects.append({'object_type': 'error_text', 'text': - 'Filling script failed: %s' % msg}) - return (output_objects, returnvalues.SYSTEM_ERROR) - os.close(master_node_script_file) - logger.debug('wrote master node script %s' % mns_fname) - except Exception as err: - output_objects.append({'object_type': 'error_text', 'text': - 'Creating script failed: %s' % msg}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # create front_end_script - - try: - (fe_script_file, fes_fname) = tempfile.mkstemp(dir=resource_dir, - text=True) - (fe_status, msg) = resadm.fill_frontend_script( - fe_script_file, configuration.migserver_https_sid_url, - unique_host_name, resource_config) - - if not fe_status: - output_objects.append({'object_type': 'error_text', 'text': - 'Filling script failed: %s' % msg}) - return (output_objects, returnvalues.SYSTEM_ERROR) - os.close(fe_script_file) - logger.debug('wrote frontend script %s' % fes_fname) - except Exception as err: - output_objects.append({'object_type': 'error_text', 'text': - 'Creating script failed: %s' % msg}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # change directory to sss_home and mount hd image in order to copy - # the FE-script and masternode script to the hd - - logger.debug('modifying hda image for this sandbox') - - mnt_path = os.path.join(configuration.sss_home, 'mnt') - - lock_path = os.path.join(configuration.sss_home, 'lockfile.txt') - if not os.path.isfile(lock_path): - try: - touch_lockfile = open(lock_path, 'w') - touch_lockfile.write('this is the lockfile') - touch_lockfile.close() - except Exception as exc: - output_objects.append({'object_type': 'error_text', 'text': - 'Could not create lock file!'}) - logger.error("failed to make sandbox lockfile: %s" % exc) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # ## Enter critical region ### - - lockfile = open(lock_path, 'r+') - fcntl.flock(lockfile.fileno(), fcntl.LOCK_EX) - - # unmount leftover disk image mounts if any - - if os.path.ismount(mnt_path): - logger.warning('unmounting leftover mount point') - # NOTE: we don't need explicit shell here - subprocess_call('sync') - subprocess_call(['umount', mnt_path]) - subprocess_call('sync') - - # create individual key files - - try: - key_path = os.path.join(configuration.sss_home, 'keyfile') - server_path = os.path.join(configuration.sss_home, 'serverfile') - fd = open(key_path, 'w') - fd.write(sandboxkey) - fd.close() - fd = open(server_path, 'w') - fd.write(configuration.migserver_https_sid_url) - fd.close() - except Exception as err: - output_objects.append({'object_type': 'error_text', 'text': - 'Creating script failed: %s' % msg}) - logger.error("saving key files failed: %s" % err) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # use a disk of the requested size - - src_path = os.path.join(configuration.sss_home, 'MiG-SSS', - 'hda_' + hd_size + '.img') - dst_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'hda.img') - copy(src_path, dst_path) - - # mount hda and copy scripts to it - - logger.info('calling mount %s' % mnt_path) - # NOTE: we don't need explicit shell here - subprocess_call(['mount', mnt_path]) - - for i in range(60): - if not os.path.ismount(mnt_path): - logger.warning('waiting for mount point to appear...') - time.sleep(1) - - if not os.path.ismount(mnt_path): - output_objects.append({'object_type': 'error_text', 'text': - 'Failed to mount sandbox disk image!'}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - failed = False - try: - - # save master_node_script to hd image - - master_dst = os.path.join(mnt_path, 'mig', 'MiG', 'mig_exe', - 'master_node_script_localhost.sh') - shutil.copyfile(mns_fname, master_dst) - - # save frontend_script to hd image - - fe_dst = os.path.join(mnt_path, 'mig', 'MiG', 'mig_frontend', - 'frontend_script.sh') - shutil.copyfile(fes_fname, fe_dst) - - # copy the sandboxkey to the keyfile: - - key_dst = os.path.join(mnt_path, 'mig', 'etc', 'keyfile') - shutil.copyfile(os.path.join(configuration.sss_home, 'keyfile'), - key_dst) - server_dst = os.path.join(mnt_path, 'mig', 'etc', 'serverfile') - shutil.copyfile(os.path.join(configuration.sss_home, 'serverfile'), - server_dst) - except Exception as err: - output_objects.append({'object_type': 'error_text', 'text': - 'Failed to customize image!'}) - logger.error("could not customize image: %s" % err) - failed = True - - # unmount disk image - - # NOTE: we don't need explicit shell here - subprocess_call('sync') - subprocess_call(['umount', mnt_path]) - subprocess_call('sync') - - for i in range(60): - if os.path.ismount(mnt_path): - logger.warning('waiting for mount point to disappear...') - time.sleep(1) - - if failed: - return (output_objects, returnvalues.SYSTEM_ERROR) - - logger.debug('finished modifying hda image') - - # Optional conversion to requested disk image format - - if 'raw' != image_format: - logger.debug('Converting disk image to %s format' % image_format) - image_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'hda.img') - tmp_path = image_path + '.' + image_format - command_list = ['qemu-img', 'convert', '-f raw', image_path, '-O', - image_format, tmp_path] - command = ' '.join(command_list) - # NOTE: we use command list to avoid shell requirement here - subprocess_call(command_list) - os.remove(image_path) - os.rename(tmp_path, image_path) - logger.debug('converted hda image to %s format' % image_format) - - zip_path = os.path.join(configuration.sss_home, - 'MiG-SSS_%d' % resource_identifier + '.zip') - iso_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'MiG.iso') - img_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'hda.img') - xsss_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'mig_xsss.py') - readme_path = os.path.join(configuration.sss_home, 'MiG-SSS', 'readme.txt') - setup_path = os.path.join(configuration.sss_home, 'MiG-SSS', - 'MiG-SSS_Setup.exe') - service_path = os.path.join(configuration.sss_home, 'MiG-SSS', - 'MiG-SSS-Service_Setup.exe') - if operating_system == 'linux': - - # Put all linux-related files in a zip archive - - (zip_status, zip_msg) = write_zipfile(zip_path, - [iso_path, img_path, xsss_path, - readme_path], - 'MiG-SSS') - if not zip_status: - logger.error('Failed to create zip file: %s' % zip_msg) - - else: - - if win_solution == 'screensaver': - - # Put all win-related files in the archive (do not store dir - # name: -j) - - (zip_status, zip_msg) = write_zipfile(zip_path, [setup_path, - iso_path, - img_path], '') - else: - - # windows service - - (zip_status, zip_msg) = write_zipfile(zip_path, [service_path, - iso_path, - img_path], '') - - # ## Leave critical region ### - - lockfile.close() # unlocks lockfile - - logger.info('Created image and packed files in zip for download') - - # Everything went as planned - switch to raw output for download - - file_size = os.stat(zip_path).st_size - headers = [('Content-Type', 'application/zip'), - ('Content-Type', 'application/force-download'), - ('Content-Type', 'application/octet-stream'), - ('Content-Type', 'application/download'), - ('Content-Disposition', 'attachment; filename=%s' % - os.path.basename(zip_path)), - ('Content-Length', '%s' % file_size)] - output_objects = [{'object_type': 'start', 'headers': headers}] - fd = open(zip_path, 'rb') - output_objects.append({'object_type': 'binary', 'data': fd.read()}) - fd.close() - os.remove(zip_path) - return (output_objects, returnvalues.OK) diff --git a/mig/shared/functionality/sssfaq.py b/mig/shared/functionality/sssfaq.py deleted file mode 100755 index 52760ff05..000000000 --- a/mig/shared/functionality/sssfaq.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssfaq - SSS frequently asked questions -# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This script is the welcome site for sandbox users""" - -from __future__ import absolute_import - -from mig.shared import returnvalues -from mig.shared.functional import validate_input -from mig.shared.init import initialize_main_variables - -default_language = 'english' - - -def signature(): - """Signature of the main function""" - - defaults = {'language': [default_language]} - return ['html_form', defaults] - - -html = {} -html['maintenance'] = \ - """ -Sorry we are currently down for maintenance, we'll be back shortly -""" - -html['english'] = \ - """ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
På dansk

What happens when the screen saver deactivates?

The sandbox is shut down and all hardware resources are given back to you. Any running job within the sandbox is killed and will eventually be scheduled for another resource by the %(site)s system. Work on suspending the job and sending it to another resource that can continue from where the job was suspended is in progress.

Is the sandbox running correctly?

If you don't get any error messages, you can assume that the sandbox is running correctly. After a while, you can login at the login-site and see the number of jobs that have been executed.

What kind of jobs will be running on my computer?

Frankly, we don't know. Anybody with a valid %(site)s user certificate can submit jobs that may end up in your sandbox, and smaller projects are typically quite transient. Many researchers from many different research areas use the system. However, we do know some projects that have been running for a while now on the sandboxes, and project homepages for each project will be available soon.

Can the screen saver show what type of job is running in the sandbox?

Your computer acts as a host system for the guest system that runs grid applications. The guest system runs in a sandbox, a virtual machine. There is no way for the two to interact; the grid job running in the guest system is not even aware of the fact that it is not running natively on a real physical machine, and the host system sees the virtual machine as any other user process. Hence, the screen saver which runs on the host system cannot know what is running inside the guest system.

Which job is currently running on my machine?

Anonymity between the users who submit jobs and the resource providers who donate the computing power is a key issue in the %(site)s design. Users do not know where their jobs will be executed, and resource owners do not know any details about the jobs their computer will execute. %(site)s keeps track of all jobs and resources, however, so in the event of abuse we can and will hold the misbehaving individuals responsible

How much time do the jobs need to complete?

It varies. It is up to the user to make sure that the jobs are suited for the screen saver model. We recommend below 60 minutes.

Will this program eat my entire internet connection?

No. By default, sandboxes will only download jobs and input files at max 256 kB/s and upload result files at max 128 kB/s, and you can set these appropriately when you download the sandbox. Further, the sandbox model only applies to small jobs that don't need to access big files.

How do I see how many jobs I've executed?

If you login to the download site, you'll see a list of your resources and the number of jobs executed by each of them. Alternatively you may take a look at the overall sandbox monitor. Work is in progress on a credential system which will give a better presentation of user credits.

Can the sandbox function behind a firewall/router/switch?

Yes, however, some firewalls block individual applications in which case it is necessary to unblock the sandbox application, Qemu. Apart from that, the sandbox only uses standard protocols (HTTP and HTTPS) that are normally open for outbound access, and all communication is initiated by the sandbox, i.e. the Grid system never contacts the sandbox, since this would not be possible had the sandbox resided behind an NAT router.

What's the difference between the screen saver and the Windows service model?

The screen saver model ensures that the computer is only working on Grid jobs when the screen saver is activated. This model is installed by default. In the Windows Service model, the sandbox is running constantly in the background whenever the computer is on. Note that this model requires administrator privileges to install the service. If you choose to install the Service model, the screen saver will not be activated.

How is this projet different from other @home projects such as seti@home, folding@home, etc.?

The existing @home projects are not true grid computing but merely one-way systems to which you can only donate your machine to a specific research project. In %(site)s, any user of the system can submit a job without porting it to a specific framework. Further, as the @home clients will execute the applications natively on your computer, they can, theoretically, compromise your computer.
Back to Sandbox login page
-
-""" - -html['danish'] = \ - """ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
In English

Intro

Velkommen til %(site)s-SSS. Ved at downloade og installere denne software vil din PC, når screensaveren er aktiv, donere overskydende regnekraft til løsning af videnskabelige problemer. Det eneste, der kræves er, at man logger ind, downloader softwaren og følger installationsproceduren.
-

Hvad sker der nå screen-saveren stopper?

Sandkassen stoppes og alle de hardware resurser den har reserveret frigives til dig igen når screen-saveren stopper. Eventuelt igangværende jobs i sandkassen lukkes ned og bliver med tiden sendt ud til en ny resurse og kørt forfra af %(site)s systemet. Arbejde på at suspendere/pause jobs så de direkte kan køre videre på en anden resurse er igang.

Kører sandkassen kkorrekt?

Medmindre du får fejlbeskeder, kan du regne med at sandkassen fungerer som den skal. Når sandkassen har kørt et stykke tid kan du gå ind på sandkasse login-siden og følge med i hvor mange jobs den har kørt.

Hvilken slags jobs kører på min computer?

Dybest set ved vi det ikke. Hvem som helst med et gyldigt %(site)s bruger certifikat kan indsende jobs til at køre på en vilkårlig sandkasse resurse, og mindre forskningsprojekter er typisk ret kortvarige. Mange forskere fra mange forskellige forskningsområder benytter systemet til deres forskning. Vi uddeler ikke %(site)s bruger certifikater til hvem som helst, så du kan være sikker på at jobs i hvert fald bruges til samfundsgavnlig forskning. Vi håber snarest at få nogle af de aktive grupper til at lave projektsider på nettet med yderligere informationer om - og baggrund for deres forskning, så den noget uklare beskrivelse kan konkretiseres.

Kan screen-saveren vise hvilken slags job den kører i sandkassen?

Din computer fungerer som et værtssystem for det gæstesystem, der kører grid applikationer. Gæstesystemet kører i en sandkasse, en virtuel maskine. De to systemer har derfor ingen måde at interagere på; grid applikationen, som kører under gæstesystemet er faktisk slet ikke klar over at den ikke kører direkte på en fysisk computer, og værtssystemet ser bare den virtuelle maskine som en vilkålig anden program-process. Derfor kan screen-saveren på værtssystemet ikke vide hvad der kører inde i gæstesystemet.

Hvilket job kører i øjeblikket på min computer?

Anonymitet mellem brugere der indsender jobs og resurser der kører dem med deres overskydende regnekraft er et overordnet designvalg i %(site)s. Så brugere ved som udgangspunkt ikke hvor deres jobs faktisk køres og resurseejere kender ikke til ejerskabet for de enkelte jobs. %(site)s holder dog styr på alle jobs og resurser, så hvis nogen misbruger tilliden kan og vil de blive holdt til ansvar.

Hvor længe tager jobs om at køre færdige?

Kort sagt er det meget forskelligt. Det overlades til den enkelte bruger at sikre at hendes jobs er egnede til at køre i sandkasse-resurser, som kan komme og gå uden varsel. Vi anbefaler derfor at brugere sørger for at deres sandkassejobs gør sig færdige indenfor 60 minutter. Hvis ikke de kan blive helt færdige på den tid, kan forskellige check pointing løsninger overvejes, så et delresultat gemmes til at arbejde videre på senere .

Vil sandkassen æde hele min internetforbindelse?

Nej, som udgangspunkt henter sandkasser kun job- og input-filer med op til 256 kB/s og sender resultatfiler med op til 128 kB/s, og du kan skrue yderlige ned eller op på disse værdier når du genererer og henter din sandkasse. Selv med de mindste ADSL løsninger på markedet skulle standard-indstillingerne dog være uproblematiske. Yderligere er sandkasse-modellen hovedsageligt henvendt til små jobs, der kan klare sig uden store datafiler, så overførslerne tager ikke lang tid.

Hvordan ser jeg hvor mange jobs min sandkasse har kørt?

Hvis du åbner sandkasse startsiden og logger ind, når du frem til en monitor side med en liste over dine sandkasse-resurser og deres kørte jobs. Du kan også se hvor meget dine sandkasser har ydet sammenlignet med andre brugeres på den samlede sandkasse monitor. Der arbejdes på at lave et mere finkornet opregning af hvad de enkelte resurser har leveret så det er lettere at sammenligne.

Kan sandkasser fungere bag en firewall/router/switch?

Ja, men nogle firewalls blokkerer individuelle applikationer, hvorfor det kan være nødvendigt at tillade sandkasse applikationen, Qemu, at tilgå internettet. Bortset fra det, benytter sandkassen kun standard protokoller (HTTP og HTTPS), som normalt i forvejen er tilladt for udgående trafik, og al kommunikation initieres fra sandkassen. D.v.s. Grid systemet kontakter aldrig sandkassen men kun omvendt, da det ellers ikke ville være muligt at køre sandkassen bag f.eks. en NAT router.

Hvad er forskellen mellem screen-saver - og Windows service modellen?

Screen-saver modellen sikrer at computeren kun tilbyder regnekraft til Grid jobs når screen-saveren er aktiv. Det er den almindelige model, da det generer brugeren mindst muligt. I Windows Service modellen, kører sandkassen altid i baggrunden når computeren er tændt. Det giver en mere effektiv resurse, da jobs så sjældent afbrydes, men det kræver administrator rettigheder at installere som en service og kan især på ældre og mindre computere genere det daglige brug. Hvis du vælger at installere Service modellen, vil screen-saveren ikke blive brugt.

Hvordan adskiller %(site)s projektet sig fra andre projekter som seti@home, folding@home, o.s.v.?

De eksisterende @home projekter er ikke ægte grid computing, men derimod 'kun' envejs systemer hvori du kan donere din overskydende regnekraft til et specifikt forskningsprojekt, som først har tilpasset sin applikation til systemet. Det betyder bl.a. at det er mere arbejdskrævende for en forsker at komme igang med at få sin forskningsapplikation kørt. Med %(site)s kan en vilkårlig bruger derimod indsende jobs uden først at skulle omskrive sit program til et givet system. Ydermere kører @home programmerne direkte på din computer, hvormed de teoretisk kan misbruge din computer.
Tilbage til sandkasse login siden
-
- - -""" - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, - op_menu=client_id) - output_objects.append({'object_type': 'header', 'text': '%s Screen Saver Sandbox FAQ' % - configuration.short_title}) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - language = accepted['language'][-1] - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - if not language in html: - output_objects.append({'object_type': 'error_text', 'text': - 'Unsupported language: %s, defaulting to %s' - % (language, default_language)}) - language = default_language - output_objects.append({'object_type': 'html_form', 'text': html[language] % - {'site': configuration.short_title}}) - return (output_objects, returnvalues.OK) diff --git a/mig/shared/functionality/sssgetresscript.py b/mig/shared/functionality/sssgetresscript.py deleted file mode 100644 index 1f7f819da..000000000 --- a/mig/shared/functionality/sssgetresscript.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssgetresscript - Load current resource scripts for SSS -# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This is a script download helper for SSS sandboxes""" - -from __future__ import absolute_import - -from mig.shared import returnvalues -from mig.shared.functional import validate_input, REJECT_UNSET -from mig.shared.init import initialize_main_variables -from mig.shared.sandbox import get_resource_name -from mig.shared.resadm import get_frontend_script, get_master_node_script - - -def signature(): - """Signature of the main function""" - - defaults = {'action': REJECT_UNSET, 'sandboxkey': REJECT_UNSET, - 'exe_name': ['localhost']} - return ['text', defaults] - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, op_title=False, - op_menu=client_id) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, - allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - action = accepted['action'][-1] - sandboxkey = accepted['sandboxkey'][-1] - exe_name = accepted['exe_name'][-1] - - status = returnvalues.OK - - # Web format for cert access and no header for SID access - if client_id: - output_objects.append( - {'object_type': 'title', 'text': 'SSS script download'}) - output_objects.append( - {'object_type': 'header', 'text': 'SSS script download'}) - else: - output_objects.append({'object_type': 'start'}) - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - (result, unique_resource_name) = get_resource_name(sandboxkey, logger) - if not result: - msg = unique_resource_name - elif action == 'get_frontend_script': - (result, msg) = get_frontend_script(unique_resource_name, logger) - elif action == 'get_master_node_script': - (result, msg) = get_master_node_script(unique_resource_name, - exe_name, logger) - else: - result = False - msg = 'Unknown action: %s' % action - - if not result: - status = returnvalues.ERROR - - # Status code line followed by raw output - if not client_id: - output_objects.append({'object_type': 'script_status', 'text': ''}) - output_objects.append( - {'object_type': 'binary', 'data': '%s' % status[0]}) - output_objects.append({'object_type': 'binary', 'data': msg}) - return (output_objects, status) diff --git a/mig/shared/functionality/ssslogin.py b/mig/shared/functionality/ssslogin.py deleted file mode 100755 index 4bb61db9e..000000000 --- a/mig/shared/functionality/ssslogin.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# ssslogin - SSS welcome and login backend -# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""This script is the welcome and login site for sandbox users""" - -from __future__ import absolute_import - -from mig.shared import returnvalues -from mig.shared.defaults import csrf_field -from mig.shared.functional import validate_input -from mig.shared.handlers import get_csrf_limit, make_csrf_token -from mig.shared.init import initialize_main_variables - -default_language = 'english' - - -def signature(): - """Signature of the main function""" - - defaults = {'language': [default_language]} - return ['html_form', defaults] - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, - op_menu=client_id) - output_objects.append({'object_type': 'header', 'text': - '%s Screen Saver Sandbox' % configuration.short_title - }) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, - allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - language = accepted['language'][-1] - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - if not language in ("maintenance", "english", "danish"): - output_objects.append({'object_type': 'error_text', 'text': - 'Unsupported language: %s, defaulting to %s' - % (language, default_language)}) - language = default_language - - # print "Default language" - # sys.exit(1) - - html = {} - html['maintenance'] = """ -Sorry we are currently down for maintenance, we'll be back shortly -""" - - form_method = 'post' - csrf_limit = get_csrf_limit(configuration) - fill_helpers = {'site': configuration.short_title, 'form_method': form_method, - 'csrf_field': csrf_field, 'csrf_limit': csrf_limit} - target_op = 'sssadmin' - csrf_token = make_csrf_token(configuration, form_method, target_op, - client_id, csrf_limit) - fill_helpers.update({'target_op': target_op, 'csrf_token': csrf_token}) - - html['english'] = """ -
- - - - - - - - - - - - - - - - - - - -
På dansk

Intro

Welcome to the %(site)s-SSS download site. By downloading and installing this software, your computer will be participating in solving scientific problems whenever the screen saver is on. All you have to do is log in below, download the sandbox, and follow the instructions during the install procedure.

Why Login?

Please note that we do not store any personal information. All you need is a login name which is solely used for identifying sandboxes so that you can keep track of how many jobs your PC has solved while it was idle.

What About Security?

The applications that will be running on your PC when you leave it in screen saver mode are all executed in a so-called 'sandbox'. A sandbox provides a secure execution environment, in which untrusted programs can run. Programs running in the sandbox can neither compromise nor gain access to your PC.

Sandbox monitor

After logging in you will be presented with a list of statistics for your own sandboxes. In case you want to compare your donations to those from other sandbox resource owners, you can take a look at the overall sandbox monitor.

More Questions?

Please check the FAQ, or send us an email.
-
- - - - - - - - - - - - - - - - - - -
Choose a user name:
Choose a password:
I'm a new user
-""" % fill_helpers - - html['danish'] = """ -
- - - - - - - - - - - - - - - - - - - - - -
In English

Intro

Velkommen til %(site)s-SSS. Ved at downloade og installere denne software vil din PC, når den er i screen saver mode, donere den ubrugte CPU-tid til at bidrage med at løse videnskabelige problemer. Det eneste, der kræves er, at man logger ind nedenfor, downloader softwaren og følger installationsproceduren.

Brugernavn

Der gemmes ikke nogen former for personlig information. Der skal blot vælges et brugernavn, som udelukkende bruges til at identificere individuelle bidragsydere, så man kan følge med i hvor mange jobs ens PC har afviklet mens den har været i screen saver mode.

Hvad med sikkerhed?

De programmer der kommer til at køre når din PC er i screen saver mode, vil alle blive afviklet i en såkaldt 'sandkasse'. En sandkasse stiller et sikkert miljø tilrådighed, hvori det er sikkert at køre ukendte programmer. Programmer kørende i sandkassen kan hverken kompromittere eller få tilgang til din PC.

Installationsvejledning

Programmet findes både i en version til Windows XP og Linux. Windowsbrugere downloader en installationsfil, som gør installationen meget simpel. En trin-for-trin guide kan findes her: Installationsguide til Windows

Job monitor

Når du logger ind får du en oversigt over jobs kørt på dine sandkasse resurser. Hvis du gerne vil sammenligne med andres sandkasse donationer, kan du se på den samlede sandkasse monitor.

Flere spørgsmål?

Check om det skulle findes i FAQ'en, ellers send os en email.
- -
- - - - - - - - - - - - -
Vælg et brugernavn:
Vælg et password:
Jeg er ny bruger
-""" % fill_helpers - - output_objects.append({'object_type': 'html_form', 'text': html[language]}) - return (output_objects, returnvalues.OK) diff --git a/mig/shared/functionality/sssmonitor.py b/mig/shared/functionality/sssmonitor.py deleted file mode 100755 index ee57a8d7f..000000000 --- a/mig/shared/functionality/sssmonitor.py +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sssmonitor - Global SSS monitor back end -# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""SSS resource monitor""" - -from __future__ import absolute_import - -from past.builtins import cmp -from datetime import datetime, timedelta - -from mig.shared import returnvalues -from mig.shared.functional import validate_input -from mig.shared.init import initialize_main_variables -from mig.shared.gridstat import GridStat -from mig.shared.sandbox import load_sandbox_db -from mig.shared.output import format_timedelta - -# sandbox db has the format: {username: (password, [list_of_resources])} - -PW, RESOURCES = 0, 1 - - -def signature(): - """Signature of the main function""" - - defaults = {'show_all': [''], 'sort': [''], 'group_by': ['']} - return ['sandboxinfos', defaults] - - -def main(client_id, user_arguments_dict): - """Main function used by front end""" - - (configuration, logger, output_objects, op_name) = \ - initialize_main_variables(client_id, op_header=False, - op_menu=client_id) - output_objects.append({'object_type': 'header', 'text': - '%s Screen Saver Sandbox Monitor' % - configuration.short_title - }) - defaults = signature()[1] - (validate_status, accepted) = validate_input(user_arguments_dict, - defaults, output_objects, - allow_rejects=False) - if not validate_status: - return (accepted, returnvalues.CLIENT_ERROR) - - show_all = accepted['show_all'][-1].lower() - sort = accepted['sort'][-1] - group_by = accepted['group_by'][-1].lower() - - if not configuration.site_enable_sandboxes: - output_objects.append({'object_type': 'text', 'text': - """Sandbox resource use is disabled on this site. -Please contact the %s site support (%s) if you think it should be enabled. -""" % (configuration.short_title, configuration.support_email)}) - return (output_objects, returnvalues.OK) - - # Load the user file - - try: - userdb = load_sandbox_db(configuration) - except Exception as exc: - output_objects.append( - {'object_type': 'error_text', 'text': - 'Could not load any sandbox information'}) - return (output_objects, returnvalues.SYSTEM_ERROR) - - # Load statistics objects - - grid_stat = GridStat(configuration, logger) - grid_stat.update() - - sandboxinfos = [] - - # loop through all users - - total_jobs = 0 - for username in userdb: - resources_jobs = {} - - jobs_per_resource = 0 - jobs_per_user = 0 - - resources_walltime = {} - walltime_per_resource = timedelta(0) - walltime_per_user = timedelta(0) - - # loop through all resources of each user - - for resource in userdb[username][RESOURCES]: - - # now find number of jobs successfully executed by resource - - jobs_per_resource = \ - grid_stat.get_value(grid_stat.RESOURCE_TOTAL, resource, - 'FINISHED') - jobs_per_user += jobs_per_resource - n = {resource: jobs_per_resource} - resources_jobs.update(n) - - walltime_per_resource = \ - grid_stat.get_value(grid_stat.RESOURCE_TOTAL, resource, - 'USED_WALLTIME') - - if walltime_per_resource != 0: - if not walltime_per_user: - walltime_per_user = walltime_per_resource - else: - walltime_per_user += walltime_per_resource - else: - walltime_per_resource = timedelta(0) - - n = {resource: walltime_per_resource} - resources_walltime.update(n) - - if group_by == 'users' and (jobs_per_user > 0 or show_all - == 'true'): - sandboxinfo = {'object_type': 'sandboxinfo'} - sandboxinfo['username'] = username - sandboxinfo['resource'] = len(userdb[username][RESOURCES]) - sandboxinfo['jobs'] = jobs_per_user - sandboxinfo['walltime'] = format_timedelta(walltime_per_user) - sandboxinfo['walltime_sort'] = walltime_per_user - sandboxinfos.append(sandboxinfo) - elif jobs_per_user > 0 or show_all == 'true': - for res in resources_jobs: - if resources_jobs[res] > 0 or show_all == 'true': - sandboxinfo = {'object_type': 'sandboxinfo'} - sandboxinfo['username'] = username - sandboxinfo['resource'] = res - sandboxinfo['jobs'] = resources_jobs[res] - sandboxinfo['walltime'] = format_timedelta( - resources_walltime[res]) - sandboxinfo['walltime_sort'] = resources_walltime[res] - sandboxinfos.append(sandboxinfo) - - total_jobs += jobs_per_user - - if 'username' == sort: - - # sort by owner: case insensitive - - sandboxinfos.sort(cmp=lambda a, b: cmp(a['username'].lower(), - b['username'].lower())) - elif 'resource' == sort: - - # sort by numerical resource ID - - if group_by == 'users': - sandboxinfos.sort(cmp=lambda a, b: cmp(int(b['resource']), - int(a['resource']))) - else: - - sandboxinfos.sort(cmp=lambda a, b: cmp( - int(a['resource'].lower().replace('sandbox.', '')), - int(b['resource'].lower().replace('sandbox.', '')))) - elif 'jobs' == sort: - - # sort by most jobs done - - sandboxinfos.sort(reverse=True) - elif 'walltime' == sort: - - # sort by most walltime - - sandboxinfos.sort(cmp=lambda a, b: cmp( - a['walltime_sort'].days * 86400 + a['walltime_sort'].seconds, - b['walltime_sort'].days * 86400 + b['walltime_sort'].seconds), - reverse=True) - else: - - # do not sort - - pass - - # Sort - - output_objects.append({'object_type': 'verbatim', 'text': 'Sort by: '}) - - link_list = [] - for name in ('username', 'resource', 'jobs', 'walltime'): - link_list.append({'object_type': 'link', 'destination': - '?sort=%s&group_by=%s' % (name, group_by), - 'text': '%s' % name.capitalize()}) - - output_objects.append({'object_type': 'multilinkline', 'links': link_list}) - - # Group - - output_objects.append({'object_type': 'html_form', 'text': '
'}) - output_objects.append({'object_type': 'verbatim', 'text': 'Show: '}) - - link_list = [] - for name in ('resources', 'users'): - link_list.append({'object_type': 'link', 'destination': - '?sort=%s&group_by=%s' % (sort, name), - 'text': '%s' % name.capitalize()}) - - output_objects.append({'object_type': 'multilinkline', 'links': link_list}) - # Time stamp - - now = datetime.now() - output_objects.append( - {'object_type': 'text', 'text': 'Updated on %s' % now}) - output_objects.append({'object_type': 'html_form', 'text': '
'}) - - # Actual stats - - output_objects.append( - {'object_type': 'sandboxinfos', 'sandboxinfos': sandboxinfos}) - output_objects.append({'object_type': 'text', 'text': - 'Total jobs run by sandboxes: %s' % total_jobs}) - return (output_objects, returnvalues.OK) diff --git a/mig/shared/functionality/submitjob.py b/mig/shared/functionality/submitjob.py index 610a990d3..5913f2133 100644 --- a/mig/shared/functionality/submitjob.py +++ b/mig/shared/functionality/submitjob.py @@ -281,9 +281,6 @@ def main(client_id, user_arguments_dict): default = saved else: default = spec['Value'] - # Hide sandbox field if sandboxes are disabled - if field == 'SANDBOX' and not configuration.site_enable_sandboxes: - continue if 'invisible' == spec['Editor']: continue if 'custom' == spec['Editor']: diff --git a/mig/shared/functionality/viewres.py b/mig/shared/functionality/viewres.py index b585e8ec7..22113cf7e 100644 --- a/mig/shared/functionality/viewres.py +++ b/mig/shared/functionality/viewres.py @@ -56,7 +56,7 @@ def build_resitem_object_from_res_dict(configuration, unique_resource_name, store_keywords = get_storenode_keywords(configuration) res_fields = ['PUBLICNAME', 'PUBLICINFO', 'CPUCOUNT', 'NODECOUNT', 'MEMORY', 'DISK', 'ARCHITECTURE', 'JOBTYPE', - 'MAXUPLOADBANDWIDTH', 'MAXDOWNLOADBANDWIDTH', 'SANDBOX'] + 'MAXUPLOADBANDWIDTH', 'MAXDOWNLOADBANDWIDTH'] exe_fields = ['cputime', 'nodecount'] store_fields = ['storage_disk', 'storage_protocol'] res_item = { diff --git a/mig/shared/gridscript.py b/mig/shared/gridscript.py index 47c4ece14..ba343df9a 100644 --- a/mig/shared/gridscript.py +++ b/mig/shared/gridscript.py @@ -382,17 +382,6 @@ def server_cleanup( logger.error('could not remove %s during server_clean_up %s' % (empty_prefix, err)) - # Only sandboxes create this link, so we don't fail if it does not exists. - - sandboxgetinputfileslink = os.path.join(configuration.webserver_home, - localjobname + '.getinputfiles') - if os.path.islink(sandboxgetinputfileslink): - try: - os.remove(sandboxgetinputfileslink) - except Exception as err: - logger.info('could not remove %s during server_clean_up %s' - % (sandboxgetinputfileslink, err)) - return success @@ -431,7 +420,6 @@ def requeue_job( client_dir = client_id_dir(job_dict['USER_CERT']) # Remove job result files, if they have arrived as the result is not valid - # This can happen with sandboxes as they can't be stopped serverside status_prefix = os.path.join(configuration.user_home, client_dir, job_dict['JOB_ID']) diff --git a/mig/shared/install.py b/mig/shared/install.py index c82b43798..63c814314 100644 --- a/mig/shared/install.py +++ b/mig/shared/install.py @@ -378,7 +378,6 @@ def generate_confs( enable_sharelinks=True, enable_transfers=False, enable_freeze=True, - enable_sandboxes=False, enable_jupyter=False, enable_cloud=False, enable_hsts=True, @@ -707,7 +706,6 @@ def _generate_confs_prepare( enable_sharelinks, enable_transfers, enable_freeze, - enable_sandboxes, enable_jupyter, enable_cloud, enable_hsts, @@ -966,7 +964,6 @@ def _generate_confs_prepare( user_dict['__ENABLE_SHARELINKS__'] = "%s" % enable_sharelinks user_dict['__ENABLE_TRANSFERS__'] = "%s" % enable_transfers user_dict['__ENABLE_FREEZE__'] = "%s" % enable_freeze - user_dict['__ENABLE_SANDBOXES__'] = "%s" % enable_sandboxes user_dict['__ENABLE_JUPYTER__'] = "%s" % enable_jupyter user_dict['__ENABLE_CLOUD__'] = "%s" % enable_cloud user_dict['__ENABLE_HSTS__'] = "%s" % enable_hsts diff --git a/mig/shared/jobfeasibility.py b/mig/shared/jobfeasibility.py index 026d2c4e2..f8c1d9d04 100644 --- a/mig/shared/jobfeasibility.py +++ b/mig/shared/jobfeasibility.py @@ -244,9 +244,6 @@ def validate(configuration, job, vgrid_resource_map, job_cond, errors): job_cond['RETRIES'] = validate_retries(configuration, job, errors) job_cond['RUNTIMEENVIRONMENT'] = validate_runtimeenvironment( configuration, job, resource, errors) - job_cond['SANDBOX'] = validate_sandbox(configuration, job, - resource, errors) - job_cond['suggested_vgrid'] = vgrid job_cond['suggested_resource'] = anon_resource_id(resource_id, False) @@ -566,24 +563,6 @@ def validate_vgrid(configuration, job, errors): return list(vgrid_access.intersection(specified_vgrids)) -def validate_sandbox(configuration, job, resource, errors): - """Do not schedule non-sandbox jobs on a sandbox resource.""" - - if skip_validation(configuration, job, 'SANDBOX', resource): - return True - - job_value = bool(job['SANDBOX']) - res_value = bool(resource['SANDBOX']) - - # do not allow non-sandbox jobs on a sandbox resource - # sandbox jobs on non-sandbox resources are ok, however - - if not job_value and res_value: - errors['SANDBOX'] = std_err_desc(job_value, res_value) - - return 'SANDBOX' not in errors - - def validate_resource_seen(configuration, resource, errors, resource_id): """Has the resource been registered at some point?""" diff --git a/mig/shared/mrslkeywords.py b/mig/shared/mrslkeywords.py index 6cb3727ff..da0c93cfb 100644 --- a/mig/shared/mrslkeywords.py +++ b/mig/shared/mrslkeywords.py @@ -316,7 +316,7 @@ def get_job_specs(configuration): })) specs.append(('RETRIES', { 'Title': 'Job Retries', - 'Description': 'Specifies the maximum number of automatic retries if the job does not finish within the requested time. E.g. if the resource dies or just does not provide enough speed to deliver results in time. If not set the server default of %s is used. It may be a good idea to increase the number of retries for e.g. long sandbox jobs where the risk of the resource going offline is higher. Similarly it is recommended to lower it for experimental jobs where a broken specification will otherwise cause repeated job failures and resulting forced empty jobs on the resources.'\ + 'Description': 'Specifies the maximum number of automatic retries if the job does not finish within the requested time. E.g. if the resource dies or just does not provide enough speed to deliver results in time. If not set the server default of %s is used. It is recommended to lower it for experimental jobs where a broken specification will otherwise cause repeated job failures and resulting forced empty jobs on the resources.'\ % configuration.job_retries, 'Example': '5', 'Type': 'int', @@ -359,15 +359,6 @@ def get_job_specs(configuration): 'Editor': 'invisible', 'Required': False, })) - specs.append(('SANDBOX', { - 'Title': 'Allow Sandbox Execution', - 'Description': 'Specifies whether the job may run in a sandbox. If 0 or false it may not, if 1 or true it may.', - 'Example': 'True', - 'Type': 'boolean', - 'Value': False, - 'Editor': 'select', - 'Required': False, - })) specs.append(('PLATFORM', { 'Title': 'Platform', 'Description': 'Specifies the platform architecture used for the execution of the job.', diff --git a/mig/shared/objecttypes.py b/mig/shared/objecttypes.py index 038d28ef3..521737c2c 100644 --- a/mig/shared/objecttypes.py +++ b/mig/shared/objecttypes.py @@ -199,8 +199,6 @@ fileuploadobj = {'object_type': 'fileuploadobj', 'required': ['submitmrsl', 'saved', 'extract_packages', 'size', 'name'], 'optional': ['message']} -sandboxinfo = {'object_type': 'sandboxinfo', 'required': - ['username', 'resource', 'jobs'], 'optional': []} signature = {'object_type': 'signature', 'required': ['function', 'signature'], 'optional': []} objects = {'object_type': 'objects', 'required': ['objects'], @@ -279,8 +277,6 @@ fileuploadobjs = {'object_type': 'fileuploadobjs', 'required_list': [('fileuploadobjs', 'fileuploadobj' )]} -sandboxinfos = {'object_type': 'sandboxinfos', - 'required_list': [('sandboxinfos', 'sandboxinfo')]} signatures = {'object_type': 'signatures', 'required_list': [('signatures', 'signature')]} linklist = {'object_type': 'linklist', 'required_list': [('links', @@ -391,8 +387,6 @@ resubmitobjs, submitstatuslist, submitstatus, - sandboxinfos, - sandboxinfo, fileuploadobjs, fileuploadobj, list, diff --git a/mig/shared/output.py b/mig/shared/output.py index 1d9bae046..5f0f52fd8 100644 --- a/mig/shared/output.py +++ b/mig/shared/output.py @@ -108,8 +108,6 @@ def filter_exc(configuration, exc): configuration.resource_home, configuration.webserver_home, configuration.user_db_home, - configuration.sss_home, - configuration.sandbox_home, configuration.freeze_home, configuration.freeze_tape, configuration.sharelink_home, @@ -1379,25 +1377,6 @@ def html_format(configuration, ret_val, ret_msg, out_obj): lines.append('%s%s' % (name, val)) lines.append('') - elif i['object_type'] == 'sandboxinfos': - sandboxinfos = i['sandboxinfos'] - lines.append('' - '' - '') - row_number = 1 - if not sandboxinfos: - help_text = 'No sandboxes found - please download a sandbox ' - 'below to proceed' - lines.append('' % - (row_name[row_number], help_text)) - for sandboxinfo in sandboxinfos: - row_class = row_name[row_number % 2] - lines.append('%s' - % (row_class, html_table_if_have_keys( - sandboxinfo, ['username', 'resource', 'jobs', - 'walltime']))) - row_number += 1 - lines.append('
UsernameResource(s)JobsWalltime
%s
') elif i['object_type'] == 'runtimeenvironments': runtimeenvironments = i['runtimeenvironments'] lines.append(''' @@ -2131,8 +2110,6 @@ def html_format(configuration, ret_val, ret_msg, out_obj): for obj in resources: lines.append('') res_type = 'real' - if obj.get('SANDBOX', False): - res_type = 'sandbox' lines.append( '%s' % (res_type, res_type, obj['name'])) diff --git a/mig/shared/resadm.py b/mig/shared/resadm.py index 9fa2920cb..e9bfbc24f 100644 --- a/mig/shared/resadm.py +++ b/mig/shared/resadm.py @@ -64,7 +64,6 @@ def put_fe_pgid( unique_resource_name, pgid, logger, - sandbox=False, ): """Write front end PGID in resource home""" @@ -123,7 +122,6 @@ def put_exe_pgid( exe_name, pgid, logger, - sandbox=False, ): """Write exe PGID file in resource home and stop exe if requested""" @@ -166,7 +164,7 @@ def put_exe_pgid( msg = "pgid: '%s' put for %s %s" % (pgid, unique_resource_name, exe_name) - if not sandbox and 'stopped' == old_pgid: + if 'stopped' == old_pgid: msg += "Resource: '" + unique_resource_name\ + "' EXE node: '" + exe_name\ + "' has been stopped, kill EXE script." @@ -212,11 +210,6 @@ def start_resource_exe_if_continuous( if not resource_dict: return (False, 'Failed to unpack resource configuration!') - resource_dict['SANDBOX'] = resource_dict.get('SANDBOX', False) - - if resource_dict['SANDBOX']: - return (True, '') - for exe in resource_dict['EXECONFIG']: if exe['name'] == finished_exe: found = True @@ -343,16 +336,6 @@ def fill_frontend_script( os.write(filehandle, 'curllog=' + resource_config['CURLLOG'] + '\n') - sandbox = resource_config.get('SANDBOX', False) - os.write(filehandle, 'sandbox=%d\n' % int(sandbox)) - if sandbox: - sandbox_key = resource_config.get('SANDBOXKEY', None) - if not sandbox_key: - return (False, - 'Resource error, SANDBOX flag is true but SANDBOXKEY was not found!' - ) - os.write(filehandle, 'sandboxkey=%s\n' % sandbox_key) - # append frontend_script.sh script_path = os.path.join(configuration.mig_code_base, 'resource', @@ -1600,51 +1583,6 @@ def restart_resource_store( start_msg)) -def get_sandbox_exe_stop_command( - sandbox_home, - sandboxkey, - exe_name, - logger, -): - - # open the resources configuration - - resource_configuration_file = os.path.join(sandbox_home, sandboxkey, - 'config') - resource_dict = unpickle(resource_configuration_file, logger) - if not resource_dict: - return (False, - 'Could not unpickle resource configuration file: ' - + resource_configuration_file) - - (status, exe) = get_resource_exe(resource_dict, exe_name, logger) - if not status: - msg = "No EXE config for: '"\ - + resource_dict['UNIQUE_RESOURCE_NAME'] + "' EXE: '"\ - + exe_name + "'" - return (False, msg) - - stop_command = exe['stop_command'] - - # Lock pgid file - - rel_pgid_path = os.path.join(sandboxkey, 'EXE_' + exe_name + '.PGID') - pgid_path = os.path.join(sandbox_home, rel_pgid_path) - if os.path.exists(pgid_path): - pgid_file = open(pgid_path, 'r') - fcntl.flock(pgid_file, fcntl.LOCK_EX) - pgid_file.seek(0, 0) - pgid = pgid_file.readline().strip() - fcntl.flock(pgid_file, fcntl.LOCK_UN) - pgid_file.close() - stop_command = stop_command.replace('$mig_exe_pgid', pgid) - return (True, stop_command) - else: - msg = 'No PGID file %r found!' % rel_pgid_path - logger.warning(msg) - return (False, msg) - - def status_resource_frontend(unique_resource_name, configuration, logger): """Get status for resource front end""" diff --git a/mig/shared/resconfkeywords.py b/mig/shared/resconfkeywords.py index b4b89f8a4..344ce70e7 100644 --- a/mig/shared/resconfkeywords.py +++ b/mig/shared/resconfkeywords.py @@ -304,24 +304,6 @@ def get_resource_specs(configuration): 'Editor': 'input', 'Required': False, })) - specs.append(('SANDBOX', { - 'Title': 'Sandbox', - 'Description': 'Specifies whether resource is a sandbox. If 0 or false, the resource is not a sandbox, if 1 or true, the resource is a sandbox. Sandbox resources are less trusted and thus can only handle explicitly allowed sandbox jobs.', - 'Example': '0', - 'Type': 'boolean', - 'Value': False, - 'Editor': 'invisible', - 'Required': False, - })) - specs.append(('SANDBOXKEY', { - 'Title': 'Sandbox Identifier', - 'Description': 'Specifies the secret sandboxkey for a sandbox.', - 'Example': '2AD32342423421111', - 'Type': 'string', - 'Value': '', - 'Editor': 'invisible', - 'Required': False, - })) specs.append(('MAXDOWNLOADBANDWIDTH', { 'Title': 'Maximum Download Bandwidth (KB/s)', 'Description': 'Specifies the max download bandwidth (in kB) the resource is allowed to use. If 0 or unset, there is no limit.', diff --git a/mig/shared/resource.py b/mig/shared/resource.py index bcaa93176..b91b6a413 100644 --- a/mig/shared/resource.py +++ b/mig/shared/resource.py @@ -940,13 +940,11 @@ def create_resource_home(configuration, client_id, resource_name): return (status, resource_identifier) -# TODO: switch sss sandbox to use create_resource() - def create_resource(configuration, client_id, resource_name, pending_file): """Create unique resource home dir and fill with resource config based on resource request in pending_file. If pending_file is a relative path it will prefixed with the - resource_pending dir of the client_id. Thus sandbox confs with no required + resource_pending dir of the client_id. Thus confs with no required user can use e.g. /tmp for the pending file and still use this function. Returns creation status and host identifier for the new resource. """ @@ -968,7 +966,7 @@ def update_resource(configuration, client_id, resource_name, """Update configuration for existing resource based on config request in pending_file. If pending_file is a relative path it will prefixed with the - resource_pending dir of the client_id. Thus sandbox confs with no required + resource_pending dir of the client_id. Thus confs with no required user can use e.g. /tmp for the pending file and still use this function. Returns update status and a message string. """ diff --git a/mig/shared/sandbox.py b/mig/shared/sandbox.py deleted file mode 100644 index bb85fc28e..000000000 --- a/mig/shared/sandbox.py +++ /dev/null @@ -1,224 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# --- BEGIN_HEADER --- -# -# sandbox - shared sandbox helpers -# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter -# -# This file is part of MiG. -# -# MiG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# MiG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# -- END_HEADER --- -# - -"""Sandbox functions""" - -from __future__ import absolute_import - -import os -import tempfile - -from mig.shared.base import hexlify -from mig.shared.conf import get_configuration_object -from mig.shared.defaults import default_vgrid, keyword_auto -from mig.shared.fileio import make_symlink, write_named_tempfile -from mig.shared.resource import create_resource -from mig.shared.serial import load, dump - -sandbox_db_name = 'sandbox_users.pkl' - - -def load_sandbox_db(configuration=None): - """Read in the sandbox DB dictionary: - Format is {username: (password, [list_of_resources])} - """ - - if not configuration: - configuration = get_configuration_object() - sandbox_db_path = os.path.join(configuration.sandbox_home, - sandbox_db_name) - sandbox_db = load(sandbox_db_path) - return sandbox_db - - -def save_sandbox_db(sandbox_db, configuration=None): - """Read in the sandbox DB dictionary: - Format is {username: (password, [list_of_resources])} - """ - - if not configuration: - configuration = get_configuration_object() - sandbox_db_path = os.path.join(configuration.sandbox_home, - sandbox_db_name) - dump(sandbox_db, sandbox_db_path) - - -def get_resource_name(sandboxkey, logger): - configuration = get_configuration_object() - - # Retrieve resource_name from sandboxkey symbolic link - - sandbox_link = configuration.sandbox_home + sandboxkey - - if os.path.exists(sandbox_link): - unique_resource_name = \ - os.path.basename(os.path.realpath(sandbox_link)) - return (True, unique_resource_name) - else: - msg = 'Remote IP: %s, No sandbox with sandboxkey: %s'\ - % (os.getenv('REMOTE_ADDR'), sandboxkey) - logger.error(msg) - return (False, msg) - - -def create_sss_resource( - sandboxkey, - cputime, - memory, - hd_size, - net_bw, - vgrid_list, - configuration, - logger, -): - - resource_name = 'sandbox' - unique_host_name = "%s.%s" % (resource_name, keyword_auto) - - # create a resource configuration string that we can write to a file - - exe_name = 'localhost' - res_conf_string = \ - """\ -::MIGUSER:: -mig - -::HOSTURL:: -%s - -::HOSTIDENTIFIER:: -%s - -::RESOURCEHOME:: -/opt/mig/MiG/mig_frontend/ - -::SCRIPTLANGUAGE:: -sh - -::SSHPORT:: -22 - -::MEMORY:: -%s - -::DISK:: -%s - -::MAXDOWNLOADBANDWIDTH:: -%s - -::MAXUPLOADBANDWIDTH:: -%s - -::CPUCOUNT:: -1 - -::SANDBOX:: -True - -::SANDBOXKEY:: -%s - -::ARCHITECTURE:: -X86 - -::NODECOUNT:: -1 - -::RUNTIMEENVIRONMENT:: - - -::HOSTKEY:: - - -::FRONTENDNODE:: -localhost - -::FRONTENDLOG:: -/opt/mig/MiG/mig_frontend/frontendlog - -::EXECONFIG:: -name=%s -nodecount=1 -cputime=%d -execution_precondition='' -prepend_execute="" -exehostlog=/opt/mig/MiG/mig_exe/exechostlog -joblog=/opt/mig/MiG/mig_exe/joblog -execution_user=mig -execution_node=localhost -execution_dir=/opt/mig/MiG/mig_exe/ -start_command=cd /opt/mig/MiG/mig_exe/; chmod 700 master_node_script_%s.sh; ./master_node_script_%s.sh -status_command=exit \\\\\`ps -o pid= -g $mig_exe_pgid | wc -l \\\\\` -stop_command=kill -9 -$mig_exe_pgid -clean_command=true -continuous=False -shared_fs=True -vgrid=%s - -"""\ - % ( - resource_name, - keyword_auto, - memory, - int(hd_size // 1000), - net_bw, - int(net_bw // 2), - sandboxkey, - exe_name, - cputime, - unique_host_name, - unique_host_name, - ', '.join(vgrid_list), - ) - - # write the conf string to a temporary conf file - # create_resource removes the tempfile automatically - - pending_file = write_named_tempfile(configuration, res_conf_string) - - (status, id_msg) = create_resource(configuration, sandboxkey, - resource_name, pending_file) - if not status: - return (False, '%s (%s)' % (id_msg, pending_file)) - - # Create PGID file in resource_home - - resource_identifier = id_msg - unique_resource_name = "%s.%d" % (resource_name, resource_identifier) - - exe_pgid_file = configuration.resource_home + unique_resource_name\ - + os.sep + 'EXE_%s.PGID' % exe_name - try: - fd = open(exe_pgid_file, 'w') - fd.write('stopped') - fd.close() - except Exception as exc: - return (False, "%s" % exc) - - return (True, "%s.%d" % (resource_name, resource_identifier)) - diff --git a/mig/shared/useradm.py b/mig/shared/useradm.py index 6c2bb572e..a75f9add3 100644 --- a/mig/shared/useradm.py +++ b/mig/shared/useradm.py @@ -47,7 +47,7 @@ update_account_status_cache from mig.shared.base import client_id_dir, client_dir_id, client_alias, \ get_client_id, extract_field, fill_user, fill_distinguished_name, \ - is_gdp_user, mask_creds, sandbox_resource, force_native_str, \ + is_gdp_user, mask_creds, force_native_str, \ force_native_str_rec, native_str_escape, native_args from mig.shared.conf import get_configuration_object from mig.shared.configuration import Configuration @@ -2274,8 +2274,6 @@ def fix_entities( kind_path = os.path.join(base_dir, entry_name, kind) if not os.path.isfile(kind_path): continue - if sandbox_resource(entry_name): - continue if verbose: print('updating %s in %s' % (client_id, kind_path)) try: diff --git a/mig/shared/vgridaccess.py b/mig/shared/vgridaccess.py index 2988d54a0..dadfc04dc 100644 --- a/mig/shared/vgridaccess.py +++ b/mig/shared/vgridaccess.py @@ -35,7 +35,7 @@ import os import time -from mig.shared.base import sandbox_resource, client_id_dir, client_dir_id +from mig.shared.base import client_id_dir, client_dir_id from mig.shared.conf import get_all_exe_vgrids, get_all_store_vgrids, \ get_resource_fields, get_resource_configuration from mig.shared.defaults import settings_filename, profile_filename, \ @@ -311,9 +311,6 @@ def refresh_resource_map(configuration, clean=False): only_valid=True) real_map = real_to_anon_res_map(configuration.resource_home) for res in all_resources: - # Sandboxes do not change their configuration - if res in resource_map and sandbox_resource(res): - continue conf_path = os.path.join(configuration.resource_home, res, "config") if not os.path.isfile(conf_path): continue @@ -445,9 +442,6 @@ def refresh_vgrid_map(configuration, clean=False): configuration.resource_home, only_valid=True) real_map = real_to_anon_res_map(configuration.resource_home) for res in all_resources: - # Sandboxes do not change their vgrid participation - if res in vgrid_map[RESOURCES] and sandbox_resource(res): - continue conf_path = os.path.join(configuration.resource_home, res, "config") if not os.path.isfile(conf_path): continue @@ -511,9 +505,6 @@ def refresh_vgrid_map(configuration, clean=False): # _logger.info("update res vgrid %s" % vgrid) for res in [i for i in vgrid_map[RESOURCES] if i not in update_res]: - # Sandboxes do not change their vgrid participation - if sandbox_resource(res): - continue # _logger.info("update res vgrid %s for res %s" % (vgrid, res)) if vgrid_allowed(res, old) != vgrid_allowed(res, new): update_res.append(res) diff --git a/mig/simulation/dummy.conf b/mig/simulation/dummy.conf index 0b0f84345..e03e6178f 100644 --- a/mig/simulation/dummy.conf +++ b/mig/simulation/dummy.conf @@ -40,10 +40,7 @@ wwwpublic = %(tmp)s/wwwpublic/ server_cert = %(tmp)s/%(server_fqdn)s-cert.pem server_key = %(tmp)s/server_fqdn)s-key.pem ca_cert = %(tmp)s/both.pem -sss_home = %(tmp)s/sss_home/ mig_server_home = %(tmp)s/server/ -sandbox_home = %(tmp)s/sandbox_home/ -javabin_home = %(tmp)s/java-bin/ # URLs migserver_http_url = http://localhost:80 diff --git a/mig/wwwuser/sss.html b/mig/wwwuser/sss.html deleted file mode 100755 index 725c27b7c..000000000 --- a/mig/wwwuser/sss.html +++ /dev/null @@ -1,55 +0,0 @@ - - -MiG SSS - - - -

Generate MiG Linux boot iso

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
User name: - -
Password - -
HD SIZE: - -
MEMORY: - -
- -
- - diff --git a/recommended.txt b/recommended.txt index 930b4390d..62a89bd8a 100644 --- a/recommended.txt +++ b/recommended.txt @@ -55,6 +55,7 @@ psutil # sslkeylog requires libssl-dev or similar system package to build #sslkeylog pyenchant +pycurl # Screenshoot helper requires selenium selenium diff --git a/state/sandbox_home/.placeholder b/state/sandbox_home/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/state/sss_home/MiG-SSS/README b/state/sss_home/MiG-SSS/README deleted file mode 100644 index 25735be92..000000000 --- a/state/sss_home/MiG-SSS/README +++ /dev/null @@ -1,58 +0,0 @@ -= Using the sandbox generator = -The sandbox generator requires a hard disk image for each of the supported disk sizes. -At the momemt the 100MB, 1G and 2G sizes map to hda_{100,1000,2000}.img files. -The images must be modified on-the-fly when a sandbox is created so you -need to provide user level mounting for a particular file, hda.img which -will be used for these modify mounts. In other words you need to add the -following line to your /etc/fstab in order to allow sandbox generation: -/home/mig/state/sss_home/MiG-SSS/hda.img /home/mig/state/sss_home/mnt auto user,loop 0 0 - -..if using the default user and path settings. - -This will allow the mig user to mount the hda.img on the mnt dir without -additional privileges. -After adding that line you can proceed to make the images that aren't -included due to size restrictions. They should preferably be created as -sparse qemu images with: -for size in 100 1000 2000; do - qemu-img create hda.img ${size}M && \ - mkfs.ext2 -F hda.img && \ - tune2fs -c 100 -i 365 hda.img && \ - mount ../mnt && \ - tar xvzf mig-hda.tgz -C ../mnt && \ - umount ../mnt && \ - mv hda.img hda_${size}.img -done - - -As qemu-img output then shows they only take up a small fraction of the denominal size: -.../state/sss_home/MiG-SSS > ls -l hda_2000.img -jonesdevel@amigos18 --rw-r--r-- 1 jonesdevel jonesdevel 2097152000 Mar 13 17:28 hda_2000.img -.../state/sss_home/MiG-SSS > qemu-img info hda_2000.img -jonesdevel@amigos18 -image: hda_2000.img -file format: raw -virtual size: 2.0G (2097152000 bytes) -disk size: 32M - -In the sandbox generator they are converted to qcow images on the fly. -We would prefer to only have them on qcow format but we need raw format to be able -to mount and modify the image on the fly, so we do that with the raw images and -convert them just before zip and download. - -The generator needs a MiG.iso base file system iso which can be downloaded from: -http://dk.migrid.org/public/sandbox/MiG-SSS/MiG.iso - -The iso is a basic Gentoo image with minor MiG additions as shown in the -iso-helpers directory. -Remastering of the iso can be done with the commands: -mount -o loop MiG.iso iso -cp -a iso remaster -[edit files in remaster directory] -mkisofs -RlDJLV "MiG SSS X86" -b isolinux/isolinux.bin -c isolinux/boot.cat \ - -no-emul-boot -boot-load-size 4 -boot-info-table -o MiG.iso remaster - -Windows sandboxes additionally need a couple of installers available from: -http://dk.migrid.org/public/sandbox/MiG-SSS/MiG-SSS_Setup.exe -http://dk.migrid.org/public/sandbox/MiG-SSS/MiG-SSS-Service_Setup.exe diff --git a/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/EXE b/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/EXE deleted file mode 100755 index d0e29db95..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/EXE +++ /dev/null @@ -1,46 +0,0 @@ -#!/sbin/runscript -# Copyright 1999-2006 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: $ - -depend() { - after FE -} - -DAEMON=/usr/bin/daemon -EXE_PGIDFILE=/var/run/MiG_EXE.pgid -MASTER_PGIDFILE=/var/run/MiG_master.pgid -EXE_BINARY=/usr/bin/start_exe.sh - - -start() { - ebegin "Starting ${SVCNAME}" - if test -f ${EXE_PGIDFILE} - then - eerror "${SVCNAME} already started" - return 1 - else - ${DAEMON} "${EXE_BINARY}" "${EXE_PGIDFILE}" & - fi - eend $? -} - -stop() { - ebegin "Stopping ${SVCNAME}" - if ! test -f ${EXE_PGIDFILE} - then - eerror "${SVCNAME} not started" - return 1 - else - # Kill all processes in group, - # to make sure alle MiG scripts are killed. - kill -9 -`cat ${EXE_PGIDFILE}` - rm -f ${EXE_PGIDFILE} - if test -f ${MASTER_PGIDFILE} - then - kill -9 -`cat ${MASTER_PGIDFILE}` - rm -f ${MASTER_PGIDFILE} - fi - fi - eend $? -} diff --git a/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/FE b/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/FE deleted file mode 100755 index a9105e3e7..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/etc/init.d/FE +++ /dev/null @@ -1,40 +0,0 @@ -#!/sbin/runscript -# Copyright 1999-2006 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: $ - -depend() { - need net - before EXE -} - -DAEMON=/usr/bin/daemon -FE_PGIDFILE=/var/run/MiG_FE.pgid -FE_BINARY=/usr/bin/start_fe.sh - -start() { - ebegin "Starting ${SVCNAME}" - if test -f ${FE_PGIDFILE} - then - eerror "${SVCNAME} already started" - return 1 - else - ${DAEMON} "${FE_BINARY}" "${FE_PGIDFILE}" & - fi - eend $? -} - -stop() { - ebegin "Stopping ${SVCNAME}" - if ! test -f ${FE_PGIDFILE} - then - eerror "${SVCNAME} not started" - return 1 - else - # Kill all processes in group, - # to make sure alle MiG scripts are killed. - kill -9 -`cat ${FE_PGIDFILE}` - rm -f ${FE_PGIDFILE} - fi - eend $? -} diff --git a/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/EXE b/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/EXE deleted file mode 120000 index 090e096a6..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/EXE +++ /dev/null @@ -1 +0,0 @@ -/etc/init.d/EXE \ No newline at end of file diff --git a/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/FE b/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/FE deleted file mode 120000 index ad8040a4a..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/etc/runlevels/FE +++ /dev/null @@ -1 +0,0 @@ -/etc/init.d/FE \ No newline at end of file diff --git a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/etc/keyfile b/state/sss_home/MiG-SSS/iso-helpers/opt/mig/etc/keyfile deleted file mode 100644 index e69de29bb..000000000 diff --git a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/etc/serverfile b/state/sss_home/MiG-SSS/iso-helpers/opt/mig/etc/serverfile deleted file mode 100644 index 8b1378917..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/etc/serverfile +++ /dev/null @@ -1 +0,0 @@ - diff --git a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/sshclient.txt b/state/sss_home/MiG-SSS/iso-helpers/opt/mig/sshclient.txt deleted file mode 100644 index c646b53c7..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/sshclient.txt +++ /dev/null @@ -1 +0,0 @@ -dbclient diff --git a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/start_resource.sh b/state/sss_home/MiG-SSS/iso-helpers/opt/mig/start_resource.sh deleted file mode 100755 index 2b867d207..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/opt/mig/start_resource.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -cd MiG/mig_exe/ -while [ /bin/true ]; do - ./master_node_script.sh -done diff --git a/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_exe.sh b/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_exe.sh deleted file mode 100755 index 7cef387aa..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_exe.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash -# Global vars -mig_user=mig -mig_home=/opt/mig - -mig_tmp=${mig_home}/MiG - -exe_home=${mig_home}/MiG/mig_exe -exe_script=master_node_script.sh - -forkwait=/usr/bin/forkwait -master_pgidfile=/var/run/MiG_master.pgid - -sandboxkey=`cat ${mig_home}/etc/keyfile` -migserver=`cat ${mig_home}/etc/serverfile` - -# Make sure EXE dir is empty -if [ -e $exe_home ]; then - rm -rf $exe_home -fi - -# Create EXE dir -mkdir -p ${exe_home} - -# Set ownership of EXE dir -chown -R ${mig_user}:${mig_user} ${exe_home} - -# Get master node script from MiG server -cmd="curl - --fail - --silent - --insecure - --output ${mig_tmp}/${exe_script} - --url $migserver/cgi-sid/sandbox-getresourcescript.py?action=get_master_node_script&sandboxkey=$sandboxkey" - -# Wait for master node script to arrive -status=1 -while [ $status -ne 0 ]; do - #echo $cmd - $cmd - status=`head -n 1 ${mig_tmp}/${exe_script}` - if [ $status -ne 0 ]; then - sleep 5 - fi -done - -# Remove status code from master node script -cat ${mig_tmp}/${exe_script} | sed -e '1d' > ${exe_home}/${exe_script} -rm -f ${mig_tmp}/${exe_script} - -# Change permissions and owner ship on master node script -chmod 500 ${exe_home}/${exe_script} -chown -R ${mig_user}:${mig_user} ${exe_home}/${exe_script} - -# Start master node script as mig user -cd ${exe_home} -while [ /bin/true ]; do - ${forkwait} "cd ${exe_home} && su mig ./${exe_script}" "${master_pgidfile}" -done & - -echo "#################################################################" -echo "#################################################################" -echo "#################################################################" -echo "####### ########### #################### ##########" -echo "####### ######### ################### ######### #########" -echo "####### # ####### # ################## ########### ########" -echo "####### ## ##### ## ################# ############# #######" -echo "####### ### ### ### ################# ######################" -echo "####### #### # #### ######## ####### ######################" -echo "####### ##### ##### ######## ####### ######################" -echo "####### ############# ################# ######################" -echo "####### ############# ################# ######################" -echo "####### ############# ######## ####### ##### #######" -echo "####### ############# ######## ####### ##### ###### #######" -echo "####### ############# ######## ####### ##### ###### #######" -echo "####### ############# ######## ####### ############# #######" -echo "####### ############# ######## ######## ########### ########" -echo "####### ############# ######## ######### ######### #########" -echo "####### ############# ######## ########## ##########" -echo "#################################################################" -echo "#################################################################" -echo "######### Effectively putting your idle resources to use ########" -echo "#################################################################" -echo "#################################################################" -echo "#################################################################" diff --git a/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_fe.sh b/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_fe.sh deleted file mode 100755 index bbc100e79..000000000 --- a/state/sss_home/MiG-SSS/iso-helpers/usr/bin/start_fe.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash -# Global vars -mig_user=mig -mig_home=/opt/mig - -mig_tmp=${mig_home}/MiG - -fe_home=${mig_home}/MiG/mig_frontend -fe_script=frontend_script.sh -fe_log=frontendlog - -# Make /dev/null read/writeable -chmod 666 /dev/null - -# Use local disk if available or fall back to writable tmpfs -# Parse kernel commandline options -for o in `cat /proc/cmdline` ; do - case $o in - mig_disk=*) - mig_disk=${o#mig_disk=} - ;; - esac -done -mig_disk="${mig_disk:-/dev/hda}" -echo "mounting $mig_disk" -mount ${mig_disk} /opt 2> /dev/null -if ! touch ${fe_home}/${fe_script} 2> /dev/null ; then - echo "No writable MiG disk - using memory" - mkdir -p /opt-rw - mount -t tmpfs none /opt-rw - rsync -a ${mig_home} /opt-rw/ - mount --bind /opt-rw/mig ${mig_home} -fi - -# Make user mig owner of his home (linked to /opt/mig) -chown -R mig:mig /opt/mig - -# Protect /etc files from jobs (mig user) -chown -R root:root /opt/mig/etc -chmod -R 400 /opt/mig/etc - -# Make sure FE dir is empty -if [ -e $fe_home ]; then - rm -rf $fe_home -fi - -# Create FE dir -mkdir -p ${fe_home} - -# Set ownership of FE dir -chown -R ${mig_user}:${mig_user} ${fe_home} - -sync - -sandboxkey=`cat ${mig_home}/etc/keyfile` -migserver=`cat ${mig_home}/etc/serverfile` - -# Get frontend script from MiG server -cmd="curl - --fail - --silent - --insecure - --output ${mig_tmp}/${fe_script} - --url $migserver/cgi-sid/sandbox-getresourcescript.py?action=get_frontend_script&sandboxkey=$sandboxkey" - -# Wait for frontend script to arrive -status=1 -while [ $status -ne 0 ]; do - #echo $cmd - $cmd - status=`head -n 1 ${mig_tmp}/${fe_script}` - if [ $status -ne 0 ]; then - sleep 5 - fi -done - -# Remove status code from frontend script -cat ${mig_tmp}/${fe_script} | sed -e '1d' > ${fe_home}/${fe_script} -rm -f ${mig_tmp}/${fe_script} - - -# Change permissions on frontend script -chmod 500 ${fe_home}/${fe_script} - -sync - -# Front end script must be run as root to protect sandboxkey from jobs -# Exe must be run as mig_user to protect system from jobs -# Fe and Exe need to write to shared job dirs -umask 0000 - -# Start frontend -cd ${fe_home} -./${fe_script} diff --git a/state/sss_home/MiG-SSS/mig-hda.tgz b/state/sss_home/MiG-SSS/mig-hda.tgz deleted file mode 100644 index 70000f997..000000000 Binary files a/state/sss_home/MiG-SSS/mig-hda.tgz and /dev/null differ diff --git a/state/sss_home/MiG-SSS/mig_xsss.py b/state/sss_home/MiG-SSS/mig_xsss.py deleted file mode 100755 index 68bd064f1..000000000 --- a/state/sss_home/MiG-SSS/mig_xsss.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python -import os -import time - -MiG_DIR = "~/MiG-SSS" -G_XSCREENSAVER_COMMAND = "/usr/X11R6/bin/xscreensaver-command -watch" -G_GPIDFILE = "/tmp/mig_xsss_job.gpid" - -# Returns Group ID of running job -def getRunningGPID( param_sGPIDFile ): - iGPID = -1 - if ( os.path.isfile( param_sGPIDFile ) ): - input = open( param_sGPIDFile, "r" ) - iGPID = int(input.readline()) - input.close() - return iGPID - -# Writes Group ID of running job to param_sGPIDFile -def writeRunningGPID( param_iGPID, param_sGPIDFile ): - output = open( param_sGPIDFile, "w" ) - output.write( str(param_iGPID) + "\n" ) - output.close() - -def startJob(param_sGPIDFile): - iPID = os.fork() - if ( iPID == 0 ): - os.setpgrp() - else: - # Write GPID to file - writeRunningGPID( os.getpgrp(), param_sGPIDFile ) - cmd = "qemu -hda "+MiG_DIR+"/hda.img -cdrom "+MiG_DIR+"/MiG.iso -boot d -kernel-kqemu -nographic" - fd = os.popen(cmd) - fd.close() - - # We never end here as it is right now - # Job finished, remove param_sGPIDFile. - os.unlink( param_sGPIDFile ) - os._exit(0) - -def killJob( param_sGPIDFile ): - iGPID = getRunningGPID( param_sGPIDFile ); - if (iGPID != -1) : - try: - # Kill all processes with group id GPID - os.kill( 0-iGPID, 9 ) - except OSError, e: - # Process doesnt exist, ignore - print "" - - # Job killed, remove param_sGPIDFile. - os.unlink( param_sGPIDFile ) - - -def SSS(): - while(1): - str = "" - bScreenSaverActive = 0 - fd = os.popen( G_XSCREENSAVER_COMMAND ) - str = fd.readline() - while ( len(str) != 0 ): - if ( (str[0:5] == "BLANK" or str[0:4] == "LOCK") and bScreenSaverActive == 0 ): - bScreenSaverActive = 1 - startJob(G_GPIDFILE) - fd = os.popen(G_XSCREENSAVER_COMMAND) - elif ( str[0:7] == "UNBLANK" and bScreenSaverActive == 1 ): - bScreenSaverActive = 0 - killJob(G_GPIDFILE) - str = fd.readline() - fd.close() - -def main(): - iPID = os.fork() - if (iPID == 0): - os.setpgrp() - SSS() - -if __name__ == '__main__' : main() diff --git a/state/sss_home/MiG-SSS/readme.txt b/state/sss_home/MiG-SSS/readme.txt deleted file mode 100644 index 2b5b83d2d..000000000 --- a/state/sss_home/MiG-SSS/readme.txt +++ /dev/null @@ -1,44 +0,0 @@ -MiG-SSS v1.1 -- Rasmus Andersen - -Welcome to MiG-SSS, a system for harvesting idle CPU-cycles. - -To donate the idle time processing power of your computer while it is -in screen saver mode, you need to download and extract this -zip-archive in your home directory (so that the extracted files can be -found in ~/MiG-SSS/), download and install qemu and the kqemu -accelerator module. Finally, make sure the included screen saver -wrapper, mig_xsss.py, is started automatically once your X session -starts (see INSTALL). - - -REQUIREMENTS: -xscreensaver -python -qemu+kqemu (kqemu is not absolutely necessary, but it speeds up -computations quite significantly, in the order of a factor 10) - -INSTALL: -- Extract the zip archive in your home directory (or, if you install - elsewhere, change the MiG-SSS_DIR variable in mig_xsss.py accordingly) -- Install qemu and kqemu, either manually or using apt-get/urpmi/yum or similar - package handling utilities. -- Make sure the screen saver wrapper, mig_xsss.py, is started once you log in - to your computer. Depending on how you start an X session, you'll have to add - it to your ~/.xsession or ~/.xinit file: - python ~/MiG-SSS/mig_xsss.py (or the correct path if you installed elsewhere) -- Enable your xscreensaver - -TEST: -You can check that everything works by -running: -> qemu -hda "+MiG-SSS_DIR+"/hda.img -cdrom "+MiG-SSS_DIR+"/MiG.iso -boot d -kernel-kqemu" - -Using this command you can also donate your processing power when you are not in screen -saver mode :) - -VERIFY: -You can check how many jobs your computer has executed in screen saver -mode by visiting https://mig-1.imada.sdu.dk/cgi-sid/sandbox_login.py - - diff --git a/state/sss_home/iso/.placeholder b/state/sss_home/iso/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/state/sss_home/mnt/.placeholder b/state/sss_home/mnt/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/data/MiGserver--customised-include_sections.conf b/tests/data/MiGserver--customised-include_sections.conf index c4c9d40ba..8ddbb1565 100644 --- a/tests/data/MiGserver--customised-include_sections.conf +++ b/tests/data/MiGserver--customised-include_sections.conf @@ -77,10 +77,8 @@ mig_path = /home/mig/mig mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ jupyter_mount_files_dir = %(state_path)s/jupyter_mount_files/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ @@ -165,8 +163,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/MiGservercert.pem server_key = %(certs_path)s/MiGserverkey.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_public_url = migserver_public_alias_url = @@ -658,8 +654,6 @@ permanent_freeze = no # Delay before frozen archives are expected to hit tape (e.g. 5m, 4d or 2w). # Leave unset or empty if no tape archiving is available. freeze_to_tape = -# Enable sandbox resources (SSS) -enable_sandboxes = False # Enable Jupyter integration - requires a remote Jupyter server configured to # allow our users to connect and then integrates mount of user home there enable_jupyter = False diff --git a/tests/data/MiGserver--customised.conf b/tests/data/MiGserver--customised.conf index 69d90606d..58a72abd0 100644 --- a/tests/data/MiGserver--customised.conf +++ b/tests/data/MiGserver--customised.conf @@ -77,10 +77,8 @@ mig_path = /home/mig/mig mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ jupyter_mount_files_dir = %(state_path)s/jupyter_mount_files/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ @@ -165,8 +163,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/MiGservercert.pem server_key = %(certs_path)s/MiGserverkey.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_public_url = migserver_public_alias_url = @@ -388,7 +384,7 @@ min_seconds_between_live_update_requests = 60 # Please note that order *does* matter for these lists! # First entry is default for resource creation cgi architectures = X86 AMD64 IA64 SPARC SPARC64 ITANIUM SUN4U SPARC-T1 SPARC-T2 -scriptlanguages = sh python java +scriptlanguages = sh python jobtypes = batch interactive all lrmstypes = Native Native-execution-leader Batch Batch-execution-leader @@ -658,8 +654,6 @@ permanent_freeze = no # Delay before frozen archives are expected to hit tape (e.g. 5m, 4d or 2w). # Leave unset or empty if no tape archiving is available. freeze_to_tape = -# Enable sandbox resources (SSS) -enable_sandboxes = False # Enable Jupyter integration - requires a remote Jupyter server configured to # allow our users to connect and then integrates mount of user home there enable_jupyter = False diff --git a/tests/fixture/confs-stdlocal/MiGserver.conf b/tests/fixture/confs-stdlocal/MiGserver.conf index 7682ce53a..a94004d8b 100644 --- a/tests/fixture/confs-stdlocal/MiGserver.conf +++ b/tests/fixture/confs-stdlocal/MiGserver.conf @@ -83,10 +83,8 @@ mig_path = /home/mig/mig mig_server_home = %(mig_path)s/server/ grid_stdin = %(mig_server_home)s/server.stdin im_notify_stdin = %(mig_server_home)s/notify.stdin -javabin_home = %(mig_path)s/java-bin/ # State paths -sandbox_home = %(state_path)s/sandbox_home/ jupyter_mount_files_dir = %(state_path)s/jupyter_mount_files/ mrsl_files_dir = %(state_path)s/mrsl_files/ re_files_dir = %(state_path)s/re_files/ @@ -169,8 +167,6 @@ public_key_file = ~/.ssh/id_rsa.pub server_cert = %(certs_path)s/combined.pem server_key = %(certs_path)s/combined.pem ca_cert = %(certs_path)s/cacert.pem -sss_home = %(state_path)s/sss_home/ - # URLs migserver_public_url = migserver_public_alias_url = @@ -668,8 +664,6 @@ permanent_freeze = no # Delay before frozen archives are expected to hit tape (e.g. 5m, 4d or 2w). # Leave unset or empty if no tape archiving is available. freeze_to_tape = -# Enable sandbox resources (SSS) -enable_sandboxes = False # Enable Jupyter integration - requires a remote Jupyter server configured to # allow our users to connect and then integrates mount of user home there enable_jupyter = False diff --git a/tests/fixture/mig_shared_configuration--new.json b/tests/fixture/mig_shared_configuration--new.json index 35eac821a..951023181 100644 --- a/tests/fixture/mig_shared_configuration--new.json +++ b/tests/fixture/mig_shared_configuration--new.json @@ -51,14 +51,12 @@ "hg_path": "", "hgweb_scripts": "", "im_notify_stdin": "", - "javabin_home": "", "job_cond_green": [ "ARCHITECTURE", "PLATFORM", "RUNTIMEENVIRONMENT", "VERIFYFILES", - "VGRID", - "SANDBOX" + "VGRID" ], "job_cond_orange": [ "CPUCOUNT", @@ -143,7 +141,6 @@ "resource_home": "", "resource_pending": "", "resource_seen_within_hours": 24, - "sandbox_home": "", "sched_alg": "FirstFit", "scriptlanguages": [], "seafile_mount": "", @@ -228,7 +225,6 @@ "smtp_send_as_user": false, "smtp_sender": "", "smtp_server": "", - "sss_home": "", "state_path": "/some/place/state", "storage_protocols": "AUTO", "submitui": [ diff --git a/tests/test_mig_shared_base.py b/tests/test_mig_shared_base.py index 276defb04..ccc188308 100644 --- a/tests/test_mig_shared_base.py +++ b/tests/test_mig_shared_base.py @@ -39,7 +39,7 @@ get_client_id, get_short_id, get_site_base_url, get_user_id, get_xgi_bin, \ hexlify, invisible_dir, invisible_file, invisible_path, is_gdp_user, \ legacy_main, mask_creds, pretty_format_user, requested_backend, \ - requested_page, requested_url_base, sandbox_resource, string_snippet, \ + requested_page, requested_url_base, string_snippet, \ unhexlify, user_base_dir, valid_dir_input, verify_local_url # Imports required for the unit test wrapping from mig.shared.defaults import cert_field_order, csrf_field, \ @@ -1213,11 +1213,6 @@ def test_is_gdp_user_detection(self): "/CN=Regular User" )) - def test_sandbox_resource_identification(self): - """Test sandbox_resource identifies sandboxes""" - self.assertTrue(sandbox_resource("sandbox.12345")) - self.assertFalse(sandbox_resource("production.system.42")) - def test_invisible_file_detection(self): """Test invisible_file detects hidden system files""" for forbidden in [".htaccess"]: