summaryrefslogtreecommitdiff
path: root/python/examples/version_switcher.py
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2018-07-05 18:28:59 -0400
committerRyan Snyder <ryan@vector35.com>2018-07-10 18:11:10 -0400
commit975249d22e10360ed2c4c0bcea151c39d9446b0a (patch)
tree93c2abb7b184bd64565ae1f116728141bfa051c2 /python/examples/version_switcher.py
parentfd42578dce78f4c5a530177426e6a2ea11fc95ed (diff)
Rebased so commit history is correct now
Diffstat (limited to 'python/examples/version_switcher.py')
-rw-r--r--python/examples/version_switcher.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/python/examples/version_switcher.py b/python/examples/version_switcher.py
new file mode 100644
index 00000000..c990a6c0
--- /dev/null
+++ b/python/examples/version_switcher.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+# Copyright (c) 2015-2017 Vector 35 LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import sys
+
+from binaryninja.update import UpdateChannel, are_auto_updates_enabled, set_auto_updates_enabled, is_update_installation_pending, install_pending_update
+from binaryninja import core_version
+import datetime
+
+chandefault = UpdateChannel.list[0].name
+channel = None
+versions = []
+
+
+def load_channel(newchannel):
+ global channel
+ global versions
+ if (channel is not None and newchannel == channel.name):
+ print("Same channel, not updating.")
+ else:
+ try:
+ print("Loading channel %s" % newchannel)
+ channel = UpdateChannel[newchannel]
+ print("Loading versions...")
+ versions = channel.versions
+ except Exception:
+ print("%s is not a valid channel name. Defaulting to " % chandefault)
+ channel = UpdateChannel[chandefault]
+
+
+def select(version):
+ done = False
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ while not done:
+ print("Version:\t%s" % version.version)
+ print("Updated:\t%s" % date)
+ print("Notes:\n\n-----\n%s" % version.notes)
+ print("-----")
+ print("\t1)\tSwitch to version")
+ print("\t2)\tMain Menu")
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection == 2):
+ done = True
+ elif (selection == 1):
+ if (version.version == channel.latest_version.version):
+ print("Requesting update to latest version.")
+ else:
+ print("Requesting update to prior version.")
+ if are_auto_updates_enabled():
+ print("Disabling automatic updates.")
+ set_auto_updates_enabled(False)
+ if (version.version == core_version):
+ print("Already running %s" % version.version)
+ else:
+ print("version.version %s" % version.version)
+ print("core_version %s" % core_version)
+ print("Downloading...")
+ print(version.update())
+ print("Installing...")
+ if is_update_installation_pending:
+ #note that the GUI will be launched after update but should still do the upgrade headless
+ install_pending_update()
+ # forward updating won't work without reloading
+ sys.exit()
+ else:
+ print("Invalid selection")
+
+
+def list_channels():
+ done = False
+ print("\tSelect channel:\n")
+ while not done:
+ channel_list = UpdateChannel.list
+ for index, item in enumerate(channel_list):
+ print("\t%d)\t%s" % (index + 1, item.name))
+ print("\t%d)\t%s" % (len(channel_list) + 1, "Main Menu"))
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(channel_list) + 1):
+ print("%s is an invalid choice." % selection)
+ else:
+ done = True
+ if (selection != len(channel_list) + 1):
+ load_channel(channel_list[selection - 1].name)
+
+
+def toggle_updates():
+ set_auto_updates_enabled(not are_auto_updates_enabled())
+
+
+def main():
+ global channel
+ done = False
+ load_channel(chandefault)
+ while not done:
+ print("\n\tBinary Ninja Version Switcher")
+ print("\t\tCurrent Channel:\t%s" % channel.name)
+ print("\t\tCurrent Version:\t%s" % core_version)
+ print("\t\tAuto-Updates On:\t%s\n" % are_auto_updates_enabled())
+ for index, version in enumerate(versions):
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ print("\t%d)\t%s (%s)" % (index + 1, version.version, date))
+ print("\t%d)\t%s" % (len(versions) + 1, "Switch Channel"))
+ print("\t%d)\t%s" % (len(versions) + 2, "Toggle Auto Updates"))
+ print("\t%d)\t%s" % (len(versions) + 3, "Exit"))
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(versions) + 3):
+ print("%d is an invalid choice.\n\n" % selection)
+ else:
+ if (selection == len(versions) + 3):
+ done = True
+ elif (selection == len(versions) + 2):
+ toggle_updates()
+ elif (selection == len(versions) + 1):
+ list_channels()
+ else:
+ select(versions[selection - 1])
+
+
+if __name__ == "__main__":
+ main()